]> granicus.if.org Git - esp-idf/commitdiff
Feature/sync lwip as submodule
authorZhang Yan Jiao <zhangyanjiao@espressif.com>
Thu, 6 Sep 2018 11:43:08 +0000 (19:43 +0800)
committerJiang Jiang Jian <jack@espressif.com>
Thu, 6 Sep 2018 11:43:08 +0000 (19:43 +0800)
209 files changed:
.gitmodules
components/esp32/esp_err_to_name.c
components/idf_test/integration_test/TC_IT_TCPIP_TCP.yml
components/lwip/COPYING [deleted file]
components/lwip/README [deleted file]
components/lwip/api/api_lib.c [deleted file]
components/lwip/api/api_msg.c [deleted file]
components/lwip/api/err.c [deleted file]
components/lwip/api/netbuf.c [deleted file]
components/lwip/api/netdb.c [deleted file]
components/lwip/api/netifapi.c [deleted file]
components/lwip/api/pppapi.c [deleted file]
components/lwip/api/sockets.c [deleted file]
components/lwip/api/tcpip.c [deleted file]
components/lwip/apps/dhcpserver/dhcpserver.c [moved from components/lwip/apps/dhcpserver.c with 99% similarity]
components/lwip/apps/ping/esp_ping.c
components/lwip/apps/ping/ping.c
components/lwip/apps/sntp/sntp.c [deleted file]
components/lwip/component.mk
components/lwip/core/def.c [deleted file]
components/lwip/core/dns.c [deleted file]
components/lwip/core/inet_chksum.c [deleted file]
components/lwip/core/init.c [deleted file]
components/lwip/core/ip.c [deleted file]
components/lwip/core/ipv4/autoip.c [deleted file]
components/lwip/core/ipv4/dhcp.c [deleted file]
components/lwip/core/ipv4/icmp.c [deleted file]
components/lwip/core/ipv4/igmp.c [deleted file]
components/lwip/core/ipv4/ip4.c [deleted file]
components/lwip/core/ipv4/ip4_addr.c [deleted file]
components/lwip/core/ipv4/ip_frag.c [deleted file]
components/lwip/core/ipv6/README [deleted file]
components/lwip/core/ipv6/dhcp6.c [deleted file]
components/lwip/core/ipv6/ethip6.c [deleted file]
components/lwip/core/ipv6/icmp6.c [deleted file]
components/lwip/core/ipv6/inet6.c [deleted file]
components/lwip/core/ipv6/ip6.c [deleted file]
components/lwip/core/ipv6/ip6_addr.c [deleted file]
components/lwip/core/ipv6/ip6_frag.c [deleted file]
components/lwip/core/ipv6/mld6.c [deleted file]
components/lwip/core/ipv6/nd6.c [deleted file]
components/lwip/core/mem.c [deleted file]
components/lwip/core/memp.c [deleted file]
components/lwip/core/netif.c [deleted file]
components/lwip/core/pbuf.c [deleted file]
components/lwip/core/raw.c [deleted file]
components/lwip/core/stats.c [deleted file]
components/lwip/core/sys.c [deleted file]
components/lwip/core/tcp.c [deleted file]
components/lwip/core/tcp_in.c [deleted file]
components/lwip/core/tcp_out.c [deleted file]
components/lwip/core/timers.c [deleted file]
components/lwip/core/udp.c [deleted file]
components/lwip/include/apps/dhcpserver/dhcpserver.h [moved from components/lwip/include/lwip/apps/dhcpserver.h with 100% similarity]
components/lwip/include/apps/dhcpserver/dhcpserver_options.h [moved from components/lwip/include/lwip/apps/dhcpserver_options.h with 100% similarity]
components/lwip/include/apps/ping/esp_ping.h [moved from components/lwip/apps/ping/esp_ping.h with 100% similarity]
components/lwip/include/apps/ping/ping.h [moved from components/lwip/apps/ping/ping.h with 100% similarity]
components/lwip/include/lwip/apps/sntp/sntp.h [deleted file]
components/lwip/include/lwip/apps/sntp/sntp_opts.h [deleted file]
components/lwip/include/lwip/lwip/api.h [deleted file]
components/lwip/include/lwip/lwip/arch.h [deleted file]
components/lwip/include/lwip/lwip/autoip.h [deleted file]
components/lwip/include/lwip/lwip/debug.h [deleted file]
components/lwip/include/lwip/lwip/def.h [deleted file]
components/lwip/include/lwip/lwip/dhcp.h [deleted file]
components/lwip/include/lwip/lwip/dhcp6.h [deleted file]
components/lwip/include/lwip/lwip/dns.h [deleted file]
components/lwip/include/lwip/lwip/err.h [deleted file]
components/lwip/include/lwip/lwip/ethip6.h [deleted file]
components/lwip/include/lwip/lwip/icmp.h [deleted file]
components/lwip/include/lwip/lwip/icmp6.h [deleted file]
components/lwip/include/lwip/lwip/igmp.h [deleted file]
components/lwip/include/lwip/lwip/inet.h [deleted file]
components/lwip/include/lwip/lwip/inet_chksum.h [deleted file]
components/lwip/include/lwip/lwip/init.h [deleted file]
components/lwip/include/lwip/lwip/ip.h [deleted file]
components/lwip/include/lwip/lwip/ip4.h [deleted file]
components/lwip/include/lwip/lwip/ip4_addr.h [deleted file]
components/lwip/include/lwip/lwip/ip6.h [deleted file]
components/lwip/include/lwip/lwip/ip6_addr.h [deleted file]
components/lwip/include/lwip/lwip/ip6_frag.h [deleted file]
components/lwip/include/lwip/lwip/ip_addr.h [deleted file]
components/lwip/include/lwip/lwip/ip_frag.h [deleted file]
components/lwip/include/lwip/lwip/mem.h [deleted file]
components/lwip/include/lwip/lwip/memp.h [deleted file]
components/lwip/include/lwip/lwip/mld6.h [deleted file]
components/lwip/include/lwip/lwip/nd6.h [deleted file]
components/lwip/include/lwip/lwip/netbuf.h [deleted file]
components/lwip/include/lwip/lwip/netdb.h [deleted file]
components/lwip/include/lwip/lwip/netif.h [deleted file]
components/lwip/include/lwip/lwip/netifapi.h [deleted file]
components/lwip/include/lwip/lwip/opt.h [deleted file]
components/lwip/include/lwip/lwip/pbuf.h [deleted file]
components/lwip/include/lwip/lwip/pppapi.h [deleted file]
components/lwip/include/lwip/lwip/priv/api_msg.h [deleted file]
components/lwip/include/lwip/lwip/priv/memp_priv.h [deleted file]
components/lwip/include/lwip/lwip/priv/memp_std.h [deleted file]
components/lwip/include/lwip/lwip/priv/tcp_priv.h [deleted file]
components/lwip/include/lwip/lwip/priv/tcpip_priv.h [deleted file]
components/lwip/include/lwip/lwip/raw.h [deleted file]
components/lwip/include/lwip/lwip/sio.h [deleted file]
components/lwip/include/lwip/lwip/snmp.h [deleted file]
components/lwip/include/lwip/lwip/sockets.h [deleted file]
components/lwip/include/lwip/lwip/stats.h [deleted file]
components/lwip/include/lwip/lwip/sys.h [deleted file]
components/lwip/include/lwip/lwip/tcp.h [deleted file]
components/lwip/include/lwip/lwip/tcpip.h [deleted file]
components/lwip/include/lwip/lwip/timers.h [deleted file]
components/lwip/include/lwip/lwip/udp.h [deleted file]
components/lwip/include/lwip/netif/etharp.h [deleted file]
components/lwip/include/lwip/netif/ethernet.h [deleted file]
components/lwip/include/lwip/netif/lowpan6.h [deleted file]
components/lwip/include/lwip/netif/lowpan6_opts.h [deleted file]
components/lwip/include/lwip/netif/ppp/ccp.h [deleted file]
components/lwip/include/lwip/netif/ppp/chap-md5.h [deleted file]
components/lwip/include/lwip/netif/ppp/chap-new.h [deleted file]
components/lwip/include/lwip/netif/ppp/chap_ms.h [deleted file]
components/lwip/include/lwip/netif/ppp/eap.h [deleted file]
components/lwip/include/lwip/netif/ppp/ecp.h [deleted file]
components/lwip/include/lwip/netif/ppp/eui64.h [deleted file]
components/lwip/include/lwip/netif/ppp/fsm.h [deleted file]
components/lwip/include/lwip/netif/ppp/ipcp.h [deleted file]
components/lwip/include/lwip/netif/ppp/ipv6cp.h [deleted file]
components/lwip/include/lwip/netif/ppp/lcp.h [deleted file]
components/lwip/include/lwip/netif/ppp/magic.h [deleted file]
components/lwip/include/lwip/netif/ppp/mppe.h [deleted file]
components/lwip/include/lwip/netif/ppp/polarssl/arc4.h [deleted file]
components/lwip/include/lwip/netif/ppp/polarssl/des.h [deleted file]
components/lwip/include/lwip/netif/ppp/polarssl/md4.h [deleted file]
components/lwip/include/lwip/netif/ppp/polarssl/md5.h [deleted file]
components/lwip/include/lwip/netif/ppp/polarssl/sha1.h [deleted file]
components/lwip/include/lwip/netif/ppp/ppp.h [deleted file]
components/lwip/include/lwip/netif/ppp/ppp_impl.h [deleted file]
components/lwip/include/lwip/netif/ppp/pppcrypt.h [deleted file]
components/lwip/include/lwip/netif/ppp/pppdebug.h [deleted file]
components/lwip/include/lwip/netif/ppp/pppoe.h [deleted file]
components/lwip/include/lwip/netif/ppp/pppol2tp.h [deleted file]
components/lwip/include/lwip/netif/ppp/pppos.h [deleted file]
components/lwip/include/lwip/netif/ppp/upap.h [deleted file]
components/lwip/include/lwip/netif/ppp/vj.h [deleted file]
components/lwip/include/lwip/netif/slipif.h [deleted file]
components/lwip/lwip [new submodule]
components/lwip/netif/FILES [deleted file]
components/lwip/netif/etharp.c [deleted file]
components/lwip/netif/ethernet.c [deleted file]
components/lwip/netif/ethernetif.c [deleted file]
components/lwip/netif/lowpan6.c [deleted file]
components/lwip/netif/ppp/PPPD_FOLLOWUP [deleted file]
components/lwip/netif/ppp/auth.c [deleted file]
components/lwip/netif/ppp/ccp.c [deleted file]
components/lwip/netif/ppp/chap-md5.c [deleted file]
components/lwip/netif/ppp/chap-new.c [deleted file]
components/lwip/netif/ppp/chap_ms.c [deleted file]
components/lwip/netif/ppp/demand.c [deleted file]
components/lwip/netif/ppp/eap.c [deleted file]
components/lwip/netif/ppp/ecp.c [deleted file]
components/lwip/netif/ppp/eui64.c [deleted file]
components/lwip/netif/ppp/fsm.c [deleted file]
components/lwip/netif/ppp/ipcp.c [deleted file]
components/lwip/netif/ppp/ipv6cp.c [deleted file]
components/lwip/netif/ppp/lcp.c [deleted file]
components/lwip/netif/ppp/magic.c [deleted file]
components/lwip/netif/ppp/mppe.c [deleted file]
components/lwip/netif/ppp/multilink.c [deleted file]
components/lwip/netif/ppp/polarssl/README [deleted file]
components/lwip/netif/ppp/polarssl/arc4.c [deleted file]
components/lwip/netif/ppp/polarssl/des.c [deleted file]
components/lwip/netif/ppp/polarssl/md4.c [deleted file]
components/lwip/netif/ppp/polarssl/md5.c [deleted file]
components/lwip/netif/ppp/polarssl/sha1.c [deleted file]
components/lwip/netif/ppp/ppp.c [deleted file]
components/lwip/netif/ppp/pppcrypt.c [deleted file]
components/lwip/netif/ppp/pppoe.c [deleted file]
components/lwip/netif/ppp/pppol2tp.c [deleted file]
components/lwip/netif/ppp/pppos.c [deleted file]
components/lwip/netif/ppp/upap.c [deleted file]
components/lwip/netif/ppp/utils.c [deleted file]
components/lwip/netif/ppp/vj.c [deleted file]
components/lwip/netif/slipif.c [deleted file]
components/lwip/port/esp32/debug/lwip_debug.c [moved from components/lwip/port/debug/lwip_debug.c with 98% similarity]
components/lwip/port/esp32/freertos/sys_arch.c [moved from components/lwip/port/freertos/sys_arch.c with 100% similarity]
components/lwip/port/esp32/include/arch/cc.h [moved from components/lwip/include/lwip/port/arch/cc.h with 100% similarity]
components/lwip/port/esp32/include/arch/perf.h [moved from components/lwip/include/lwip/port/arch/perf.h with 100% similarity]
components/lwip/port/esp32/include/arch/sys_arch.h [moved from components/lwip/include/lwip/port/arch/sys_arch.h with 100% similarity]
components/lwip/port/esp32/include/arch/vfs_lwip.h [moved from components/lwip/include/lwip/port/arch/vfs_lwip.h with 100% similarity]
components/lwip/port/esp32/include/arpa/inet.h [moved from components/lwip/include/lwip/port/arpa/inet.h with 93% similarity]
components/lwip/port/esp32/include/debug/lwip_debug.h [moved from components/lwip/include/lwip/lwip/lwip_debug.h with 100% similarity]
components/lwip/port/esp32/include/lwipopts.h [moved from components/lwip/include/lwip/port/lwipopts.h with 97% similarity]
components/lwip/port/esp32/include/netdb.h [moved from components/lwip/include/lwip/posix/netdb.h with 100% similarity]
components/lwip/port/esp32/include/netif/ethernetif.h [moved from components/lwip/include/lwip/port/netif/ethernetif.h with 100% similarity]
components/lwip/port/esp32/include/netif/wlanif.h [moved from components/lwip/include/lwip/port/netif/wlanif.h with 100% similarity]
components/lwip/port/esp32/include/netinet/in.h [moved from components/lwip/include/lwip/port/netinet/in.h with 100% similarity]
components/lwip/port/esp32/include/sys/socket.h [moved from components/lwip/include/lwip/posix/sys/socket.h with 100% similarity]
components/lwip/port/esp32/netif/ethernetif.c [moved from components/lwip/port/netif/ethernetif.c with 100% similarity]
components/lwip/port/esp32/netif/wlanif.c [moved from components/lwip/port/netif/wlanif.c with 100% similarity]
components/lwip/port/esp32/vfs_lwip.c [moved from components/lwip/port/vfs_lwip.c with 100% similarity]
components/mdns/mdns_networking.c
components/tcpip_adapter/include/tcpip_adapter.h
components/tcpip_adapter/tcpip_adapter_lwip.c
examples/protocols/http2_request/main/http2_request_example_main.c
examples/protocols/pppos_client/main/pppos_client_main.c
examples/protocols/sntp/main/sntp_example_main.c
examples/protocols/udp_multicast/main/udp_multicast_example_main.c
examples/wifi/iperf/sdkconfig.defaults
examples/wifi/iperf/sdkconfig.defaults.05
examples/wifi/iperf/sdkconfig.defaults.06
examples/wifi/iperf/sdkconfig.defaults.07
examples/wifi/iperf/sdkconfig.defaults.99
tools/ci/mirror-list.txt

index 2a9eaef01038c14614335f34fd1298dda9955011..0b2a99894f0cb37ca3cc69b5c3de392783e57633 100644 (file)
@@ -49,3 +49,7 @@
 [submodule "components/expat/expat"]
        path = components/expat/expat
        url = https://github.com/libexpat/libexpat.git
+
+[submodule "components/lwip/lwip"]
+       path = components/lwip/lwip
+       url = https://github.com/espressif/esp-lwip.git
index efa2370dd540991e2aa8532774825ee7223e6d91..aee804b05327b987970a5351bf30819d216319b7 100644 (file)
@@ -4,6 +4,9 @@
 #if __has_include("soc/soc.h")
 #include "soc/soc.h"
 #endif
+#if __has_include("apps/ping/esp_ping.h")
+#include "apps/ping/esp_ping.h"
+#endif
 #if __has_include("esp32/ulp.h")
 #include "esp32/ulp.h"
 #endif
@@ -25,9 +28,6 @@
 #if __has_include("esp_ota_ops.h")
 #include "esp_ota_ops.h"
 #endif
-#if __has_include("esp_ping.h")
-#include "esp_ping.h"
-#endif
 #if __has_include("esp_spi_flash.h")
 #include "esp_spi_flash.h"
 #endif
@@ -399,7 +399,7 @@ static const esp_err_msg_t esp_err_msg_table[] = {
 #   ifdef      ESP_ERR_TCPIP_ADAPTER_DHCP_NOT_STOPPED
     ERR_TBL_IT(ESP_ERR_TCPIP_ADAPTER_DHCP_NOT_STOPPED),     /* 20487 0x5007 */
 #   endif
-    // components/lwip/apps/ping/esp_ping.h
+    // components/lwip/include/apps/ping/esp_ping.h
 #   ifdef      ESP_ERR_PING_BASE
     ERR_TBL_IT(ESP_ERR_PING_BASE),                          /* 24576 0x6000 */
 #   endif
index ad934a0a9006d7950d20dd3452ea2e99525286b3..a6a127f35a56eec1697cbf8bb4cf1160c50e9c48 100644 (file)
@@ -1138,7 +1138,6 @@ test cases:
     - - R SSC1 A <sock4>:ACCEPT:(\d+),\d+,.+,\d+
   - - SSC SSC1 soc -I
     - - P SSC1 RE "SOCINFO:%%s,2,%%s,\d+,%%s,%%d"%%(<sock1>,<target_ip>,<pc_ip>,<test_tcp_port1>)
-      - P SSC1 RE "SOCINFO:%%s,2,.+,\d+,.+,\d+"%%(<sock2>)
       - P SSC1 RE "SOCINFO:%%s,82,.+,%%d"%%(<sock3>,<random_port>)
       - P SSC1 RE "SOCINFO:%%s,2,%%s,%%d,%%s,\d+"%%(<sock4>,<target_ip>,<random_port>,<pc_ip>)
   execution time: 0.0
@@ -1385,7 +1384,6 @@ test cases:
     - - R SSC1 A <sock4>:ACCEPT:(\d+),\d+,.+,\d+
   - - SSC SSC1 soc -I
     - - P SSC1 RE "SOCINFO:%%s,2,%%s,\d+,%%s,%%d"%%(<sock1>,<target_ap_ip>,<pc_ip_wifi>,<test_tcp_port1>)
-      - P SSC1 RE "SOCINFO:%%s,2,.+,\d+,.+,\d+"%%(<sock2>)
       - P SSC1 RE "SOCINFO:%%s,82,.+,%%d"%%(<sock3>,<random_port>)
       - P SSC1 RE "SOCINFO:%%s,2,%%s,%%d,%%s,\d+"%%(<sock4>,<target_ap_ip>,<random_port>,<pc_ip_wifi>)
   execution time: 0.0
diff --git a/components/lwip/COPYING b/components/lwip/COPYING
deleted file mode 100644 (file)
index e23898b..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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>
- *
- */
-
-
diff --git a/components/lwip/README b/components/lwip/README
deleted file mode 100644 (file)
index 495556e..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-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).
-
-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.
-
-FEATURES
-
-  * IP (Internet Protocol) 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
-  * UDP (User Datagram Protocol) including experimental UDP-lite extensions
-  * TCP (Transmission Control Protocol) with congestion control, RTT estimation
-    and fast recovery/fast retransmit
-  * Specialized raw/native API for enhanced performance
-  * Optional Berkeley-like socket API
-  * DNS (Domain names resolver)
-  * SNMP (Simple Network Management Protocol)
-  * DHCP (Dynamic Host Configuration Protocol)
-  * AUTOIP (for IPv4, conform with RFC 3927)
-  * PPP (Point-to-Point Protocol)
-  * ARP (Address Resolution Protocol) for Ethernet
-
-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/
-
-
-DOCUMENTATION
-
-The original out-dated homepage of lwIP and Adam Dunkels' papers on
-lwIP are at the official lwIP home page:
-  http://www.sics.se/~adam/lwip/
-
-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 growin 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/
-
-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 <adam@sics.se>
-Leon Woestenberg <leon.woestenberg@gmx.net>
-
diff --git a/components/lwip/api/api_lib.c b/components/lwip/api/api_lib.c
deleted file mode 100644 (file)
index 3701d46..0000000
+++ /dev/null
@@ -1,984 +0,0 @@
-/**
- * @file
- * Sequential API External module
- *
- */
-
-/*
- * 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 is the part of the API that is linked with
-   the application */
-
-#include "lwip/opt.h"
-
-#if LWIP_NETCONN /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/api.h"
-#include "lwip/memp.h"
-
-#include "lwip/ip.h"
-#include "lwip/raw.h"
-#include "lwip/udp.h"
-#include "lwip/priv/api_msg.h"
-#include "lwip/priv/tcp_priv.h"
-#include "lwip/priv/tcpip_priv.h"
-
-#include <string.h>
-
-#define API_MSG_VAR_REF(name)             API_VAR_REF(name)
-#define API_MSG_VAR_DECLARE(name)         API_VAR_DECLARE(struct api_msg, name)
-#define API_MSG_VAR_ALLOC(name)           API_VAR_ALLOC(struct api_msg, MEMP_API_MSG, name)
-#define API_MSG_VAR_ALLOC_DONTFAIL(name)  API_VAR_ALLOC_DONTFAIL(struct api_msg, MEMP_API_MSG, name)
-#define API_MSG_VAR_FREE(name)            API_VAR_FREE(MEMP_API_MSG, name)
-
-static err_t netconn_close_shutdown(struct netconn *conn, u8_t how);
-
-#if !LWIP_TCPIP_CORE_LOCKING
-/**
- * Call the lower part of a netconn_* function
- * This function is then running in the thread context
- * of tcpip_thread and has exclusive access to lwIP core code.
- *
- * @param apimsg a struct containing the function to call and its parameters
- * @return ERR_OK if the function was called, another err_t if not
- */
-static err_t ESP_IRAM_ATTR
-tcpip_apimsg(struct api_msg *apimsg)
-{
-#if LWIP_DEBUG
-  /* catch functions that don't set err */
-  apimsg->msg.err = ERR_VAL;
-#endif
-
-#if LWIP_NETCONN_SEM_PER_THREAD
-  apimsg->msg.op_completed_sem = LWIP_NETCONN_THREAD_SEM_GET();
-  LWIP_ASSERT("netconn semaphore not initialized",
-  sys_sem_valid(apimsg->msg.op_completed_sem));
-#endif
-
-  if (tcpip_send_api_msg(apimsg->function, &apimsg->msg, LWIP_API_MSG_SEM(&apimsg->msg)) == ERR_OK) {
-        return apimsg->msg.err;
-  }
-    
-  return ERR_VAL;
-}
-#endif /* !LWIP_TCPIP_CORE_LOCKING */
-
-/**
- * Create a new netconn (of a specific type) that has a callback function.
- * The corresponding pcb is also created.
- *
- * @param t the type of 'connection' to create (@see enum netconn_type)
- * @param proto the IP protocol for RAW IP pcbs
- * @param callback a function to call on status changes (RX available, TX'ed)
- * @return a newly allocated struct netconn or
- *         NULL on memory error
- */
-struct netconn*
-netconn_new_with_proto_and_callback(enum netconn_type t, u8_t proto, netconn_callback callback)
-{
-  struct netconn *conn;
-  API_MSG_VAR_DECLARE(msg);
-
-  conn = netconn_alloc(t, callback);
-  if (conn != NULL) {
-    err_t err;
-    API_MSG_VAR_ALLOC_DONTFAIL(msg);
-    API_MSG_VAR_REF(msg).msg.msg.n.proto = proto;
-    API_MSG_VAR_REF(msg).msg.conn = conn;
-    TCPIP_APIMSG(&API_MSG_VAR_REF(msg), lwip_netconn_do_newconn, err);
-    API_MSG_VAR_FREE(msg);
-    if (err != ERR_OK) {
-      LWIP_ASSERT("freeing conn without freeing pcb", conn->pcb.tcp == NULL);
-      LWIP_ASSERT("conn has no recvmbox", sys_mbox_valid(&conn->recvmbox));
-#if LWIP_TCP
-      LWIP_ASSERT("conn->acceptmbox shouldn't exist", !sys_mbox_valid(&conn->acceptmbox));
-#endif /* LWIP_TCP */
-#if !LWIP_NETCONN_SEM_PER_THREAD
-      LWIP_ASSERT("conn has no op_completed", sys_sem_valid(&conn->op_completed));
-      sys_sem_free(&conn->op_completed);
-#endif /* !LWIP_NETCONN_SEM_PER_THREAD */
-      sys_mbox_free(&conn->recvmbox);
-      memp_free(MEMP_NETCONN, conn);
-      return NULL;
-    }
-  }
-  return conn;
-}
-
-static inline bool is_created_by_socket(struct netconn *conn)
-{
-#if LWIP_SOCKET
-  if (conn && (conn->socket >= 0)) {
-    return true;
-  }
-#endif
-  return false;
-}
-/**
- * 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;
-  API_MSG_VAR_DECLARE(msg);
-
-  /* No ASSERT here because possible to get a (conn == NULL) if we got an accept error */
-  if (conn == NULL) {
-    return ERR_OK;
-  }
-
-  API_MSG_VAR_ALLOC(msg);
-  API_MSG_VAR_REF(msg).msg.conn = conn;
-#if LWIP_SO_SNDTIMEO || LWIP_SO_LINGER
-  /* get the time we started, which is later compared to
-     sys_now() + conn->send_timeout */
-  API_MSG_VAR_REF(msg).msg.msg.sd.time_started = sys_now();
-#else /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */
-#if LWIP_TCP
-  API_MSG_VAR_REF(msg).msg.msg.sd.polls_left =
-    ((LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT + TCP_SLOW_INTERVAL - 1) / TCP_SLOW_INTERVAL) + 1;
-#endif /* LWIP_TCP */
-#endif /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */
-  TCPIP_APIMSG(&API_MSG_VAR_REF(msg), lwip_netconn_do_delconn, err);
-  API_MSG_VAR_FREE(msg);
-
-  if (err != ERR_OK) {
-    return err;
-  }
-
-#if ESP_THREAD_SAFE
-  if (is_created_by_socket(conn) == false) {
-    LWIP_DEBUGF(ESP_THREAD_SAFE_DEBUG, ("netconn_delete - free conn\n"));
-    netconn_free(conn);
-  }
-#else
-  LWIP_DEBUGF(ESP_THREAD_SAFE_DEBUG, ("netconn_delete - free conn\n"));
-  netconn_free(conn);
-#endif
-
-  return ERR_OK;
-}
-
-/**
- * Get the local or remote IP address and port of a netconn.
- * For RAW netconns, this returns the protocol instead of a port!
- *
- * @param conn the netconn to query
- * @param addr a pointer to which to save the IP address
- * @param port a pointer to which to save the port (or protocol for RAW)
- * @param local 1 to get the local IP address, 0 to get the remote one
- * @return ERR_CONN for invalid connections
- *         ERR_OK if the information was retrieved
- */
-err_t
-netconn_getaddr(struct netconn *conn, ip_addr_t *addr, u16_t *port, u8_t local)
-{
-  API_MSG_VAR_DECLARE(msg);
-  err_t err;
-
-  LWIP_ERROR("netconn_getaddr: invalid conn", (conn != NULL), return ERR_ARG;);
-  LWIP_ERROR("netconn_getaddr: invalid addr", (addr != NULL), return ERR_ARG;);
-  LWIP_ERROR("netconn_getaddr: invalid port", (port != NULL), return ERR_ARG;);
-
-  API_MSG_VAR_ALLOC(msg);
-  API_MSG_VAR_REF(msg).msg.conn = conn;
-  API_MSG_VAR_REF(msg).msg.msg.ad.local = local;
-#if LWIP_MPU_COMPATIBLE
-  TCPIP_APIMSG(msg, lwip_netconn_do_getaddr, err);
-  *addr = msg->msg.msg.ad.ipaddr;
-  *port = msg->msg.msg.ad.port;
-#else /* LWIP_MPU_COMPATIBLE */
-  msg.msg.msg.ad.ipaddr = addr;
-  msg.msg.msg.ad.port = port;
-  TCPIP_APIMSG(&msg, lwip_netconn_do_getaddr, err);
-#endif /* LWIP_MPU_COMPATIBLE */
-  API_MSG_VAR_FREE(msg);
-
-  return err;
-}
-
-/**
- * Bind a netconn to a specific local IP address and port.
- * 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 (use IP_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
- */
-err_t
-netconn_bind(struct netconn *conn, const ip_addr_t *addr, u16_t port)
-{
-  API_MSG_VAR_DECLARE(msg);
-  err_t err;
-  
-  LWIP_ERROR("netconn_bind: invalid conn", (conn != NULL), return ERR_ARG;);
-
-  /* Don't propagate NULL pointer (IP_ADDR_ANY alias) to subsequent functions */
-  if (addr == NULL) {
-    addr = IP_ADDR_ANY;
-  }
-
-  API_MSG_VAR_ALLOC(msg);
-  API_MSG_VAR_REF(msg).msg.conn = conn;
-  API_MSG_VAR_REF(msg).msg.msg.bc.ipaddr = API_MSG_VAR_REF(addr);
-  API_MSG_VAR_REF(msg).msg.msg.bc.port = port;
-  TCPIP_APIMSG(&API_MSG_VAR_REF(msg), lwip_netconn_do_bind, err);
-  API_MSG_VAR_FREE(msg);
-
-  return err;
-}
-
-/**
- * Connect a netconn to a specific remote IP address and port.
- *
- * @param conn the netconn to connect
- * @param addr the remote IP address to connect to
- * @param port the remote port to connect to (no used for RAW)
- * @return ERR_OK if connected, return value of tcp_/udp_/raw_connect otherwise
- */
-err_t
-netconn_connect(struct netconn *conn, const ip_addr_t *addr, u16_t port)
-{
-  API_MSG_VAR_DECLARE(msg);
-  err_t err;
-
-  LWIP_ERROR("netconn_connect: invalid conn", (conn != NULL), return ERR_ARG;);
-
-  /* Don't propagate NULL pointer (IP_ADDR_ANY alias) to subsequent functions */
-  if (addr == NULL) {
-    addr = IP_ADDR_ANY;
-  }
-
-  API_MSG_VAR_ALLOC(msg);
-  API_MSG_VAR_REF(msg).msg.conn = conn;
-  API_MSG_VAR_REF(msg).msg.msg.bc.ipaddr = API_MSG_VAR_REF(addr);
-  API_MSG_VAR_REF(msg).msg.msg.bc.port = port;
-  TCPIP_APIMSG(&API_MSG_VAR_REF(msg), lwip_netconn_do_connect, err);
-  API_MSG_VAR_FREE(msg);
-
-  return err;
-}
-
-/**
- * Disconnect a netconn from its current peer (only valid for UDP netconns).
- *
- * @param conn the netconn to disconnect
- * @return TODO: return value is not set here...
- */
-err_t
-netconn_disconnect(struct netconn *conn)
-{
-  API_MSG_VAR_DECLARE(msg);
-  err_t err;
-
-  LWIP_ERROR("netconn_disconnect: invalid conn", (conn != NULL), return ERR_ARG;);
-
-  API_MSG_VAR_ALLOC(msg);
-  API_MSG_VAR_REF(msg).msg.conn = conn;
-  TCPIP_APIMSG(&API_MSG_VAR_REF(msg), lwip_netconn_do_disconnect, err);
-  API_MSG_VAR_FREE(msg);
-
-  return err;
-}
-
-/**
- * Set a TCP netconn into listen mode
- *
- * @param conn the tcp netconn to set to listen mode
- * @param backlog the listen backlog, only used if TCP_LISTEN_BACKLOG==1
- * @return ERR_OK if the netconn was set to listen (UDP and RAW netconns
- *         don't return any error (yet?))
- */
-err_t
-netconn_listen_with_backlog(struct netconn *conn, u8_t backlog)
-{
-#if LWIP_TCP
-  API_MSG_VAR_DECLARE(msg);
-  err_t err;
-
-  /* This does no harm. If TCP_LISTEN_BACKLOG is off, backlog is unused. */
-  LWIP_UNUSED_ARG(backlog);
-
-  LWIP_ERROR("netconn_listen: invalid conn", (conn != NULL), return ERR_ARG;);
-
-  API_MSG_VAR_ALLOC(msg);
-  API_MSG_VAR_REF(msg).msg.conn = conn;
-#if TCP_LISTEN_BACKLOG
-  API_MSG_VAR_REF(msg).msg.msg.lb.backlog = backlog;
-#endif /* TCP_LISTEN_BACKLOG */
-  TCPIP_APIMSG(&API_MSG_VAR_REF(msg), lwip_netconn_do_listen, err);
-  API_MSG_VAR_FREE(msg);
-
-  return err;
-#else /* LWIP_TCP */
-  LWIP_UNUSED_ARG(conn);
-  LWIP_UNUSED_ARG(backlog);
-  return ERR_ARG;
-#endif /* LWIP_TCP */
-}
-
-/**
- * Accept a new connection on a TCP listening netconn.
- *
- * @param conn the TCP listen netconn
- * @param new_conn pointer where the new connection is stored
- * @return ERR_OK if a new connection has been received or an error
- *                code otherwise
- */
-err_t
-netconn_accept(struct netconn *conn, struct netconn **new_conn)
-{
-#if LWIP_TCP
-  struct netconn *newconn;
-  err_t err;
-#if TCP_LISTEN_BACKLOG
-  API_MSG_VAR_DECLARE(msg);
-#endif /* TCP_LISTEN_BACKLOG */
-
-  LWIP_ERROR("netconn_accept: invalid pointer",    (new_conn != NULL),                  return ERR_ARG;);
-  *new_conn = NULL;
-  LWIP_ERROR("netconn_accept: invalid conn",       (conn != NULL),                      return ERR_ARG;);
-  LWIP_ERROR("netconn_accept: invalid acceptmbox", sys_mbox_valid(&conn->acceptmbox),   return ERR_ARG;);
-
-  err = conn->last_err;
-  if (ERR_IS_FATAL(err)) {
-    /* don't recv on fatal errors: this might block the application task
-       waiting on acceptmbox forever! */
-    return err;
-  }
-
-#if LWIP_SO_RCVTIMEO
-  if (sys_arch_mbox_fetch(&conn->acceptmbox, (void **)&newconn, conn->recv_timeout) == SYS_ARCH_TIMEOUT) {
-    return ERR_TIMEOUT;
-  }
-#else
-  sys_arch_mbox_fetch(&conn->acceptmbox, (void **)&newconn, 0);
-#endif /* LWIP_SO_RCVTIMEO*/
-  /* Register event with callback */
-  API_EVENT(conn, NETCONN_EVT_RCVMINUS, 0);
-
-  if (newconn == 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_ABRT);
-    return ERR_ABRT;
-  }
-#if TCP_LISTEN_BACKLOG
-  /* Let the stack know that we have accepted the connection. */
-  API_MSG_VAR_ALLOC_DONTFAIL(msg);
-  API_MSG_VAR_REF(msg).msg.conn = newconn;
-  /* don't care for the return value of lwip_netconn_do_accepted */
-  TCPIP_APIMSG_NOERR(&API_MSG_VAR_REF(msg), lwip_netconn_do_accepted);
-  API_MSG_VAR_FREE(msg);
-#endif /* TCP_LISTEN_BACKLOG */
-
-  *new_conn = newconn;
-  /* don't set conn->last_err: it's only ERR_OK, anyway */
-  return ERR_OK;
-#else /* LWIP_TCP */
-  LWIP_UNUSED_ARG(conn);
-  LWIP_UNUSED_ARG(new_conn);
-  return ERR_ARG;
-#endif /* LWIP_TCP */
-}
-
-/**
- * Receive data: actual implementation that doesn't care whether pbuf or netbuf
- * is received
- *
- * @param conn the netconn from which to receive data
- * @param new_buf pointer where a new pbuf/netbuf is stored when received data
- * @return ERR_OK if data has been received, an error code otherwise (timeout,
- *                memory error or another error)
- */
-static err_t ESP_IRAM_ATTR
-netconn_recv_data(struct netconn *conn, void **new_buf)
-{
-  void *buf = NULL;
-  u16_t len;
-  err_t err;
-#if LWIP_TCP
-  API_MSG_VAR_DECLARE(msg);
-#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;
-    }
-  }
-#endif /* LWIP_TCP */
-  LWIP_ERROR("netconn_recv: invalid recvmbox", sys_mbox_valid(&conn->recvmbox), return ERR_CONN;);
-
-  err = conn->last_err;
-  if (ERR_IS_FATAL(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 err;
-  }
-
-#if LWIP_SO_RCVTIMEO
-  if (sys_arch_mbox_fetch(&conn->recvmbox, &buf, conn->recv_timeout) == SYS_ARCH_TIMEOUT) {
-    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) */
-  {
-    if (!netconn_get_noautorecved(conn) || (buf == NULL)) {
-      /* 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_ALLOC_DONTFAIL(msg);
-      API_MSG_VAR_REF(msg).msg.conn = conn;
-      if (buf != NULL) {
-        API_MSG_VAR_REF(msg).msg.msg.r.len = ((struct pbuf *)buf)->tot_len;
-      } else {
-        API_MSG_VAR_REF(msg).msg.msg.r.len = 1;
-      }
-      /* don't care for the return value of lwip_netconn_do_recv */
-      TCPIP_APIMSG_NOERR(&API_MSG_VAR_REF(msg), lwip_netconn_do_recv);
-      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);
-      /* Don' store ERR_CLSD as conn->err since we are only half-closed */
-      return ERR_CLSD;
-    }
-    len = ((struct pbuf *)buf)->tot_len;
-  }
-#endif /* LWIP_TCP */
-#if LWIP_TCP && (LWIP_UDP || LWIP_RAW)
-  else
-#endif /* LWIP_TCP && (LWIP_UDP || LWIP_RAW) */
-#if (LWIP_UDP || LWIP_RAW)
-  {
-#if ESP_THREAD_SAFE
-    if (buf == NULL){
-      API_EVENT(conn, NETCONN_EVT_RCVMINUS, 0);
-      return ERR_CLSD;
-    }
-#endif
-    LWIP_ASSERT("buf != NULL", buf != NULL);
-    len = netbuf_len((struct netbuf *)buf);
-  }
-#endif /* (LWIP_UDP || LWIP_RAW) */
-
-#if ESP_PERF
-  if (len > DBG_PERF_FILTER_LEN) {
-    DBG_PERF_PATH_SET(DBG_PERF_DIR_RX, DBG_PERF_POINT_SOC_IN);
-  }
-#endif
-
-#if LWIP_SO_RCVBUF
-  SYS_ARCH_DEC(conn->recv_avail, len);
-#endif /* LWIP_SO_RCVBUF */
-  /* Register event with callback */
-  API_EVENT(conn, NETCONN_EVT_RCVMINUS, len);
-
-  LWIP_DEBUGF(API_LIB_DEBUG, ("netconn_recv_data: received %p, len=%"U16_F"\n", buf, len));
-
-  *new_buf = buf;
-  /* don't set conn->last_err: it's only ERR_OK, anyway */
-  return ERR_OK;
-}
-
-/**
- * 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
- * @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 TCP netconn
- */
-err_t
-netconn_recv_tcp_pbuf(struct netconn *conn, struct pbuf **new_buf)
-{
-  LWIP_ERROR("netconn_recv: invalid conn", (conn != NULL) &&
-             NETCONNTYPE_GROUP(netconn_type(conn)) == NETCONN_TCP, return ERR_ARG;);
-
-  return netconn_recv_data(conn, (void **)new_buf);
-}
-
-/**
- * Receive data (in form of a netbuf containing a packet buffer) from a 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_t ESP_IRAM_ATTR
-netconn_recv(struct netconn *conn, struct netbuf **new_buf)
-{
-#if LWIP_TCP
-  struct netbuf *buf = NULL;
-  err_t err;
-#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) */
-  {
-    struct pbuf *p = NULL;
-    /* This is not a listening netconn, since recvmbox is set */
-
-    buf = (struct netbuf *)memp_malloc(MEMP_NETBUF);
-    if (buf == NULL) {
-      return ERR_MEM;
-    }
-
-    err = netconn_recv_data(conn, (void **)&p);
-    if (err != ERR_OK) {
-      memp_free(MEMP_NETBUF, buf);
-      return err;
-    }
-    LWIP_ASSERT("p != NULL", p != NULL);
-
-    buf->p = p;
-    buf->ptr = p;
-    buf->port = 0;
-    ip_addr_set_zero(&buf->addr);
-    *new_buf = buf;
-    /* don't set conn->last_err: it's only ERR_OK, anyway */
-    return ERR_OK;
-  }
-#endif /* LWIP_TCP */
-#if LWIP_TCP && (LWIP_UDP || LWIP_RAW)
-  else
-#endif /* LWIP_TCP && (LWIP_UDP || LWIP_RAW) */
-  {
-#if (LWIP_UDP || LWIP_RAW)
-    return netconn_recv_data(conn, (void **)new_buf);
-#endif /* (LWIP_UDP || LWIP_RAW) */
-  }
-}
-
-/**
- * TCP: update the receive window: by calling this, the application
- * tells the stack that it has processed data and is able to accept
- * new data.
- * ATTENTION: use with care, this is mainly used for sockets!
- * Can only be used when calling netconn_set_noautorecved(conn, 1) before.
- *
- * @param conn the netconn for which to update the receive window
- * @param length amount of data processed (ATTENTION: this must be accurate!)
- */
-void
-netconn_recved(struct netconn *conn, u32_t length)
-{
-#if LWIP_TCP
-  if ((conn != NULL) && (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP) &&
-      (netconn_get_noautorecved(conn))) {
-    API_MSG_VAR_DECLARE(msg);
-    /* 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_ALLOC_DONTFAIL(msg);
-    API_MSG_VAR_REF(msg).msg.conn = conn;
-    API_MSG_VAR_REF(msg).msg.msg.r.len = length;
-    /* don't care for the return value of lwip_netconn_do_recv */
-    TCPIP_APIMSG_NOERR(&API_MSG_VAR_REF(msg), lwip_netconn_do_recv);
-    API_MSG_VAR_FREE(msg);
-  }
-#else /* LWIP_TCP */
-  LWIP_UNUSED_ARG(conn);
-  LWIP_UNUSED_ARG(length);
-#endif /* LWIP_TCP */
-}
-
-/**
- * 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).
- *
- * @param conn the netconn over which to send data
- * @param buf a netbuf containing the data to send
- * @param addr the remote IP address to which to send the data
- * @param port the remote port to which to send the data
- * @return ERR_OK if data was sent, any other err_t on error
- */
-err_t
-netconn_sendto(struct netconn *conn, struct netbuf *buf, const ip_addr_t *addr, u16_t port)
-{
-  if (buf != NULL) {
-    ip_addr_set(&buf->addr, addr);
-    buf->port = port;
-    return netconn_send(conn, buf);
-  }
-  return ERR_VAL;
-}
-
-/**
- * Send data over a UDP or RAW netconn (that is already connected).
- *
- * @param conn the UDP or RAW netconn over which to send data
- * @param buf a netbuf containing the data to send
- * @return ERR_OK if data was sent, any other err_t on error
- */
-err_t ESP_IRAM_ATTR
-netconn_send(struct netconn *conn, struct netbuf *buf)
-{
-  API_MSG_VAR_DECLARE(msg);
-  err_t err;
-
-  LWIP_ERROR("netconn_send: invalid conn",  (conn != NULL), return ERR_ARG;);
-
-  LWIP_DEBUGF(API_LIB_DEBUG, ("netconn_send: sending %"U16_F" bytes\n", buf->p->tot_len));
-  API_MSG_VAR_ALLOC(msg);
-  API_MSG_VAR_REF(msg).msg.conn = conn;
-  API_MSG_VAR_REF(msg).msg.msg.b = buf;
-  TCPIP_APIMSG(&API_MSG_VAR_REF(msg), lwip_netconn_do_send, err);
-  API_MSG_VAR_FREE(msg);
-
-  return err;
-}
-
-/**
- * Send data over a TCP netconn.
- *
- * @param conn the TCP netconn over which to send data
- * @param dataptr pointer to the application buffer that contains the data to send
- * @param size size of the application data to send
- * @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_partly(struct netconn *conn, const void *dataptr, size_t size,
-                     u8_t apiflags, size_t *bytes_written)
-{
-  API_MSG_VAR_DECLARE(msg);
-  err_t err;
-  u8_t dontblock;
-
-  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;
-  }
-  dontblock = netconn_is_nonblocking(conn) || (apiflags & NETCONN_DONTBLOCK);
-
-  if (dontblock && !bytes_written) {
-    /* This implies netconn_write() cannot be used for non-blocking send, since
-       it has no way to return the number of bytes written. */
-    return ERR_VAL;
-  }
-
-  API_MSG_VAR_ALLOC(msg);
-  /* non-blocking write sends as much  */
-  API_MSG_VAR_REF(msg).msg.conn = conn;
-  API_MSG_VAR_REF(msg).msg.msg.w.dataptr = dataptr;
-  API_MSG_VAR_REF(msg).msg.msg.w.apiflags = apiflags;
-  API_MSG_VAR_REF(msg).msg.msg.w.len = size;
-#if LWIP_SO_SNDTIMEO
-  if (conn->send_timeout != 0) {
-    /* get the time we started, which is later compared to
-        sys_now() + conn->send_timeout */
-    API_MSG_VAR_REF(msg).msg.msg.w.time_started = sys_now();
-  } else {
-    API_MSG_VAR_REF(msg).msg.msg.w.time_started = 0;
-  }
-#endif /* LWIP_SO_SNDTIMEO */
-
-  /* For locking the core: this _can_ be delayed on low memory/low send buffer,
-     but if it is, this is done inside api_msg.c:do_write(), so we can use the
-     non-blocking version here. */
-  TCPIP_APIMSG(&API_MSG_VAR_REF(msg), lwip_netconn_do_write, err);
-  if ((err == ERR_OK) && (bytes_written != NULL)) {
-    if (dontblock
-#if LWIP_SO_SNDTIMEO
-        || (conn->send_timeout != 0)
-#endif /* LWIP_SO_SNDTIMEO */
-       ) {
-      /* nonblocking write: maybe the data has been sent partly */
-      *bytes_written = API_MSG_VAR_REF(msg).msg.msg.w.len;
-    } else {
-      /* blocking call succeeded: all data has been sent if it */
-      *bytes_written = size;
-    }
-  }
-  API_MSG_VAR_FREE(msg);
-
-  return err;
-}
-
-/**
- * Close or shutdown a TCP netconn (doesn't delete it).
- *
- * @param conn the TCP netconn to close or shutdown
- * @param how fully close or only shutdown one side?
- * @return ERR_OK if the netconn was closed, any other err_t on error
- */
-static err_t
-netconn_close_shutdown(struct netconn *conn, u8_t how)
-{
-  API_MSG_VAR_DECLARE(msg);
-  err_t err;
-  LWIP_UNUSED_ARG(how);
-
-  LWIP_ERROR("netconn_close: invalid conn",  (conn != NULL), return ERR_ARG;);
-
-  API_MSG_VAR_ALLOC(msg);
-  API_MSG_VAR_REF(msg).msg.conn = conn;
-#if LWIP_TCP
-  /* shutting down both ends is the same as closing */
-  API_MSG_VAR_REF(msg).msg.msg.sd.shut = how;
-#if LWIP_SO_SNDTIMEO || LWIP_SO_LINGER
-  /* get the time we started, which is later compared to
-     sys_now() + conn->send_timeout */
-  API_MSG_VAR_REF(msg).msg.msg.sd.time_started = sys_now();
-#else /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */
-  API_MSG_VAR_REF(msg).msg.msg.sd.polls_left =
-    ((LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT + TCP_SLOW_INTERVAL - 1) / TCP_SLOW_INTERVAL) + 1;
-#endif /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */
-#endif /* LWIP_TCP */
-  TCPIP_APIMSG(&API_MSG_VAR_REF(msg), lwip_netconn_do_close, err);
-  API_MSG_VAR_FREE(msg);
-
-  return err;
-}
-
-/**
- * Close a TCP netconn (doesn't delete it).
- *
- * @param conn the TCP netconn to close
- * @return ERR_OK if the netconn was closed, any other err_t on error
- */
-err_t
-netconn_close(struct netconn *conn)
-{
-  /* shutting down both ends is the same as closing */
-  return netconn_close_shutdown(conn, NETCONN_SHUT_RDWR);
-}
-
-/**
- * Shut down one or both sides of a TCP netconn (doesn't delete it).
- *
- * @param conn the TCP netconn to shut down
- * @return ERR_OK if the netconn was closed, any other err_t on error
- */
-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));
-}
-
-#if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD)
-/**
- * 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 netif_addr the IP address of the network interface on which to send
- *                  the igmp message
- * @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(struct netconn *conn,
-                         const ip_addr_t *multiaddr,
-                         const ip_addr_t *netif_addr,
-                         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);
-
-  /* Don't propagate NULL pointer (IP_ADDR_ANY alias) to subsequent functions */
-  if (multiaddr == NULL) {
-    multiaddr = IP_ADDR_ANY;
-  }
-  if (netif_addr == NULL) {
-    netif_addr = IP_ADDR_ANY;
-  }
-
-  API_MSG_VAR_REF(msg).msg.conn = conn;
-  API_MSG_VAR_REF(msg).msg.msg.jl.multiaddr = API_MSG_VAR_REF(multiaddr);
-  API_MSG_VAR_REF(msg).msg.msg.jl.netif_addr = API_MSG_VAR_REF(netif_addr);
-  API_MSG_VAR_REF(msg).msg.msg.jl.join_or_leave = join_or_leave;
-  TCPIP_APIMSG(&API_MSG_VAR_REF(msg), lwip_netconn_do_join_leave_group, err);
-  API_MSG_VAR_FREE(msg);
-
-  return err;
-}
-#endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */
-
-#if LWIP_DNS
-/**
- * Execute a DNS query, only one IP address is returned
- *
- * @param name a string representation of the DNS host name to query
- * @param addr a preallocated ip_addr_t where to store the resolved IP address
- * @return ERR_OK: resolving succeeded
- *         ERR_MEM: memory error, try again later
- *         ERR_ARG: dns client not initialized or invalid hostname
- *         ERR_VAL: dns server response was invalid
- */
-#if LWIP_IPV4 && LWIP_IPV6
-err_t
-netconn_gethostbyname_addrtype(const char *name, ip_addr_t *addr, u8_t dns_addrtype)
-#else
-err_t
-netconn_gethostbyname(const char *name, ip_addr_t *addr)
-#endif
-{
-
-  API_VAR_DECLARE(struct dns_api_msg, msg);
-  err_t localerr;
-#if !LWIP_MPU_COMPATIBLE
-  sys_sem_t sem;
-#endif /* LWIP_MPU_COMPATIBLE */
-  err_t err = ERR_OK;
-
-  LWIP_ERROR("netconn_gethostbyname: invalid name", (name != NULL), return ERR_ARG;);
-  LWIP_ERROR("netconn_gethostbyname: invalid addr", (addr != NULL), return ERR_ARG;);
-#if LWIP_MPU_COMPATIBLE
-  if (strlen(name) >= DNS_MAX_NAME_LENGTH) {
-    return ERR_ARG;
-  }
-#endif
-
-  API_VAR_ALLOC(struct dns_api_msg, MEMP_DNS_API_MSG, msg);
-#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;
-#else /* LWIP_MPU_COMPATIBLE */
-  msg.err = &err;
-  msg.sem = &sem;
-  API_VAR_REF(msg).addr = API_VAR_REF(addr);
-  API_VAR_REF(msg).name = name;
-#endif /* LWIP_MPU_COMPATIBLE */
-#if LWIP_IPV4 && LWIP_IPV6
-  API_VAR_REF(msg).dns_addrtype = dns_addrtype;
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-
-
-#if LWIP_NETCONN_SEM_PER_THREAD
-  API_VAR_REF(msg).sem = LWIP_NETCONN_THREAD_SEM_GET();
-#else /* LWIP_NETCONN_SEM_PER_THREAD*/
-  err = sys_sem_new(API_EXPR_REF(API_VAR_REF(msg).sem), 0);
-  if (err != ERR_OK) {
-    API_VAR_FREE(MEMP_DNS_API_MSG, msg);
-    return err;
-  }
-#endif /* LWIP_NETCONN_SEM_PER_THREAD */
-
-  localerr = tcpip_callback(lwip_netconn_do_gethostbyname, &API_VAR_REF(msg));
-  if (localerr != 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 localerr;
-  }
-
-  sys_sem_wait(API_EXPR_REF_SEM(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 LWIP_MPU_COMPATIBLE
-  *addr = msg->addr;
-  err = msg->err;
-#endif /* LWIP_MPU_COMPATIBLE */
-
-  API_VAR_FREE(MEMP_DNS_API_MSG, msg);
-
-  return err;
-}
-#endif /* LWIP_DNS*/
-
-#if LWIP_NETCONN_SEM_PER_THREAD
-void
-netconn_thread_init(void)
-{
-  sys_sem_t *sem = LWIP_NETCONN_THREAD_SEM_GET();
-  if ((sem == NULL) || !sys_sem_valid(sem)) {
-    /* call alloc only once */
-    LWIP_NETCONN_THREAD_SEM_ALLOC();
-    LWIP_ASSERT("LWIP_NETCONN_THREAD_SEM_ALLOC() failed", sys_sem_valid(LWIP_NETCONN_THREAD_SEM_GET()));
-  }
-}
-
-void
-netconn_thread_cleanup(void)
-{
-  sys_sem_t *sem = LWIP_NETCONN_THREAD_SEM_GET();
-  if ((sem != NULL) && sys_sem_valid(sem)) {
-    /* call free only once */
-    LWIP_NETCONN_THREAD_SEM_FREE();
-  }
-}
-#endif /* LWIP_NETCONN_SEM_PER_THREAD */
-
-#endif /* LWIP_NETCONN */
diff --git a/components/lwip/api/api_msg.c b/components/lwip/api/api_msg.c
deleted file mode 100644 (file)
index 531bca2..0000000
+++ /dev/null
@@ -1,2003 +0,0 @@
-/**
- * @file
- * Sequential API Internal module
- *
- */
-
-/*
- * 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>
- *
- */
-
-#include "lwip/opt.h"
-
-#if LWIP_NETCONN /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/priv/api_msg.h"
-
-#include "lwip/ip.h"
-#include "lwip/udp.h"
-#include "lwip/tcp.h"
-#include "lwip/raw.h"
-
-#include "lwip/memp.h"
-#include "lwip/igmp.h"
-#include "lwip/dns.h"
-#include "lwip/mld6.h"
-#include "lwip/priv/tcpip_priv.h"
-
-#include <string.h>
-
-/* netconns are polled once per second (e.g. continue write on memory error) */
-#define NETCONN_TCP_POLL_INTERVAL 2
-
-#define SET_NONBLOCKING_CONNECT(conn, val)  do { if (val) { \
-  (conn)->flags |= 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)
-
-/* forward declarations */
-#if LWIP_TCP
-#if LWIP_TCPIP_CORE_LOCKING
-#define WRITE_DELAYED         , 1
-#define WRITE_DELAYED_PARAM   , u8_t delayed
-#else /* LWIP_TCPIP_CORE_LOCKING */
-#define WRITE_DELAYED
-#define WRITE_DELAYED_PARAM
-#endif /* LWIP_TCPIP_CORE_LOCKING */
-static err_t lwip_netconn_do_writemore(struct netconn *conn  WRITE_DELAYED_PARAM);
-
-#if ESP_LWIP
-#define SIG_CLOSE_PARAM  , bool sig_close
-#define SIG_CLOSE_TRUE   true
-#define SIG_CLOSE_FALSE  false
-#else
-#define SIG_CLOSE_PARAM  
-#define SIG_CLOSE_TRUE   
-#define SIG_CLOSE_FALSE  
-#endif
-
-#endif
-
-static err_t lwip_netconn_do_close_internal(struct netconn *conn  WRITE_DELAYED_PARAM SIG_CLOSE_PARAM);
-
-#if LWIP_RAW
-/**
- * Receive callback function for RAW netconns.
- * Doesn't 'eat' the packet, only copies it and sends it to
- * conn->recvmbox
- *
- * @see raw.h (struct raw_pcb.recv) for parameters and return value
- */
-static u8_t
-recv_raw(void *arg, struct raw_pcb *pcb, struct pbuf *p,
-    const ip_addr_t *addr)
-{
-  struct pbuf *q;
-  struct netbuf *buf;
-  struct netconn *conn;
-
-  LWIP_UNUSED_ARG(addr);
-  conn = (struct netconn *)arg;
-
-  if ((conn != NULL) && sys_mbox_valid(&conn->recvmbox)) {
-#if LWIP_SO_RCVBUF
-    int recv_avail;
-    SYS_ARCH_GET(conn->recv_avail, recv_avail);
-    if ((recv_avail + (int)(p->tot_len)) > conn->recv_bufsize) {
-      return 0;
-    }
-#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;
-      }
-    }
-
-    if (q != NULL) {
-      u16_t len;
-      buf = (struct netbuf *)memp_malloc(MEMP_NETBUF);
-      if (buf == NULL) {
-        pbuf_free(q);
-        return 0;
-      }
-
-      buf->p = q;
-      buf->ptr = q;
-      ip_addr_copy(buf->addr, *ip_current_src_addr());
-      buf->port = pcb->protocol;
-
-      len = q->tot_len;
-      if (sys_mbox_trypost(&conn->recvmbox, buf) != ERR_OK) {
-        ESP_STATS_DROP_INC(esp.rx_rawmbox_post_fail);
-        netbuf_delete(buf);
-        return 0;
-      } else {
-#if LWIP_SO_RCVBUF
-        SYS_ARCH_INC(conn->recv_avail, len);
-#endif /* LWIP_SO_RCVBUF */
-        /* Register event with callback */
-        API_EVENT(conn, NETCONN_EVT_RCVPLUS, len);
-      }
-    }
-  }
-
-  return 0; /* do not eat the packet */
-}
-#endif /* LWIP_RAW*/
-
-#if LWIP_UDP
-/**
- * Receive callback function for UDP netconns.
- * Posts the packet to conn->recvmbox or deletes it on memory error.
- *
- * @see udp.h (struct udp_pcb.recv) for parameters
- */
-static void
-recv_udp(void *arg, struct udp_pcb *pcb, struct pbuf *p,
-   const ip_addr_t *addr, u16_t port)
-{
-  struct netbuf *buf;
-  struct netconn *conn;
-  u16_t len;
-#if LWIP_SO_RCVBUF
-  int recv_avail;
-#endif /* LWIP_SO_RCVBUF */
-
-  LWIP_UNUSED_ARG(pcb); /* only used for asserts... */
-  LWIP_ASSERT("recv_udp must have a pcb argument", pcb != NULL);
-  LWIP_ASSERT("recv_udp must have an argument", arg != NULL);
-  conn = (struct netconn *)arg;
-  LWIP_ASSERT("recv_udp: recv for wrong pcb!", conn->pcb.udp == pcb);
-
-#if LWIP_SO_RCVBUF
-  SYS_ARCH_GET(conn->recv_avail, recv_avail);
-  if ((conn == NULL) || !sys_mbox_valid(&conn->recvmbox) ||
-      ((recv_avail + (int)(p->tot_len)) > conn->recv_bufsize)) {
-#else  /* LWIP_SO_RCVBUF */
-  if ((conn == NULL) || !sys_mbox_valid(&conn->recvmbox)) {
-#endif /* LWIP_SO_RCVBUF */
-    pbuf_free(p);
-    return;
-  }
-
-#if LWIP_IPV6
-  /* This should be eventually moved to a flag on the UDP PCB, and this drop can happen
-     more correctly in udp_input(). This will also allow icmp_dest_unreach() to be called. */
-  if (conn->flags & NETCONN_FLAG_IPV6_V6ONLY && !ip_current_is_v6()) {
-    LWIP_DEBUGF(API_MSG_DEBUG, ("recv_udp: Dropping IPv4 UDP packet (IPv6-only socket)"));
-    pbuf_free(p);
-    return;
-  }
-#endif
-
-  buf = (struct netbuf *)memp_malloc(MEMP_NETBUF);
-  if (buf == NULL) {
-    pbuf_free(p);
-    return;
-  } else {
-    buf->p = p;
-    buf->ptr = p;
-    ip_addr_set(&buf->addr, addr);
-    buf->port = port;
-#if LWIP_NETBUF_RECVINFO
-    {
-      /* 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
-      buf->flags = NETBUF_FLAG_DESTADDR;
-#endif /* LWIP_CHECKSUM_ON_COPY */
-      ip_addr_set(&buf->toaddr, ip_current_dest_addr());
-      buf->toport_chksum = udphdr->dest;
-    }
-#endif /* LWIP_NETBUF_RECVINFO */
-  }
-
-#if ESP_PERF
-  if (p->len > DBG_PERF_FILTER_LEN) {
-    DBG_PERF_PATH_SET(DBG_PERF_DIR_RX, DBG_PERF_POINT_LWIP_OUT);
-  }
-#endif
-
-  len = p->tot_len;
-  if (sys_mbox_trypost(&conn->recvmbox, buf) != ERR_OK) {
-    ESP_STATS_DROP_INC(esp.rx_udpmbox_post_fail);
-    netbuf_delete(buf);
-    return;
-  } else {
-#if LWIP_SO_RCVBUF
-    SYS_ARCH_INC(conn->recv_avail, len);
-#endif /* LWIP_SO_RCVBUF */
-    /* Register event with callback */
-    API_EVENT(conn, NETCONN_EVT_RCVPLUS, len);
-  }
-}
-#endif /* LWIP_UDP */
-
-#if LWIP_TCP
-/**
- * Receive callback function for TCP netconns.
- * Posts the packet to conn->recvmbox, but doesn't delete it on errors.
- *
- * @see tcp.h (struct tcp_pcb.recv) for parameters and return value
- */
-static err_t
-recv_tcp(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
-{
-  struct netconn *conn;
-  u16_t len;
-
-  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);
-  conn = (struct netconn *)arg;
-
-  if (conn == NULL) {
-    return ERR_VAL;
-  }
-  LWIP_ASSERT("recv_tcp: recv for wrong pcb!", conn->pcb.tcp == pcb);
-
-  if (!sys_mbox_valid(&conn->recvmbox)) {
-    /* recvmbox already deleted */
-    if (p != NULL) {
-      tcp_recved(pcb, p->tot_len);
-      pbuf_free(p);
-    }
-    return ERR_OK;
-  }
-  /* Unlike for UDP or RAW pcbs, don't check for available space
-     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) {
-    len = p->tot_len;
-  } else {
-    len = 0;
-  }
-
-  if (sys_mbox_trypost(&conn->recvmbox, p) != ERR_OK) {
-    ESP_STATS_DROP_INC(esp.rx_tcpmbox_post_fail);
-    /* don't deallocate p: it is presented to us later again from tcp_fasttmr! */
-    return ERR_MEM;
-  } else {
-#if LWIP_SO_RCVBUF
-    SYS_ARCH_INC(conn->recv_avail, len);
-#endif /* LWIP_SO_RCVBUF */
-    /* Register event with callback */
-    API_EVENT(conn, NETCONN_EVT_RCVPLUS, len);
-  }
-
-  return ERR_OK;
-}
-
-/**
- * Poll callback function for TCP netconns.
- * Wakes up an application thread that waits for a connection to close
- * or data to be sent. The application thread then takes the
- * appropriate action to go on.
- *
- * Signals the conn->sem.
- * netconn_close waits for conn->sem if closing failed.
- *
- * @see tcp.h (struct tcp_pcb.poll) for parameters and return value
- */
-static err_t
-poll_tcp(void *arg, struct tcp_pcb *pcb)
-{
-  struct netconn *conn = (struct netconn *)arg;
-  bool sig_close = false;
-
-  LWIP_UNUSED_ARG(pcb);
-  LWIP_ASSERT("conn != NULL", (conn != NULL));
-
-  if (conn->state == NETCONN_WRITE) {
-    lwip_netconn_do_writemore(conn  WRITE_DELAYED);
-  } else if (conn->state == NETCONN_CLOSE) {
-#if !LWIP_SO_SNDTIMEO && !LWIP_SO_LINGER
-    if (conn->current_msg && conn->current_msg->msg.sd.polls_left) {
-      conn->current_msg->msg.sd.polls_left--;
-    }
-#endif /* !LWIP_SO_SNDTIMEO && !LWIP_SO_LINGER */
-    /* Delay the netconn close until no one use 'conn' because close frees 'conn'*/
-    if (ERR_OK == lwip_netconn_do_close_internal(conn  WRITE_DELAYED, SIG_CLOSE_FALSE)) {
-      sig_close = true;
-    }
-  }
-  /* @todo: implement connect timeout here? */
-
-  /* Did a nonblocking write fail before? Then check available write-space. */
-  if (conn->flags & NETCONN_FLAG_CHECK_WRITESPACE) {
-    /* 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(conn->pcb.tcp)) &&
-      (tcp_sndqueuelen(conn->pcb.tcp) < TCP_SNDQUEUELOWAT(conn->pcb.tcp))) {
-      conn->flags &= ~NETCONN_FLAG_CHECK_WRITESPACE;
-      API_EVENT(conn, NETCONN_EVT_SENDPLUS, 0);
-    }
-  }
-
-#if ESP_LWIP
-  if (sig_close) {
-    sys_sem_t *op_completed_sem = LWIP_API_MSG_SEM(conn->current_msg);
-    conn->current_msg = NULL;
-    sys_sem_signal(op_completed_sem);
-    return ERR_ABRT;
-  }
-#endif
-
-  return ERR_OK;
-}
-
-/**
- * Sent callback function for TCP netconns.
- * Signals the conn->sem and calls API_EVENT.
- * netconn_write waits for conn->sem if send buffer is low.
- *
- * @see tcp.h (struct tcp_pcb.sent) for parameters and return value
- */
-static err_t
-sent_tcp(void *arg, struct tcp_pcb *pcb, u16_t len)
-{
-  struct netconn *conn = (struct netconn *)arg;
-  bool sig_close = false;
-
-  LWIP_UNUSED_ARG(pcb);
-  LWIP_ASSERT("conn != NULL", (conn != NULL));
-
-  if (conn) {
-    if (conn->state == NETCONN_WRITE) {
-      lwip_netconn_do_writemore(conn  WRITE_DELAYED);
-    } else if (conn->state == NETCONN_CLOSE) {
-      /* Delay the netconn close until no one use 'conn' because close frees 'conn'*/
-      if (ERR_OK ==  lwip_netconn_do_close_internal(conn  WRITE_DELAYED, SIG_CLOSE_FALSE)) {
-        sig_close = true;
-      }
-    }
-
-    /* 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(conn->pcb.tcp) &&
-      (tcp_sndqueuelen(conn->pcb.tcp) < TCP_SNDQUEUELOWAT(conn->pcb.tcp)))) {
-      conn->flags &= ~NETCONN_FLAG_CHECK_WRITESPACE;
-      API_EVENT(conn, NETCONN_EVT_SENDPLUS, len);
-    }
-
-#if ESP_LWIP
-    if (sig_close) {
-      sys_sem_t *op_completed_sem = LWIP_API_MSG_SEM(conn->current_msg);
-      conn->current_msg = NULL;
-      sys_sem_signal(op_completed_sem);
-      return ERR_ABRT;
-    }
-#endif
-  }
-
-  return ERR_OK;
-}
-
-/**
- * Error callback function for TCP netconns.
- * Signals conn->sem, posts to all conn mboxes and calls API_EVENT.
- * The application thread has then to decide what to do.
- *
- * @see tcp.h (struct tcp_pcb.err) for parameters
- */
-static void
-err_tcp(void *arg, err_t err)
-{
-  struct netconn *conn;
-  enum netconn_state old_state;
-
-  conn = (struct netconn *)arg;
-  LWIP_ASSERT("conn != NULL", (conn != NULL));
-
-  conn->pcb.tcp = NULL;
-
-  /* no check since this is always fatal! */
-  SYS_ARCH_SET(conn->last_err, err);
-
-  /* reset conn->state now before waking up other threads */
-  old_state = conn->state;
-  conn->state = NETCONN_NONE;
-
-  /* @todo: the type of NETCONN_EVT created should depend on 'old_state' */
-
-  /* Notify the user layer about a connection error. Used to signal select. */
-  API_EVENT(conn, NETCONN_EVT_ERROR, 0);
-  /* Try to release selects pending on 'read' or 'write', too.
-     They will get an error if they actually try to read or write. */
-  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)) {
-    /* use trypost to prevent deadlock */
-    if (sys_mbox_trypost(&conn->recvmbox, NULL) != ERR_OK){
-      ESP_STATS_DROP_INC(esp.err_tcp_rxmbox_post_fail);
-    }
-  }
-  /* pass NULL-message to acceptmbox to wake up pending accept */
-  if (sys_mbox_valid(&conn->acceptmbox)) {
-    /* use trypost to preven deadlock */
-    if (sys_mbox_trypost(&conn->acceptmbox, NULL) != ERR_OK) {
-      ESP_STATS_DROP_INC(esp.err_tcp_rxmbox_post_fail);
-    }
-  }
-
-  if ((old_state == NETCONN_WRITE) || (old_state == NETCONN_CLOSE) ||
-      (old_state == NETCONN_CONNECT)) {
-    /* calling lwip_netconn_do_writemore/lwip_netconn_do_close_internal is not necessary
-       since the pcb has already been deleted! */
-    int was_nonblocking_connect = IN_NONBLOCKING_CONNECT(conn);
-    SET_NONBLOCKING_CONNECT(conn, 0);
-
-    if (!was_nonblocking_connect) {
-      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;
-      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 {
-    LWIP_ASSERT("conn->current_msg == NULL", conn->current_msg == NULL);
-  }
-}
-
-/**
- * Setup a tcp_pcb with the correct callback function pointers
- * and their arguments.
- *
- * @param conn the TCP netconn to setup
- */
-static void
-setup_tcp(struct netconn *conn)
-{
-  struct tcp_pcb *pcb;
-
-  pcb = conn->pcb.tcp;
-  tcp_arg(pcb, conn);
-  tcp_recv(pcb, recv_tcp);
-  tcp_sent(pcb, sent_tcp);
-  tcp_poll(pcb, poll_tcp, NETCONN_TCP_POLL_INTERVAL);
-  tcp_err(pcb, err_tcp);
-}
-
-/**
- * Accept callback function for TCP netconns.
- * Allocates a new netconn and posts that to conn->acceptmbox.
- *
- * @see tcp.h (struct tcp_pcb_listen.accept) for parameters and return value
- */
-static err_t
-accept_function(void *arg, struct tcp_pcb *newpcb, err_t err)
-{
-  struct netconn *newconn;
-  struct netconn *conn = (struct netconn *)arg;
-
-  LWIP_DEBUGF(API_MSG_DEBUG, ("accept_function: newpcb->tate: %s\n", tcp_debug_state_str(newpcb->state)));
-
-  if (!sys_mbox_valid(&conn->acceptmbox)) {
-    LWIP_DEBUGF(API_MSG_DEBUG, ("accept_function: acceptmbox already deleted\n"));
-    return ERR_VAL;
-  }
-
-  /* We have to set the callback here even though
-   * the new socket is unknown. conn->socket is marked as -1. */
-  newconn = netconn_alloc(conn->type, conn->callback);
-  if (newconn == NULL) {
-    return ERR_MEM;
-  }
-  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);
-
-  if (sys_mbox_trypost(&conn->acceptmbox, newconn) != ERR_OK) {
-    ESP_STATS_DROP_INC(esp.acceptmbox_post_fail);
-    /* 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;
-    tcp_arg(pcb, NULL);
-    tcp_recv(pcb, NULL);
-    tcp_sent(pcb, NULL);
-    tcp_poll(pcb, NULL, 0);
-    tcp_err(pcb, NULL);
-    /* remove reference from to the pcb from this netconn */
-    newconn->pcb.tcp = NULL;
-    /* no need to drain since we know the recvmbox is empty. */
-    sys_mbox_free(&newconn->recvmbox);
-    sys_mbox_set_invalid(&newconn->recvmbox);
-    netconn_free(newconn);
-    return ERR_MEM;
-  } else {
-    /* Register event with callback */
-    API_EVENT(conn, NETCONN_EVT_RCVPLUS, 0);
-  }
-
-  return ERR_OK;
-}
-#endif /* LWIP_TCP */
-
-/**
- * Create a new pcb of a specific type.
- * Called from lwip_netconn_do_newconn().
- *
- * @param msg the api_msg_msg describing the connection type
- * @return msg->conn->err, but the return value is currently ignored
- */
-static void
-pcb_new(struct api_msg_msg *msg)
-{
-  LWIP_ASSERT("pcb_new: pcb already allocated", msg->conn->pcb.tcp == NULL);
-
-  /* Allocate a PCB for this connection */
-  switch(NETCONNTYPE_GROUP(msg->conn->type)) {
-#if LWIP_RAW
-  case NETCONN_RAW:
-    msg->conn->pcb.raw = raw_new(msg->msg.n.proto);
-    if (msg->conn->pcb.raw != NULL) {
-      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();
-    if (msg->conn->pcb.udp != NULL) {
-#if LWIP_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);
-      }
-      udp_recv(msg->conn->pcb.udp, recv_udp, msg->conn);
-    }
-    break;
-#endif /* LWIP_UDP */
-#if LWIP_TCP
-  case NETCONN_TCP:
-    msg->conn->pcb.tcp = tcp_new();
-    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;
-  }
-  if (msg->conn->pcb.ip == NULL) {
-    msg->err = ERR_MEM;
-  }
-#if LWIP_IPV4 && LWIP_IPV6
-  else {
-    if (NETCONNTYPE_ISIPV6(msg->conn->type)) {
-      /* Convert IPv4 PCB manually to an IPv6 PCB */
-      IP_SET_TYPE_VAL(msg->conn->pcb.ip->local_ip,  IPADDR_TYPE_V6);
-      IP_SET_TYPE_VAL(msg->conn->pcb.ip->remote_ip, IPADDR_TYPE_V6);
-    }
-  }
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-}
-
-/**
- * Create a new pcb of a specific type inside a netconn.
- * Called from netconn_new_with_proto_and_callback.
- *
- * @param msg the api_msg_msg describing the connection type
- */
-void
-lwip_netconn_do_newconn(void *m)
-{
-  struct api_msg_msg *msg = (struct api_msg_msg*)m;
-
-  msg->err = ERR_OK;
-  if (msg->conn->pcb.tcp == NULL) {
-    pcb_new(msg);
-  }
-  /* Else? This "new" connection already has a PCB allocated. */
-  /* Is this an error condition? Should it be deleted? */
-  /* We currently just are happy and return. */
-
-  TCPIP_APIMSG_ACK(msg);
-}
-
-/**
- * Create a new netconn (of a specific type) that has a callback function.
- * The corresponding pcb is NOT created!
- *
- * @param t the type of 'connection' to create (@see enum netconn_type)
- * @param proto the IP protocol for RAW IP pcbs
- * @param callback a function to call on status changes (RX available, TX'ed)
- * @return a newly allocated struct netconn or
- *         NULL on memory error
- */
-struct netconn*
-netconn_alloc(enum netconn_type t, netconn_callback callback)
-{
-  struct netconn *conn;
-  int size;
-
-  conn = (struct netconn *)memp_malloc(MEMP_NETCONN);
-  if (conn == NULL) {
-    return NULL;
-  }
-
-  conn->last_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)) {
-#if LWIP_RAW
-  case NETCONN_RAW:
-    size = DEFAULT_RAW_RECVMBOX_SIZE;
-    break;
-#endif /* LWIP_RAW */
-#if LWIP_UDP
-  case NETCONN_UDP:
-    size = DEFAULT_UDP_RECVMBOX_SIZE;
-    break;
-#endif /* LWIP_UDP */
-#if LWIP_TCP
-  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;
-  }
-
-  if (sys_mbox_new(&conn->recvmbox, size) != ERR_OK) {
-    goto free_and_return;
-  }
-#if !LWIP_NETCONN_SEM_PER_THREAD
-  if (sys_sem_new(&conn->op_completed, 0) != ERR_OK) {
-    sys_mbox_free(&conn->recvmbox);
-    goto free_and_return;
-  }
-#endif
-
-#if LWIP_TCP
-  sys_mbox_set_invalid(&conn->acceptmbox);
-#endif
-  conn->state        = NETCONN_NONE;
-#if LWIP_SOCKET
-  /* initialize socket to -1 since 0 is a valid socket */
-  conn->socket       = -1;
-#endif /* LWIP_SOCKET */
-  conn->callback     = callback;
-#if LWIP_TCP
-  conn->current_msg  = NULL;
-  conn->write_offset = 0;
-#endif /* LWIP_TCP */
-#if LWIP_SO_SNDTIMEO
-  conn->send_timeout = 0;
-#endif /* LWIP_SO_SNDTIMEO */
-#if LWIP_SO_RCVTIMEO
-  conn->recv_timeout = 0;
-#endif /* LWIP_SO_RCVTIMEO */
-#if LWIP_SO_RCVBUF
-  conn->recv_bufsize = RECV_BUFSIZE_DEFAULT;
-  conn->recv_avail   = 0;
-#endif /* LWIP_SO_RCVBUF */
-#if LWIP_SO_LINGER
-  conn->linger = -1;
-#endif /* LWIP_SO_LINGER */
-  conn->flags = 0;
-  return conn;
-free_and_return:
-  memp_free(MEMP_NETCONN, conn);
-  return NULL;
-}
-
-/**
- * Delete a netconn and all its resources.
- * The pcb is NOT freed (since we might not be in the right thread context do this).
- *
- * @param conn the netconn to free
- */
-void
-netconn_free(struct netconn *conn)
-{
-  LWIP_ASSERT("PCB must be deallocated outside this function", conn->pcb.tcp == NULL);
-  LWIP_ASSERT("recvmbox must be deallocated before calling this function",
-    !sys_mbox_valid(&conn->recvmbox));
-#if LWIP_TCP
-  LWIP_ASSERT("acceptmbox must be deallocated before calling this function",
-    !sys_mbox_valid(&conn->acceptmbox));
-#endif /* LWIP_TCP */
-
-#if !LWIP_NETCONN_SEM_PER_THREAD
-  sys_sem_free(&conn->op_completed);
-  sys_sem_set_invalid(&conn->op_completed);
-#endif
-
-  memp_free(MEMP_NETCONN, conn);
-}
-
-/**
- * Delete rcvmbox and acceptmbox of a netconn and free the left-over data in
- * these mboxes
- *
- * @param conn the netconn to free
- * @bytes_drained bytes drained from recvmbox
- * @accepts_drained pending connections drained from acceptmbox
- */
-static void
-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 */
-
-  /* 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 */
-      {
-        netbuf_delete((struct netbuf *)mem);
-      }
-    }
-    sys_mbox_free(&conn->recvmbox);
-    sys_mbox_set_invalid(&conn->recvmbox);
-  }
-
-  /* Delete and drain the acceptmbox. */
-#if LWIP_TCP
-  if (sys_mbox_valid(&conn->acceptmbox)) {
-    while (sys_mbox_tryfetch(&conn->acceptmbox, &mem) != SYS_MBOX_EMPTY) {
-      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() */
-      if (conn->pcb.tcp != NULL) {
-        tcp_accepted(conn->pcb.tcp);
-      }
-      /* drain recvmbox */
-      netconn_drain(newconn);
-      if (newconn->pcb.tcp != NULL) {
-        tcp_abort(newconn->pcb.tcp);
-        newconn->pcb.tcp = NULL;
-      }
-      netconn_free(newconn);
-    }
-    sys_mbox_free(&conn->acceptmbox);
-    sys_mbox_set_invalid(&conn->acceptmbox);
-  }
-#endif /* LWIP_TCP */
-}
-
-#if LWIP_TCP
-/**
- * Internal helper function to close a TCP netconn: since this sometimes
- * doesn't work at the first attempt, this function is called from multiple
- * places.
- *
- * @param conn the TCP netconn to close
- * [@param delay 1 if called from sent/poll (wake up calling thread on end)]
- */
-static err_t
-lwip_netconn_do_close_internal(struct netconn *conn  WRITE_DELAYED_PARAM SIG_CLOSE_PARAM)
-{
-  err_t err;
-  u8_t shut, shut_rx, shut_tx, close;
-  u8_t close_finished = 0;
-  struct tcp_pcb* tpcb;
-#if LWIP_SO_LINGER
-  u8_t linger_wait_required = 0;
-#endif /* LWIP_SO_LINGER */
-
-  LWIP_ASSERT("invalid conn", (conn != NULL));
-  LWIP_ASSERT("this is for tcp netconns only", (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP));
-  LWIP_ASSERT("conn must be in state NETCONN_CLOSE", (conn->state == NETCONN_CLOSE));
-  LWIP_ASSERT("pcb already closed", (conn->pcb.tcp != NULL));
-  LWIP_ASSERT("conn->current_msg != NULL", conn->current_msg != NULL);
-
-  tpcb = conn->pcb.tcp;
-  shut = conn->current_msg->msg.sd.shut;
-  shut_rx = shut & NETCONN_SHUT_RD;
-  shut_tx = shut & NETCONN_SHUT_WR;
-  /* 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;
-  } else if (shut_rx &&
-             ((tpcb->state == FIN_WAIT_1) ||
-              (tpcb->state == FIN_WAIT_2) ||
-              (tpcb->state == CLOSING))) {
-    close = 1;
-  } else if (shut_tx && ((tpcb->flags & TF_RXCLOSED) != 0)) {
-    close = 1;
-  } else {
-    close = 0;
-  }
-
-  /* Set back some callback pointers */
-  if (close) {
-    tcp_arg(tpcb, NULL);
-  }
-  if (tpcb->state == LISTEN) {
-    tcp_accept(tpcb, NULL);
-  } else {
-    /* some callbacks have to be reset if tcp_close is not successful */
-    if (shut_rx) {
-      tcp_recv(tpcb, NULL);
-      tcp_accept(tpcb, NULL);
-    }
-    if (shut_tx) {
-      tcp_sent(tpcb, NULL);
-    }
-    if (close) {
-      tcp_poll(tpcb, NULL, 0);
-      tcp_err(tpcb, NULL);
-    }
-  }
-  /* Try to close the connection */
-  if (close) {
-#if LWIP_SO_LINGER
-    /* check linger possibilites before calling tcp_close */
-    err = ERR_OK;
-    /* linger enabled/required at all? (i.e. is there untransmitted data left?) */
-    if ((conn->linger >= 0) && (conn->pcb.tcp->unsent || conn->pcb.tcp->unacked)) {
-      if ((conn->linger == 0)) {
-        /* data left but linger prevents waiting */
-        tcp_abort(tpcb);
-        tpcb = NULL;
-      } else if (conn->linger > 0) {
-        /* data left and linger says we should wait */
-        if (netconn_is_nonblocking(conn)) {
-          /* 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)) {
-          /* data left but linger timeout has expired (this happens on further
-             calls to this function through poll_tcp */
-          tcp_abort(tpcb);
-          tpcb = NULL;
-        } else {
-          /* data left -> need to wait for ACK after successful close */
-          linger_wait_required = 1;
-        }
-      }
-    }
-    if ((err == ERR_OK) && (tpcb != NULL))
-#endif /* LWIP_SO_LINGER */
-    {
-      err = tcp_close(tpcb);
-    }
-  } else {
-    err = tcp_shutdown(tpcb, shut_rx, shut_tx);
-  }
-  if (err == ERR_OK) {
-    close_finished = 1;
-#if LWIP_SO_LINGER
-    if (linger_wait_required) {
-      /* wait for ACK of all unsent/unacked data by just getting called again */
-      close_finished = 0;
-      err = ERR_INPROGRESS;
-    }
-#endif /* LWIP_SO_LINGER */
-  } else {
-    if (err == ERR_MEM) {
-      /* Closing failed because of memory shortage */
-      if (netconn_is_nonblocking(conn)) {
-        /* Nonblocking close failed */
-        close_finished = 1;
-        err = ERR_WOULDBLOCK;
-      } else {
-        /* Blocking close, check the timeout */
-#if LWIP_SO_SNDTIMEO || LWIP_SO_LINGER
-        s32_t close_timeout = LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT;
-        /* this is kind of an lwip addition to the standard sockets: we wait
-           for some time when failing to allocate a segment for the FIN */
-#if LWIP_SO_SNDTIMEO
-        if (conn->send_timeout > 0) {
-          close_timeout = conn->send_timeout;
-        }
-#endif /* LWIP_SO_SNDTIMEO */
-#if LWIP_SO_LINGER
-        if (conn->linger >= 0) {
-          /* use linger timeout (seconds) */
-          close_timeout = conn->linger * 1000U;
-        }
-#endif
-        if ((s32_t)(sys_now() - conn->current_msg->msg.sd.time_started) >= close_timeout) {
-#else /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */
-        if (conn->current_msg->msg.sd.polls_left == 0) {
-#endif /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */
-          close_finished = 1;
-          if (close) {
-            /* in this case, we want to RST the connection */
-            tcp_abort(tpcb);
-            err = ERR_OK;
-          }
-        }
-      }
-    } else {
-      /* Closing failed for a non-memory error: give up */
-      close_finished = 1;
-    }
-  }
-  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);
-    conn->current_msg->err = err;
-    conn->state = NETCONN_NONE;
-    if (err == ERR_OK) {
-      if (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
-         on the connection, error first! */
-        API_EVENT(conn, NETCONN_EVT_ERROR, 0);
-      }
-      if (shut_rx) {
-        API_EVENT(conn, NETCONN_EVT_RCVPLUS, 0);
-      }
-      if (shut_tx) {
-        API_EVENT(conn, NETCONN_EVT_SENDPLUS, 0);
-      }
-    }
-    NETCONN_SET_SAFE_ERR(conn, err);
-#if LWIP_TCPIP_CORE_LOCKING
-    if (delayed)
-#endif
-    {
-      /* wake up the application task */
-#if ESP_LWIP
-      if (sig_close) {
-        conn->current_msg = NULL;
-        sys_sem_signal(op_completed_sem);
-      }
-#else
-      conn->current_msg = NULL;
-      sys_sem_signal(op_completed_sem);
-#endif
-    }
-    return ERR_OK;
-  }
-  if (!close_finished) {
-    /* Closing failed and we want to wait: restore some of the callbacks */
-    /* Closing of listen pcb will never fail! */
-    LWIP_ASSERT("Closing a listen pcb may not fail!", (tpcb->state != LISTEN));
-    if (shut_tx) {
-      tcp_sent(tpcb, sent_tcp);
-    }
-    /* when waiting for close, set up poll interval to 500ms */
-    tcp_poll(tpcb, poll_tcp, 1);
-    tcp_err(tpcb, err_tcp);
-    tcp_arg(tpcb, conn);
-    /* don't restore recv callback: we don't want to receive any more data */
-  }
-  /* If closing didn't succeed, we get called again either
-     from poll_tcp or from sent_tcp */
-  LWIP_ASSERT("err != ERR_OK", err != ERR_OK);
-  return err;
-}
-#endif /* LWIP_TCP */
-
-/**
- * Delete the pcb inside a netconn.
- * Called from netconn_delete.
- *
- * @param msg the api_msg_msg pointing to the connection
- */
-void
-lwip_netconn_do_delconn(void *m)
-{
-  struct api_msg_msg *msg = (struct api_msg_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));
-
-  msg->err = ERR_OK;
-
-#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;
-      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);
-      msg->err = ERR_INPROGRESS;
-      sys_sem_signal(op_completed_sem);
-    }
-  }
-#else /* LWIP_NETCONN_FULLDUPLEX */
-  if (((state != NETCONN_NONE) &&
-       (state != NETCONN_LISTEN) &&
-       (state != NETCONN_CONNECT)) ||
-      ((state == NETCONN_CONNECT) && !IN_NONBLOCKING_CONNECT(msg->conn))) {
-    /* This means either a blocking write or blocking connect is running
-       (nonblocking write returns and sets state to NONE) */
-    msg->err = ERR_INPROGRESS;
-  } else
-#endif /* LWIP_NETCONN_FULLDUPLEX */
-  {
-    /* Drain and delete mboxes */
-    netconn_drain(msg->conn);
-
-    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;
-#endif /* LWIP_RAW */
-#if LWIP_UDP
-      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;
-#if LWIP_TCPIP_CORE_LOCKING
-        if (lwip_netconn_do_close_internal(msg->conn, 0, SIG_CLOSE_TRUE) != 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, SIG_CLOSE_TRUE);
-#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;
-#endif /* LWIP_TCP */
-      default:
-        break;
-      }
-      msg->conn->pcb.tcp = NULL;
-    }
-    /* tcp netconns don't come here! */
-
-    /* @todo: this lets select make the socket readable and writable,
-       which is wrong! errfd instead? */
-    API_EVENT(msg->conn, NETCONN_EVT_RCVPLUS, 0);
-    API_EVENT(msg->conn, NETCONN_EVT_SENDPLUS, 0);
-  }
-  if (sys_sem_valid(LWIP_API_MSG_SEM(msg))) {
-    TCPIP_APIMSG_ACK(msg);
-  }
-}
-
-/**
- * Bind a pcb contained in a netconn
- * Called from netconn_bind.
- *
- * @param msg the api_msg_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 *msg = (struct api_msg_msg*)m;
-
-  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) {
-      const ip_addr_t *ipaddr = API_EXPR_REF(msg->msg.bc.ipaddr);
-
-#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 NOT set, use IP_ANY_TYPE to bind
-       */
-      if (ip_addr_cmp(ipaddr, IP6_ADDR_ANY) &&
-          (netconn_get_ipv6only(msg->conn) == 0)) {
-        /* change PCB type to IPADDR_TYPE_ANY */
-        IP_SET_TYPE_VAL(msg->conn->pcb.ip->local_ip,  IPADDR_TYPE_ANY);
-        IP_SET_TYPE_VAL(msg->conn->pcb.ip->remote_ip, IPADDR_TYPE_ANY);
-        
-        /* bind to IPADDR_TYPE_ANY */
-        ipaddr = IP_ANY_TYPE;
-      }
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-
-      switch (NETCONNTYPE_GROUP(msg->conn->type)) {
-#if LWIP_RAW
-      case NETCONN_RAW:
-        msg->err = raw_bind(msg->conn->pcb.raw, ipaddr);
-        break;
-#endif /* LWIP_RAW */
-#if LWIP_UDP
-      case NETCONN_UDP:
-        msg->err = udp_bind(msg->conn->pcb.udp, ipaddr, msg->msg.bc.port);
-        break;
-#endif /* LWIP_UDP */
-#if LWIP_TCP
-      case NETCONN_TCP:
-        msg->err = tcp_bind(msg->conn->pcb.tcp, ipaddr, msg->msg.bc.port);
-        break;
-#endif /* LWIP_TCP */
-      default:
-        break;
-      }
-    }
-  }
-  TCPIP_APIMSG_ACK(msg);
-}
-
-#if LWIP_TCP
-/**
- * TCP callback function if a connection (opened by tcp_connect/lwip_netconn_do_connect) has
- * been established (or reset by the remote host).
- *
- * @see tcp.h (struct tcp_pcb.connected) for parameters and return values
- */
-static err_t
-lwip_netconn_do_connected(void *arg, struct tcp_pcb *pcb, err_t err)
-{
-  struct netconn *conn;
-  int was_blocking;
-  sys_sem_t* op_completed_sem = NULL;
-
-  LWIP_UNUSED_ARG(pcb);
-
-  conn = (struct netconn *)arg;
-
-  if (conn == NULL) {
-    return ERR_VAL;
-  }
-
-  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));
-
-  if (conn->current_msg != NULL) {
-    conn->current_msg->err = err;
-    op_completed_sem = LWIP_API_MSG_SEM(conn->current_msg);
-  }
-  if ((NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP) && (err == ERR_OK)) {
-    setup_tcp(conn);
-  }
-  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));
-  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) {
-    sys_sem_signal(op_completed_sem);
-  }
-  return ERR_OK;
-}
-#endif /* LWIP_TCP */
-
-/**
- * Connect a pcb contained inside a netconn
- * Called from netconn_connect.
- *
- * @param msg the api_msg_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 *msg = (struct api_msg_msg*)m;
-
-  if (msg->conn->pcb.tcp == NULL) {
-    /* This may happen when calling netconn_connect() a second time */
-    msg->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;
-#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;
-#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! */
-#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);
-#endif /* LWIP_TCPIP_CORE_LOCKING */
-            return;
-          }
-        }
-      }
-      break;
-#endif /* LWIP_TCP */
-    default:
-      LWIP_ERROR("Invalid netconn type", 0, do{ msg->err = ERR_VAL; }while(0));
-      break;
-    }
-  }
-  /* For all other protocols, netconn_connect() calls TCPIP_APIMSG(),
-     so use TCPIP_APIMSG_ACK() here. */
-  TCPIP_APIMSG_ACK(msg);
-}
-
-/**
- * Disconnect a pcb contained inside a netconn
- * Only used for UDP netconns.
- * Called from netconn_disconnect.
- *
- * @param msg the api_msg_msg pointing to the connection to disconnect
- */
-void
-lwip_netconn_do_disconnect(void *m)
-{
-  struct api_msg_msg *msg = (struct api_msg_msg*)m;
-
-#if LWIP_UDP
-  if (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_UDP) {
-    udp_disconnect(msg->conn->pcb.udp);
-    msg->err = ERR_OK;
-  } else
-#endif /* LWIP_UDP */
-  {
-    msg->err = ERR_VAL;
-  }
-  TCPIP_APIMSG_ACK(msg);
-}
-
-#if LWIP_TCP
-/**
- * Set a TCP pcb contained in a netconn into listen mode
- * Called from netconn_listen.
- *
- * @param msg the api_msg_msg pointing to the connection
- */
-void
-lwip_netconn_do_listen(void *m)
-{
-  struct api_msg_msg *msg = (struct api_msg_msg*)m;
-
-  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 {
-#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);
-            }
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-
-#if TCP_LISTEN_BACKLOG
-            lpcb = tcp_listen_with_backlog(msg->conn->pcb.tcp, msg->msg.lb.backlog);
-#else  /* TCP_LISTEN_BACKLOG */
-            lpcb = tcp_listen(msg->conn->pcb.tcp);
-#endif /* TCP_LISTEN_BACKLOG */
-
-            if (lpcb == NULL) {
-              /* in this case, the old pcb is still allocated */
-              msg->err = ERR_MEM;
-            } 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;
-              }
-            }
-          }
-        } else if (msg->conn->state == NETCONN_LISTEN) {
-          /* already listening, allow updating of the backlog */
-          msg->err = ERR_OK;
-#if TCP_LISTEN_BACKLOG
-          tcp_backlog_set(msg->conn->pcb.tcp, msg->msg.lb.backlog);
-#endif /* TCP_LISTEN_BACKLOG */
-        }
-      } else {
-        msg->err = ERR_ARG;
-      }
-    }
-  }
-  TCPIP_APIMSG_ACK(msg);
-}
-#endif /* LWIP_TCP */
-
-/**
- * Send some data on a RAW or UDP pcb contained in a netconn
- * Called from netconn_send
- *
- * @param msg the api_msg_msg pointing to the connection
- */
-void ESP_IRAM_ATTR
-lwip_netconn_do_send(void *m)
-{
-  struct api_msg_msg *msg = (struct api_msg_msg*)m;
-
-  if (ERR_IS_FATAL(msg->conn->last_err)) {
-    msg->err = msg->conn->last_err;
-#if LWIP_IPV4 && LWIP_IPV6
-  } else if ((msg->conn->flags & NETCONN_FLAG_IPV6_V6ONLY) &&
-             IP_IS_V4MAPPEDV6(&msg->msg.b->addr)) {
-    LWIP_DEBUGF(API_MSG_DEBUG, ("lwip_netconn_do_send: Dropping IPv4 packet on IPv6-only socket"));
-    msg->err = ERR_VAL;
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-  } else {
-    msg->err = ERR_CONN;
-    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)) {
-          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;
-#endif
-#if LWIP_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);
-        }
-#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);
-        }
-#endif /* LWIP_CHECKSUM_ON_COPY */
-        break;
-#endif /* LWIP_UDP */
-      default:
-        break;
-      }
-    }
-  }
-  TCPIP_APIMSG_ACK(msg);
-}
-
-#if LWIP_TCP
-/**
- * Indicate data has been received from a TCP pcb contained in a netconn
- * Called from netconn_recv
- *
- * @param msg the api_msg_msg pointing to the connection
- */
-void
-lwip_netconn_do_recv(void *m)
-{
-  struct api_msg_msg *msg = (struct api_msg_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;
-      do {
-        u16_t recved = (remaining > 0xffff) ? 0xffff : (u16_t)remaining;
-        tcp_recved(msg->conn->pcb.tcp, recved);
-        remaining -= recved;
-      } while (remaining != 0);
-    }
-  }
-  TCPIP_APIMSG_ACK(msg);
-}
-
-#if TCP_LISTEN_BACKLOG
-/** Indicate that a TCP pcb has been accepted
- * Called from netconn_accept
- *
- * @param m the api_msg pointing to the connection
- */
-void
-lwip_netconn_do_accepted(void *m)
-{
-  struct api_msg_msg *msg = (struct api_msg_msg *)m;
-
-  msg->err = ERR_OK;
-  if (msg->conn->pcb.tcp != NULL) {
-    if (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_TCP) {
-      tcp_backlog_accepted(msg->conn->pcb.tcp);
-    }
-  }
-  TCPIP_APIMSG_ACK(msg);
-}
-#endif /* TCP_LISTEN_BACKLOG */
-
-/**
- * See if more data needs to be written from a previous call to netconn_write.
- * Called initially from lwip_netconn_do_write. If the first call can't send all data
- * (because of low memory or empty send-buffer), this function is called again
- * from sent_tcp() or poll_tcp() to send more data. If all data is sent, the
- * blocking application thread (waiting in netconn_write) is released.
- *
- * @param conn netconn (that is currently in state NETCONN_WRITE) to process
- * [@param delay 1 if called from sent/poll (wake up calling thread on end)]
- * @return ERR_OK
- *         ERR_MEM if LWIP_TCPIP_CORE_LOCKING=1 and sending hasn't yet finished
- */
-static err_t
-lwip_netconn_do_writemore(struct netconn *conn  WRITE_DELAYED_PARAM)
-{
-  err_t err;
-  const void *dataptr;
-  u16_t len, available;
-  u8_t write_finished = 0;
-  size_t diff;
-  u8_t dontblock;
-  u8_t apiflags;
-
-  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);
-
-  dontblock = netconn_is_nonblocking(conn) ||
-       (conn->current_msg->msg.w.apiflags & NETCONN_DONTBLOCK);
-  apiflags = conn->current_msg->msg.w.apiflags;
-
-#if LWIP_SO_SNDTIMEO
-  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) {
-      /* 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 {
-        apiflags |= TCP_WRITE_FLAG_MORE;
-      }
-    }
-    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);
-    /* 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)) {
-        /* 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);
-        conn->flags |= NETCONN_FLAG_CHECK_WRITESPACE;
-      } else if ((tcp_sndbuf(conn->pcb.tcp) <= TCP_SNDLOWAT(conn->pcb.tcp)) ||
-                 (tcp_sndqueuelen(conn->pcb.tcp) >= TCP_SNDQUEUELOWAT(conn->pcb.tcp))) {
-        /* 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);
-      }
-    }
-
-    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 */
-        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,
-           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) && !dontblock) {
-      /* If ERR_MEM, we wait for sent_tcp or poll_tcp to be called
-         we do NOT return to the application thread, since ERR_MEM is
-         only a temporary error! */
-
-      /* 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,
-           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 {
-      }
-    } 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);
-
-    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
-    {
-      sys_sem_signal(op_completed_sem);
-    }
-  }
-#if LWIP_TCPIP_CORE_LOCKING
-  else {
-    return ERR_MEM;
-  }
-#endif
-  return ERR_OK;
-}
-#endif /* LWIP_TCP */
-
-/**
- * Send some data on a TCP pcb contained in a netconn
- * Called from netconn_write
- *
- * @param msg the api_msg_msg pointing to the connection
- */
-void
-lwip_netconn_do_write(void *m)
-{
-  struct api_msg_msg *msg = (struct api_msg_msg*)m;
-
-  if (ERR_IS_FATAL(msg->conn->last_err)) {
-    msg->err = msg->conn->last_err;
-  } else {
-    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;
-      } 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("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);
-          UNLOCK_TCPIP_CORE();
-          sys_arch_sem_wait(LWIP_API_MSG_SEM(msg), 0);
-          LOCK_TCPIP_CORE();
-          LWIP_ASSERT("state!", msg->conn->state != NETCONN_WRITE);
-        }
-#else /* LWIP_TCPIP_CORE_LOCKING */
-        lwip_netconn_do_writemore(msg->conn);
-#endif /* LWIP_TCPIP_CORE_LOCKING */
-        /* for both cases: if lwip_netconn_do_writemore was called, don't ACK the APIMSG
-           since lwip_netconn_do_writemore ACKs it! */
-        return;
-      } else {
-        msg->err = ERR_CONN;
-      }
-#else /* LWIP_TCP */
-      msg->err = ERR_VAL;
-#endif /* LWIP_TCP */
-#if (LWIP_UDP || LWIP_RAW)
-    } else {
-      msg->err = ERR_VAL;
-#endif /* (LWIP_UDP || LWIP_RAW) */
-    }
-  }
-  TCPIP_APIMSG_ACK(msg);
-}
-
-/**
- * Return a connection's local or remote address
- * Called from netconn_getaddr
- *
- * @param msg the api_msg_msg pointing to the connection
- */
-void
-lwip_netconn_do_getaddr(void *m)
-{
-  struct api_msg_msg *msg = (struct api_msg_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);
-    } else {
-      ip_addr_copy(API_EXPR_DEREF(msg->msg.ad.ipaddr),
-        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;
-#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;
-        } else {
-          API_EXPR_DEREF(msg->msg.ad.port) = msg->conn->pcb.udp->remote_port;
-        }
-      }
-      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;
-#endif /* LWIP_TCP */
-    default:
-      LWIP_ASSERT("invalid netconn_type", 0);
-      break;
-    }
-  } else {
-    msg->err = ERR_CONN;
-  }
-  TCPIP_APIMSG_ACK(msg);
-}
-
-/**
- * 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.
- *
- * @param msg the api_msg_msg pointing to the connection
- */
-void
-lwip_netconn_do_close(void *m)
-{
-  struct api_msg_msg *msg = (struct api_msg_msg*)m;
-
-#if LWIP_TCP
-  enum netconn_state state = msg->conn->state;
-  /* First check if this is a TCP netconn and if it is in a correct state
-      (LISTEN doesn't support half shutdown) */
-  if ((msg->conn->pcb.tcp != NULL) &&
-      (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_TCP) &&
-      ((msg->msg.sd.shut == NETCONN_SHUT_RDWR) || (state != NETCONN_LISTEN))) {
-    /* Check if we are in a connected state */
-    if (state == NETCONN_CONNECT) {
-      /* TCP connect in progress: cannot shutdown */
-      msg->err = ERR_CONN;
-    } else if (state == NETCONN_WRITE) {
-#if LWIP_NETCONN_FULLDUPLEX
-      if (msg->msg.sd.shut & NETCONN_SHUT_WR) {
-        /* close requested, abort running write */
-        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);
-      } else {
-        LWIP_ASSERT("msg->msg.sd.shut == NETCONN_SHUT_RD", msg->msg.sd.shut == NETCONN_SHUT_RD);
-        /* In this case, let the write continue and do not interfere with
-           conn->current_msg or conn->state! */
-        msg->err = tcp_shutdown(msg->conn->pcb.tcp, 1, 0);
-      }
-#else /* LWIP_NETCONN_FULLDUPLEX */
-      msg->err = ERR_INPROGRESS;
-#endif /* LWIP_NETCONN_FULLDUPLEX */
-    } else {
-      if (msg->msg.sd.shut & NETCONN_SHUT_RD) {
-        /* Drain and delete mboxes */
-        netconn_drain(msg->conn);
-      }
-      LWIP_ASSERT("already writing or closing", msg->conn->current_msg == NULL &&
-        msg->conn->write_offset == 0);
-      msg->conn->state = NETCONN_CLOSE;
-      msg->conn->current_msg = msg;
-#if LWIP_TCPIP_CORE_LOCKING
-      if (lwip_netconn_do_close_internal(msg->conn, 0, SIG_CLOSE_TRUE) != 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, SIG_CLOSE_TRUE);
-#endif /* LWIP_TCPIP_CORE_LOCKING */
-      /* for tcp netconns, lwip_netconn_do_close_internal ACKs the message */
-      return;
-    }
-  } else
-#endif /* LWIP_TCP */
-  {
-    msg->err = ERR_CONN;
-  }
-  TCPIP_APIMSG_ACK(msg);
-}
-
-#if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD)
-/**
- * Join multicast groups for UDP netconns.
- * Called from netconn_join_leave_group
- *
- * @param msg the api_msg_msg pointing to the connection
- */
-void
-lwip_netconn_do_join_leave_group(void *m)
-{
-  struct api_msg_msg *msg = (struct api_msg_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) {
-#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)));
-          }
-        }
-        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 */
-        }
-#endif /* LWIP_UDP */
-#if (LWIP_TCP || LWIP_RAW)
-      } else {
-        msg->err = ERR_VAL;
-#endif /* (LWIP_TCP || LWIP_RAW) */
-      }
-    } else {
-      msg->err = ERR_CONN;
-    }
-  }
-  TCPIP_APIMSG_ACK(msg);
-}
-#endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */
-
-#if LWIP_DNS
-/**
- * Callback function that is called when DNS name is resolved
- * (or on timeout). A waiting application thread is waked up by
- * signaling the semaphore.
- */
-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;
-
-  /* we trust the internal implementation to be correct :-) */
-  LWIP_UNUSED_ARG(name);
-
-  if (ipaddr == NULL) {
-    /* timeout or memory error */
-    API_EXPR_DEREF(msg->err) = ERR_VAL;
-  } else {
-    /* address was resolved */
-    API_EXPR_DEREF(msg->err) = ERR_OK;
-    API_EXPR_DEREF(msg->addr) = *ipaddr;
-  }
-  /* wake up the application task waiting in netconn_gethostbyname */
-  sys_sem_signal(API_EXPR_REF_SEM(msg->sem));
-}
-
-/**
- * Execute a DNS query
- * Called from netconn_gethostbyname
- *
- * @param arg the dns_api_msg pointing to the query
- */
-void
-lwip_netconn_do_gethostbyname(void *arg)
-{
-  struct dns_api_msg *msg = (struct dns_api_msg*)arg;
-  u8_t addrtype =
-#if LWIP_IPV4 && LWIP_IPV6
-    msg->dns_addrtype;
-#else
-    LWIP_DNS_ADDRTYPE_DEFAULT;
-#endif
-
-  API_EXPR_DEREF(msg->err) = dns_gethostbyname_addrtype(msg->name,
-    API_EXPR_REF(msg->addr), lwip_netconn_do_dns_found, msg, addrtype);
-  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_DNS */
-
-#endif /* LWIP_NETCONN */
diff --git a/components/lwip/api/err.c b/components/lwip/api/err.c
deleted file mode 100644 (file)
index f3650f4..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-/**
- * @file
- * Error Management module
- *
- */
-
-/*
- * 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>
- *
- */
-
-#include "lwip/err.h"
-
-#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 */
-};
-
-/**
- * Convert an lwip internal error to a string representation.
- *
- * @param err an lwip internal err_t
- * @return a string representation for err
- */
-const char *
-lwip_strerr(err_t err)
-{
-  return err_strerr[-err];
-}
-
-#endif /* LWIP_DEBUG */
diff --git a/components/lwip/api/netbuf.c b/components/lwip/api/netbuf.c
deleted file mode 100644 (file)
index 2c33549..0000000
+++ /dev/null
@@ -1,245 +0,0 @@
-/**
- * @file
- * Network buffer management
- *
- */
-
-/*
- * 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>
- *
- */
-
-#include "lwip/opt.h"
-
-#if LWIP_NETCONN /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/netbuf.h"
-#include "lwip/memp.h"
-
-#include <string.h>
-
-/**
- * Create (allocate) and initialize a new netbuf.
- * The netbuf doesn't yet contain a packet buffer!
- *
- * @return a pointer to a new netbuf
- *         NULL on lack of memory
- */
-struct
-netbuf *netbuf_new(void)
-{
-  struct netbuf *buf;
-
-  buf = (struct netbuf *)memp_malloc(MEMP_NETBUF);
-  if (buf != NULL) {
-    buf->p = NULL;
-    buf->ptr = NULL;
-    ip_addr_set_zero(&buf->addr);
-    buf->port = 0;
-#if LWIP_NETBUF_RECVINFO || LWIP_CHECKSUM_ON_COPY
-#if LWIP_CHECKSUM_ON_COPY
-    buf->flags = 0;
-#endif /* LWIP_CHECKSUM_ON_COPY */
-    buf->toport_chksum = 0;
-#if LWIP_NETBUF_RECVINFO
-    ip_addr_set_zero(&buf->toaddr);
-#endif /* LWIP_NETBUF_RECVINFO */
-#endif /* LWIP_NETBUF_RECVINFO || LWIP_CHECKSUM_ON_COPY */
-    return buf;
-  } else {
-    return NULL;
-  }
-}
-
-/**
- * Deallocate a netbuf allocated by netbuf_new().
- *
- * @param buf pointer to a netbuf allocated by netbuf_new()
- */
-void
-netbuf_delete(struct netbuf *buf)
-{
-  if (buf != NULL) {
-    if (buf->p != NULL) {
-      pbuf_free(buf->p);
-      buf->p = buf->ptr = NULL;
-    }
-    memp_free(MEMP_NETBUF, buf);
-  }
-}
-
-/**
- * Allocate memory for a packet buffer for a given netbuf.
- *
- * @param buf the netbuf for which to allocate a packet buffer
- * @param size the size of the packet buffer to allocate
- * @return pointer to the allocated memory
- *         NULL if no memory could be allocated
- */
-void * ESP_IRAM_ATTR
-netbuf_alloc(struct netbuf *buf, u16_t size)
-{
-  LWIP_ERROR("netbuf_alloc: invalid buf", (buf != NULL), return NULL;);
-
-  /* Deallocate any previously allocated memory. */
-  if (buf->p != NULL) {
-    pbuf_free(buf->p);
-  }
-  buf->p = pbuf_alloc(PBUF_TRANSPORT, size, PBUF_RAM);
-  if (buf->p == NULL) {
-     return NULL;
-  }
-  LWIP_ASSERT("check that first pbuf can hold size",
-             (buf->p->len >= size));
-  buf->ptr = buf->p;
-  return buf->p->payload;
-}
-
-/**
- * Free the packet buffer included in a netbuf
- *
- * @param buf pointer to the netbuf which contains the packet buffer to free
- */
-void ESP_IRAM_ATTR
-netbuf_free(struct netbuf *buf)
-{
-  LWIP_ERROR("netbuf_free: invalid buf", (buf != NULL), return;);
-  if (buf->p != NULL) {
-    pbuf_free(buf->p);
-  }
-  buf->p = buf->ptr = NULL;
-}
-
-/**
- * Let a netbuf reference existing (non-volatile) data.
- *
- * @param buf netbuf which should reference the data
- * @param dataptr pointer to the data to reference
- * @param size size of the data
- * @return ERR_OK if data is referenced
- *         ERR_MEM if data couldn't be referenced due to lack of memory
- */
-err_t
-netbuf_ref(struct netbuf *buf, const void *dataptr, u16_t size)
-{
-  LWIP_ERROR("netbuf_ref: invalid buf", (buf != NULL), return ERR_ARG;);
-  if (buf->p != NULL) {
-    pbuf_free(buf->p);
-  }
-  buf->p = pbuf_alloc(PBUF_TRANSPORT, 0, PBUF_REF);
-  if (buf->p == NULL) {
-    buf->ptr = NULL;
-    return ERR_MEM;
-  }
-  ((struct pbuf_rom*)buf->p)->payload = dataptr;
-  buf->p->len = buf->p->tot_len = size;
-  buf->ptr = buf->p;
-  return ERR_OK;
-}
-
-/**
- * Chain one netbuf to another (@see pbuf_chain)
- *
- * @param head the first netbuf
- * @param tail netbuf to chain after head, freed by this function, may not be reference after returning
- */
-void
-netbuf_chain(struct netbuf *head, struct netbuf *tail)
-{
-  LWIP_ERROR("netbuf_ref: invalid head", (head != NULL), return;);
-  LWIP_ERROR("netbuf_chain: invalid tail", (tail != NULL), return;);
-  pbuf_cat(head->p, tail->p);
-  head->ptr = head->p;
-  memp_free(MEMP_NETBUF, tail);
-}
-
-/**
- * Get the data pointer and length of the data inside a netbuf.
- *
- * @param buf netbuf to get the data from
- * @param dataptr pointer to a void pointer where to store the data pointer
- * @param len pointer to an u16_t where the length of the data is stored
- * @return ERR_OK if the information was retrieved,
- *         ERR_BUF on error.
- */
-err_t
-netbuf_data(struct netbuf *buf, void **dataptr, u16_t *len)
-{
-  LWIP_ERROR("netbuf_data: invalid buf", (buf != NULL), return ERR_ARG;);
-  LWIP_ERROR("netbuf_data: invalid dataptr", (dataptr != NULL), return ERR_ARG;);
-  LWIP_ERROR("netbuf_data: invalid len", (len != NULL), return ERR_ARG;);
-
-  if (buf->ptr == NULL) {
-    return ERR_BUF;
-  }
-  *dataptr = buf->ptr->payload;
-  *len = buf->ptr->len;
-  return ERR_OK;
-}
-
-/**
- * Move the current data pointer of a packet buffer contained in a netbuf
- * to the next part.
- * The packet buffer itself is not modified.
- *
- * @param buf the netbuf to modify
- * @return -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
- */
-s8_t
-netbuf_next(struct netbuf *buf)
-{
-  LWIP_ERROR("netbuf_free: invalid buf", (buf != NULL), return -1;);
-  if (buf->ptr->next == NULL) {
-    return -1;
-  }
-  buf->ptr = buf->ptr->next;
-  if (buf->ptr->next == NULL) {
-    return 1;
-  }
-  return 0;
-}
-
-/**
- * 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.
- *
- * @param buf the netbuf to modify
- */
-void
-netbuf_first(struct netbuf *buf)
-{
-  LWIP_ERROR("netbuf_free: invalid buf", (buf != NULL), return;);
-  buf->ptr = buf->p;
-}
-
-#endif /* LWIP_NETCONN */
diff --git a/components/lwip/api/netdb.c b/components/lwip/api/netdb.c
deleted file mode 100644 (file)
index 66f602d..0000000
+++ /dev/null
@@ -1,421 +0,0 @@
-/**
- * @file
- * API functions for name resolving
- *
- */
-
-/*
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE 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/netdb.h"
-
-#if LWIP_DNS && LWIP_SOCKET
-
-#include "lwip/err.h"
-#include "lwip/mem.h"
-#include "lwip/memp.h"
-#include "lwip/ip_addr.h"
-#include "lwip/api.h"
-#include "lwip/dns.h"
-
-#include <string.h>
-#include <stdlib.h>
-
-/** helper struct for gethostbyname_r to access the char* buffer */
-struct gethostbyname_r_helper {
-  ip_addr_t *addr_list[2];
-  ip_addr_t addr;
-  char *aliases;
-};
-
-/** h_errno is exported in netdb.h for access by applications. */
-#if LWIP_DNS_API_DECLARE_H_ERRNO
-int h_errno;
-#endif /* LWIP_DNS_API_DECLARE_H_ERRNO */
-
-/** define "hostent" variables storage: 0 if we use a static (but unprotected)
- * set of variables for lwip_gethostbyname, 1 if we use a local storage */
-#ifndef LWIP_DNS_API_HOSTENT_STORAGE
-#define LWIP_DNS_API_HOSTENT_STORAGE 0
-#endif
-
-/** define "hostent" variables storage */
-#if LWIP_DNS_API_HOSTENT_STORAGE
-#define HOSTENT_STORAGE
-#else
-#define HOSTENT_STORAGE static
-#endif /* LWIP_DNS_API_STATIC_HOSTENT */
-
-/**
- * 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.
- *
- * @param name the hostname to resolve
- * @return an entry containing addresses of address family AF_INET
- *         for the host with name name
- */
-struct hostent*
-lwip_gethostbyname(const char *name)
-{
-  err_t err;
-  ip_addr_t addr;
-
-  /* buffer variables for lwip_gethostbyname() */
-  HOSTENT_STORAGE struct hostent s_hostent;
-  HOSTENT_STORAGE char *s_aliases;
-  HOSTENT_STORAGE ip_addr_t s_hostent_addr;
-  HOSTENT_STORAGE ip_addr_t *s_phostent_addr[2];
-  HOSTENT_STORAGE char s_hostname[DNS_MAX_NAME_LENGTH + 1];
-
-  /* query host IP address */
-  err = netconn_gethostbyname(name, &addr);
-  if (err != ERR_OK) {
-    LWIP_DEBUGF(DNS_DEBUG, ("lwip_gethostbyname(%s) failed, err=%d\n", name, err));
-    h_errno = HOST_NOT_FOUND;
-    return NULL;
-  }
-
-  /* fill hostent */
-  s_hostent_addr = addr;
-  s_phostent_addr[0] = &s_hostent_addr;
-  s_phostent_addr[1] = NULL;
-  strncpy(s_hostname, name, DNS_MAX_NAME_LENGTH);
-  s_hostname[DNS_MAX_NAME_LENGTH] = 0;
-  s_hostent.h_name = s_hostname;
-  s_aliases = NULL;
-  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;
-
-#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));
-  /* 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));
-  if (s_hostent.h_addr_list != NULL) {
-    u8_t 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])));
-    }
-  }
-#endif /* DNS_DEBUG */
-
-#if LWIP_DNS_API_HOSTENT_STORAGE
-  /* this function should return the "per-thread" hostent after copy from s_hostent */
-  return sys_thread_hostent(&s_hostent);
-#else
-  return &s_hostent;
-#endif /* LWIP_DNS_API_HOSTENT_STORAGE */
-}
-
-/**
- * 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.
- *
- * @param name the hostname to resolve
- * @param ret pre-allocated struct where to store the result
- * @param buf pre-allocated buffer where to store additional data
- * @param buflen the size of buf
- * @param result pointer to a hostent pointer that is set to ret on success
- *               and set to zero on error
- * @param h_errnop pointer to an int where to store errors (instead of modifying
- *                 the global h_errno)
- * @return 0 on success, non-zero on error, additional error information
- *         is stored in *h_errnop instead of h_errno to be thread-safe
- */
-int
-lwip_gethostbyname_r(const char *name, struct hostent *ret, char *buf,
-                size_t buflen, struct hostent **result, int *h_errnop)
-{
-  err_t err;
-  struct gethostbyname_r_helper *h;
-  char *hostname;
-  size_t namelen;
-  int lh_errno;
-
-  if (h_errnop == NULL) {
-    /* ensure h_errnop is never NULL */
-    h_errnop = &lh_errno;
-  }
-
-  if (result == NULL) {
-    /* not all arguments given */
-    *h_errnop = EINVAL;
-    return -1;
-  }
-  /* first thing to do: set *result to nothing */
-  *result = NULL;
-  if ((name == NULL) || (ret == NULL) || (buf == NULL)) {
-    /* not all arguments given */
-    *h_errnop = EINVAL;
-    return -1;
-  }
-
-  namelen = strlen(name);
-  if (buflen < (sizeof(struct gethostbyname_r_helper) + namelen + 1 + (MEM_ALIGNMENT - 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);
-
-  /* query host IP address */
-  err = netconn_gethostbyname(name, &h->addr);
-  if (err != ERR_OK) {
-    LWIP_DEBUGF(DNS_DEBUG, ("lwip_gethostbyname(%s) failed, err=%d\n", name, err));
-    *h_errnop = HOST_NOT_FOUND;
-    return -1;
-  }
-
-  /* copy the hostname into buf */
-  MEMCPY(hostname, name, namelen);
-  hostname[namelen] = 0;
-
-  /* fill hostent */
-  h->addr_list[0] = &h->addr;
-  h->addr_list[1] = NULL;
-  h->aliases = NULL;
-  ret->h_name = hostname;
-  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;
-
-  /* set result != NULL */
-  *result = ret;
-
-  /* return success */
-  return 0;
-}
-
-/**
- * Frees one or more addrinfo structures returned by getaddrinfo(), 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.
- *
- * @param ai struct addrinfo to free
- */
-void
-lwip_freeaddrinfo(struct addrinfo *ai)
-{
-  struct addrinfo *next;
-
-  while (ai != NULL) {
-    next = ai->ai_next;
-    memp_free(MEMP_NETDB, ai);
-    ai = next;
-  }
-}
-
-/**
- * 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
- * lwip_freeaddrinfo()!
- *
- * 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)!
- *
- * @param nodename descriptive name or address string of the host
- *                 (may be NULL -> local address)
- * @param servname port number as string of NULL
- * @param hints structure containing input values that set socktype and protocol
- * @param res pointer to a pointer where to store the result (set to NULL on failure)
- * @return 0 on success, non-zero on failure
- *
- * @todo: implement AI_ADDRCONFIG
- */
-int
-lwip_getaddrinfo(const char *nodename, const char *servname,
-       const struct addrinfo *hints, struct addrinfo **res)
-{
-  err_t err;
-  ip_addr_t addr;
-  struct addrinfo *ai;
-  struct sockaddr_storage *sa = NULL;
-  int port_nr = 0;
-  size_t total_size;
-  size_t namelen = 0;
-  int ai_family;
-
-  if (res == NULL) {
-    return EAI_FAIL;
-  }
-  *res = NULL;
-  if ((nodename == NULL) && (servname == NULL)) {
-    return EAI_NONAME;
-  }
-
-  if (hints != NULL) {
-    ai_family = hints->ai_family;
-    if ((ai_family != AF_UNSPEC)
-#if LWIP_IPV4
-      && (ai_family != AF_INET)
-#endif /* LWIP_IPV4 */
-#if LWIP_IPV6
-      && (ai_family != AF_INET6)
-#endif /* LWIP_IPV6 */
-      ) {
-      return EAI_FAMILY;
-    }
-  } else {
-    ai_family = AF_UNSPEC;
-  }
-
-  if (servname != NULL) {
-    /* service name specified: convert to port number
-     * @todo?: currently, only ASCII integers (port numbers) are supported (AI_NUMERICSERV)! */
-    port_nr = atoi(servname);
-    if ((port_nr <= 0) || (port_nr > 0xffff)) {
-      return EAI_SERVICE;
-    }
-  }
-
-  if (nodename != NULL) {
-    /* service location specified, try to resolve */
-    if ((hints != NULL) && (hints->ai_flags & AI_NUMERICHOST)) {
-      /* no DNS lookup, just parse for an address string */
-      if (!ipaddr_aton(nodename, &addr)) {
-        return EAI_NONAME;
-      }
-#if LWIP_IPV4 && LWIP_IPV6
-      if ((IP_IS_V6_VAL(addr) && ai_family == AF_INET) ||
-          (!IP_IS_V6_VAL(addr) && ai_family == AF_INET6)) {
-        return EAI_NONAME;
-      }
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-    } else {
-#if LWIP_IPV4 && LWIP_IPV6
-      /* AF_UNSPEC: prefer IPv4 */
-      u8_t type = NETCONN_DNS_IPV4_IPV6;
-      if (ai_family == AF_INET) {
-        type = NETCONN_DNS_IPV4;
-      } else if (ai_family == AF_INET6) {
-        type = NETCONN_DNS_IPV6;
-        if (hints->ai_flags & AI_V4MAPPED) {
-          type = NETCONN_DNS_IPV6_IPV4;
-        }
-      }
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-      err = netconn_gethostbyname_addrtype(nodename, &addr, type);
-      if (err != ERR_OK) {
-        return EAI_FAIL;
-      }
-    }
-  } else {
-    /* service location specified, use loopback address */
-    if ((hints != NULL) && (hints->ai_flags & AI_PASSIVE)) {
-      ip_addr_set_any(ai_family == AF_INET6, &addr);
-    } else {
-      ip_addr_set_loopback(ai_family == AF_INET6, &addr);
-    }
-  }
-
-#if LWIP_IPV4 && LWIP_IPV6
-  if (ai_family == AF_INET6 && (hints->ai_flags & AI_V4MAPPED)
-      && IP_GET_TYPE(&addr) == IPADDR_TYPE_V4) {
-    /* Convert native V4 address to a V4-mapped IPV6 address */
-    ip_addr_make_ip4_mapped_ip6(&addr, &addr);
-  }
-#endif
-
-  total_size = sizeof(struct addrinfo) + sizeof(struct sockaddr_storage);
-  if (nodename != NULL) {
-    namelen = strlen(nodename);
-    if (namelen > DNS_MAX_NAME_LENGTH) {
-      /* invalid name length */
-      return EAI_FAIL;
-    }
-    LWIP_ASSERT("namelen is too long", total_size + namelen + 1 > total_size);
-    total_size += namelen + 1;
-  }
-  /* If this fails, please report to lwip-devel! :-) */
-  LWIP_ASSERT("total_size <= NETDB_ELEM_SIZE: please report this!",
-    total_size <= NETDB_ELEM_SIZE);
-  ai = (struct addrinfo *)memp_malloc(MEMP_NETDB);
-  if (ai == NULL) {
-    return EAI_MEMORY;
-  }
-  memset(ai, 0, total_size);
-  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;
-    /* 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 = htons((u16_t)port_nr);
-    ai->ai_family = AF_INET6;
-#endif /* LWIP_IPV6 */
-  } else {
-#if LWIP_IPV4
-    struct sockaddr_in *sa4 = (struct sockaddr_in*)sa;
-    /* set up sockaddr */
-    inet_addr_from_ipaddr(&sa4->sin_addr, ip_2_ip4(&addr));
-    sa4->sin_family = AF_INET;
-    sa4->sin_len = sizeof(struct sockaddr_in);
-    sa4->sin_port = htons((u16_t)port_nr);
-    ai->ai_family = AF_INET;
-#endif /* LWIP_IPV4 */
-  }
-
-  /* set up addrinfo */
-  if (hints != NULL) {
-    /* copy socktype & protocol from hints if specified */
-    ai->ai_socktype = hints->ai_socktype;
-    ai->ai_protocol = hints->ai_protocol;
-  }
-  if (nodename != NULL) {
-    /* copy nodename to canonname if specified */
-    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;
-
-  *res = ai;
-
-  return 0;
-}
-
-#endif /* LWIP_DNS && LWIP_SOCKET */
diff --git a/components/lwip/api/netifapi.c b/components/lwip/api/netifapi.c
deleted file mode 100644 (file)
index 3ddb9f5..0000000
+++ /dev/null
@@ -1,206 +0,0 @@
-/**
- * @file
- * Network Interface Sequential API module
- *
- */
-
-/*
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- */
-
-#include "lwip/opt.h"
-
-#if LWIP_NETIF_API /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/netifapi.h"
-#include "lwip/memp.h"
-#include "lwip/priv/tcpip_priv.h"
-
-#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)
-#define NETIFAPI_VAR_FREE(name)     API_VAR_FREE(MEMP_NETIFAPI_MSG, name)
-
-/**
- * Call netif_add() inside the tcpip_thread context.
- */
-static err_t
-netifapi_do_netif_add(struct tcpip_api_call *m)
-{
-  struct netifapi_msg *msg = (struct netifapi_msg*)m;
-  
-  if (!netif_add( msg->netif,
-#if LWIP_IPV4
-                  API_EXPR_REF(msg->msg.add.ipaddr),
-                  API_EXPR_REF(msg->msg.add.netmask),
-                  API_EXPR_REF(msg->msg.add.gw),
-#endif /* LWIP_IPV4 */
-                  msg->msg.add.state,
-                  msg->msg.add.init,
-                  msg->msg.add.input)) {
-    return ERR_IF;
-  } else {
-    return ERR_OK;
-  }
-}
-
-#if LWIP_IPV4
-/**
- * Call netif_set_addr() inside the tcpip_thread context.
- */
-static err_t
-netifapi_do_netif_set_addr(struct tcpip_api_call *m)
-{
-  struct netifapi_msg *msg = (struct netifapi_msg*)m;
-
-  netif_set_addr( msg->netif,
-                  API_EXPR_REF(msg->msg.add.ipaddr),
-                  API_EXPR_REF(msg->msg.add.netmask),
-                  API_EXPR_REF(msg->msg.add.gw));
-  return ERR_OK;
-}
-#endif /* LWIP_IPV4 */
-
-/**
- * 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 *m)
-{
-  struct netifapi_msg *msg = (struct netifapi_msg*)m;
-
-  if (msg->msg.common.errtfunc != NULL) {
-    return msg->msg.common.errtfunc(msg->netif);
-  } else {
-    msg->msg.common.voidfunc(msg->netif);
-    return ERR_OK;
-  }
-}
-
-/**
- * Call netif_add() in a thread-safe way by running that function inside the
- * tcpip_thread context.
- *
- * @note for params @see netif_add()
- */
-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,
-#endif /* LWIP_IPV4 */
-                   void *state, netif_init_fn init, netif_input_fn input)
-{
-  err_t err;
-  NETIFAPI_VAR_DECLARE(msg);
-  NETIFAPI_VAR_ALLOC(msg);
-
-#if LWIP_IPV4
-  if (ipaddr == NULL) {
-    ipaddr = IP4_ADDR_ANY;
-  }
-  if (netmask == NULL) {
-    netmask = IP4_ADDR_ANY;
-  }
-  if (gw == NULL) {
-    gw = IP4_ADDR_ANY;
-  }
-#endif /* LWIP_IPV4 */
-
-  NETIFAPI_VAR_REF(msg).netif = netif;
-#if LWIP_IPV4
-  NETIFAPI_VAR_REF(msg).msg.add.ipaddr  = NETIFAPI_VAR_REF(ipaddr);
-  NETIFAPI_VAR_REF(msg).msg.add.netmask = NETIFAPI_VAR_REF(netmask);
-  NETIFAPI_VAR_REF(msg).msg.add.gw      = NETIFAPI_VAR_REF(gw);
-#endif /* LWIP_IPV4 */
-  NETIFAPI_VAR_REF(msg).msg.add.state   = state;
-  NETIFAPI_VAR_REF(msg).msg.add.init    = init;
-  NETIFAPI_VAR_REF(msg).msg.add.input   = input;
-  err = tcpip_api_call(netifapi_do_netif_add, &API_VAR_REF(msg).call);
-  NETIFAPI_VAR_FREE(msg);
-  return err;
-}
-
-#if LWIP_IPV4
-/**
- * Call netif_set_addr() in a thread-safe way by running that function inside the
- * tcpip_thread context.
- *
- * @note for params @see netif_set_addr()
- */
-err_t
-netifapi_netif_set_addr(struct netif *netif,
-                        const ip4_addr_t *ipaddr,
-                        const ip4_addr_t *netmask,
-                        const ip4_addr_t *gw)
-{
-  err_t err;
-  NETIFAPI_VAR_DECLARE(msg);
-  NETIFAPI_VAR_ALLOC(msg);
-
-  if (ipaddr == NULL) {
-    ipaddr = IP4_ADDR_ANY;
-  }
-  if (netmask == NULL) {
-    netmask = IP4_ADDR_ANY;
-  }
-  if (gw == NULL) {
-    gw = IP4_ADDR_ANY;
-  }
-
-  NETIFAPI_VAR_REF(msg).netif = netif;
-  NETIFAPI_VAR_REF(msg).msg.add.ipaddr  = NETIFAPI_VAR_REF(ipaddr);
-  NETIFAPI_VAR_REF(msg).msg.add.netmask = NETIFAPI_VAR_REF(netmask);
-  NETIFAPI_VAR_REF(msg).msg.add.gw      = NETIFAPI_VAR_REF(gw);
-  err = tcpip_api_call(netifapi_do_netif_set_addr, &API_VAR_REF(msg).call);
-  NETIFAPI_VAR_FREE(msg);
-  return err;
-}
-#endif /* LWIP_IPV4 */
-
-/**
- * call the "errtfunc" (or the "voidfunc" if "errtfunc" is NULL) in a thread-safe
- * way by running that function inside the tcpip_thread context.
- *
- * @note use only for functions where there is only "netif" parameter.
- */
-err_t
-netifapi_netif_common(struct netif *netif, netifapi_void_fn voidfunc,
-                       netifapi_errt_fn errtfunc)
-{
-  err_t err;
-  NETIFAPI_VAR_DECLARE(msg);
-  NETIFAPI_VAR_ALLOC(msg);
-
-  NETIFAPI_VAR_REF(msg).netif = netif;
-  NETIFAPI_VAR_REF(msg).msg.common.voidfunc = voidfunc;
-  NETIFAPI_VAR_REF(msg).msg.common.errtfunc = errtfunc;
-  err = tcpip_api_call(netifapi_do_netif_common, &API_VAR_REF(msg).call);
-  NETIFAPI_VAR_FREE(msg);
-  return err;
-}
-
-#endif /* LWIP_NETIF_API */
diff --git a/components/lwip/api/pppapi.c b/components/lwip/api/pppapi.c
deleted file mode 100644 (file)
index 735ae76..0000000
+++ /dev/null
@@ -1,371 +0,0 @@
-/**
- * @file
- * Point To Point Protocol Sequential API module
- *
- */
-
-/*
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- */
-
-#include "lwip/opt.h"
-
-#if LWIP_PPP_API /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/pppapi.h"
-#include "lwip/priv/tcpip_priv.h"
-#include "netif/ppp/pppoe.h"
-#include "netif/ppp/pppol2tp.h"
-#include "netif/ppp/pppos.h"
-
-
-/**
- * Call ppp_set_default() inside the tcpip_thread context.
- */
-static err_t
-pppapi_do_ppp_set_default(struct tcpip_api_call *m)
-{
-  struct pppapi_msg *msg = (struct pppapi_msg *)m;
-  
-  ppp_set_default(msg->msg.ppp);
-  return ERR_OK;
-}
-
-/**
- * Call ppp_set_default() in a thread-safe way by running that function inside the
- * tcpip_thread context.
- */
-void
-pppapi_set_default(ppp_pcb *pcb)
-{
-  struct pppapi_msg msg;
-  msg.msg.ppp = pcb;
-  tcpip_api_call(pppapi_do_ppp_set_default, &msg.call);
-}
-
-
-/**
- * Call ppp_set_auth() inside the tcpip_thread context.
- */
-static err_t
-pppapi_do_ppp_set_auth(struct tcpip_api_call *m)
-{
-  struct pppapi_msg *msg = (struct pppapi_msg *)m;
-
-  ppp_set_auth(msg->msg.ppp, msg->msg.msg.setauth.authtype,
-               msg->msg.msg.setauth.user, msg->msg.msg.setauth.passwd);
-  return ERR_OK;
-}
-
-/**
- * Call ppp_set_auth() in a thread-safe way by running that function inside the
- * tcpip_thread context.
- */
-void
-pppapi_set_auth(ppp_pcb *pcb, u8_t authtype, const char *user, const char *passwd)
-{
-  struct pppapi_msg msg;
-  msg.msg.ppp = pcb;
-  msg.msg.msg.setauth.authtype = authtype;
-  msg.msg.msg.setauth.user = user;
-  msg.msg.msg.setauth.passwd = passwd;
-  tcpip_api_call(pppapi_do_ppp_set_auth, &msg.call);
-}
-
-
-#if PPP_NOTIFY_PHASE
-/**
- * Call ppp_set_notify_phase_callback() inside the tcpip_thread context.
- */
-static err_t
-pppapi_do_ppp_set_notify_phase_callback(struct tcpip_api_call *m)
-{
-  struct pppapi_msg *msg = (struct pppapi_msg *)m;
-  ppp_set_notify_phase_callback(msg->msg.ppp, msg->msg.msg.setnotifyphasecb.notify_phase_cb);
-  return ERR_OK;
-}
-
-/**
- * Call ppp_set_notify_phase_callback() in a thread-safe way by running that function inside the
- * tcpip_thread context.
- */
-void
-pppapi_set_notify_phase_callback(ppp_pcb *pcb, ppp_notify_phase_cb_fn notify_phase_cb)
-{
-  struct pppapi_msg msg;
-  msg.function = pppapi_do_ppp_set_notify_phase_callback;
-  msg.msg.ppp = pcb;
-  msg.msg.msg.setnotifyphasecb.notify_phase_cb = notify_phase_cb;
-  tcpip_api_call(pppapi_do_ppp_set_notify_phase_callback, &msg.call);
-}
-#endif /* PPP_NOTIFY_PHASE */
-
-
-#if PPPOS_SUPPORT
-/**
- * Call pppos_create() inside the tcpip_thread context.
- */
-static err_t
-pppapi_do_pppos_create(struct tcpip_api_call *m)
-{
-  struct pppapi_msg *msg = (struct pppapi_msg *)(m);
-
-  msg->msg.ppp = pppos_create(msg->msg.msg.serialcreate.pppif, msg->msg.msg.serialcreate.output_cb,
-    msg->msg.msg.serialcreate.link_status_cb, msg->msg.msg.serialcreate.ctx_cb);
-  return ERR_OK;
-}
-
-/**
- * Call pppos_create() in a thread-safe way by running that function inside the
- * tcpip_thread context.
- */
-ppp_pcb*
-pppapi_pppos_create(struct netif *pppif, pppos_output_cb_fn output_cb,
-               ppp_link_status_cb_fn link_status_cb, void *ctx_cb)
-{
-  struct pppapi_msg msg;
-  msg.msg.msg.serialcreate.pppif = pppif;
-  msg.msg.msg.serialcreate.output_cb = output_cb;
-  msg.msg.msg.serialcreate.link_status_cb = link_status_cb;
-  msg.msg.msg.serialcreate.ctx_cb = ctx_cb;
-  tcpip_api_call(pppapi_do_pppos_create, &msg.call);
-  return msg.msg.ppp;
-}
-#endif /* PPPOS_SUPPORT */
-
-
-#if PPPOE_SUPPORT
-/**
- * Call pppoe_create() inside the tcpip_thread context.
- */
-static err_t
-pppapi_do_pppoe_create(struct tcpip_api_call *m)
-{
-  struct pppapi_msg *msg = (struct pppapi_msg *)m;
-
-  msg->msg.ppp = pppoe_create(msg->msg.msg.ethernetcreate.pppif, msg->msg.msg.ethernetcreate.ethif,
-    msg->msg.msg.ethernetcreate.service_name, msg->msg.msg.ethernetcreate.concentrator_name,
-    msg->msg.msg.ethernetcreate.link_status_cb, msg->msg.msg.ethernetcreate.ctx_cb);
-  return ERR_OK;
-}
-
-/**
- * Call pppoe_create() in a thread-safe way by running that function inside the
- * tcpip_thread context.
- */
-ppp_pcb*
-pppapi_pppoe_create(struct netif *pppif, struct netif *ethif, const char *service_name,
-                            const char *concentrator_name, ppp_link_status_cb_fn link_status_cb,
-                            void *ctx_cb)
-{
-  struct pppapi_msg msg;
-  msg.msg.msg.ethernetcreate.pppif = pppif;
-  msg.msg.msg.ethernetcreate.ethif = ethif;
-  msg.msg.msg.ethernetcreate.service_name = service_name;
-  msg.msg.msg.ethernetcreate.concentrator_name = concentrator_name;
-  msg.msg.msg.ethernetcreate.link_status_cb = link_status_cb;
-  msg.msg.msg.ethernetcreate.ctx_cb = ctx_cb;
-  tcpip_api_call(pppapi_do_pppoe_create, &msg.call);
-  return msg.msg.ppp;
-}
-#endif /* PPPOE_SUPPORT */
-
-
-#if PPPOL2TP_SUPPORT
-/**
- * Call pppol2tp_create() inside the tcpip_thread context.
- */
-static err_t
-pppapi_do_pppol2tp_create(struct tcpip_api_call *m)
-{
-  struct pppapi_msg *msg = (struct pppapi_msg *)m;
-
-  msg->msg.ppp = pppol2tp_create(msg->msg.msg.l2tpcreate.pppif,
-    msg->msg.msg.l2tpcreate.netif, msg->msg.msg.l2tpcreate.ipaddr, msg->msg.msg.l2tpcreate.port,
-#if PPPOL2TP_AUTH_SUPPORT
-    msg->msg.msg.l2tpcreate.secret,
-    msg->msg.msg.l2tpcreate.secret_len,
-#else /* PPPOL2TP_AUTH_SUPPORT */
-    NULL,
-#endif /* PPPOL2TP_AUTH_SUPPORT */
-    msg->msg.msg.l2tpcreate.link_status_cb, msg->msg.msg.l2tpcreate.ctx_cb);
-  return ERR_OK;
-}
-
-/**
- * Call pppol2tp_create() in a thread-safe way by running that function inside the
- * tcpip_thread context.
- */
-ppp_pcb*
-pppapi_pppol2tp_create(struct netif *pppif, struct netif *netif, ip_addr_t *ipaddr, u16_t port,
-                        const u8_t *secret, u8_t secret_len,
-                        ppp_link_status_cb_fn link_status_cb, void *ctx_cb)
-{
-  struct pppapi_msg msg;
-  msg.msg.msg.l2tpcreate.pppif = pppif;
-  msg.msg.msg.l2tpcreate.netif = netif;
-  msg.msg.msg.l2tpcreate.ipaddr = ipaddr;
-  msg.msg.msg.l2tpcreate.port = port;
-#if PPPOL2TP_AUTH_SUPPORT
-  msg.msg.msg.l2tpcreate.secret = secret;
-  msg.msg.msg.l2tpcreate.secret_len = secret_len;
-#endif /* PPPOL2TP_AUTH_SUPPORT */
-  msg.msg.msg.l2tpcreate.link_status_cb = link_status_cb;
-  msg.msg.msg.l2tpcreate.ctx_cb = ctx_cb;
-  tcpip_api_call(pppapi_do_pppol2tp_create, &msg.call);
-  return msg.msg.ppp;
-}
-#endif /* PPPOL2TP_SUPPORT */
-
-
-/**
- * Call ppp_connect() inside the tcpip_thread context.
- */
-static err_t
-pppapi_do_ppp_connect(struct tcpip_api_call *m)
-{
-  struct pppapi_msg *msg = (struct pppapi_msg *)m;
-
-  return ppp_connect(msg->msg.ppp, msg->msg.msg.connect.holdoff);
-}
-
-/**
- * Call ppp_connect() in a thread-safe way by running that function inside the
- * tcpip_thread context.
- */
-err_t
-pppapi_connect(ppp_pcb *pcb, u16_t holdoff)
-{
-  struct pppapi_msg msg;
-  msg.msg.ppp = pcb;
-  msg.msg.msg.connect.holdoff = holdoff;
-  return tcpip_api_call(pppapi_do_ppp_connect, &msg.call);
-}
-
-
-#if PPP_SERVER
-/**
- * Call ppp_listen() inside the tcpip_thread context.
- */
-static void
-pppapi_do_ppp_listen(struct pppapi_msg_msg *msg)
-{
-  msg->err = ppp_listen(msg->ppp, msg->msg.listen.addrs);
-  TCPIP_PPPAPI_ACK(msg);
-}
-
-/**
- * Call ppp_listen() in a thread-safe way by running that function inside the
- * tcpip_thread context.
- */
-err_t
-pppapi_listen(ppp_pcb *pcb, struct ppp_addrs *addrs)
-{
-  struct pppapi_msg msg;
-  msg.function = pppapi_do_ppp_listen;
-  msg.msg.ppp = pcb;
-  msg.msg.msg.listen.addrs = addrs;
-  TCPIP_PPPAPI(&msg);
-  return msg.msg.err;
-}
-#endif /* PPP_SERVER */
-
-
-/**
- * Call ppp_close() inside the tcpip_thread context.
- */
-static err_t
-pppapi_do_ppp_close(struct tcpip_api_call *m)
-{
-  struct pppapi_msg *msg = (struct pppapi_msg *)m;
-
-  return ppp_close(msg->msg.ppp, msg->msg.msg.close.nocarrier);
-}
-
-/**
- * Call ppp_close() in a thread-safe way by running that function inside the
- * tcpip_thread context.
- */
-err_t
-pppapi_close(ppp_pcb *pcb, u8_t nocarrier)
-{
-  struct pppapi_msg msg;
-  msg.msg.ppp = pcb;
-  msg.msg.msg.close.nocarrier = nocarrier;
-  return tcpip_api_call(pppapi_do_ppp_close, &msg.call);
-}
-
-
-/**
- * Call ppp_free() inside the tcpip_thread context.
- */
-static err_t
-pppapi_do_ppp_free(struct tcpip_api_call *m)
-{
-  struct pppapi_msg *msg = (struct pppapi_msg *)m;
-
-  return ppp_free(msg->msg.ppp);
-}
-
-/**
- * Call ppp_free() in a thread-safe way by running that function inside the
- * tcpip_thread context.
- */
-err_t
-pppapi_free(ppp_pcb *pcb)
-{
-  struct pppapi_msg msg;
-  msg.msg.ppp = pcb;
-  return tcpip_api_call(pppapi_do_ppp_free, &msg.call);
-}
-
-
-/**
- * Call ppp_ioctl() inside the tcpip_thread context.
- */
-static err_t
-pppapi_do_ppp_ioctl(struct tcpip_api_call *m)
-{
-  struct pppapi_msg *msg = (struct pppapi_msg *)m;
-
-  return ppp_ioctl(msg->msg.ppp, msg->msg.msg.ioctl.cmd, msg->msg.msg.ioctl.arg);
-}
-
-/**
- * Call ppp_ioctl() in a thread-safe way by running that function inside the
- * tcpip_thread context.
- */
-err_t
-pppapi_ioctl(ppp_pcb *pcb, u8_t cmd, void *arg)
-{
-  struct pppapi_msg msg;
-  msg.msg.ppp = pcb;
-  msg.msg.msg.ioctl.cmd = cmd;
-  msg.msg.msg.ioctl.arg = arg;
-  return tcpip_api_call(pppapi_do_ppp_ioctl, &msg.call);
-}
-
-#endif /* LWIP_PPP_API */
diff --git a/components/lwip/api/sockets.c b/components/lwip/api/sockets.c
deleted file mode 100644 (file)
index 9d2d303..0000000
+++ /dev/null
@@ -1,3410 +0,0 @@
-/**
- * @file
- * Sockets BSD-Like API module
- *
- */
-
-/*
- * 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>
- *
- * Improved by Marc Boucher <marc@mbsi.ca> and David Haas <dhaas@alum.rpi.edu>
- *
- */
-
-#include "lwip/opt.h"
-
-#if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/sockets.h"
-#include "lwip/api.h"
-#include "lwip/sys.h"
-#include "lwip/igmp.h"
-#include "lwip/mld6.h"
-#include "lwip/inet.h"
-#include "lwip/tcp.h"
-#include "lwip/raw.h"
-#include "lwip/udp.h"
-#include "lwip/memp.h"
-#include "lwip/pbuf.h"
-#include "lwip/priv/tcpip_priv.h"
-#include "lwip/priv/api_msg.h"
-//#include "esp_common.h"
-#if LWIP_CHECKSUM_ON_COPY
-#include "lwip/inet_chksum.h"
-#endif
-
-#include <string.h>
-
-/* If the netconn API is not required publicly, then we include the necessary
-   files here to get the implementation */
-#if !LWIP_NETCONN
-#undef LWIP_NETCONN
-#define LWIP_NETCONN 1
-#include "api_msg.c"
-#include "api_lib.c"
-#include "netbuf.c"
-#undef LWIP_NETCONN
-#define LWIP_NETCONN 0
-#endif
-
-#if LWIP_IPV4
-#define IP4ADDR_PORT_TO_SOCKADDR(sin, ipaddr, port) do { \
-      (sin)->sin_len = sizeof(struct sockaddr_in); \
-      (sin)->sin_family = AF_INET; \
-      (sin)->sin_port = htons((port)); \
-      inet_addr_from_ipaddr(&(sin)->sin_addr, ipaddr); \
-      memset((sin)->sin_zero, 0, SIN_ZERO_LEN); }while(0)
-#define SOCKADDR4_TO_IP4ADDR_PORT(sin, ipaddr, port) do { \
-    inet_addr_to_ipaddr(ip_2_ip4(ipaddr), &((sin)->sin_addr)); \
-    (port) = ntohs((sin)->sin_port); }while(0)
-#endif /* LWIP_IPV4 */
-
-#if LWIP_IPV6
-#define IP6ADDR_PORT_TO_SOCKADDR(sin6, ipaddr, port) do { \
-      (sin6)->sin6_len = sizeof(struct sockaddr_in6); \
-      (sin6)->sin6_family = AF_INET6; \
-      (sin6)->sin6_port = htons((port)); \
-      (sin6)->sin6_flowinfo = 0; \
-      inet6_addr_from_ip6addr(&(sin6)->sin6_addr, ipaddr); \
-      (sin6)->sin6_scope_id = 0; }while(0)
-#define SOCKADDR6_TO_IP6ADDR_PORT(sin6, ipaddr, port) do { \
-    inet6_addr_to_ip6addr(ip_2_ip6(ipaddr), &((sin6)->sin6_addr)); \
-    (port) = 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);
-
-#define IS_SOCK_ADDR_LEN_VALID(namelen)  (((namelen) == sizeof(struct sockaddr_in)) || \
-                                         ((namelen) == sizeof(struct sockaddr_in6)))
-#define IS_SOCK_ADDR_TYPE_VALID(name)    (((name)->sa_family == AF_INET) || \
-                                         ((name)->sa_family == AF_INET6))
-#define SOCK_ADDR_TYPE_MATCH(name, sock) \
-       ((((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)) { \
-      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); \
-    } } while(0)
-#define SOCKADDR_TO_IPADDR_PORT(sockaddr, ipaddr, port) sockaddr_to_ipaddr_port(sockaddr, ipaddr, &(port))
-#define DOMAIN_TO_NETCONN_TYPE(domain, type) (((domain) == AF_INET) ? \
-  (type) : (enum netconn_type)((type) | NETCONN_TYPE_IPV6))
-#elif LWIP_IPV6 /* LWIP_IPV4 && LWIP_IPV6 */
-#define IS_SOCK_ADDR_LEN_VALID(namelen)  ((namelen) == sizeof(struct sockaddr_in6))
-#define IS_SOCK_ADDR_TYPE_VALID(name)    ((name)->sa_family == AF_INET6)
-#define SOCK_ADDR_TYPE_MATCH(name, sock) 1
-#define IPADDR_PORT_TO_SOCKADDR(sockaddr, ipaddr, port) \
-        IP6ADDR_PORT_TO_SOCKADDR((struct sockaddr_in6*)(void*)(sockaddr), ip_2_ip6(ipaddr), port)
-#define SOCKADDR_TO_IPADDR_PORT(sockaddr, ipaddr, port) \
-        SOCKADDR6_TO_IP6ADDR_PORT((const struct sockaddr_in6*)(const void*)(sockaddr), ipaddr, port)
-#define DOMAIN_TO_NETCONN_TYPE(domain, netconn_type) (netconn_type)
-#else /*-> LWIP_IPV4: LWIP_IPV4 && LWIP_IPV6 */
-#define IS_SOCK_ADDR_LEN_VALID(namelen)  ((namelen) == sizeof(struct sockaddr_in))
-#define IS_SOCK_ADDR_TYPE_VALID(name)    ((name)->sa_family == AF_INET)
-#define SOCK_ADDR_TYPE_MATCH(name, sock) 1
-#define IPADDR_PORT_TO_SOCKADDR(sockaddr, ipaddr, port) \
-        IP4ADDR_PORT_TO_SOCKADDR((struct sockaddr_in*)(void*)(sockaddr), ip_2_ip4(ipaddr), port)
-#define SOCKADDR_TO_IPADDR_PORT(sockaddr, ipaddr, port) \
-        SOCKADDR4_TO_IP4ADDR_PORT((const struct sockaddr_in*)(const void*)(sockaddr), ipaddr, port)
-#define DOMAIN_TO_NETCONN_TYPE(domain, netconn_type) (netconn_type)
-#endif /* LWIP_IPV6 */
-
-#define IS_SOCK_ADDR_TYPE_VALID_OR_UNSPEC(name)    (((name)->sa_family == AF_UNSPEC) || \
-                                                    IS_SOCK_ADDR_TYPE_VALID(name))
-#define SOCK_ADDR_TYPE_MATCH_OR_UNSPEC(name, sock) (((name)->sa_family == AF_UNSPEC) || \
-                                                    SOCK_ADDR_TYPE_MATCH(name, sock))
-#define IS_SOCK_ADDR_ALIGNED(name)      ((((mem_ptr_t)(name)) % 4) == 0)
-
-
-#define LWIP_SOCKOPT_CHECK_OPTLEN(optlen, opttype) do { if ((optlen) < sizeof(opttype)) { 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)
-#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)
-#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)
-
-
-#define LWIP_SETGETSOCKOPT_DATA_VAR_REF(name)     API_VAR_REF(name)
-#define LWIP_SETGETSOCKOPT_DATA_VAR_DECLARE(name) API_VAR_DECLARE(struct lwip_setgetsockopt_data, name)
-#define LWIP_SETGETSOCKOPT_DATA_VAR_FREE(name)    API_VAR_FREE(MEMP_SOCKET_SETGETSOCKOPT_DATA, name)
-#if LWIP_MPU_COMPATIBLE
-#define LWIP_SETGETSOCKOPT_DATA_VAR_ALLOC(name, sock) do { \
-  name = (struct lwip_setgetsockopt_data *)memp_malloc(MEMP_SOCKET_SETGETSOCKOPT_DATA); \
-  if (name == NULL) { \
-    sock_set_errno(sock, ENOMEM); \
-    return -1; \
-  } }while(0)
-#else /* LWIP_MPU_COMPATIBLE */
-#define LWIP_SETGETSOCKOPT_DATA_VAR_ALLOC(name, sock)
-#endif /* LWIP_MPU_COMPATIBLE */
-
-#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))
-#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))
-#endif
-
-#define NUM_SOCKETS MEMP_NUM_NETCONN
-
-#if !defined IOV_MAX
-#define IOV_MAX 0xFFFF
-#elif IOV_MAX > 0xFFFF
-#error "IOV_MAX larger than supported by LwIP"
-#endif /* IOV_MAX */
-
-/** 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;
-
-#if ESP_THREAD_SAFE
-  /* lock is used to protect state/ref field, however this lock is not a perfect lock, e.g
-   * taskA and taskB can access sock X, then taskA freed sock X, before taskB detect 
-   * this, taskC reuse sock X, then when taskB try to access sock X, problem may happen.
-   * A mitigation solution may be, when allocate a socket, alloc the least frequently used
-   * socket.
-   */
-  sys_mutex_t lock;
-
-  /* can be LWIP_SOCK_OPEN/LWIP_SOCK_CLOSING/LWIP_SOCK_CLOSED */
-  u8_t state;
-
-  /* if ref is 0, the sock need/can to be freed */
-  s8_t ref;
-
-  /* indicate how long the sock is in LWIP_SOCK_CLOSED status */
-  u8_t age;
-#endif
-  /** counter of how many threads are waiting for this socket using select */
-  SELWAIT_T select_waiting;
-};
-
-#if ESP_THREAD_SAFE
-
-#define LWIP_SOCK_OPEN    0
-#define LWIP_SOCK_CLOSING 1
-#define LWIP_SOCK_CLOSED  2
-
-#define LWIP_SOCK_LOCK(sock) \
-do{\
-  /*LWIP_DEBUGF(ESP_THREAD_SAFE_DEBUG, ("l\n"));*/\
-    sys_mutex_lock(&sock->lock);\
-  /*LWIP_DEBUGF(ESP_THREAD_SAFE_DEBUG, ("l ok\n"));*/\
-}while(0)
-
-
-#define LWIP_SOCK_UNLOCK(sock) \
-do{\
-  sys_mutex_unlock(&sock->lock);\
-  /*LWIP_DEBUGF(ESP_THREAD_SAFE_DEBUG1, ("unl\n"));*/\
-}while(0)
-
-#define LWIP_FREE_SOCK(sock) \
-do{\
-  if(sock->conn && NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP){\
-    LWIP_DEBUGF(ESP_THREAD_SAFE_DEBUG, ("LWIP_FREE_SOCK:free tcp sock\n"));\
-    free_socket(sock, 1);\
-  } else {\
-    LWIP_DEBUGF(ESP_THREAD_SAFE_DEBUG, ("LWIP_FREE_SOCK:free non-tcp sock\n"));\
-    free_socket(sock, 0);\
-  }\
-}while(0)
-
-#define LWIP_SET_CLOSE_FLAG() \
-do{\
-  LWIP_SOCK_LOCK(__sock);\
-  LWIP_DEBUGF(ESP_THREAD_SAFE_DEBUG, ("mark sock closing\n"));\
-  __sock->state = LWIP_SOCK_CLOSING;\
-  LWIP_SOCK_UNLOCK(__sock);\
-}while(0)
-
-#define LWIP_API_LOCK() \
-  struct lwip_sock *__sock;\
-  int __ret;\
-\
-  __sock = get_socket(s);\
-  if (!__sock) {\
-    return -1;\
-  }\
-\
-do{\
-  LWIP_SOCK_LOCK(__sock);\
-  __sock->ref ++;\
-  if (__sock->state != LWIP_SOCK_OPEN) {\
-    LWIP_DEBUGF(ESP_THREAD_SAFE_DEBUG, ("LWIP_API_LOCK:soc is %d, return\n", __sock->state));\
-    __sock->ref --;\
-    LWIP_SOCK_UNLOCK(__sock);\
-    return -1;\
-  }\
-\
-  LWIP_SOCK_UNLOCK(__sock);\
-}while(0)
-
-#define LWIP_API_UNLOCK() \
-do{\
-  LWIP_SOCK_LOCK(__sock);\
-  __sock->ref --;\
-  if (__sock->state == LWIP_SOCK_CLOSING) {\
-    if (__sock->ref == 0){\
-      LWIP_DEBUGF(ESP_THREAD_SAFE_DEBUG, ("LWIP_API_UNLOCK:ref 0, free __sock\n"));\
-      LWIP_FREE_SOCK(__sock);\
-      LWIP_SOCK_UNLOCK(__sock);\
-      return __ret;\
-    }\
-    LWIP_DEBUGF(ESP_THREAD_SAFE_DEBUG, ("LWIP_API_UNLOCK: soc state is closing, return\n"));\
-    LWIP_SOCK_UNLOCK(__sock);\
-    return __ret;\
-  }\
-\
-  LWIP_SOCK_UNLOCK(__sock);\
-  return __ret;\
-}while(0)
-
-#endif
-
-
-
-#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;
-#if LWIP_IPV6
-   struct sockaddr_in6 sin6;
-#endif /* LWIP_IPV6 */
-#if LWIP_IPV4
-   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
-
-/* This is to keep track of IP_ADD_MEMBERSHIP/IPV6_ADD_MEMBERSHIP calls to drop
-   the membership when a socket is closed */
-struct lwip_socket_multicast_pair {
-  /** the socket (+1 to not require initialization) */
-  int sa;
-  /** the interface address */
-  ip_addr_t if_addr;
-  /** the group address */
-  ip_addr_t multi_addr;
-};
-
-struct lwip_socket_multicast_pair socket_multicast_memberships[LWIP_SOCKET_MAX_MEMBERSHIPS];
-
-static int  lwip_socket_register_membership(int s, const ip_addr_t *if_addr, const ip_addr_t *multi_addr);
-static void lwip_socket_unregister_membership(int s, const ip_addr_t *if_addr, const ip_addr_t *multi_addr);
-static void lwip_socket_drop_registered_memberships(int s);
-#endif /* LWIP_IGMP */
-
-/** The global array of available sockets */
-static struct lwip_sock sockets[NUM_SOCKETS];
-#if ESP_THREAD_SAFE
-static bool sockets_init_flag = false;
-#endif
-/** 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;
-
-/** Table to quickly map an lwIP error (err_t) to a socket error
-  * by using -err as an index */
-static const int err_to_errno_table[] = {
-  0,             /* ERR_OK          0      No error, everything OK. */
-  ENOMEM,        /* ERR_MEM        -1      Out of memory error.     */
-  ENOBUFS,       /* ERR_BUF        -2      Buffer error.            */
-  EWOULDBLOCK,   /* ERR_TIMEOUT    -3      Timeout                  */
-  EHOSTUNREACH,  /* ERR_RTE        -4      Routing problem.         */
-  EINPROGRESS,   /* ERR_INPROGRESS -5      Operation in progress    */
-  EINVAL,        /* ERR_VAL        -6      Illegal value.           */
-  EWOULDBLOCK,   /* ERR_WOULDBLOCK -7      Operation would block.   */
-  EADDRINUSE,    /* ERR_USE        -8      Address in use.          */
-
-#if ESP_LWIP
-  EALREADY,      /* ERR_ALREADY    -9      Already connected.       */
-  EISCONN,              /* ERR_ISCONN     -10     Conn already established */
-  ECONNABORTED,  /* ERR_ABRT       -11     Connection aborted.      */
-  ECONNRESET,    /* ERR_RST        -12     Connection reset.        */
-  ENOTCONN,      /* ERR_CLSD       -13     Connection closed.       */
-  ENOTCONN,      /* ERR_CONN       -14     Not connected.           */
-  EIO,           /* ERR_ARG        -15     Illegal argument.        */
-  -1,            /* ERR_IF         -16     Low-level netif error    */
-#else
-  EALREADY,      /* ERR_ALREADY    -9      Already connecting.      */
-  EISCONN,       /* ERR_ISCONN     -10     Conn already established.*/
-  ENOTCONN,      /* ERR_CONN       -11     Not connected.           */
-  -1,            /* ERR_IF         -12     Low-level netif error    */
-  ECONNABORTED,  /* ERR_ABRT       -13     Connection aborted.      */
-  ECONNRESET,    /* ERR_RST        -14     Connection reset.        */
-  ENOTCONN,      /* ERR_CLSD       -15     Connection closed.       */
-  EIO            /* ERR_ARG        -16     Illegal argument.        */
-#endif
-};
-
-#define ERR_TO_ERRNO_TABLE_SIZE LWIP_ARRAYSIZE(err_to_errno_table)
-
-#define err_to_errno(err) \
-  ((unsigned)(-(signed)(err)) < ERR_TO_ERRNO_TABLE_SIZE ? \
-    err_to_errno_table[-(signed)(err)] : EIO)
-
-#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 */
-
-#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 */
-static void event_callback(struct netconn *conn, enum netconn_evt evt, u16_t len);
-#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);
-
-#if LWIP_IPV4 && LWIP_IPV6
-static void
-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);
-    ipaddr->type = IPADDR_TYPE_V6;
-  } else {
-    SOCKADDR4_TO_IP4ADDR_PORT((const struct sockaddr_in*)(const void*)(sockaddr), ipaddr, *port);
-    ipaddr->type = IPADDR_TYPE_V4;
-  }
-}
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-
-/** LWIP_NETCONN_SEM_PER_THREAD==1: initialize thread-local semaphore */
-void
-lwip_socket_thread_init(void)
-{
-   netconn_thread_init();
-}
-
-/** LWIP_NETCONN_SEM_PER_THREAD==1: destroy thread-local semaphore */
-void
-lwip_socket_thread_cleanup(void)
-{
-   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 * ESP_IRAM_ATTR
-get_socket(int s)
-{
-  struct lwip_sock *sock;
-
-  s -= 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);
-    return NULL;
-  }
-
-  sock = &sockets[s];
-
-  if (!sock->conn) {
-    LWIP_DEBUGF(SOCKETS_DEBUG, ("get_socket(%d): not active\n", s + LWIP_SOCKET_OFFSET));
-    set_errno(EBADF);
-    return NULL;
-  }
-
-  return sock;
-}
-
-/**
- * Same as get_socket but doesn't set errno
- *
- * @param s externally used socket index
- * @return struct lwip_sock for the socket or NULL if not found
- */
-static struct lwip_sock *
-tryget_socket(int s)
-{
-  s -= LWIP_SOCKET_OFFSET;
-  if ((s < 0) || (s >= NUM_SOCKETS)) {
-    return NULL;
-  }
-  if (!sockets[s].conn) {
-    return NULL;
-  }
-  return &sockets[s];
-}
-
-/**
- * Allocate a new socket for a given netconn.
- *
- * @param newconn the netconn for which to allocate a socket
- * @param accepted 1 if socket has been created by accept(),
- *                 0 if socket has been created by socket()
- * @return the index of the new socket; -1 on error
- */
-static int
-alloc_socket(struct netconn *newconn, int accepted)
-{
-  int i;
-  SYS_ARCH_DECL_PROTECT(lev);
-
-#if ESP_THREAD_SAFE
-  bool    found        = false;
-  int     oldest       = -1;
-
-  SYS_ARCH_PROTECT(lev);
-
-  if (sockets_init_flag == false){
-    sockets_init_flag = true;
-    memset(sockets, 0, sizeof(sockets));
-  }
-
-  for (i = 0; i < NUM_SOCKETS; ++i) {
-    sockets[i].age ++;
-
-    if (found == true){
-      continue;
-    }
-
-    if (!sockets[i].conn && (sockets[i].state == LWIP_SOCK_OPEN)) {
-      found  = true;
-      oldest = i;
-      continue;
-    }
-
-    if (!sockets[i].conn){
-      if (oldest == -1 || sockets[i].age > sockets[oldest].age){
-        oldest = i;
-      }
-    }
-  }
-
-  if ((oldest != -1) && !sockets[oldest].conn) {
-    found = true;
-    sockets[oldest].conn       = newconn;
-  }
-
-  SYS_ARCH_UNPROTECT(lev);
-  if (found == true) {
-    sockets[oldest].lastdata   = NULL;
-    sockets[oldest].lastoffset = 0;
-    sockets[oldest].rcvevent   = 0;
-
-    /* TCP sendbuf is empty, but the socket is not yet writable until connected
-     * (unless it has been created by accept()). */
-    sockets[oldest].sendevent  = (NETCONNTYPE_GROUP(newconn->type) == NETCONN_TCP ? (accepted != 0) : 1);
-    sockets[oldest].errevent   = 0;
-    sockets[oldest].err        = 0;
-    sockets[oldest].select_waiting = 0;
-
-    sockets[oldest].state      = LWIP_SOCK_OPEN;
-    sockets[oldest].age        = 0;
-    sockets[oldest].ref        = 0;
-    if (!sockets[oldest].lock){
-      /* one time init and never free */
-      if (sys_mutex_new(&sockets[oldest].lock) != ERR_OK){
-        LWIP_DEBUGF(ESP_THREAD_SAFE_DEBUG, ("new sock lock fail\n"));
-        return -1;
-      }
-    }
-    LWIP_DEBUGF(ESP_THREAD_SAFE_DEBUG, ("alloc_socket: alloc %d ok\n", oldest));
-
-    return oldest + LWIP_SOCKET_OFFSET;
-  }
-
-  LWIP_DEBUGF(ESP_THREAD_SAFE_DEBUG, ("alloc_socket: failed\n"));
-#else
-
-  /* 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].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].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;
-      sockets[i].select_waiting = 0;
-
-      return i + LWIP_SOCKET_OFFSET;
-    }
-    SYS_ARCH_UNPROTECT(lev);
-  }
-
-#endif
-
-  return -1;
-}
-
-/** Free a socket. The socket's netconn must have been
- * delete before!
- *
- * @param sock the socket to free
- * @param is_tcp != 0 for TCP sockets, used to free lastdata
- */
-static void
-free_socket(struct lwip_sock *sock, int is_tcp)
-{
-  void *lastdata;
-  SYS_ARCH_DECL_PROTECT(lev);
-
-  LWIP_DEBUGF(ESP_THREAD_SAFE_DEBUG, ("free_sockset:free socket s=%p is_tcp=%d\n", sock, is_tcp));
-  lastdata         = sock->lastdata;
-  sock->lastdata   = NULL;
-  sock->lastoffset = 0;
-  sock->err        = 0;
-#if ESP_THREAD_SAFE
-  if (sock->conn){
-    netconn_free(sock->conn);
-  }
-
-  SYS_ARCH_PROTECT(lev);
-  sock->age        = 0;
-  sock->conn       = NULL;
-  sock->state      = LWIP_SOCK_CLOSED;
-  SYS_ARCH_UNPROTECT(lev);
-#endif
-
-  /* Protect socket array */
-  SYS_ARCH_SET(sock->conn, NULL);
-  /* don't use 'sock' after this line, as another task might have allocated it */
-
-  if (lastdata != NULL) {
-    if (is_tcp) {
-      LWIP_DEBUGF(ESP_THREAD_SAFE_DEBUG, ("free_sockset:free lastdata pbuf=%p\n", lastdata));
-      pbuf_free((struct pbuf *)lastdata);
-    } else {
-      LWIP_DEBUGF(ESP_THREAD_SAFE_DEBUG, ("free_sockset:free lastdata, netbuf=%p\n", lastdata));
-      netbuf_delete((struct netbuf *)lastdata);
-    }
-  }
-}
-
-/* Below this, the well-known socket functions are implemented.
- * Use google.com or opengroup.org to get a good description :-)
- *
- * Exceptions are documented!
- */
-
-int
-lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen)
-{
-  struct lwip_sock *sock, *nsock;
-  struct netconn *newconn;
-  ip_addr_t naddr;
-  u16_t port = 0;
-  int newsock;
-  err_t err;
-  SYS_ARCH_DECL_PROTECT(lev);
-
-  LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d)...\n", s));
-  sock = get_socket(s);
-  if (!sock) {
-    return -1;
-  }
-
-  if (netconn_is_nonblocking(sock->conn) && (sock->rcvevent <= 0)) {
-    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d): returning EWOULDBLOCK\n", s));
-    sock_set_errno(sock, EWOULDBLOCK);
-    return -1;
-  }
-
-  /* wait for a new connection */
-  err = netconn_accept(sock->conn, &newconn);
-  if (err != ERR_OK) {
-    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d): netconn_acept failed, err=%d\n", s, err));
-    if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) {
-      sock_set_errno(sock, EOPNOTSUPP);
-      return EOPNOTSUPP;
-    }
-    sock_set_errno(sock, err_to_errno(err));
-    return -1;
-  }
-  LWIP_ASSERT("newconn != NULL", newconn != NULL);
-  /* Prevent automatic window updates, we do this on our own! */
-  netconn_set_noautorecved(newconn, 1);
-
-  newsock = alloc_socket(newconn, 1);
-  if (newsock == -1) {
-    netconn_delete(newconn);
-    sock_set_errno(sock, ENFILE);
-    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
-   * though the server task might not have created a new socket yet.
-   * In that case, newconn->socket is counted down (newconn->socket--),
-   * so nsock->rcvevent is >= 1 here!
-   */
-  SYS_ARCH_PROTECT(lev);
-  nsock->rcvevent += (s16_t)(-1 - newconn->socket);
-  newconn->socket = newsock;
-  SYS_ARCH_UNPROTECT(lev);
-
-  /* Note that POSIX only requires us to check addr is non-NULL. addrlen must
-   * not be NULL if addr is valid.
-   */
-  if (addr != NULL) {
-    union sockaddr_aligned tempaddr;
-    /* get the IP address and port of the remote host */
-    err = netconn_peer(newconn, &naddr, &port);
-    if (err != ERR_OK) {
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d): netconn_peer failed, err=%d\n", s, err));
-      netconn_delete(newconn);
-      free_socket(nsock, 1);
-      sock_set_errno(sock, err_to_errno(err));
-      return -1;
-    }
-    LWIP_ASSERT("addr valid but addrlen NULL", addrlen != NULL);
-
-    IPADDR_PORT_TO_SOCKADDR(&tempaddr, &naddr, port);
-    if (*addrlen > tempaddr.sa.sa_len) {
-      *addrlen = tempaddr.sa.sa_len;
-    }
-    MEMCPY(addr, &tempaddr, *addrlen);
-
-    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d) returning new sock=%d addr=", s, newsock));
-    ip_addr_debug_print_val(SOCKETS_DEBUG, naddr);
-    LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F"\n", port));
-  } else {
-    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d) returning new sock=%d", s, newsock));
-  }
-
-  sock_set_errno(sock, 0);
-  return newsock;
-}
-
-int
-lwip_bind(int s, const struct sockaddr *name, socklen_t namelen)
-{
-  struct lwip_sock *sock;
-  ip_addr_t local_addr;
-  u16_t local_port;
-  err_t err;
-
-  sock = get_socket(s);
-  if (!sock) {
-    return -1;
-  }
-
-  if (!SOCK_ADDR_TYPE_MATCH(name, sock)) {
-    /* sockaddr does not match socket type (IPv4/IPv6) */
-    sock_set_errno(sock, err_to_errno(ERR_VAL));
-    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;);
-  LWIP_UNUSED_ARG(namelen);
-
-  SOCKADDR_TO_IPADDR_PORT(name, &local_addr, local_port);
-  LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_bind(%d, addr=", s));
-  ip_addr_debug_print_val(SOCKETS_DEBUG, local_addr);
-  LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F")\n", local_port));
-
-  err = netconn_bind(sock->conn, &local_addr, local_port);
-
-  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));
-    return -1;
-  }
-
-  LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_bind(%d) succeeded\n", s));
-  sock_set_errno(sock, 0);
-  return 0;
-}
-
-int
-lwip_close(int s)
-{
-  struct lwip_sock *sock;
-  int is_tcp = 0;
-  err_t err;
-
-  LWIP_DEBUGF(SOCKETS_DEBUG|ESP_THREAD_SAFE_DEBUG, ("lwip_close: (%d)\n", s));
-
-  sock = get_socket(s);
-  if (!sock) {
-    LWIP_DEBUGF(SOCKETS_DEBUG|ESP_THREAD_SAFE_DEBUG, ("lwip_close: sock is null, return -1\n"));
-    return -1;
-  }
-
-  if (sock->conn != NULL) {
-    is_tcp = NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP;
-    LWIP_DEBUGF(SOCKETS_DEBUG|ESP_THREAD_SAFE_DEBUG, ("lwip_close: is_tcp=%d\n", is_tcp));
-  } else {
-    LWIP_DEBUGF(SOCKETS_DEBUG|ESP_THREAD_SAFE_DEBUG, ("conn is null\n"));
-    LWIP_ASSERT("lwip_close: sock->lastdata == NULL", sock->lastdata == NULL);
-  }
-
-#if (LWIP_IGMP) || (LWIP_IPV6_MLD && LWIP_MULTICAST_TX_OPTIONS)
-  /* drop all possibly joined IGMP memberships */
-  lwip_socket_drop_registered_memberships(s);
-#endif /* LWIP_IGMP */
-
-  err = netconn_delete(sock->conn);
-  if (err != ERR_OK) {
-    LWIP_DEBUGF(SOCKETS_DEBUG|ESP_THREAD_SAFE_DEBUG, ("netconn_delete fail, ret=%d\n", err));
-    sock_set_errno(sock, err_to_errno(err));
-    return -1;
-  }
-
-#if !ESP_THREAD_SAFE
-  free_socket(sock, is_tcp);
-#endif
-
-  set_errno(0);
-  return 0;
-}
-
-int
-lwip_connect(int s, const struct sockaddr *name, socklen_t namelen)
-{
-  struct lwip_sock *sock;
-  err_t err;
-
-  sock = get_socket(s);
-  if (!sock) {
-    return -1;
-  }
-
-  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));
-    return -1;
-  }
-
-  LWIP_UNUSED_ARG(namelen);
-  if (name->sa_family == AF_UNSPEC) {
-    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_connect(%d, AF_UNSPEC)\n", s));
-    err = netconn_disconnect(sock->conn);
-  } else {
-    ip_addr_t remote_addr;
-    u16_t remote_port;
-
-    /* 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;);
-
-    SOCKADDR_TO_IPADDR_PORT(name, &remote_addr, remote_port);
-    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_connect(%d, addr=", s));
-    ip_addr_debug_print_val(SOCKETS_DEBUG, remote_addr);
-    LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F")\n", remote_port));
-
-    err = netconn_connect(sock->conn, &remote_addr, remote_port);
-  }
-
-  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));
-    return -1;
-  }
-
-  LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_connect(%d) succeeded\n", s));
-  sock_set_errno(sock, 0);
-  return 0;
-}
-
-/**
- * Set a socket into listen mode.
- * The socket may not have been used for another connection previously.
- *
- * @param s the socket to set to listening mode
- * @param backlog (ATTENTION: needs TCP_LISTEN_BACKLOG=1)
- * @return 0 on success, non-zero on failure
- */
-int
-lwip_listen(int s, int backlog)
-{
-  struct lwip_sock *sock;
-  err_t err;
-
-  LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_listen(%d, backlog=%d)\n", s, backlog));
-
-  sock = get_socket(s);
-  if (!sock) {
-    return -1;
-  }
-
-  /* limit the "backlog" parameter to fit in an u8_t */
-  backlog = LWIP_MIN(LWIP_MAX(backlog, 0), 0xff);
-
-  err = netconn_listen_with_backlog(sock->conn, (u8_t)backlog);
-
-  if (err != ERR_OK) {
-    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_listen(%d) failed, err=%d\n", s, err));
-    if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) {
-      sock_set_errno(sock, EOPNOTSUPP);
-      return -1;
-    }
-    sock_set_errno(sock, err_to_errno(err));
-    return -1;
-  }
-
-  sock_set_errno(sock, 0);
-  return 0;
-}
-
-int ESP_IRAM_ATTR
-lwip_recvfrom(int s, void *mem, size_t len, int flags,
-              struct sockaddr *from, socklen_t *fromlen)
-{
-  struct lwip_sock *sock;
-  void             *buf = NULL;
-  struct pbuf      *p;
-  u16_t            buflen, copylen;
-  int              off = 0;
-  u8_t             done = 0;
-  err_t            err;
-
-  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;
-  }
-
-  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) {
-          /* update receive window */
-          netconn_recved(sock->conn, (u32_t)off);
-          /* already received data, return that */
-          sock_set_errno(sock, 0);
-          return off;
-        }
-        LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d): returning EWOULDBLOCK\n", s));
-        sock_set_errno(sock, EWOULDBLOCK);
-        return -1;
-      }
-
-      /* 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));
-
-      if (err != ERR_OK) {
-        if (off > 0) {
-          /* update receive window */
-          netconn_recved(sock->conn, (u32_t)off);
-          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;
-        }
-        /* 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)));
-        sock_set_errno(sock, err_to_errno(err));
-        if (err == ERR_CLSD) {
-          return 0;
-        } else {
-          return -1;
-        }
-      }
-      LWIP_ASSERT("buf != NULL", buf != NULL);
-      sock->lastdata = buf;
-    }
-
-    if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {
-      p = (struct pbuf *)buf;
-    } else {
-      p = ((struct netbuf *)buf)->p;
-    }
-    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;
-    }
-
-    /* copy the contents of the received buffer into
-    the supplied memory pointer mem */
-    pbuf_copy_partial(p, (u8_t*)mem + off, copylen, sock->lastoffset);
-
-    off += 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;
-      }
-    } else {
-      done = 1;
-    }
-
-    /* Check to see from where the data was.*/
-    if (done) {
-/* enabling the UDP fix for ESP32 below when SOCKET_DEBUG is off */
-#if !SOCKETS_DEBUG && !ESP_LWIP
-      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);
-        }
-        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 (from && fromlen)
-        {
-              if (*fromlen > saddr.sa.sa_len) {
-                *fromlen = saddr.sa.sa_len;
-              }
-              MEMCPY(from, &saddr, *fromlen);
-#if ESP_LWIP
-        } else {
-               /*fix the code for setting the UDP PROTO's remote infomation by liuh at 2014.8.27*/
-               if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_UDP){
-                       sock->conn->pcb.udp->remote_ip.u_addr.ip4.addr = fromaddr->u_addr.ip4.addr;
-                       sock->conn->pcb.udp->remote_port = port;
-               }
-#endif
-
-        }
-      }
-    }
-
-    /* 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);
-
-  if ((off > 0) && (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) &&
-      ((flags & MSG_PEEK) == 0)) {
-    /* update receive window */
-    netconn_recved(sock->conn, (u32_t)off);
-  }
-  sock_set_errno(sock, 0);
-  return off;
-}
-
-
-int
-lwip_read(int s, void *mem, size_t len)
-{
-  return lwip_recvfrom(s, mem, len, 0, NULL, NULL);
-}
-
-int
-lwip_recv(int s, void *mem, size_t len, int flags)
-{
-  return lwip_recvfrom(s, mem, len, flags, NULL, NULL);
-}
-
-int
-lwip_send(int s, const void *data, size_t size, int flags)
-{
-  struct lwip_sock *sock;
-  err_t err;
-  u8_t write_flags;
-  size_t written;
-
-  LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_send(%d, data=%p, size=%"SZT_F", flags=0x%x)\n",
-                              s, data, size, flags));
-
-  sock = get_socket(s);
-  if (!sock) {
-    return -1;
-  }
-
-  if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) {
-#if (LWIP_UDP || LWIP_RAW)
-    return lwip_sendto(s, data, size, flags, NULL, 0);
-#else /* (LWIP_UDP || LWIP_RAW) */
-    sock_set_errno(sock, err_to_errno(ERR_ARG));
-    return -1;
-#endif /* (LWIP_UDP || LWIP_RAW) */
-  }
-
-  write_flags = 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);
-}
-
-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_VAL);
-      return -1;
-    }
-    buflen = (ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len);
-  }
-
-  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_recvfrom(s, message->msg_iov[i].iov_base, message->msg_iov[i].iov_len, recv_flags, NULL, NULL);
-    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);
-  }
-
-  return buflen;
-}
-
-int
-lwip_sendmsg(int s, const struct msghdr *msg, int flags)
-{
-  struct lwip_sock *sock;
-  struct netbuf *chain_buf;
-  u16_t remote_port;
-  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);
-  if (!sock) {
-    return -1;
-  }
-
-  LWIP_ERROR("lwip_sendmsg: invalid msghdr", msg != NULL,
-             sock_set_errno(sock, err_to_errno(ERR_ARG)); 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);
-
-    for (i = 0; i < msg->msg_iovlen; i++) {
-      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;
-      }
-    }
-    sock_set_errno(sock, err_to_errno(err));
-    return size;
-#else /* LWIP_TCP */
-    sock_set_errno(sock, err_to_errno(ERR_ARG));
-    return -1;
-#endif /* LWIP_TCP */
-  }
-  /* else, UDP and RAW NETCONNs */
-#if LWIP_UDP || LWIP_RAW
-
-  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;);
-
-  /* initialize chain buffer with destination */
-  chain_buf = netbuf_new();
-  if (!chain_buf) {
-    sock_set_errno(sock, err_to_errno(ERR_MEM));
-    return -1;
-  }
-  if (msg->msg_name) {
-    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;
-  }
-  /* Allocate a new netbuf and copy the data into it. */
-  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);
-      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);
-    }
-#endif /* LWIP_CHECKSUM_ON_COPY */
-    err = ERR_OK;
-  }
-#else /* LWIP_NETIF_TX_SINGLE_PBUF */
-  /* 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);
-    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;
-    /* add pbuf to existing pbuf chain */
-    } else {
-      pbuf_cat(chain_buf->p, p);
-    }
-  }    
-  /* save size of total chain */
-  if (err == ERR_OK) {
-    size = netbuf_len(chain_buf);
-  }
-#endif /* LWIP_NETIF_TX_SINGLE_PBUF */
-
-  if (err == ERR_OK) {
-    /* send the data */
-    err = netconn_send(sock->conn, chain_buf);
-  }
-
-  /* deallocated the buffer */
-  netbuf_delete(chain_buf);
-
-  sock_set_errno(sock, err_to_errno(err));
-  return (err == ERR_OK ? size : -1);
-#else /* LWIP_UDP || LWIP_RAW */
-  sock_set_errno(sock, err_to_errno(ERR_ARG));
-  return -1;
-#endif /* LWIP_UDP || LWIP_RAW */
-}
-
-int ESP_IRAM_ATTR
-lwip_sendto(int s, const void *data, size_t size, int flags,
-       const struct sockaddr *to, socklen_t tolen)
-{
-  struct lwip_sock *sock;
-  err_t err;
-  u16_t short_size;
-  u16_t remote_port;
-  struct netbuf buf;
-
-  sock = get_socket(s);
-  if (!sock) {
-    return -1;
-  }
-
-  if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {
-#if LWIP_TCP
-    return lwip_send(s, data, size, flags);
-#else /* LWIP_TCP */
-    LWIP_UNUSED_ARG(flags);
-    sock_set_errno(sock, err_to_errno(ERR_ARG));
-    return -1;
-#endif /* LWIP_TCP */
-  }
-
-  if ((to != NULL) && !SOCK_ADDR_TYPE_MATCH(to, sock)) {
-    /* sockaddr does not match socket type (IPv4/IPv6) */
-    sock_set_errno(sock, err_to_errno(ERR_VAL));
-    return -1;
-  }
-
-  /* @todo: split into multiple sendto's? */
-  LWIP_ASSERT("lwip_sendto: size must fit in u16_t", size <= 0xffff);
-  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;);
-  LWIP_UNUSED_ARG(tolen);
-
-  /* initialize a buffer */
-  buf.p = buf.ptr = NULL;
-#if LWIP_CHECKSUM_ON_COPY
-  buf.flags = 0;
-#endif /* LWIP_CHECKSUM_ON_COPY */
-  if (to) {
-    SOCKADDR_TO_IPADDR_PORT(to, &buf.addr, remote_port);
-  } else {
-  
-#if ESP_LWIP
-        /*fix the code for getting the UDP proto's remote information by liuh at 2014.8.27*/
-        if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_UDP){
-            if(NETCONNTYPE_ISIPV6(netconn_type(sock->conn))) {
-                memcpy(&buf.addr.u_addr.ip6.addr, sock->conn->pcb.udp->remote_ip.u_addr.ip6.addr,16);
-                remote_port = sock->conn->pcb.udp->remote_port;
-                IP_SET_TYPE(&buf.addr, IPADDR_TYPE_V6);
-            } else {
-                buf.addr.u_addr.ip4.addr = sock->conn->pcb.udp->remote_ip.u_addr.ip4.addr;
-                remote_port = sock->conn->pcb.udp->remote_port;
-                IP_SET_TYPE(&buf.addr, IPADDR_TYPE_V4);
-            }
-        } else {
-#endif
-            remote_port = 0;
-            ip_addr_set_any(NETCONNTYPE_ISIPV6(netconn_type(sock->conn)), &buf.addr);
-#if ESP_LWIP
-        }
-#endif
-        
-  }
-  netbuf_fromport(&buf) = remote_port;
-
-
-  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);
-  LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F"\n", remote_port));
-
-  /* make the buffer point to the data that should be sent */
-#if LWIP_NETIF_TX_SINGLE_PBUF
-  /* Allocate a new netbuf and copy the data into it. */
-  if (netbuf_alloc(&buf, short_size) == NULL) {
-    err = ERR_MEM;
-  } else {
-#if LWIP_CHECKSUM_ON_COPY
-    if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_RAW) {
-      u16_t chksum = LWIP_CHKSUM_COPY(buf.p->payload, data, short_size);
-      netbuf_set_chksum(&buf, chksum);
-    } else
-#endif /* LWIP_CHECKSUM_ON_COPY */
-    {
-      MEMCPY(buf.p->payload, data, short_size);
-    }
-    err = ERR_OK;
-  }
-#else /* LWIP_NETIF_TX_SINGLE_PBUF */
-  err = netbuf_ref(&buf, data, short_size);
-#endif /* LWIP_NETIF_TX_SINGLE_PBUF */
-
-  if (err == ERR_OK) {
-    DBG_PERF_PATH_SET(DBG_PERF_DIR_TX, DBG_PERF_POINT_SOC_OUT);
-    /* send the data */
-    err = netconn_send(sock->conn, &buf);
-  }
-
-  /* deallocated the buffer */
-  netbuf_free(&buf);
-
-  sock_set_errno(sock, err_to_errno(err));
-  return (err == ERR_OK ? short_size : -1);
-}
-
-int
-lwip_socket(int domain, int type, int protocol)
-{
-  struct netconn *conn;
-  int i;
-
-#if !LWIP_IPV6
-  LWIP_UNUSED_ARG(domain); /* @todo: check this */
-#endif /* LWIP_IPV6 */
-
-  /* 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));
-    if (conn != NULL) {
-      /* Prevent automatic window updates, we do this on our own! */
-      netconn_set_noautorecved(conn, 1);
-    }
-    break;
-  default:
-    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%d, %d/UNKNOWN, %d) = -1\n",
-                                 domain, type, protocol));
-    set_errno(EINVAL);
-    return -1;
-  }
-
-  if (!conn) {
-    LWIP_DEBUGF(SOCKETS_DEBUG, ("-1 / ENOBUFS (could not create netconn)\n"));
-    set_errno(ENOBUFS);
-    return -1;
-  }
-
-  i = alloc_socket(conn, 0);
-
-  if (i == -1) {
-    LWIP_DEBUGF(SOCKETS_DEBUG, ("-1 / ENFILE (could not allocate socket)\n"));
-    netconn_delete(conn);
-    set_errno(ENFILE);
-    return -1;
-  }
-  conn->socket = i;
-  LWIP_DEBUGF(SOCKETS_DEBUG, ("%d\n", i));
-  set_errno(0);
-  return i;
-}
-
-int
-lwip_write(int s, const void *data, size_t size)
-{
-  return lwip_send(s, data, size, 0);
-}
-
-int
-lwip_writev(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 = (struct iovec *)(size_t)iov;
-  msg.msg_iovlen = iovcnt;
-  msg.msg_control = NULL;
-  msg.msg_controllen = 0;
-  msg.msg_flags = 0;
-  return lwip_sendmsg(s, &msg, 0);
-}
-
-/**
- * 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
- * the sockets enabled that had events.
- *
- * @param maxfdp1 the highest socket index in the sets
- * @param readset_in:    set of sockets to check for read events
- * @param writeset_in:   set of sockets to check for write events
- * @param exceptset_in:  set of sockets to check for error events
- * @param readset_out:   set of sockets that had read events
- * @param writeset_out:  set of sockets that had write events
- * @param exceptset_out: set os sockets that had error events
- * @return number of sockets that had events (read/write/exception) (>= 0)
- */
-static int
-lwip_selscan(int maxfdp1, fd_set *readset_in, fd_set *writeset_in, fd_set *exceptset_in,
-             fd_set *readset_out, fd_set *writeset_out, fd_set *exceptset_out)
-{
-  int i, nready = 0;
-  fd_set lreadset, lwriteset, lexceptset;
-  struct lwip_sock *sock;
-  SYS_ARCH_DECL_PROTECT(lev);
-
-  FD_ZERO(&lreadset);
-  FD_ZERO(&lwriteset);
-  FD_ZERO(&lexceptset);
-
-  /* Go through each socket in each list to count number of sockets which
-     currently match */
-  for (i = LWIP_SOCKET_OFFSET; i < maxfdp1; i++) {
-    /* if this FD is not in the set, continue */
-    if (!(readset_in && FD_ISSET(i, readset_in)) &&
-        !(writeset_in && FD_ISSET(i, writeset_in)) &&
-        !(exceptset_in && FD_ISSET(i, exceptset_in))) {
-      continue;
-    }
-    /* First get the socket's status (protected)... */
-    SYS_ARCH_PROTECT(lev);
-    sock = tryget_socket(i);
-    if (sock != NULL) {
-      void* lastdata = sock->lastdata;
-      s16_t rcvevent = sock->rcvevent;
-      u16_t sendevent = sock->sendevent;
-      u16_t errevent = sock->errevent;
-      SYS_ARCH_UNPROTECT(lev);
-
-      /* ... then examine it: */
-      /* See if netconn of this socket is ready for read */
-      if (readset_in && FD_ISSET(i, readset_in) && ((lastdata != NULL) || (rcvevent > 0))) {
-        FD_SET(i, &lreadset);
-        LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_selscan: fd=%d ready for reading\n", i));
-        nready++;
-      }
-      /* See if netconn of this socket is ready for write */
-      if (writeset_in && FD_ISSET(i, writeset_in) && (sendevent != 0)) {
-        FD_SET(i, &lwriteset);
-        LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_selscan: fd=%d ready for writing\n", i));
-        nready++;
-      }
-      /* See if netconn of this socket had an error */
-      if (exceptset_in && FD_ISSET(i, exceptset_in) && (errevent != 0)) {
-        FD_SET(i, &lexceptset);
-        LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_selscan: fd=%d ready for exception\n", i));
-        nready++;
-      }
-    } else {
-      SYS_ARCH_UNPROTECT(lev);
-      /* continue on to next FD in list */
-    }
-  }
-  /* copy local sets to the ones provided as arguments */
-  *readset_out = lreadset;
-  *writeset_out = lwriteset;
-  *exceptset_out = lexceptset;
-
-  LWIP_ASSERT("nready >= 0", nready >= 0);
-  return nready;
-}
-
-int
-lwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,
-            struct timeval *timeout)
-{
-  u32_t waitres = 0;
-  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
-  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));
-
-  /* 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 (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) {
-          /* @todo: what if this is a new socket (reallocated?) in this case,
-             select_waiting-- would be wrong (a global 'sockalloc' counter,
-             stored per socket could help) */
-          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);
-
-#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);
-    }
-#else /* LWIP_NETCONN_SEM_PER_THREAD */
-    sys_sem_free(&select_cb.sem);
-#endif /* LWIP_NETCONN_SEM_PER_THREAD */
-
-    if (nready < 0) {
-      /* This happens when a socket got closed while waiting */
-      set_errno(EBADF);
-      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. */
-      goto return_copy_fdsets;
-    }
-
-    /* See what's set */
-    nready = lwip_selscan(maxfdp1, readset, writeset, exceptset, &lreadset, &lwriteset, &lexceptset);
-  }
-
-  LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_select: nready=%d\n", nready));
-return_copy_fdsets:
-  set_errno(0);
-  if (readset) {
-    *readset = lreadset;
-  }
-  if (writeset) {
-    *writeset = lwriteset;
-  }
-  if (exceptset) {
-    *exceptset = lexceptset;
-  }
-  return nready;
-}
-
-/**
- * Callback registered in the netconn layer for each socket-netconn.
- * Processes recvevent (data available) and wakes up tasks waiting for select.
- */
-static void ESP_IRAM_ATTR
-event_callback(struct netconn *conn, enum netconn_evt evt, u16_t len)
-{
-  int s;
-  struct lwip_sock *sock;
-  struct lwip_select_cb *scb;
-  int last_select_cb_ctr;
-  SYS_ARCH_DECL_PROTECT(lev);
-
-  LWIP_UNUSED_ARG(len);
-
-  /* Get socket */
-  if (conn) {
-    s = conn->socket;
-    if (s < 0) {
-      /* Data comes in right away after an accept, even though
-       * the server task might not have created a new socket yet.
-       * Just count down (or up) if that's the case and we
-       * will use the data later. Note that only receive events
-       * can happen before the new socket is set up. */
-      SYS_ARCH_PROTECT(lev);
-      if (conn->socket < 0) {
-        if (evt == NETCONN_EVT_RCVPLUS) {
-          conn->socket--;
-        }
-        SYS_ARCH_UNPROTECT(lev);
-        return;
-      }
-      s = conn->socket;
-      SYS_ARCH_UNPROTECT(lev);
-    }
-
-    sock = get_socket(s);
-    if (!sock) {
-      return;
-    }
-  } else {
-    return;
-  }
-
-  SYS_ARCH_PROTECT(lev);
-  /* Set event as required */
-  switch (evt) {
-    case NETCONN_EVT_RCVPLUS:
-      sock->rcvevent++;
-      break;
-    case NETCONN_EVT_RCVMINUS:
-      sock->rcvevent--;
-      break;
-    case NETCONN_EVT_SENDPLUS:
-      sock->sendevent = 1;
-      break;
-    case NETCONN_EVT_SENDMINUS:
-      sock->sendevent = 0;
-      break;
-    case NETCONN_EVT_ERROR:
-      sock->errevent = 1;
-      break;
-    default:
-      LWIP_ASSERT("unknown event", 0);
-      break;
-  }
-
-  if (sock->select_waiting == 0) {
-    /* noone is waiting for this socket, no need to check select_cb_list */
-    SYS_ARCH_UNPROTECT(lev);
-    return;
-  }
-
-  /* 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. */
-
-  /* At this point, SYS_ARCH is still protected! */
-again:
-  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 (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;
-        }
-      }
-      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. */
-        sys_sem_signal(SELECT_SEM_PTR(scb->sem));
-      }
-    }
-    /* unlock interrupts with each step */
-    SYS_ARCH_UNPROTECT(lev);
-    /* this makes sure interrupt protection time is short */
-    SYS_ARCH_PROTECT(lev);
-    if (last_select_cb_ctr != select_cb_ctr) {
-      /* someone has changed select_cb_list, restart at the beginning */
-      goto again;
-    }
-  }
-  SYS_ARCH_UNPROTECT(lev);
-}
-
-/**
- * Unimplemented: Close one end of a full-duplex connection.
- * Currently, the full connection is closed.
- */
-int
-lwip_shutdown(int s, int how)
-{
-#if ! ESP_LWIP
-
-  struct lwip_sock *sock;
-  err_t err;
-  u8_t shut_rx = 0, shut_tx = 0;
-
-  LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_shutdown(%d, how=%d)\n", s, how));
-
-  sock = get_socket(s);
-  if (!sock) {
-    return -1;
-  }
-
-  if (sock->conn != NULL) {
-    if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) {
-      sock_set_errno(sock, EOPNOTSUPP);
-      return -1;
-    }
-  } else {
-    sock_set_errno(sock, ENOTCONN);
-    return -1;
-  }
-
-  if (how == SHUT_RD) {
-    shut_rx = 1;
-  } else if (how == SHUT_WR) {
-    shut_tx = 1;
-  } else if (how == SHUT_RDWR) {
-    shut_rx = 1;
-    shut_tx = 1;
-  } else {
-    sock_set_errno(sock, EINVAL);
-    return -1;
-  }
-  err = netconn_shutdown(sock->conn, shut_rx, shut_tx);
-
-  sock_set_errno(sock, err_to_errno(err));
-  return (err == ERR_OK ? 0 : -1);
-#else
-  return ERR_OK;
-#endif
-  
-}
-
-static int
-lwip_getaddrname(int s, struct sockaddr *name, socklen_t *namelen, u8_t local)
-{
-  struct lwip_sock *sock;
-  union sockaddr_aligned saddr;
-  ip_addr_t naddr;
-  u16_t port;
-  err_t err;
-
-  sock = get_socket(s);
-  if (!sock) {
-    return -1;
-  }
-
-  /* get the IP address and port */
-  /* @todo: this does not work for IPv6, yet */
-  err = netconn_getaddr(sock->conn, &naddr, &port, local);
-  if (err != ERR_OK) {
-    sock_set_errno(sock, err_to_errno(err));
-    return -1;
-  }
-  IPADDR_PORT_TO_SOCKADDR(&saddr, &naddr, port);
-
-  LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getaddrname(%d, addr=", s));
-  ip_addr_debug_print_val(SOCKETS_DEBUG, naddr);
-  LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F")\n", port));
-
-  if (*namelen > saddr.sa.sa_len) {
-    *namelen = saddr.sa.sa_len;
-  }
-  MEMCPY(name, &saddr, *namelen);
-
-  sock_set_errno(sock, 0);
-  return 0;
-}
-
-int
-lwip_getpeername(int s, struct sockaddr *name, socklen_t *namelen)
-{
-  return lwip_getaddrname(s, name, namelen, 0);
-}
-
-int
-lwip_getsockname(int s, struct sockaddr *name, socklen_t *namelen)
-{
-  return lwip_getaddrname(s, name, namelen, 1);
-}
-
-int
-lwip_getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen)
-{
-  u8_t err;
-  struct lwip_sock *sock = get_socket(s);
-#if !LWIP_TCPIP_CORE_LOCKING
-  LWIP_SETGETSOCKOPT_DATA_VAR_DECLARE(data);
-#endif /* !LWIP_TCPIP_CORE_LOCKING */
-
-  if (!sock) {
-    return -1;
-  }
-
-  if ((NULL == optval) || (NULL == optlen)) {
-    sock_set_errno(sock, EFAULT);
-    return -1;
-  }
-
-#if LWIP_TCPIP_CORE_LOCKING
-  /* core-locking can just call the -impl function */
-  LOCK_TCPIP_CORE();
-  err = lwip_getsockopt_impl(s, level, optname, optval, optlen);
-  UNLOCK_TCPIP_CORE();
-
-#else /* LWIP_TCPIP_CORE_LOCKING */
-
-#if LWIP_MPU_COMPATIBLE
-  /* MPU_COMPATIBLE copies the optval data, so check for max size here */
-  if (*optlen > LWIP_SETGETSOCKOPT_MAXOPTLEN) {
-    sock_set_errno(sock, ENOBUFS);
-    return -1;
-  }
-#endif /* LWIP_MPU_COMPATIBLE */
-
-  LWIP_SETGETSOCKOPT_DATA_VAR_ALLOC(data, sock);
-  LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).s = s;
-  LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).level = level;
-  LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optname = optname;
-  LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optlen = *optlen;
-#if !LWIP_MPU_COMPATIBLE
-  LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optval.p = optval;
-#endif /* !LWIP_MPU_COMPATIBLE */
-  LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).err = 0;
-#if LWIP_NETCONN_SEM_PER_THREAD
-  LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).completed_sem = LWIP_NETCONN_THREAD_SEM_GET();
-#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) {
-    LWIP_SETGETSOCKOPT_DATA_VAR_FREE(data);
-    sock_set_errno(sock, err_to_errno(err));
-    return -1;
-  }
-  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);
-#endif /* LWIP_MPU_COMPATIBLE */
-
-  /* maybe lwip_getsockopt_internal has changed err */
-  err = LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).err;
-  LWIP_SETGETSOCKOPT_DATA_VAR_FREE(data);
-#endif /* LWIP_TCPIP_CORE_LOCKING */
-
-  sock_set_errno(sock, err);
-  return err ? -1 : 0;
-}
-
-#if !LWIP_TCPIP_CORE_LOCKING
-/** lwip_getsockopt_callback: only used without CORE_LOCKING
- * to get into the tcpip_thread
- */
-static void
-lwip_getsockopt_callback(void *arg)
-{
-  struct lwip_setgetsockopt_data *data;
-  LWIP_ASSERT("arg != NULL", arg != NULL);
-  data = (struct lwip_setgetsockopt_data*)arg;
-
-  data->err = lwip_getsockopt_impl(data->s, data->level, data->optname,
-#if LWIP_MPU_COMPATIBLE
-    data->optval,
-#else /* LWIP_MPU_COMPATIBLE */
-    data->optval.p,
-#endif /* LWIP_MPU_COMPATIBLE */
-    &data->optlen);
-
-  sys_sem_signal((sys_sem_t*)(data->completed_sem));
-}
-#endif  /* LWIP_TCPIP_CORE_LOCKING */
-
-/** lwip_getsockopt_impl: the actual implementation of getsockopt:
- * same argument as lwip_getsockopt, either called directly or through callback
- */
-static u8_t
-lwip_getsockopt_impl(int s, int level, int optname, void *optval, socklen_t *optlen)
-{
-  u8_t err = 0;
-  struct lwip_sock *sock = tryget_socket(s);
-  if (!sock) {
-    return EBADF;
-  }
-
-  switch (level) {
-
-/* 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;
-#endif /* LWIP_TCP */
-
-    /* The option flags */
-    case SO_BROADCAST:
-    case SO_KEEPALIVE:
-#if SO_REUSE
-    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;
-
-    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(*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;
-
-#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;
-#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;
-#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;
-#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;
-        }
-      }
-      break;
-#endif /* LWIP_SO_LINGER */
-#if LWIP_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 */
-      *(int*)optval = (udp_flags(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;
-      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));
-      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 = sock->conn->pcb.udp->mcast_ttl;
-      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_ipaddr((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);
-    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;
-#endif /* LWIP_TCP_KEEPALIVE */
-
-#if ESP_PER_SOC_TCP_WND
-    case TCP_WINDOW:
-    *(int*)optval = (int)sock->conn->pcb.tcp->per_soc_tcp_wnd;
-    break;
-    case TCP_SNDBUF:
-    *(int*)optval = (int)sock->conn->pcb.tcp->per_soc_tcp_snd_buf;
-    break;
-#endif
-
-    default:
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, UNIMPL: optname=0x%x, ..)\n",
-                  s, optname));
-      err = ENOPROTOOPT;
-      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));
-      break;
-    default:
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IPV6, UNIMPL: optname=0x%x, ..)\n",
-                  s, optname));
-      err = ENOPROTOOPT;
-      break;
-    }  /* switch (optname) */
-    break;
-#if  LWIP_IPV6_MLD && LWIP_MULTICAST_TX_OPTIONS  /* Multicast options, similar to LWIP_IGMP options for IPV4 */
-    case IPV6_MULTICAST_IF: /* NB: like IP_MULTICAST_IF, this returns an IP not an index */
-      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, struct in6_addr);
-      if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_UDP) {
-        return ENOPROTOOPT;
-      }
-      inet6_addr_from_ip6addr((struct in6_addr*)optval,
-                              udp_get_multicast_netif_ip6addr(sock->conn->pcb.udp));
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IPV6, IPV6_MULTICAST_IF) = 0x%"X32_F"\n",
-                                  s, *(u32_t *)optval));
-      break;
-    case IPV6_MULTICAST_HOPS:
-      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, u8_t);
-      if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_UDP) {
-        return ENOPROTOOPT;
-      }
-      *(u8_t*)optval = sock->conn->pcb.udp->mcast_ttl;
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IPV6, IP_MULTICAST_LOOP) = %d\n",
-                                  s, *(int *)optval));
-      break;
-    case IPV6_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_IPV6, IP_MULTICAST_LOOP) = %d\n",
-                                  s, *(int *)optval));
-      break;
-
-#endif /* LWIP_IPV6_MLD && LWIP_MULTICAST_TX_OPTIONS */
-#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;
-      }
-      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, level=0x%x, UNIMPL: optname=0x%x, ..)\n",
-                                s, level, optname));
-    err = ENOPROTOOPT;
-    break;
-  } /* switch (level) */
-
-  return err;
-}
-
-int
-lwip_setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen)
-{
-  u8_t err = 0;
-  struct lwip_sock *sock = get_socket(s);
-#if !LWIP_TCPIP_CORE_LOCKING
-  LWIP_SETGETSOCKOPT_DATA_VAR_DECLARE(data);
-#endif /* !LWIP_TCPIP_CORE_LOCKING */
-
-  if (!sock) {
-    return -1;
-  }
-
-  if (NULL == optval) {
-    sock_set_errno(sock, EFAULT);
-    return -1;
-  }
-
-#if LWIP_TCPIP_CORE_LOCKING
-  /* core-locking can just call the -impl function */
-  LOCK_TCPIP_CORE();
-  err = lwip_setsockopt_impl(s, level, optname, optval, optlen);
-  UNLOCK_TCPIP_CORE();
-
-#else /* LWIP_TCPIP_CORE_LOCKING */
-
-#if LWIP_MPU_COMPATIBLE
-  /* MPU_COMPATIBLE copies the optval data, so check for max size here */
-  if (optlen > LWIP_SETGETSOCKOPT_MAXOPTLEN) {
-    sock_set_errno(sock, ENOBUFS);
-    return -1;
-  }
-#endif /* LWIP_MPU_COMPATIBLE */
-
-  LWIP_SETGETSOCKOPT_DATA_VAR_ALLOC(data, sock);
-  LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).s = s;
-  LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).level = level;
-  LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optname = optname;
-  LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optlen = optlen;
-#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;
-#endif /* LWIP_MPU_COMPATIBLE */
-  LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).err = 0;
-#if LWIP_NETCONN_SEM_PER_THREAD
-  LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).completed_sem = LWIP_NETCONN_THREAD_SEM_GET();
-#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) {
-    LWIP_SETGETSOCKOPT_DATA_VAR_FREE(data);
-    sock_set_errno(sock, err_to_errno(err));
-    return -1;
-  }
-  sys_arch_sem_wait((sys_sem_t*)(LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).completed_sem), 0);
-
-  /* maybe lwip_getsockopt_internal has changed err */
-  err = LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).err;
-  LWIP_SETGETSOCKOPT_DATA_VAR_FREE(data);
-#endif  /* LWIP_TCPIP_CORE_LOCKING */
-
-  sock_set_errno(sock, err);
-  return err ? -1 : 0;
-}
-
-#if !LWIP_TCPIP_CORE_LOCKING
-/** lwip_setsockopt_callback: only used without CORE_LOCKING
- * to get into the tcpip_thread
- */
-static void
-lwip_setsockopt_callback(void *arg)
-{
-  struct lwip_setgetsockopt_data *data;
-  LWIP_ASSERT("arg != NULL", arg != NULL);
-  data = (struct lwip_setgetsockopt_data*)arg;
-
-  data->err = lwip_setsockopt_impl(data->s, data->level, data->optname,
-#if LWIP_MPU_COMPATIBLE
-    data->optval,
-#else /* LWIP_MPU_COMPATIBLE */
-    data->optval.pc,
-#endif /* LWIP_MPU_COMPATIBLE */
-    data->optlen);
-
-  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
-lwip_setsockopt_impl(int s, int level, int optname, const void *optval, socklen_t optlen)
-{
-  u8_t err = 0;
-  struct lwip_sock *sock = tryget_socket(s);
-  if (!sock) {
-    return EBADF;
-  }
-
-  switch (level) {
-
-/* Level: SOL_SOCKET */
-  case SOL_SOCKET:
-    switch (optname) {
-
-    /* SO_ACCEPTCONN is get-only */
-
-    /* The option flags */
-    case SO_BROADCAST:
-    case SO_KEEPALIVE:
-#if SO_REUSE
-    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;
-
-    /* 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) {
-            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);
-#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);
-      sock->conn->pcb.udp->mcast_ttl = (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_ipaddr(&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 state the socket */
-        err_t igmp_err;
-        const struct ip_mreq *imr = (const struct ip_mreq *)optval;
-        ip_addr_t if_addr;
-        ip_addr_t multi_addr;
-        LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, struct ip_mreq, NETCONN_UDP);
-        inet_addr_to_ipaddr(ip_2_ip4(&if_addr), &imr->imr_interface);
-        inet_addr_to_ipaddr(ip_2_ip4(&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(ip_2_ip4(&if_addr), ip_2_ip4(&multi_addr));
-          }
-        } else {
-          igmp_err = igmp_leavegroup(ip_2_ip4(&if_addr), ip_2_ip4(&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;
-      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);
-    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;
-#endif /* LWIP_TCP_KEEPALIVE */
-
-#if ESP_PER_SOC_TCP_WND
-    case TCP_WINDOW:
-    sock->conn->pcb.tcp->per_soc_tcp_wnd = ((u32_t)(*(const int*)optval)) * TCP_MSS;
-    break;
-    case TCP_SNDBUF:
-    sock->conn->pcb.tcp->per_soc_tcp_snd_buf = ((u32_t)(*(const int*)optval)) * TCP_MSS;
-    break;
-#endif
-
-    default:
-      LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, UNIMPL: optname=0x%x, ..)\n",
-                  s, optname));
-      err = ENOPROTOOPT;
-      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);
-      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 && LWIP_MULTICAST_TX_OPTIONS  /* Multicast options, similar to LWIP_IGMP options for IPV4 */
-    case IPV6_MULTICAST_IF: /* NB: like IP_MULTICAST_IF, this takes an IP not an index */
-      {
-        ip6_addr_t if_addr;
-        LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, struct in6_addr, NETCONN_UDP);
-        inet6_addr_to_ip6addr(&if_addr, (const struct in6_addr*)optval);
-        udp_set_multicast_netif_ip6addr(sock->conn->pcb.udp, &if_addr);
-      }
-      break;
-    case IPV6_MULTICAST_HOPS:
-      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, u8_t, NETCONN_UDP);
-      sock->conn->pcb.udp->mcast_ttl = (u8_t)(*(const u8_t*)optval);
-      break;
-    case IPV6_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;
-    case IPV6_ADD_MEMBERSHIP:
-    case IPV6_DROP_MEMBERSHIP:
-      {
-        err_t mld_err;
-        const struct ip6_mreq *imr = (const struct ip6_mreq *)optval;
-        ip_addr_t if_addr;
-        ip_addr_t multi_addr;
-        LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, struct ip6_mreq, NETCONN_UDP);
-        inet6_addr_to_ip6addr(ip_2_ip6(&if_addr), &imr->ipv6mr_interface);
-        inet6_addr_to_ip6addr(ip_2_ip6(&multi_addr), &imr->ipv6mr_multiaddr);
-        if (optname == IPV6_ADD_MEMBERSHIP) {
-          if (!lwip_socket_register_membership(s, &if_addr, &multi_addr)) {
-            /* cannot track membership (out of memory) */
-            err = ENOMEM;
-            mld_err = ERR_OK;
-          } else {
-            mld_err = mld6_joingroup(ip_2_ip6(&if_addr), ip_2_ip6(&multi_addr));
-          }
-        } else {
-          mld_err = mld6_leavegroup(ip_2_ip6(&if_addr), ip_2_ip6(&multi_addr));
-          lwip_socket_unregister_membership(s, &if_addr, &multi_addr);
-        }
-        if (mld_err != ERR_OK) {
-          err = EADDRNOTAVAIL;
-        }
-      }
-    break;
-#endif /* LWIP_IPV6_MLD && LWIP_MULTICAST_TX_OPTIONS */
-    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;
-      }
-      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;
-#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 (*(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;
-#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, level=0x%x, UNIMPL: optname=0x%x, ..)\n",
-                s, level, optname));
-    err = ENOPROTOOPT;
-    break;
-  }  /* switch (level) */
-
-  return err;
-}
-
-int
-lwip_ioctl(int s, long cmd, void *argp)
-{
-  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 */
-
-  if (!sock) {
-    return -1;
-  }
-
-  switch (cmd) {
-#if LWIP_SO_RCVBUF || LWIP_FIONREAD_LINUXMODE
-  case FIONREAD:
-    if (!argp) {
-      sock_set_errno(sock, EINVAL);
-      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;
-        } else {
-          err = netconn_recv(sock->conn, &rxbuf);
-          if (err != ERR_OK) {
-            *((int*)argp) = 0;
-          } else {
-            sock->lastdata = rxbuf;
-            sock->lastoffset = 0;
-            *((int*)argp) = rxbuf->p->tot_len;
-          }
-        }
-      }
-      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;
-      }
-      buflen = p->tot_len;
-      buflen -= sock->lastoffset;
-
-      *((int*)argp) += buflen;
-    }
-
-    LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, FIONREAD, %p) = %"U16_F"\n", s, argp, *((u16_t*)argp)));
-    sock_set_errno(sock, 0);
-    return 0;
-#else /* LWIP_SO_RCVBUF */
-    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;
-
-  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 */
-  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.
- */
-int
-lwip_fcntl(int s, int cmd, int val)
-{
-  struct lwip_sock *sock = get_socket(s);
-  int ret = -1;
-
-  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;
-      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;
-  }
-  return ret;
-}
-
-#if LWIP_IGMP || (LWIP_IPV6_MLD && LWIP_MULTICAST_TX_OPTIONS)
-/** Register a new multicast group 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_membership(int s, const ip_addr_t *if_addr, const ip_addr_t *multi_addr)
-{
-  /* s+1 is stored in the array to prevent having to initialize the array
-     (default initialization is to 0) */
-  int sa = s + 1;
-  int i;
-
-  for (i = 0; i < LWIP_SOCKET_MAX_MEMBERSHIPS; i++) {
-    if (socket_multicast_memberships[i].sa == 0) {
-      socket_multicast_memberships[i].sa = sa;
-      ip_addr_copy(socket_multicast_memberships[i].if_addr, *if_addr);
-      ip_addr_copy(socket_multicast_memberships[i].multi_addr, *multi_addr);
-      return 1;
-    }
-  }
-  return 0;
-}
-
-/** Unregister a previously registered 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_membership(int s, const ip_addr_t *if_addr, const ip_addr_t *multi_addr)
-{
-  /* s+1 is stored in the array to prevent having to initialize the array
-     (default initialization is to 0) */
-  int sa = s + 1;
-  int i;
-
-  for (i = 0; i < LWIP_SOCKET_MAX_MEMBERSHIPS; i++) {
-    if ((socket_multicast_memberships[i].sa == sa) &&
-        ip_addr_cmp(&socket_multicast_memberships[i].if_addr, if_addr) &&
-        ip_addr_cmp(&socket_multicast_memberships[i].multi_addr, multi_addr)) {
-      socket_multicast_memberships[i].sa = 0;
-      ip_addr_set_zero(&socket_multicast_memberships[i].if_addr);
-      ip_addr_set_zero(&socket_multicast_memberships[i].multi_addr);
-      return;
-    }
-  }
-}
-
-/** Drop all 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_memberships(int s)
-{
-  /* s+1 is stored in the array to prevent having to initialize the array
-     (default initialization is to 0) */
-  int sa = s + 1;
-  int i;
-  struct lwip_sock *sock = get_socket(s);
-
-  LWIP_ASSERT("socket has no netconn", sock->conn != NULL);
-
-  for (i = 0; i < LWIP_SOCKET_MAX_MEMBERSHIPS; i++) {
-    if (socket_multicast_memberships[i].sa == sa) {
-      socket_multicast_memberships[i].sa = 0;
-      netconn_join_leave_group(sock->conn,
-                               &socket_multicast_memberships[i].multi_addr,
-                               &socket_multicast_memberships[i].if_addr,
-                               NETCONN_LEAVE);
-      ip_addr_set_zero(&socket_multicast_memberships[i].if_addr);
-      ip_addr_set_zero(&socket_multicast_memberships[i].multi_addr);
-    }
-  }
-}
-#endif /* LWIP_IGMP || (LWIP_IPV6_MLD && LWIP_MULTICAST_TX_OPTIONS) */
-
-#if ESP_THREAD_SAFE
-
-int ESP_IRAM_ATTR
-lwip_sendto_r(int s, const void *data, size_t size, int flags,
-       const struct sockaddr *to, socklen_t tolen)
-{
-  LWIP_API_LOCK();
-  __ret = lwip_sendto(s, data, size, flags, to, tolen);
-  LWIP_API_UNLOCK();
-}
-int
-lwip_send_r(int s, const void *data, size_t size, int flags)
-{
-  LWIP_API_LOCK();
-  __ret = lwip_send(s, data, size, flags);
-  LWIP_API_UNLOCK();
-}
-
-int ESP_IRAM_ATTR
-lwip_recvfrom_r(int s, void *mem, size_t len, int flags,
-              struct sockaddr *from, socklen_t *fromlen)
-{
-  LWIP_API_LOCK();
-  __ret = lwip_recvfrom(s, mem, len, flags, from, fromlen);
-  LWIP_API_UNLOCK();
-}
-
-int
-lwip_recv_r(int s, void *mem, size_t len, int flags)
-{
-  return lwip_recvfrom_r(s, mem, len, flags, NULL, NULL);
-}
-
-int
-lwip_read_r(int s, void *mem, size_t len)
-{
-  return lwip_recvfrom_r(s, mem, len, 0, NULL, NULL);
-}
-
-int
-lwip_sendmsg_r(int s, const struct msghdr *msg, int flags)
-{
-  LWIP_API_LOCK();
-  __ret = lwip_sendmsg(s, msg, flags);
-  LWIP_API_UNLOCK();
-}
-
-int
-lwip_write_r(int s, const void *data, size_t size)
-{
-  return lwip_send_r(s, data, size, 0);
-}
-
-int
-lwip_writev_r(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 = (struct iovec *)(size_t)iov;
-  msg.msg_iovlen = iovcnt;
-  msg.msg_control = NULL;
-  msg.msg_controllen = 0;
-  msg.msg_flags = 0;
-  return lwip_sendmsg_r(s, &msg, 0);
-}
-
-int
-lwip_connect_r(int s, const struct sockaddr *name, socklen_t namelen)
-{
-  LWIP_API_LOCK();
-  __ret = lwip_connect(s, name, namelen);
-  LWIP_API_UNLOCK();
-}
-
-int
-lwip_recvmsg_r(int s, struct msghdr *msg, int flags)
-{
-  LWIP_API_LOCK();
-  __ret = lwip_recvmsg(s, msg, flags);
-  LWIP_API_UNLOCK();
-}
-
-int
-lwip_listen_r(int s, int backlog)
-{
-  LWIP_API_LOCK();
-  __ret = lwip_listen(s, backlog);
-  LWIP_API_UNLOCK();
-}
-
-int
-lwip_bind_r(int s, const struct sockaddr *name, socklen_t namelen)
-{
-  LWIP_API_LOCK();
-  __ret = lwip_bind(s, name, namelen);
-  LWIP_API_UNLOCK();
-}
-int
-lwip_accept_r(int s, struct sockaddr *addr, socklen_t *addrlen)
-{
-  LWIP_API_LOCK();
-  __ret = lwip_accept(s, addr, addrlen);
-  LWIP_API_UNLOCK();
-}
-int
-lwip_ioctl_r(int s, long cmd, void *argp)
-{
-  LWIP_API_LOCK();
-  __ret = lwip_ioctl(s, cmd, argp);
-  LWIP_API_UNLOCK();
-}
-
-int
-lwip_fcntl_r(int s, int cmd, int val)
-{
-  LWIP_API_LOCK();
-  __ret = lwip_fcntl(s, cmd, val);
-  LWIP_API_UNLOCK();
-}
-
-int
-lwip_setsockopt_r(int s, int level, int optname, const void *optval, socklen_t optlen)
-{
-  LWIP_API_LOCK();
-  __ret = lwip_setsockopt(s, level, optname, optval, optlen);
-  LWIP_API_UNLOCK();
-}
-int
-lwip_getsockopt_r(int s, int level, int optname, void *optval, socklen_t *optlen)
-{
-  LWIP_API_LOCK();
-  __ret = lwip_getsockopt(s, level, optname, optval, optlen);
-  LWIP_API_UNLOCK();
-}
-
-int
-lwip_getpeername_r(int s, struct sockaddr *name, socklen_t *namelen)
-{
-  LWIP_API_LOCK();
-  __ret = lwip_getpeername(s, name, namelen);
-  LWIP_API_UNLOCK();
-}
-
-int
-lwip_getsockname_r(int s, struct sockaddr *name, socklen_t *namelen)
-{
-  LWIP_API_LOCK();
-  __ret = lwip_getsockname(s, name, namelen);
-  LWIP_API_UNLOCK();
-}
-
-int
-lwip_close_r(int s)
-{
-  LWIP_API_LOCK();
-  LWIP_SET_CLOSE_FLAG();
-  __ret = lwip_close(s);
-  LWIP_API_UNLOCK();
-}
-
-int
-lwip_shutdown_r(int s, int how)
-{
-  LWIP_API_LOCK();
-  __ret = lwip_shutdown(s, how);
-  LWIP_API_UNLOCK();
-}
-
-#endif
-
-#endif /* LWIP_SOCKET */
diff --git a/components/lwip/api/tcpip.c b/components/lwip/api/tcpip.c
deleted file mode 100644 (file)
index 7724b5a..0000000
+++ /dev/null
@@ -1,567 +0,0 @@
-/**
- * @file
- * Sequential API Main thread module
- *
- */
-
-/*
- * 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>
- *
- */
-
-#include "lwip/opt.h"
-
-#if !NO_SYS /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/priv/tcpip_priv.h"
-#include "lwip/priv/api_msg.h"
-#include "lwip/sys.h"
-#include "lwip/memp.h"
-#include "lwip/mem.h"
-#include "lwip/init.h"
-#include "lwip/ip.h"
-#include "lwip/pbuf.h"
-#include "netif/etharp.h"
-
-#define TCPIP_MSG_VAR_REF(name)     API_VAR_REF(name)
-#define TCPIP_MSG_VAR_DECLARE(name) API_VAR_DECLARE(struct tcpip_msg, name)
-#define TCPIP_MSG_VAR_ALLOC(name)   API_VAR_ALLOC(struct tcpip_msg, MEMP_TCPIP_MSG_API, name)
-#define TCPIP_MSG_VAR_FREE(name)    API_VAR_FREE(MEMP_TCPIP_MSG_API, name)
-
-/* global variables */
-static tcpip_init_done_fn tcpip_init_done;
-static void *tcpip_init_done_arg;
-static sys_mbox_t mbox;
-sys_thread_t g_lwip_task = NULL;
-
-#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 */
-/* 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 */
-
-/**
- * The main lwIP thread. This thread has exclusive access to lwIP core functions
- * (unless access to them is not locked). Other threads communicate with this
- * thread using message boxes.
- *
- * It also starts all the timers to make sure they are running in the right
- * thread context.
- *
- * @param arg unused argument
- */
-static void ESP_IRAM_ATTR
-tcpip_thread(void *arg)
-{
-
-
-  struct tcpip_msg *msg;
-  LWIP_UNUSED_ARG(arg);
-
-  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();
-    
-
-    
-    if (msg == NULL) {
-      LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: invalid message: NULL\n"));
-      LWIP_ASSERT("tcpip_thread: invalid message", 0);
-
-      continue;
-    }
-
-    
-
-    
-    switch (msg->type) {
-#if !LWIP_TCPIP_CORE_LOCKING
-    case TCPIP_MSG_API:
-
-      LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: API message %p\n", (void *)msg));
-      msg->msg.api.function(msg->msg.api.msg);
-      break;
-    case TCPIP_MSG_API_CALL:
-
-      LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: API CALL message %p\n", (void *)msg));
-      msg->msg.api_call->err = msg->msg.api_call->function(msg->msg.api_call);
-#if LWIP_NETCONN_SEM_PER_THREAD
-      sys_sem_signal(msg->msg.api_call->sem);
-#else /* LWIP_NETCONN_SEM_PER_THREAD */
-      sys_sem_signal(&msg->msg.api_call->sem);
-#endif /* LWIP_NETCONN_SEM_PER_THREAD */
-      break;
-#endif /* LWIP_TCPIP_CORE_LOCKING */
-
-#if !LWIP_TCPIP_CORE_LOCKING_INPUT
-    case TCPIP_MSG_INPKT:
-      LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: PACKET %p\n", (void *)msg));
-
-#if ESP_LWIP
-        if(msg->msg.inp.p != NULL && msg->msg.inp.netif != NULL) {
-#endif
-            msg->msg.inp.input_fn(msg->msg.inp.p, msg->msg.inp.netif);
-#if ESP_LWIP
-        }
-#endif
-
-        memp_free(MEMP_TCPIP_MSG_INPKT, msg);
-
-      break;
-#endif /* LWIP_TCPIP_CORE_LOCKING_INPUT */
-
-#if LWIP_TCPIP_TIMEOUT
-    case TCPIP_MSG_TIMEOUT:
-
-      LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: TIMEOUT %p\n", (void *)msg));
-      sys_timeout(msg->msg.tmo.msecs, msg->msg.tmo.h, msg->msg.tmo.arg);
-      memp_free(MEMP_TCPIP_MSG_API, msg);
-      break;
-    case TCPIP_MSG_UNTIMEOUT:
-
-      LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: UNTIMEOUT %p\n", (void *)msg));
-      sys_untimeout(msg->msg.tmo.h, msg->msg.tmo.arg);
-      memp_free(MEMP_TCPIP_MSG_API, msg);
-      break;
-#endif /* LWIP_TCPIP_TIMEOUT */
-
-    case TCPIP_MSG_CALLBACK:
-
-      LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: CALLBACK %p\n", (void *)msg));
-      msg->msg.cb.function(msg->msg.cb.ctx);
-      memp_free(MEMP_TCPIP_MSG_API, msg);
-      break;
-
-    case TCPIP_MSG_CALLBACK_STATIC:
-
-      LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: CALLBACK_STATIC %p\n", (void *)msg));
-      msg->msg.cb.function(msg->msg.cb.ctx);
-      break;
-
-    default:
-
-      LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: invalid message: %d\n", msg->type));
-      LWIP_ASSERT("tcpip_thread: invalid message", 0);
-      break;
-    }
-
-  }
-}
-
-/**
- * Pass a received packet to tcpip_thread for input processing
- *
- * @param p the received packet
- * @param inp the network interface on which the packet was received
- * @param input_fn input function to call
- */
-err_t ESP_IRAM_ATTR
-tcpip_inpkt(struct pbuf *p, struct netif *inp, netif_input_fn input_fn)
-{
-#if LWIP_TCPIP_CORE_LOCKING_INPUT
-  err_t ret;
-  LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_inpkt: PACKET %p/%p\n", (void *)p, (void *)inp));
-  LOCK_TCPIP_CORE();
-  ret = input_fn(p, inp);
-  UNLOCK_TCPIP_CORE();
-  return ret;
-#else /* LWIP_TCPIP_CORE_LOCKING_INPUT */
-  struct tcpip_msg *msg;
-
-  if (!sys_mbox_valid_val(mbox)) {
-    return ERR_VAL;
-  }
-  msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_INPKT);
-  if (msg == NULL) {
-    return ERR_MEM;
-  }
-
-  msg->type = TCPIP_MSG_INPKT;
-  msg->msg.inp.p = p;
-  msg->msg.inp.netif = inp;
-  msg->msg.inp.input_fn = input_fn;
-#if ESP_PERF
-  if (p->len > DBG_PERF_FILTER_LEN) {
-    DBG_PERF_PATH_SET(DBG_PERF_DIR_RX, DBG_PERF_POINT_WIFI_OUT);
-  }
-#endif
-
-  if (sys_mbox_trypost(&mbox, msg) != ERR_OK) {
-    ESP_STATS_DROP_INC(esp.tcpip_inpkt_post_fail);
-    memp_free(MEMP_TCPIP_MSG_INPKT, msg);
-    return ERR_MEM;
-  }
-  return ERR_OK;
-#endif /* LWIP_TCPIP_CORE_LOCKING_INPUT */
-}
-
-/**
- * Pass a received packet to tcpip_thread for input processing with
- * ethernet_input or ip_input
- *
- * @param p the received packet, p->payload pointing to the Ethernet header or
- *          to an IP header (if inp doesn't have NETIF_FLAG_ETHARP or
- *          NETIF_FLAG_ETHERNET flags)
- * @param inp the network interface on which the packet was received
- */
-err_t ESP_IRAM_ATTR
-tcpip_input(struct pbuf *p, struct netif *inp)
-{
-#if LWIP_ETHERNET
-  if (inp->flags & (NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET)) {
-    return tcpip_inpkt(p, inp, ethernet_input);
-  } else
-#endif /* LWIP_ETHERNET */
-  return tcpip_inpkt(p, inp, ip_input);
-}
-
-/**
- * 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.
- *
- * @param f 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
- */
-err_t
-tcpip_callback_with_block(tcpip_callback_fn function, void *ctx, u8_t block)
-{
-  struct tcpip_msg *msg;
-
-  if (sys_mbox_valid_val(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 (block) {
-      sys_mbox_post(&mbox, msg);
-    } else {
-      if (sys_mbox_trypost(&mbox, msg) != ERR_OK) {
-        ESP_STATS_DROP_INC(esp.tcpip_cb_post_fail);
-        memp_free(MEMP_TCPIP_MSG_API, msg);
-        return ERR_MEM;
-      }
-    }
-    return ERR_OK;
-  }
-  return ERR_VAL;
-}
-
-#if LWIP_TCPIP_TIMEOUT
-/**
- * call sys_timeout in tcpip_thread
- *
- * @param msec time in milliseconds for timeout
- * @param h function to be called on timeout
- * @param arg argument to pass to timeout function h
- * @return ERR_MEM on memory error, ERR_OK otherwise
- */
-err_t
-tcpip_timeout(u32_t msecs, sys_timeout_handler h, void *arg)
-{
-  struct tcpip_msg *msg;
-
-  if (sys_mbox_valid_val(mbox)) {
-    msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API);
-    if (msg == NULL) {
-      return ERR_MEM;
-    }
-
-    msg->type = TCPIP_MSG_TIMEOUT;
-    msg->msg.tmo.msecs = msecs;
-    msg->msg.tmo.h = h;
-    msg->msg.tmo.arg = arg;
-    sys_mbox_post(&mbox, msg);
-    return ERR_OK;
-  }
-  return ERR_VAL;
-}
-
-/**
- * call sys_untimeout in tcpip_thread
- *
- * @param msec time in milliseconds for timeout
- * @param h function to be called on timeout
- * @param arg argument to pass to timeout function h
- * @return ERR_MEM on memory error, ERR_OK otherwise
- */
-err_t
-tcpip_untimeout(sys_timeout_handler h, void *arg)
-{
-  struct tcpip_msg *msg;
-
-  if (sys_mbox_valid_val(mbox)) {
-    msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API);
-    if (msg == NULL) {
-      return ERR_MEM;
-    }
-
-    msg->type = TCPIP_MSG_UNTIMEOUT;
-    msg->msg.tmo.h = h;
-    msg->msg.tmo.arg = arg;
-    sys_mbox_post(&mbox, msg);
-    return ERR_OK;
-  }
-  return ERR_VAL;
-}
-#endif /* LWIP_TCPIP_TIMEOUT */
-
-
-#if !LWIP_TCPIP_CORE_LOCKING
-/**
- * Generic way to dispatch an API message in TCPIP thread.
- *
- * @param fn function to be called from TCPIP thread
- * @param apimsg argument to API function
- * @param sem semaphore to wait on
- * @return ERR_OK if the function was called, another err_t if not
- */
-err_t ESP_IRAM_ATTR
-tcpip_send_api_msg(tcpip_callback_fn fn, void *apimsg, sys_sem_t* sem)
-{
-  LWIP_ASSERT("semaphore not initialized", sys_sem_valid(sem));
-
-  if (sys_mbox_valid_val(mbox)) {
-    TCPIP_MSG_VAR_DECLARE(msg);
-    
-    TCPIP_MSG_VAR_ALLOC(msg);
-    TCPIP_MSG_VAR_REF(msg).type = TCPIP_MSG_API;
-    TCPIP_MSG_VAR_REF(msg).msg.api.function = fn;
-    TCPIP_MSG_VAR_REF(msg).msg.api.msg = apimsg;
-    sys_mbox_post(&mbox, &TCPIP_MSG_VAR_REF(msg));
-    sys_arch_sem_wait(sem, 0);
-    TCPIP_MSG_VAR_FREE(msg);
-
-    return ERR_OK;
-  }
-  return ERR_VAL;
-}
-#endif /* !LWIP_TCPIP_CORE_LOCKING */
-
-err_t tcpip_api_call(tcpip_api_call_fn fn, struct tcpip_api_call *call)
-{
-#if LWIP_TCPIP_CORE_LOCKING
-  err_t err;
-  LOCK_TCPIP_CORE();
-  err = fn(call);
-  UNLOCK_TCPIP_CORE();
-  return err;
-#else
-  if (sys_mbox_valid_val(mbox)) {
-    TCPIP_MSG_VAR_DECLARE(msg);
-    err_t err;
-
-#if LWIP_NETCONN_SEM_PER_THREAD
-    call->sem = LWIP_NETCONN_THREAD_SEM_GET();
-#else /* LWIP_NETCONN_SEM_PER_THREAD */
-    err = sys_sem_new(&call->sem, 0);
-    if (err != ERR_OK) {
-      return err;
-    }
-#endif /* LWIP_NETCONN_SEM_PER_THREAD */
-    
-    TCPIP_MSG_VAR_ALLOC(msg);
-    TCPIP_MSG_VAR_REF(msg).type = TCPIP_MSG_API_CALL;
-    TCPIP_MSG_VAR_REF(msg).msg.api_call = call;
-    TCPIP_MSG_VAR_REF(msg).msg.api_call->function = fn;
-    sys_mbox_post(&mbox, &TCPIP_MSG_VAR_REF(msg));
-#if LWIP_NETCONN_SEM_PER_THREAD
-    sys_arch_sem_wait(call->sem, 0);
-#else /* LWIP_NETCONN_SEM_PER_THREAD */
-    sys_arch_sem_wait(&call->sem, 0);
-    sys_sem_free(&call->sem);
-#endif /* LWIP_NETCONN_SEM_PER_THREAD */
-    TCPIP_MSG_VAR_FREE(msg);
-    return ERR_OK;
-  }
-  return ERR_VAL;
-#endif
-}
-
-/**
- * Allocate a structure for a static callback message and initialize it.
- * This is intended to be used to send "static" messages from interrupt context.
- *
- * @param function the function to call
- * @param ctx parameter passed to function
- * @return a struct pointer to pass to tcpip_trycallback().
- */
-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);
-  if (msg == NULL) {
-    return NULL;
-  }
-  msg->type = TCPIP_MSG_CALLBACK_STATIC;
-  msg->msg.cb.function = function;
-  msg->msg.cb.ctx = ctx;
-  return (struct tcpip_callback_msg*)msg;
-}
-
-/**
- * Free a callback message allocated by tcpip_callbackmsg_new().
- *
- * @param msg the message to free
- */
-void
-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.
- *
- * @param msg pointer to the message to post
- * @return sys_mbox_trypost() return code
- */
-err_t
-tcpip_trycallback(struct tcpip_callback_msg* msg)
-{
-  if (!sys_mbox_valid_val(mbox)) {
-    return ERR_VAL;
-  }
-  return sys_mbox_trypost(&mbox, msg);
-}
-
-/**
- * Initialize this module:
- * - initialize all sub modules
- * - start the tcpip_thread
- *
- * @param initfunc a function to call when tcpip_thread is running and finished initializing
- * @param arg argument to pass to initfunc
- */
-void
-tcpip_init(tcpip_init_done_fn initfunc, void *arg)
-{
-
-  lwip_init();
-
-  tcpip_init_done = initfunc;
-  tcpip_init_done_arg = arg;
-  if (sys_mbox_new(&mbox, TCPIP_MBOX_SIZE) != ERR_OK) {
-    LWIP_ASSERT("failed to create tcpip_thread mbox", 0);
-  }
-#if LWIP_TCPIP_CORE_LOCKING
-  if (sys_mutex_new(&lock_tcpip_core) != ERR_OK) {
-    LWIP_ASSERT("failed to create lock_tcpip_core", 0);
-  }
-#endif /* LWIP_TCPIP_CORE_LOCKING */
-
-
-  g_lwip_task = sys_thread_new(TCPIP_THREAD_NAME
-                , tcpip_thread, NULL, TCPIP_THREAD_STACKSIZE, TCPIP_THREAD_PRIO);
-
-  LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_task_hdlxxx : %x, prio:%d,stack:%d\n",
-                (u32_t)g_lwip_task,TCPIP_THREAD_PRIO,TCPIP_THREAD_STACKSIZE));
-
-}
-
-/**
- * Simple callback function used with tcpip_callback to free a pbuf
- * (pbuf_free has a wrong signature for tcpip_callback)
- *
- * @param p The pbuf (chain) to be dereferenced.
- */
-static void
-pbuf_free_int(void *p)
-{
-  struct pbuf *q = (struct pbuf *)p;
-  pbuf_free(q);
-}
-
-/**
- * A simple wrapper function that allows you to free a pbuf from interrupt context.
- *
- * @param p The pbuf (chain) to be dereferenced.
- * @return ERR_OK if callback could be enqueued, an err_t if not
- */
-err_t
-pbuf_free_callback(struct pbuf *p)
-{
-  return tcpip_callback_with_block(pbuf_free_int, p, 0);
-}
-
-/**
- * A simple wrapper function that allows you to free heap memory from
- * interrupt context.
- *
- * @param m the heap memory to free
- * @return ERR_OK if callback could be enqueued, an err_t if not
- */
-#if ESP_LWIP
-static void mem_free_local(void *arg)
-{
-       mem_free(arg);
-}
-err_t mem_free_callback(void *m)
-{
-      return tcpip_callback_with_block(mem_free_local, m, 0);
-      
-#else
-err_t mem_free_callback(void *m)
-{
-#endif
-
-  return tcpip_callback_with_block(mem_free, m, 0);  
-}
-
-#endif /* !NO_SYS */
similarity index 99%
rename from components/lwip/apps/dhcpserver.c
rename to components/lwip/apps/dhcpserver/dhcpserver.c
index 718d22a5468aab97514ffab405b69abdb5ea6275..63f01a68542cdaa6ee1b0000f4aeda347b235429 100644 (file)
@@ -22,8 +22,8 @@
 #include "lwip/ip_addr.h"
 #include "tcpip_adapter.h"
 
-#include "apps/dhcpserver.h"
-#include "apps/dhcpserver_options.h"
+#include "dhcpserver/dhcpserver.h"
+#include "dhcpserver/dhcpserver_options.h"
 
 #if ESP_DHCP
 
@@ -524,9 +524,7 @@ static void send_offer(struct dhcps_msg *m, u16_t len)
     ip_addr_t ip_temp = IPADDR4_INIT(0x0);
     ip4_addr_set(ip_2_ip4(&ip_temp), &broadcast_dhcps);
     SendOffer_err_t = udp_sendto(pcb_dhcps, p, &ip_temp, DHCPS_CLIENT_PORT);
-#if DHCPS_DEBUG
     DHCPS_LOG("dhcps: send_offer>>udp_sendto result %x\n", SendOffer_err_t);
-#endif
 
     if (p->ref != 0) {
 #if DHCPS_DEBUG
@@ -597,9 +595,7 @@ static void send_nak(struct dhcps_msg *m, u16_t len)
     ip_addr_t ip_temp = IPADDR4_INIT(0x0);
     ip4_addr_set(ip_2_ip4(&ip_temp), &broadcast_dhcps);
     SendNak_err_t = udp_sendto(pcb_dhcps, p, &ip_temp, DHCPS_CLIENT_PORT);
-#if DHCPS_DEBUG
     DHCPS_LOG("dhcps: send_nak>>udp_sendto result %x\n", SendNak_err_t);
-#endif
 
     if (p->ref != 0) {
 #if DHCPS_DEBUG
index cae4c866b1f2335b46625f832231a97eddec1042..43e405f2402a23ccac3fad351c7918e1aad4113b 100644 (file)
@@ -13,7 +13,7 @@
 // limitations under the License.
 
 #include <string.h>
-#include "esp_ping.h"
+#include "ping/esp_ping.h"
 
 #include "lwip/ip_addr.h"
 
index 8799832db68da7211393f466cfe8daa40c34b09c..eb7e71c60ee85c664ab44a75c4c7657b75b028ff 100644 (file)
 
 #if LWIP_IPV4 && LWIP_RAW /* don't build if not configured for use in lwipopts.h */
 
-#include "ping.h"
+#include "ping/ping.h"
 
 #include "lwip/mem.h"
 #include "lwip/raw.h"
 #include "lwip/icmp.h"
 #include "lwip/netif.h"
 #include "lwip/sys.h"
-#include "lwip/timers.h"
+#include "lwip/timeouts.h"
 #include "lwip/inet_chksum.h"
 
 #if PING_USE_SOCKETS
@@ -58,7 +58,7 @@
 #endif /* PING_USE_SOCKETS */
 
 #ifdef ESP_PING
-#include "esp_ping.h"
+#include "ping/esp_ping.h"
 #include "lwip/ip_addr.h"
 #endif
 /**
@@ -155,7 +155,7 @@ ping_send(int s, ip_addr_t *addr)
 
   to.sin_len = sizeof(to);
   to.sin_family = AF_INET;
-  inet_addr_from_ipaddr(&to.sin_addr, ip_2_ip4(addr));
+  inet_addr_from_ip4addr(&to.sin_addr, ip_2_ip4(addr));
 
   err = sendto(s, iecho, ping_size, 0, (struct sockaddr*)&to, sizeof(to));
 
@@ -182,7 +182,7 @@ ping_recv(int s)
         LWIP_DEBUGF( PING_DEBUG, ("ping: invalid sin_family\n"));
       } else {
         ip4_addr_t fromaddr;
-        inet_addr_to_ipaddr(&fromaddr, &from.sin_addr);
+        inet_addr_to_ip4addr(&fromaddr, &from.sin_addr);
         iphdr = (struct ip_hdr *)buf;
         iecho = (struct icmp_echo_hdr *)(buf + (IPH_HL(iphdr) * 4));
  
diff --git a/components/lwip/apps/sntp/sntp.c b/components/lwip/apps/sntp/sntp.c
deleted file mode 100644 (file)
index 6bee032..0000000
+++ /dev/null
@@ -1,716 +0,0 @@
-/**
- * @file
- * SNTP client module
- *
- * 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 :
- * http://support.ntp.org/bin/view/Servers/NTPPoolServers
- *
- * @todo:
- * - set/change servers at runtime
- * - complete SNTP_CHECK_RESPONSE checks 3 and 4
- * - support broadcast/multicast mode?
- */
-
-/*
- * Copyright (c) 2007-2009 Frédéric Bernon, 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: Frédéric Bernon, Simon Goldschmidt
- */
-
-#include "apps/sntp/sntp.h"
-
-#include "lwip/opt.h"
-#include "lwip/timers.h"
-#include "lwip/udp.h"
-#include "lwip/dns.h"
-#include "lwip/ip_addr.h"
-#include "lwip/pbuf.h"
-#include "lwip/dhcp.h"
-
-#include <string.h>
-#include <time.h>
-
-#if LWIP_UDP
-
-/* Handle support for more than one server via SNTP_MAX_SERVERS */
-#if SNTP_MAX_SERVERS > 1
-#define SNTP_SUPPORT_MULTIPLE_SERVERS 1
-#else /* NTP_MAX_SERVERS > 1 */
-#define SNTP_SUPPORT_MULTIPLE_SERVERS 0
-#endif /* NTP_MAX_SERVERS > 1 */
-
-#if (SNTP_UPDATE_DELAY < 15000) && !defined(SNTP_SUPPRESS_DELAY_CHECK)
-#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)
-#define SNTP_DEBUG_WARN         (SNTP_DEBUG | LWIP_DBG_LEVEL_WARNING)
-#define SNTP_DEBUG_WARN_STATE   (SNTP_DEBUG | LWIP_DBG_LEVEL_WARNING | LWIP_DBG_STATE)
-#define SNTP_DEBUG_SERIOUS      (SNTP_DEBUG | LWIP_DBG_LEVEL_SERIOUS)
-
-#define SNTP_ERR_KOD                1
-
-/* SNTP protocol defines */
-#define SNTP_MSG_LEN                48
-
-#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_VERSION_MASK           0x38
-#define SNTP_VERSION                (4/* NTP Version 4*/<<3)
-
-#define SNTP_MODE_MASK              0x07
-#define SNTP_MODE_CLIENT            0x03
-#define SNTP_MODE_SERVER            0x04
-#define SNTP_MODE_BROADCAST         0x05
-
-#define SNTP_OFFSET_STRATUM         1
-#define SNTP_STRATUM_KOD            0x00
-
-#define SNTP_OFFSET_ORIGINATE_TIME  24
-#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)
-
-/**
- * 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.
- */
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct sntp_msg {
-  PACK_STRUCT_FLD_8(u8_t  li_vn_mode);
-  PACK_STRUCT_FLD_8(u8_t  stratum);
-  PACK_STRUCT_FLD_8(u8_t  poll);
-  PACK_STRUCT_FLD_8(u8_t  precision);
-  PACK_STRUCT_FIELD(u32_t root_delay);
-  PACK_STRUCT_FIELD(u32_t root_dispersion);
-  PACK_STRUCT_FIELD(u32_t reference_identifier);
-  PACK_STRUCT_FIELD(u32_t reference_timestamp[2]);
-  PACK_STRUCT_FIELD(u32_t originate_timestamp[2]);
-  PACK_STRUCT_FIELD(u32_t receive_timestamp[2]);
-  PACK_STRUCT_FIELD(u32_t transmit_timestamp[2]);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
-/* function prototypes */
-static void sntp_request(void *arg);
-
-/** The operating mode */
-static u8_t sntp_opmode;
-
-/** The UDP pcb used by the SNTP client */
-static struct udp_pcb* sntp_pcb;
-/** Names/Addresses of servers */
-struct sntp_server {
-#if SNTP_SERVER_DNS
-  char* name;
-#endif /* SNTP_SERVER_DNS */
-  ip_addr_t addr;
-};
-static struct sntp_server sntp_servers[SNTP_MAX_SERVERS];
-
-#if SNTP_GET_SERVERS_FROM_DHCP
-static u8_t sntp_set_servers_from_dhcp;
-#endif /* SNTP_GET_SERVERS_FROM_DHCP */
-#if SNTP_SUPPORT_MULTIPLE_SERVERS
-/** The currently used server (initialized to 0) */
-static u8_t sntp_current_server;
-#else /* SNTP_SUPPORT_MULTIPLE_SERVERS */
-#define sntp_current_server 0
-#endif /* SNTP_SUPPORT_MULTIPLE_SERVERS */
-
-#if SNTP_RETRY_TIMEOUT_EXP
-#define SNTP_RESET_RETRY_TIMEOUT() sntp_retry_timeout = SNTP_RETRY_TIMEOUT
-/** Retry time, initialized with SNTP_RETRY_TIMEOUT and doubled with each retry. */
-static u32_t sntp_retry_timeout;
-#else /* SNTP_RETRY_TIMEOUT_EXP */
-#define SNTP_RESET_RETRY_TIMEOUT()
-#define sntp_retry_timeout SNTP_RETRY_TIMEOUT
-#endif /* SNTP_RETRY_TIMEOUT_EXP */
-
-#if SNTP_CHECK_RESPONSE >= 1
-/** Saves the last server address to compare with response */
-static ip_addr_t sntp_last_server_address;
-#endif /* SNTP_CHECK_RESPONSE >= 1 */
-
-#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];
-#endif /* SNTP_CHECK_RESPONSE >= 2 */
-
-/**
- * SNTP processing of received timestamp
- */
-static void
-sntp_process(u32_t *receive_timestamp)
-{
-  /* convert SNTP time (1900-based) to unix GMT time (1970-based)
-   * if MSB is 0, SNTP time is 2036-based!
-   */
-  u32_t rx_secs = 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;
-
-#if SNTP_CALC_TIME_US
-  u32_t us = 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));
-
-#else /* SNTP_CALC_TIME_US */
-
-  /* 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);
-}
-
-/**
- * Initialize request struct to be sent to server.
- */
-static void
-sntp_initialize_request(struct sntp_msg *req)
-{
-  memset(req, 0, SNTP_MSG_LEN);
-  req->li_vn_mode = SNTP_LI_NO_WARNING | SNTP_VERSION | SNTP_MODE_CLIENT;
-
-#if SNTP_CHECK_RESPONSE >= 2
-  {
-    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] = 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] = htonl(sntp_time_us);
-    req->transmit_timestamp[1] = sntp_last_timestamp_sent[1];
-  }
-#endif /* SNTP_CHECK_RESPONSE >= 2 */
-}
-
-/**
- * Retry: send a new request (and increase retry timeout).
- *
- * @param arg is unused (only necessary to conform to sys_timeout)
- */
-static void
-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));
-
-  /* set up a timer to send a retry and increase the retry delay */
-  sys_timeout(sntp_retry_timeout, sntp_request, NULL);
-
-#if SNTP_RETRY_TIMEOUT_EXP
-  {
-    u32_t new_retry_timeout;
-    /* increase the timeout for next retry */
-    new_retry_timeout = sntp_retry_timeout << 1;
-    /* limit to maximum timeout and prevent overflow */
-    if ((new_retry_timeout <= SNTP_RETRY_TIMEOUT_MAX) &&
-        (new_retry_timeout > sntp_retry_timeout)) {
-      sntp_retry_timeout = new_retry_timeout;
-    }
-  }
-#endif /* SNTP_RETRY_TIMEOUT_EXP */
-}
-
-#if SNTP_SUPPORT_MULTIPLE_SERVERS
-/**
- * If Kiss-of-Death is received (or another packet parsing error),
- * try the next server or retry the current server and increase the retry
- * timeout if only one server is available.
- * (implicitly, SNTP_MAX_SERVERS > 1)
- *
- * @param arg is unused (only necessary to conform to sys_timeout)
- */
-static void
-sntp_try_next_server(void* arg)
-{
-  u8_t old_server, i;
-  LWIP_UNUSED_ARG(arg);
-
-  old_server = sntp_current_server;
-  for (i = 0; i < SNTP_MAX_SERVERS - 1; i++) {
-    sntp_current_server++;
-    if (sntp_current_server >= SNTP_MAX_SERVERS) {
-      sntp_current_server = 0;
-    }
-    if (!ip_addr_isany(&sntp_servers[sntp_current_server].addr)
-#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));
-      /* new server: reset retry timeout */
-      SNTP_RESET_RETRY_TIMEOUT();
-      /* instantly send a request to the next server */
-      sntp_request(NULL);
-      return;
-    }
-  }
-  /* no other valid server found */
-  sntp_current_server = old_server;
-  sntp_retry(NULL);
-}
-#else /* SNTP_SUPPORT_MULTIPLE_SERVERS */
-/* Always retry on error if only one server is supported */
-#define sntp_try_next_server    sntp_retry
-#endif /* SNTP_SUPPORT_MULTIPLE_SERVERS */
-
-/** 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)
-{
-  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))
-#else /* SNTP_CHECK_RESPONSE >= 1 */
-  LWIP_UNUSED_ARG(addr);
-  LWIP_UNUSED_ARG(port);
-#endif /* SNTP_CHECK_RESPONSE >= 1 */
-  {
-    /* 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;
-      /* if this is a SNTP response... */
-      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);
-        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 {
-#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"));
-          } else
-#endif /* SNTP_CHECK_RESPONSE >= 2 */
-          /* @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 {
-        LWIP_DEBUGF(SNTP_DEBUG_WARN, ("sntp_recv: Invalid mode in response: %"U16_F"\n", (u16_t)mode));
-        /* wait for correct response */
-        err = ERR_TIMEOUT;
-      }
-    } else {
-      LWIP_DEBUGF(SNTP_DEBUG_WARN, ("sntp_recv: Invalid packet length: %"U16_F"\n", p->tot_len));
-    }
-  }
-#if SNTP_CHECK_RESPONSE >= 1
-  else {
-    /* packet from wrong remote address or port, wait for correct response */
-    err = ERR_TIMEOUT;
-  }
-#endif /* SNTP_CHECK_RESPONSE >= 1 */
-  pbuf_free(p);
-  if (err == ERR_OK) {
-    sntp_process(receive_timestamp);
-
-    /* Set up timeout for next request (only if poll response was received)*/
-    if (sntp_opmode == SNTP_OPMODE_POLL) {
-      /* Correct response, reset retry timeout */
-      SNTP_RESET_RETRY_TIMEOUT();
-
-      sys_timeout((u32_t)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));
-    }
-  } else if (err != ERR_TIMEOUT) {
-    /* 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);
-      }
-    }
-  }
-}
-
-/** Actually send an sntp request to a server.
- *
- * @param server_addr resolved IP address of the SNTP server
- */
-static void
-sntp_send_request(const ip_addr_t *server_addr)
-{
-  struct pbuf* p;
-  p = pbuf_alloc(PBUF_TRANSPORT, SNTP_MSG_LEN, PBUF_RAM);
-  if (p != NULL) {
-    struct sntp_msg *sntpmsg = (struct sntp_msg *)p->payload;
-    LWIP_DEBUGF(SNTP_DEBUG_STATE, ("sntp_send_request: Sending request to server\n"));
-    /* initialize request message */
-    sntp_initialize_request(sntpmsg);
-    /* send request */
-    udp_sendto(sntp_pcb, p, server_addr, SNTP_PORT);
-    /* free the pbuf after sending it */
-    pbuf_free(p);
-    /* 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);
-#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));
-    /* out of memory: set up a timer to send a retry */
-    sys_timeout((u32_t)SNTP_RETRY_TIMEOUT, sntp_request, NULL);
-  }
-}
-
-#if SNTP_SERVER_DNS
-/**
- * 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)
-{
-  LWIP_UNUSED_ARG(hostname);
-  LWIP_UNUSED_ARG(arg);
-
-  if (ipaddr != NULL) {
-    /* Address resolved, send request */
-    LWIP_DEBUGF(SNTP_DEBUG_STATE, ("sntp_dns_found: Server address resolved, sending request\n"));
-    sntp_send_request(ipaddr);
-  } else {
-    /* DNS resolving failed -> try another server */
-    LWIP_DEBUGF(SNTP_DEBUG_WARN_STATE, ("sntp_dns_found: Failed to resolve server address resolved, trying next server\n"));
-    sntp_try_next_server(NULL);
-  }
-}
-#endif /* SNTP_SERVER_DNS */
-
-/**
- * Send out an sntp request.
- *
- * @param arg is unused (only necessary to conform to sys_timeout)
- */
-static void
-sntp_request(void *arg)
-{
-  ip_addr_t sntp_server_address;
-  err_t err;
-
-  LWIP_UNUSED_ARG(arg);
-
-  /* initialize SNTP server address */
-#if SNTP_SERVER_DNS
-  if (sntp_servers[sntp_current_server].name) {
-    /* 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);
-    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"));
-      return;
-    } else if (err == ERR_OK) {
-      sntp_servers[sntp_current_server].addr = sntp_server_address;
-    }
-  } else
-#endif /* SNTP_SERVER_DNS */
-  {
-    sntp_server_address = sntp_servers[sntp_current_server].addr;
-    err = (ip_addr_isany_val(sntp_server_address)) ? ERR_ARG : ERR_OK;
-  }
-
-  if (err == ERR_OK) {
-    LWIP_DEBUGF(SNTP_DEBUG_TRACE, ("sntp_request: current server address is %s\n",
-      ipaddr_ntoa(&sntp_server_address)));
-    sntp_send_request(&sntp_server_address);
-  } else {
-    /* address conversion failed, try another server */
-    LWIP_DEBUGF(SNTP_DEBUG_WARN_STATE, ("sntp_request: Invalid server address, trying next server.\n"));
-    sys_timeout((u32_t)SNTP_RETRY_TIMEOUT, sntp_try_next_server, NULL);
-  }
-}
-
-/**
- * Initialize this module.
- * Send out request instantly or after SNTP_STARTUP_DELAY(_FUNC).
- */
-void
-sntp_init(void)
-{
-#ifdef SNTP_SERVER_ADDRESS
-#if SNTP_SERVER_DNS
-  sntp_setservername(0, SNTP_SERVER_ADDRESS);
-#else
-#error SNTP_SERVER_ADDRESS string not supported SNTP_SERVER_DNS==0
-#endif
-#endif /* SNTP_SERVER_ADDRESS */
-
-  if (sntp_pcb == NULL) {
-    sntp_pcb = udp_new_ip_type(IPADDR_TYPE_ANY);
-    LWIP_ASSERT("Failed to allocate udp pcb for sntp client", sntp_pcb != NULL);
-    if (sntp_pcb != NULL) {
-      udp_recv(sntp_pcb, sntp_recv, NULL);
-
-      if (sntp_opmode == SNTP_OPMODE_POLL) {
-        SNTP_RESET_RETRY_TIMEOUT();
-#if SNTP_STARTUP_DELAY
-        sys_timeout((u32_t)SNTP_STARTUP_DELAY_FUNC, sntp_request, NULL);
-#else
-        sntp_request(NULL);
-#endif
-      } else if (sntp_opmode == SNTP_OPMODE_LISTENONLY) {
-        ip_set_option(sntp_pcb, SOF_BROADCAST);
-        udp_bind(sntp_pcb, IP_ANY_TYPE, SNTP_PORT);
-      }
-    }
-  }
-}
-
-/**
- * Stop this module.
- */
-void
-sntp_stop(void)
-{
-  if (sntp_pcb != NULL) {
-    sys_untimeout(sntp_request, NULL);
-    udp_remove(sntp_pcb);
-    sntp_pcb = NULL;
-  }
-}
-
-/**
- * Get enabled state.
- */
-u8_t sntp_enabled(void)
-{
-  return (sntp_pcb != NULL)? 1 : 0;
-}
-
-/**
- * Sets the operating mode.
- * @param operating_mode one of the available operating modes
- */
-void
-sntp_setoperatingmode(u8_t operating_mode)
-{
-  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;
-}
-
-/**
- * Gets the operating mode.
- */
-u8_t
-sntp_getoperatingmode(void)
-{
-  return sntp_opmode;
-}
-
-#if SNTP_GET_SERVERS_FROM_DHCP
-/**
- * Config SNTP server handling by IP address, name, or DHCP; clear table
- * @param set_servers_from_dhcp enable or disable getting server addresses from dhcp
- */
-void
-sntp_servermode_dhcp(int set_servers_from_dhcp)
-{
-  u8_t new_mode = set_servers_from_dhcp ? 1 : 0;
-  if (sntp_set_servers_from_dhcp != new_mode) {
-    sntp_set_servers_from_dhcp = new_mode;
-  }
-}
-#endif /* SNTP_GET_SERVERS_FROM_DHCP */
-
-/**
- * Initialize one of the NTP servers by IP address
- *
- * @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
- */
-void
-sntp_setserver(u8_t idx, const ip_addr_t *server)
-{
-  if (idx < SNTP_MAX_SERVERS) {
-    if (server != NULL) {
-      sntp_servers[idx].addr = (*server);
-    } else {
-      ip_addr_set_zero(&sntp_servers[idx].addr);
-    }
-#if SNTP_SERVER_DNS
-    sntp_servers[idx].name = NULL;
-#endif
-  }
-}
-
-#if LWIP_DHCP && SNTP_GET_SERVERS_FROM_DHCP
-/**
- * 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
- */
-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));
-  if (sntp_set_servers_from_dhcp && num) {
-    u8_t i;
-    for (i = 0; (i < num) && (i < SNTP_MAX_SERVERS); i++) {
-      ip_addr_t addr;
-      ip_addr_copy_from_ip4(addr, server[i]);
-      sntp_setserver(i, &addr);
-    }
-    for (i = num; i < SNTP_MAX_SERVERS; i++) {
-      sntp_setserver(i, NULL);
-    }
-  }
-}
-#endif /* LWIP_DHCP && SNTP_GET_SERVERS_FROM_DHCP */
-
-/**
- * Obtain one of the currently configured by IP address (or DHCP) NTP servers
- *
- * @param numdns the index of the NTP server
- * @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).
- */
-ip_addr_t
-sntp_getserver(u8_t idx)
-{
-  if (idx < SNTP_MAX_SERVERS) {
-    return sntp_servers[idx].addr;
-  }
-  return *IP_ADDR_ANY;
-}
-
-#if SNTP_SERVER_DNS
-/**
- * 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
- */
-void
-sntp_setservername(u8_t idx, char *server)
-{
-  if (idx < SNTP_MAX_SERVERS) {
-    sntp_servers[idx].name = server;
-  }
-}
-
-/**
- * Obtain one of the currently configured by name NTP servers.
- *
- * @param numdns 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 *
-sntp_getservername(u8_t idx)
-{
-  if (idx < SNTP_MAX_SERVERS) {
-    return sntp_servers[idx].name;
-  }
-  return NULL;
-}
-#endif /* SNTP_SERVER_DNS */
-
-#endif /* LWIP_UDP */
-
index f85759bedbe267bfe96a93296279055d084a00a5..914ab6577f4a693199d26800b236be7805205c76 100644 (file)
@@ -1,25 +1,28 @@
 #
 # Component Makefile
 #
+COMPONENT_SUBMODULES += lwip
 
 COMPONENT_ADD_INCLUDEDIRS := \
-       include/lwip \
-       include/lwip/port \
-       include/lwip/posix \
-       apps/ping
-
-ifdef CONFIG_PPP_SUPPORT
-LWIP_PPP_DIRS := netif/ppp/polarssl netif/ppp
-else
-LWIP_PPP_DIRS :=
-endif
+       include/apps \
+       lwip/src/include \
+       port/esp32/include \
+       port/esp32/include/arch
 
 COMPONENT_SRCDIRS := \
-       api \
-       apps apps/sntp apps/ping \
-       core core/ipv4 core/ipv6 \
-       $(LWIP_PPP_DIRS) netif \
-       port/freertos port/netif port/debug port
+       apps/dhcpserver \
+       apps/ping \
+       lwip/src/api \
+       lwip/src/apps/sntp \
+       lwip/src/core \
+       lwip/src/core/ipv4 \
+       lwip/src/core/ipv6 \
+       lwip/src/netif \
+       lwip/src/netif/ppp \
+       port/esp32 \
+       port/esp32/freertos \
+       port/esp32/netif \
+       port/esp32/debug 
 
 CFLAGS += -Wno-address  # lots of LWIP source files evaluate macros that check address of stack variables
 
diff --git a/components/lwip/core/def.c b/components/lwip/core/def.c
deleted file mode 100644 (file)
index bb4b8e0..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-/**
- * @file
- * Common functions used throughout the stack.
- *
- */
-
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Simon Goldschmidt
- *
- */
-
-#include "lwip/opt.h"
-#include "lwip/def.h"
-
-/**
- * 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:
- *
- * #define LWIP_PLATFORM_BYTESWAP 1
- * #define LWIP_PLATFORM_HTONS(x) <your_htons>
- * #define LWIP_PLATFORM_HTONL(x) <your_htonl>
- *
- * Note ntohs() and ntohl() are merely references to the htonx counterparts.
- */
-
-#if (LWIP_PLATFORM_BYTESWAP == 0) && (BYTE_ORDER == LITTLE_ENDIAN)
-
-/**
- * Convert an u16_t from host- to network byte order.
- *
- * @param n u16_t in host byte order
- * @return n in network byte order
- */
-u16_t
-lwip_htons(u16_t n)
-{
-  return ((n & 0xff) << 8) | ((n & 0xff00) >> 8);
-}
-
-/**
- * Convert an u16_t from network- to host byte order.
- *
- * @param n u16_t in network byte order
- * @return n in host byte order
- */
-u16_t
-lwip_ntohs(u16_t n)
-{
-  return lwip_htons(n);
-}
-
-/**
- * Convert an u32_t from host- to network byte order.
- *
- * @param n u32_t in host byte order
- * @return n in network byte order
- */
-u32_t
-lwip_htonl(u32_t n)
-{
-  return ((n & 0xff) << 24) |
-    ((n & 0xff00) << 8) |
-    ((n & 0xff0000UL) >> 8) |
-    ((n & 0xff000000UL) >> 24);
-}
-
-/**
- * Convert an u32_t from network- to host byte order.
- *
- * @param n u32_t in network byte order
- * @return n in host byte order
- */
-u32_t
-lwip_ntohl(u32_t n)
-{
-  return lwip_htonl(n);
-}
-
-#endif /* (LWIP_PLATFORM_BYTESWAP == 0) && (BYTE_ORDER == LITTLE_ENDIAN) */
diff --git a/components/lwip/core/dns.c b/components/lwip/core/dns.c
deleted file mode 100644 (file)
index 4e16415..0000000
+++ /dev/null
@@ -1,1524 +0,0 @@
-/**
- * @file
- * DNS - host name to IP address resolver.
- *
- */
-
-/**
-
- * This file implements a DNS host name to IP address resolver.
-
- * Port to lwIP from uIP
- * by Jim Pettinato April 2007
-
- * security fixes and more by Simon Goldschmidt
-
- * uIP version Copyright (c) 2002-2003, Adam Dunkels.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote
- *    products derived from this software without specific prior
- *    written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
- * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (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.C
- *
- * 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 dns_query() function.
- *
- * The lwIP version of the resolver also adds a non-blocking version of
- * gethostbyname() that will work with a raw API application. This function
- * checks for an IP address string first and converts it if it is valid.
- * gethostbyname() 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.
- *
- * 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).
- */
-
-/*-----------------------------------------------------------------------------
- * RFC 1035 - Domain names - implementation and specification
- * RFC 2181 - Clarifications to the DNS Specification
- *----------------------------------------------------------------------------*/
-
-/** @todo: define good default values (rfc compliance) */
-/** @todo: improve answer parsing, more checkings... */
-/** @todo: check RFC1035 - 7.3. Processing responses */
-
-/*-----------------------------------------------------------------------------
- * Includes
- *----------------------------------------------------------------------------*/
-
-#include "lwip/opt.h"
-
-#if LWIP_DNS /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/udp.h"
-#include "lwip/mem.h"
-#include "lwip/memp.h"
-#include "lwip/dns.h"
-
-#include <string.h>
-
-/** Random generator function to create random TXIDs and source ports for queries */
-#ifndef DNS_RAND_TXID
-#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_RAND_XID) != 0)
-#define DNS_RAND_TXID LWIP_RAND
-#else
-static u16_t dns_txid;
-#define DNS_RAND_TXID() (++dns_txid)
-#endif
-#endif
-
-/** Limits the source port to be >= 1024 by default */
-#ifndef DNS_PORT_ALLOWED
-#define DNS_PORT_ALLOWED(port) ((port) >= 1024)
-#endif
-
-/** DNS server port address */
-#ifndef DNS_SERVER_PORT
-#define DNS_SERVER_PORT           53
-#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
-#endif
-
-/* The number of parallel requests (i.e. calls to dns_gethostbyname
- * that cannot be answered from the DNS table.
- * This is set to the table size by default.
- */
-#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING) != 0)
-#ifndef DNS_MAX_REQUESTS
-#define DNS_MAX_REQUESTS          DNS_TABLE_SIZE
-#endif
-#else
-/* In this configuration, both arrays have to have the same size and are used
- * like one entry (used/free) */
-#define DNS_MAX_REQUESTS          DNS_TABLE_SIZE
-#endif
-
-/* The number of UDP source ports used in parallel */
-#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_RAND_SRC_PORT) != 0)
-#ifndef DNS_MAX_SOURCE_PORTS
-#define DNS_MAX_SOURCE_PORTS      DNS_MAX_REQUESTS
-#endif
-#else
-#ifdef DNS_MAX_SOURCE_PORTS
-#undef DNS_MAX_SOURCE_PORTS
-#endif
-#define DNS_MAX_SOURCE_PORTS      1
-#endif
-
-#if LWIP_IPV4 && LWIP_IPV6
-#define LWIP_DNS_ADDRTYPE_IS_IPV6(t) (((t) == LWIP_DNS_ADDRTYPE_IPV6_IPV4) || ((t) == LWIP_DNS_ADDRTYPE_IPV6))
-#define LWIP_DNS_ADDRTYPE_MATCH_IP(t, ip) (IP_IS_V6_VAL(ip) ? LWIP_DNS_ADDRTYPE_IS_IPV6(t) : (!LWIP_DNS_ADDRTYPE_IS_IPV6(t)))
-#define LWIP_DNS_ADDRTYPE_ARG(x) , x
-#define LWIP_DNS_ADDRTYPE_ARG_OR_ZERO(x) x
-#define LWIP_DNS_SET_ADDRTYPE(x, y) do { x = y; } while(0)
-#else
-#if LWIP_IPV6
-#define LWIP_DNS_ADDRTYPE_IS_IPV6(t) 1
-#else
-#define LWIP_DNS_ADDRTYPE_IS_IPV6(t) 0
-#endif
-#define LWIP_DNS_ADDRTYPE_MATCH_IP(t, ip) 1
-#define LWIP_DNS_ADDRTYPE_ARG(x)
-#define LWIP_DNS_ADDRTYPE_ARG_OR_ZERO(x) 0
-#define LWIP_DNS_SET_ADDRTYPE(x, y)
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-
-/** DNS field TYPE used for "Resource Records" */
-#define DNS_RRTYPE_A              1     /* a host address */
-#define DNS_RRTYPE_NS             2     /* an authoritative name server */
-#define DNS_RRTYPE_MD             3     /* a mail destination (Obsolete - use MX) */
-#define DNS_RRTYPE_MF             4     /* a mail forwarder (Obsolete - use MX) */
-#define DNS_RRTYPE_CNAME          5     /* the canonical name for an alias */
-#define DNS_RRTYPE_SOA            6     /* marks the start of a zone of authority */
-#define DNS_RRTYPE_MB             7     /* a mailbox domain name (EXPERIMENTAL) */
-#define DNS_RRTYPE_MG             8     /* a mail group member (EXPERIMENTAL) */
-#define DNS_RRTYPE_MR             9     /* a mail rename domain name (EXPERIMENTAL) */
-#define DNS_RRTYPE_NULL           10    /* a null RR (EXPERIMENTAL) */
-#define DNS_RRTYPE_WKS            11    /* a well known service description */
-#define DNS_RRTYPE_PTR            12    /* a domain name pointer */
-#define DNS_RRTYPE_HINFO          13    /* host information */
-#define DNS_RRTYPE_MINFO          14    /* mailbox or mail list information */
-#define DNS_RRTYPE_MX             15    /* mail exchange */
-#define DNS_RRTYPE_TXT            16    /* text strings */
-#define DNS_RRTYPE_AAAA           28    /* IPv6 address */
-
-/** DNS field CLASS used for "Resource Records" */
-#define DNS_RRCLASS_IN            1     /* the Internet */
-#define DNS_RRCLASS_CS            2     /* the CSNET class (Obsolete - used only for examples in some obsolete RFCs) */
-#define DNS_RRCLASS_CH            3     /* the CHAOS class */
-#define DNS_RRCLASS_HS            4     /* Hesiod [Dyer 87] */
-#define DNS_RRCLASS_FLUSH         0x800 /* Flush bit */
-
-/* DNS protocol flags */
-#define DNS_FLAG1_RESPONSE        0x80
-#define DNS_FLAG1_OPCODE_STATUS   0x10
-#define DNS_FLAG1_OPCODE_INVERSE  0x08
-#define DNS_FLAG1_OPCODE_STANDARD 0x00
-#define DNS_FLAG1_AUTHORATIVE     0x04
-#define DNS_FLAG1_TRUNC           0x02
-#define DNS_FLAG1_RD              0x01
-#define DNS_FLAG2_RA              0x80
-#define DNS_FLAG2_ERR_MASK        0x0f
-#define DNS_FLAG2_ERR_NONE        0x00
-#define DNS_FLAG2_ERR_NAME        0x03
-
-/* DNS protocol states */
-#define DNS_STATE_UNUSED            0
-#define DNS_STATE_NEW               1
-#define DNS_STATE_ASKING            2
-#define DNS_STATE_DONE              3
-
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-/** DNS message header */
-struct dns_hdr {
-  PACK_STRUCT_FIELD(u16_t id);
-  PACK_STRUCT_FLD_8(u8_t flags1);
-  PACK_STRUCT_FLD_8(u8_t flags2);
-  PACK_STRUCT_FIELD(u16_t numquestions);
-  PACK_STRUCT_FIELD(u16_t numanswers);
-  PACK_STRUCT_FIELD(u16_t numauthrr);
-  PACK_STRUCT_FIELD(u16_t numextrarr);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-#define SIZEOF_DNS_HDR 12
-
-/** DNS query message structure.
-    No packing needed: only used locally on the stack. */
-struct dns_query {
-  /* DNS query record starts with either a domain name or a pointer
-     to a name already present somewhere in the packet. */
-  u16_t type;
-  u16_t cls;
-};
-#define SIZEOF_DNS_QUERY 4
-
-/** DNS answer message structure.
-    No packing needed: only used locally on the stack. */
-struct dns_answer {
-  /* DNS answer record starts with either a domain name or a pointer
-     to a name already present somewhere in the packet. */
-  u16_t type;
-  u16_t cls;
-  u32_t ttl;
-  u16_t len;
-};
-#define SIZEOF_DNS_ANSWER 10
-/* maximum allowed size for the struct due to non-packed */
-#define SIZEOF_DNS_ANSWER_ASSERT 12
-
-/** DNS table entry */
-struct dns_table_entry {
-  u32_t ttl;
-  ip_addr_t ipaddr;
-  u16_t txid;
-  u8_t  state;
-  u8_t  server_idx;
-  u8_t  tmr;
-  u8_t  retries;
-  u8_t  seqno;
-#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_RAND_SRC_PORT) != 0)
-  u8_t pcb_idx;
-#endif
-  char name[DNS_MAX_NAME_LENGTH];
-#if LWIP_IPV4 && LWIP_IPV6
-  u8_t reqaddrtype;
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-};
-
-/** DNS request table entry: used when dns_gehostbyname cannot answer the
- * request from the DNS table */
-struct dns_req_entry {
-  /* pointer to callback on DNS query done */
-  dns_found_callback found;
-  /* argument passed to the callback function */
-  void *arg;
-#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING) != 0)
-  u8_t dns_table_idx;
-#endif
-#if LWIP_IPV4 && LWIP_IPV6
-  u8_t reqaddrtype;
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-};
-
-#if DNS_LOCAL_HOSTLIST
-
-#if DNS_LOCAL_HOSTLIST_IS_DYNAMIC
-/** Local host-list. For hostnames in this list, no
- *  external name resolution is performed */
-static struct local_hostlist_entry *local_hostlist_dynamic;
-#else /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */
-
-/** Defining this allows the local_hostlist_static to be placed in a different
- * linker section (e.g. FLASH) */
-#ifndef DNS_LOCAL_HOSTLIST_STORAGE_PRE
-#define DNS_LOCAL_HOSTLIST_STORAGE_PRE static
-#endif /* DNS_LOCAL_HOSTLIST_STORAGE_PRE */
-/** Defining this allows the local_hostlist_static to be placed in a different
- * linker section (e.g. FLASH) */
-#ifndef DNS_LOCAL_HOSTLIST_STORAGE_POST
-#define DNS_LOCAL_HOSTLIST_STORAGE_POST
-#endif /* DNS_LOCAL_HOSTLIST_STORAGE_POST */
-DNS_LOCAL_HOSTLIST_STORAGE_PRE struct local_hostlist_entry local_hostlist_static[]
-  DNS_LOCAL_HOSTLIST_STORAGE_POST = DNS_LOCAL_HOSTLIST_INIT;
-
-#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */
-
-static void dns_init_local(void);
-#endif /* DNS_LOCAL_HOSTLIST */
-
-
-/* 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);
-
-/*-----------------------------------------------------------------------------
- * Globals
- *----------------------------------------------------------------------------*/
-
-/* DNS variables */
-static struct udp_pcb        *dns_pcbs[DNS_MAX_SOURCE_PORTS];
-#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_RAND_SRC_PORT) != 0)
-static u8_t                   dns_last_pcb_idx;
-#endif
-static u8_t                   dns_seqno;
-static struct dns_table_entry dns_table[DNS_TABLE_SIZE];
-static struct dns_req_entry   dns_requests[DNS_MAX_REQUESTS];
-static ip_addr_t              dns_servers[DNS_MAX_SERVERS];
-
-#ifndef LWIP_DNS_STRICMP
-#define LWIP_DNS_STRICMP(str1, str2) dns_stricmp(str1, str2)
-/**
- * A small but sufficient implementation for case insensitive strcmp.
- * This can be defined to e.g. stricmp for windows or strcasecmp for linux. */
-static int
-dns_stricmp(const char* str1, const char* str2)
-{
-  char c1, c2;
-
-  do {
-    c1 = *str1++;
-    c2 = *str2++;
-    if (c1 != c2) {
-      char c1_upc = c1 | 0x20;
-      if ((c1_upc >= 'a') && (c1_upc <= 'z')) {
-        /* characters are not equal an one is in the alphabet range:
-        downcase both chars and check again */
-        char c2_upc = c2 | 0x20;
-        if (c1_upc != c2_upc) {
-          /* still not equal */
-          /* don't care for < or > */
-          return 1;
-        }
-      } else {
-        /* characters are not equal but none is in the alphabet range */
-        return 1;
-      }
-    }
-  } while (c1 != 0);
-  return 0;
-}
-#endif /* LWIP_DNS_STRICMP */
-
-/**
- * Initialize the resolver: set up the UDP pcb and configure the fallback dns server
- * (if FALLBACK_DNS_SERVER_ADDRESS is set).
- */
-void
-dns_init(void)
-{
-#ifdef FALLBACK_DNS_SERVER_ADDRESS
-  /* initialize default DNS server address */
-  ip_addr_t dnsserver;
-  FALLBACK_DNS_SERVER_ADDRESS(&dnsserver);
-  dnsserver.type = IPADDR_TYPE_V4;
-  dns_setserver(DNS_FALLBACK_SERVER_INDEX, &dnsserver);
-#endif /* FALLBACK_DNS_SERVER_ADDRESS */
-
-  LWIP_ASSERT("sanity check 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);
-
-  LWIP_DEBUGF(DNS_DEBUG, ("dns_init: initializing\n"));
-
-  /* if dns client not yet initialized... */
-#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_RAND_SRC_PORT) == 0)
-  if (dns_pcbs[0] == NULL) {
-    dns_pcbs[0] = udp_new_ip_type(IPADDR_TYPE_ANY);
-    LWIP_ASSERT("dns_pcbs[0] != NULL", dns_pcbs[0] != NULL);
-
-    /* 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);
-
-    /* initialize DNS client */
-    udp_bind(dns_pcbs[0], IP_ANY_TYPE, 0);
-    udp_recv(dns_pcbs[0], dns_recv, NULL);
-  }
-#endif
-
-#if DNS_LOCAL_HOSTLIST
-  dns_init_local();
-#endif
-}
-
-/**
- * Initialize one of the DNS servers.
- *
- * @param numdns the index of the DNS server to set must be < DNS_MAX_SERVERS
- * @param dnsserver IP address of the DNS server to set
- */
-void
-dns_setserver(u8_t numdns, const ip_addr_t *dnsserver)
-{
-  if (numdns < DNS_MAX_SERVERS) {
-    if (dnsserver != NULL) {
-      dns_servers[numdns] = (*dnsserver);
-    } else {
-      dns_servers[numdns] = *IP_ADDR_ANY;
-    }
-  }
-}
-
-void 
-dns_clear_servers(bool keep_fallback)
-{
-  u8_t numdns = 0; 
-  
-  for (numdns = 0; numdns < DNS_MAX_SERVERS; numdns ++) {
-    if (keep_fallback && numdns == DNS_FALLBACK_SERVER_INDEX) {
-      continue;
-    }
-
-    dns_setserver(numdns, NULL);
-  }
-}
-
-
-/**
- * Obtain one of the currently configured DNS server.
- *
- * @param numdns the index of the DNS server
- * @return IP address of the indexed DNS server or "ip_addr_any" if the DNS
- *         server has not been configured.
- */
-ip_addr_t
-dns_getserver(u8_t numdns)
-{
-  if (numdns < DNS_MAX_SERVERS) {
-    return dns_servers[numdns];
-  } else {
-    return *IP_ADDR_ANY;
-  }
-}
-
-/**
- * The DNS resolver client timer - handle retries and timeouts and should
- * be called every DNS_TMR_INTERVAL milliseconds (every second by default).
- */
-void
-dns_tmr(void)
-{
-  LWIP_DEBUGF(DNS_DEBUG, ("dns_tmr: dns_check_entries\n"));
-  dns_check_entries();
-}
-
-#if DNS_LOCAL_HOSTLIST
-static void
-dns_init_local(void)
-{
-#if DNS_LOCAL_HOSTLIST_IS_DYNAMIC && defined(DNS_LOCAL_HOSTLIST_INIT)
-  size_t i;
-  struct local_hostlist_entry *entry;
-  /* Dynamic: copy entries from DNS_LOCAL_HOSTLIST_INIT to list */
-  struct local_hostlist_entry local_hostlist_init[] = DNS_LOCAL_HOSTLIST_INIT;
-  size_t namelen;
-  for (i = 0; i < sizeof(local_hostlist_init) / sizeof(struct local_hostlist_entry); i++) {
-    struct local_hostlist_entry *init_entry = &local_hostlist_init[i];
-    LWIP_ASSERT("invalid host name (NULL)", init_entry->name != NULL);
-    namelen = strlen(init_entry->name);
-    LWIP_ASSERT("namelen <= DNS_LOCAL_HOSTLIST_MAX_NAMELEN", namelen <= DNS_LOCAL_HOSTLIST_MAX_NAMELEN);
-    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);
-      MEMCPY(entry_name, init_entry->name, namelen);
-      entry_name[namelen] = 0;
-      entry->name = entry_name;
-      entry->addr = init_entry->addr;
-      entry->next = local_hostlist_dynamic;
-      local_hostlist_dynamic = entry;
-    }
-  }
-#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC && defined(DNS_LOCAL_HOSTLIST_INIT) */
-}
-
-/**
- * Scans the local host-list for a hostname.
- *
- * @param hostname Hostname to look for in the local host-list
- * @param addr the first IP address for the hostname in the local host-list or
- *         IPADDR_NONE if not found.
- * @return ERR_OK if found, ERR_ARG if not found
- */
-static err_t
-dns_lookup_local(const char *hostname, ip_addr_t *addr LWIP_DNS_ADDRTYPE_ARG(u8_t dns_addrtype))
-{
-#if DNS_LOCAL_HOSTLIST_IS_DYNAMIC
-  struct local_hostlist_entry *entry = local_hostlist_dynamic;
-  while (entry != NULL) {
-    if ((LWIP_DNS_STRICMP(entry->name, hostname) == 0) &&
-        LWIP_DNS_ADDRTYPE_MATCH_IP(dns_addrtype, entry->addr)) {
-      if (addr) {
-        ip_addr_copy(*addr, entry->addr);
-      }
-      return ERR_OK;
-    }
-    entry = entry->next;
-  }
-#else /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */
-  size_t i;
-  for (i = 0; i < sizeof(local_hostlist_static) / sizeof(struct local_hostlist_entry); i++) {
-    if ((LWIP_DNS_STRICMP(local_hostlist_static[i].name, hostname) == 0) &&
-        LWIP_DNS_ADDRTYPE_MATCH_IP(dns_addrtype, local_hostlist_static[i].addr)) {
-      if (addr) {
-        ip_addr_copy(*addr, local_hostlist_static[i].addr);
-      }
-      return ERR_OK;
-    }
-  }
-#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */
-  return ERR_ARG;
-}
-
-#if DNS_LOCAL_HOSTLIST_IS_DYNAMIC
-/** Remove all entries from the local host-list for a specific hostname
- * and/or IP address
- *
- * @param hostname hostname for which entries shall be removed from the local
- *                 host-list
- * @param addr address for which entries shall be removed from the local host-list
- * @return the number of removed entries
- */
-int
-dns_local_removehost(const char *hostname, const ip_addr_t *addr)
-{
-  int removed = 0;
-  struct local_hostlist_entry *entry = local_hostlist_dynamic;
-  struct local_hostlist_entry *last_entry = NULL;
-  while (entry != NULL) {
-    if (((hostname == NULL) || !LWIP_DNS_STRICMP(entry->name, hostname)) &&
-        ((addr == NULL) || ip_addr_cmp(&entry->addr, addr))) {
-      struct local_hostlist_entry *free_entry;
-      if (last_entry != NULL) {
-        last_entry->next = entry->next;
-      } else {
-        local_hostlist_dynamic = entry->next;
-      }
-      free_entry = entry;
-      entry = entry->next;
-      memp_free(MEMP_LOCALHOSTLIST, free_entry);
-      removed++;
-    } else {
-      last_entry = entry;
-      entry = entry->next;
-    }
-  }
-  return removed;
-}
-
-/**
- * Add a hostname/IP address pair to the local host-list.
- * Duplicates are not checked.
- *
- * @param hostname hostname of the new entry
- * @param addr IP address of the new entry
- * @return ERR_OK if succeeded or ERR_MEM on memory error
- */
-err_t
-dns_local_addhost(const char *hostname, const ip_addr_t *addr)
-{
-  struct local_hostlist_entry *entry;
-  size_t namelen;
-  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);
-  entry = (struct local_hostlist_entry *)memp_malloc(MEMP_LOCALHOSTLIST);
-  if (entry == NULL) {
-    return ERR_MEM;
-  }
-  entry_name = (char*)entry + sizeof(struct local_hostlist_entry);
-  MEMCPY(entry_name, hostname, namelen);
-  entry_name[namelen] = 0;
-  entry->name = entry_name;
-  ip_addr_copy(entry->addr, *addr);
-  entry->next = local_hostlist_dynamic;
-  local_hostlist_dynamic = entry;
-  return ERR_OK;
-}
-#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC*/
-#endif /* DNS_LOCAL_HOSTLIST */
-
-/**
- * Look up a hostname in the array of known hostnames.
- *
- * @note This function only looks in the internal array of known
- * hostnames, it does not send out a query for the hostname if none
- * was found. The function dns_enqueue() can be used to send a query
- * for a hostname.
- *
- * @param name the hostname to look up
- * @param addr the hostname's IP address, as u32_t (instead of ip_addr_t to
- *         better check for failure: != IPADDR_NONE) or IPADDR_NONE if the hostname
- *         was not found in the cached dns_table.
- * @return ERR_OK if found, ERR_ARG if not found
- */
-static err_t
-dns_lookup(const char *name, ip_addr_t *addr LWIP_DNS_ADDRTYPE_ARG(u8_t dns_addrtype))
-{
-  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;
-  }
-#endif /* DNS_LOCAL_HOSTLIST */
-#ifdef DNS_LOOKUP_LOCAL_EXTERN
-  if (DNS_LOOKUP_LOCAL_EXTERN(name, addr, LWIP_DNS_ADDRTYPE_ARG_OR_ZERO(dns_addrtype))) {
-    return ERR_OK;
-  }
-#endif /* DNS_LOOKUP_LOCAL_EXTERN */
-
-  /* Walk through name list, return entry if found. If not, return NULL. */
-  for (i = 0; i < DNS_TABLE_SIZE; ++i) {
-    if ((dns_table[i].state == DNS_STATE_DONE) &&
-        (LWIP_DNS_STRICMP(name, 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));
-      LWIP_DEBUGF(DNS_DEBUG, ("\n"));
-      if (addr) {
-        ip_addr_copy(*addr, dns_table[i].ipaddr);
-      }
-      return ERR_OK;
-    }
-  }
-
-  return ERR_ARG;
-}
-
-/**
- * Compare the "dotted" name "query" with the encoded name "response"
- * to make sure an answer from the DNS server matches the current dns_table
- * entry (otherwise, answers might arrive late for hostname not on the list
- * any more).
- *
- * @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(char *query, struct pbuf* p, u16_t start_offset)
-{
-  unsigned char n;
-  u16_t response_offset = start_offset;
-
-  do {
-    n = pbuf_get_at(p, 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 */
-      return 0xFFFF;
-    } else {
-      /* Not compressed name */
-      while (n > 0) {
-        if ((*query) != pbuf_get_at(p, response_offset)) {
-          return 0xFFFF;
-        }
-        ++response_offset;
-        ++query;
-        --n;
-      }
-      ++query;
-    }
-  } while (pbuf_get_at(p, response_offset) != 0);
-
-  return response_offset + 1;
-}
-
-/**
- * Walk through a compact encoded DNS name and return the end of the name.
- *
- * @param p pbuf containing the name
- * @param query_idx start index into p pointing to encoded DNS name in the DNS server response
- * @return index to end of the name
- */
-static u16_t
-dns_parse_name(struct pbuf* p, u16_t query_idx)
-{
-  unsigned char n;
-
-  do {
-    n = pbuf_get_at(p, query_idx++);
-    /** @see RFC 1035 - 4.1.4. Message compression */
-    if ((n & 0xc0) == 0xc0) {
-      /* Compressed name */
-      break;
-    } else {
-      /* Not compressed name */
-      while (n > 0) {
-        ++query_idx;
-        --n;
-      }
-    }
-  } while (pbuf_get_at(p, query_idx) != 0);
-
-  return query_idx + 1;
-}
-
-/**
- * Send a DNS query packet.
- *
- * @param idx the DNS table entry index for which to send a request
- * @return ERR_OK if packet is sent; an err_t indicating the problem otherwise
- */
-static err_t
-dns_send(u8_t idx)
-{
-  err_t err;
-  struct dns_hdr hdr;
-  struct dns_query qry;
-  struct pbuf *p;
-  u16_t query_idx, copy_len;
-  const char *hostname, *hostname_part;
-  u8_t n;
-  u8_t pcb_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));
-  LWIP_ASSERT("dns server out of array", entry->server_idx < DNS_MAX_SERVERS);
-  if (ip_addr_isany_val(dns_servers[entry->server_idx])) {
-    return ERR_OK;
-  }
-
-  /* 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);
-  if (p != NULL) {
-    /* fill dns header */
-    memset(&hdr, 0, SIZEOF_DNS_HDR);
-    hdr.id = htons(entry->txid);
-    hdr.flags1 = DNS_FLAG1_RD;
-    hdr.numquestions = PP_HTONS(1);
-    pbuf_take(p, &hdr, SIZEOF_DNS_HDR);
-    hostname = entry->name;
-    --hostname;
-
-    /* convert hostname into suitable query format. */
-    query_idx = SIZEOF_DNS_HDR;
-    do {
-      ++hostname;
-      hostname_part = hostname;
-      for (n = 0; *hostname != '.' && *hostname != 0; ++hostname) {
-        ++n;
-      }
-      copy_len = (u16_t)(hostname - hostname_part);
-      pbuf_put_at(p, query_idx, n);
-      pbuf_take_at(p, hostname_part, copy_len, query_idx + 1);
-      query_idx += n + 1;
-    } while (*hostname != 0);
-    pbuf_put_at(p, query_idx, 0);
-    query_idx++;
-
-    /* fill dns query */
-    if (LWIP_DNS_ADDRTYPE_IS_IPV6(entry->reqaddrtype)) {
-      qry.type = PP_HTONS(DNS_RRTYPE_AAAA);
-    } else {
-      qry.type = PP_HTONS(DNS_RRTYPE_A);
-    }
-    qry.cls = PP_HTONS(DNS_RRCLASS_IN);
-    pbuf_take_at(p, &qry, SIZEOF_DNS_QUERY, query_idx);
-
-#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_RAND_SRC_PORT) != 0)
-    pcb_idx = entry->pcb_idx;
-#else
-    pcb_idx = 0;
-#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));
-    err = udp_sendto(dns_pcbs[pcb_idx], p, &dns_servers[entry->server_idx], DNS_SERVER_PORT);
-
-    /* free pbuf */
-    pbuf_free(p);
-  } else {
-    err = ERR_MEM;
-  }
-
-  return err;
-}
-
-#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_RAND_SRC_PORT) != 0)
-static struct udp_pcb*
-dns_alloc_random_port(void)
-{
-  err_t err;
-  struct udp_pcb* ret;
-
-  ret = udp_new_ip_type(IPADDR_TYPE_ANY);
-  if (ret == 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)) {
-      /* 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);
-    return NULL;
-  }
-  udp_recv(ret, dns_recv, NULL);
-  return ret;
-}
-
-/**
- * dns_alloc_pcb() - allocates a new pcb (or reuses an existing one) to be used
- * for sending a request
- *
- * @return an index into dns_pcbs
- */
-static u8_t
-dns_alloc_pcb(void)
-{
-  u8_t i;
-  u8_t idx;
-
-  for (i = 0; i < DNS_MAX_SOURCE_PORTS; i++) {
-    if (dns_pcbs[i] == NULL) {
-      break;
-    }
-  }
-  if (i < DNS_MAX_SOURCE_PORTS) {
-    dns_pcbs[i] = dns_alloc_random_port();
-    if (dns_pcbs[i] != NULL) {
-      /* succeeded */
-      dns_last_pcb_idx = i;
-      return i;
-    }
-  }
-  /* 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++) {
-    if (idx >= DNS_MAX_SOURCE_PORTS) {
-      idx = 0;
-    }
-    if (dns_pcbs[idx] != NULL) {
-      dns_last_pcb_idx = idx;
-      return idx;
-    }
-  }
-  return DNS_MAX_SOURCE_PORTS;
-}
-#endif /* ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_RAND_SRC_PORT) != 0) */
-
-/**
- * dns_call_found() - call the found callback and check if there are duplicate
- * entries for the given hostname. If there are any, their found callback will
- * be called and they will be removed.
- *
- * @param idx dns table index of the entry that is resolved or removed
- * @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)
-{
-#if ((LWIP_DNS_SECURE & (LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING | LWIP_DNS_SECURE_RAND_SRC_PORT)) != 0)
-  u8_t i;
-#endif
-
-#if LWIP_IPV4 && LWIP_IPV6
-  if (addr != NULL) {
-    /* check that address type matches the request and adapt the table entry */
-    if (IP_IS_V6_VAL(*addr)) {
-      LWIP_ASSERT("invalid response", LWIP_DNS_ADDRTYPE_IS_IPV6(dns_table[idx].reqaddrtype));
-      dns_table[idx].reqaddrtype = LWIP_DNS_ADDRTYPE_IPV6;
-    } else {
-      LWIP_ASSERT("invalid response", !LWIP_DNS_ADDRTYPE_IS_IPV6(dns_table[idx].reqaddrtype));
-      dns_table[idx].reqaddrtype = LWIP_DNS_ADDRTYPE_IPV4;
-    }
-  }
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-
-#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING) != 0)
-  for (i = 0; i < DNS_MAX_REQUESTS; i++) {
-    if (dns_requests[i].found && (dns_requests[i].dns_table_idx == idx)) {
-      (*dns_requests[i].found)(dns_table[idx].name, addr, dns_requests[i].arg);
-      /* flush this entry */
-      dns_requests[i].found = NULL;
-    }
-  }
-#else
-  if (dns_requests[idx].found) {
-    (*dns_requests[idx].found)(dns_table[idx].name, addr, dns_requests[idx].arg);
-  }
-  dns_requests[idx].found = NULL;
-#endif
-#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_RAND_SRC_PORT) != 0)
-  /* close the pcb used unless other request are using it */
-  for (i = 0; i < DNS_MAX_REQUESTS; i++) {
-    if (i == idx) {
-      continue; /* only check other requests */
-    }
-    if (dns_table[i].state == DNS_STATE_ASKING) {
-      if (dns_table[i].pcb_idx == dns_table[idx].pcb_idx) {
-        /* another request is still using the same pcb */
-        dns_table[idx].pcb_idx = DNS_MAX_SOURCE_PORTS;
-        break;
-      }
-    }
-  }
-  if (dns_table[idx].pcb_idx < DNS_MAX_SOURCE_PORTS) {
-    /* if we come here, the pcb is not used any more and can be removed */
-    udp_remove(dns_pcbs[dns_table[idx].pcb_idx]);
-    dns_pcbs[dns_table[idx].pcb_idx] = NULL;
-    dns_table[idx].pcb_idx = DNS_MAX_SOURCE_PORTS;
-  }
-#endif
-}
-
-/* Create a query transmission ID that is unique for all outstanding queries */
-static u16_t
-dns_create_txid(void)
-{
-  u16_t txid;
-  u8_t i;
-
-again:
-  txid = (u16_t)DNS_RAND_TXID();
-
-  /* check whether the ID is unique */
-  for (i = 0; i < DNS_TABLE_SIZE; i++) {
-    if ((dns_table[i].state == DNS_STATE_ASKING) &&
-        (dns_table[i].txid == txid)) {
-      /* ID already used by another pending query */
-      goto again;
-    }
-  }
-
-  return txid;
-}
-
-/**
- * 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
- * - retry old pending entries on timeout (also with different servers)
- * - remove completed entries from the table if their TTL has expired
- *
- * @param i index of the dns_table entry to check
- */
-static void
-dns_check_entry(u8_t i)
-{
-  err_t err;
-  struct dns_table_entry *entry = &dns_table[i];
-
-  LWIP_ASSERT("array index out of bounds", i < DNS_TABLE_SIZE);
-
-  switch (entry->state) {
-
-    case DNS_STATE_NEW: {
-      u16_t txid;
-      /* initialize new entry */
-      txid = dns_create_txid();
-      entry->txid = txid;
-      entry->state = DNS_STATE_ASKING;
-      entry->server_idx = 0;
-      entry->tmr = 1;
-      entry->retries = 0;
-
-      /* send DNS packet for this entry */
-      err = dns_send(i);
-      if (err != ERR_OK) {
-        LWIP_DEBUGF(DNS_DEBUG | LWIP_DBG_LEVEL_WARNING,
-                    ("dns_send returned error: %s\n", lwip_strerr(err)));
-      }
-      break;
-    }
-
-    case DNS_STATE_ASKING:
-      if (--entry->tmr == 0) {
-        if (++entry->retries == DNS_MAX_RETRIES) {
-          /* skip DNS servers with zero address */
-          while ((entry->server_idx + 1 < DNS_MAX_SERVERS) && ip_addr_isany_val(dns_servers[entry->server_idx + 1])) {
-            entry->server_idx++;
-          }
-
-          if ((entry->server_idx + 1 < DNS_MAX_SERVERS) && !ip_addr_isany_val(dns_servers[entry->server_idx + 1])) {
-            /* change of server */
-            entry->server_idx++;
-            entry->tmr = 1;
-            entry->retries = 0;
-          } else {
-            LWIP_DEBUGF(DNS_DEBUG, ("dns_check_entry: \"%s\": timeout\n", entry->name));
-            /* call specified callback function if provided */
-            dns_call_found(i, NULL);
-            /* flush this entry */
-            entry->state = DNS_STATE_UNUSED;
-            break;
-          }
-        } else {
-          /* wait longer for the next retry */
-          entry->tmr = entry->retries;
-        }
-
-        /* send DNS packet for this entry */
-        err = dns_send(i);
-        if (err != ERR_OK) {
-          LWIP_DEBUGF(DNS_DEBUG | LWIP_DBG_LEVEL_WARNING,
-                      ("dns_send returned error: %s\n", lwip_strerr(err)));
-        }
-      }
-      break;
-    case DNS_STATE_DONE:
-      /* if the time to live is nul */
-      if ((entry->ttl == 0) || (--entry->ttl == 0)) {
-        LWIP_DEBUGF(DNS_DEBUG, ("dns_check_entry: \"%s\": flush\n", entry->name));
-        /* flush this entry, there cannot be any related pending entries in this state */
-        entry->state = DNS_STATE_UNUSED;
-      }
-      break;
-    case DNS_STATE_UNUSED:
-      /* nothing to do */
-      break;
-    default:
-      LWIP_ASSERT("unknown dns_table entry state:", 0);
-      break;
-  }
-}
-
-/**
- * Call dns_check_entry for each entry in dns_table - check all entries.
- */
-static void
-dns_check_entries(void)
-{
-  u8_t i;
-
-  for (i = 0; i < DNS_TABLE_SIZE; ++i) {
-    dns_check_entry(i);
-  }
-}
-
-/**
- * Receive input function for DNS response packets arriving for the dns UDP pcb.
- *
- * @params see udp.h
- */
-static void
-dns_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
-{
-  u8_t i, entry_idx = DNS_TABLE_SIZE;
-  u16_t txid;
-  u16_t res_idx;
-  struct dns_hdr hdr;
-  struct dns_answer ans;
-  struct dns_query qry;
-  u16_t nquestions, nanswers;
-
-  LWIP_UNUSED_ARG(arg);
-  LWIP_UNUSED_ARG(pcb);
-  LWIP_UNUSED_ARG(port);
-
-  /* is the dns message big enough ? */
-  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;
-  }
-
-  /* copy dns payload inside static buffer for processing */
-  if (pbuf_copy_partial(p, &hdr, SIZEOF_DNS_HDR, 0) == SIZEOF_DNS_HDR) {
-    /* Match the ID in the DNS header with the name table. */
-    txid = htons(hdr.id);
-    for (i = 0; i < DNS_TABLE_SIZE; i++) {
-      struct dns_table_entry *entry = &dns_table[i];
-      entry_idx = i;
-      if ((entry->state == DNS_STATE_ASKING) &&
-          (entry->txid == txid)) {
-        u8_t dns_err;
-        /* This entry is now completed. */
-        
-#if ! ESP_DNS
-        entry->state = DNS_STATE_DONE;
-#endif
-        dns_err = hdr.flags2 & DNS_FLAG2_ERR_MASK;
-
-        /* We only care about the question(s) and the answers. The authrr
-           and the extrarr are simply discarded. */
-        nquestions = htons(hdr.numquestions);
-        nanswers   = htons(hdr.numanswers);
-
-        /* Check for error. If so, call callback to inform. */
-        if (((hdr.flags1 & DNS_FLAG1_RESPONSE) == 0) || (dns_err != 0) || (nquestions != 1)) {
-          LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": error in flags\n", entry->name));
-          /* call callback to indicate error, clean up memory and return */
-#if ! ESP_DNS
-                goto responseerr;
-        }
-#else
-                goto memerr;
-        }
-        entry->state = DNS_STATE_DONE;
-#endif
-        
-
-        /* 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])) {
-          /* call callback to indicate error, clean up memory and return */
-          goto responseerr;
-        }
-
-        /* Check if the name in the "question" part match with the name in the entry and
-           skip it if equal. */
-        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));
-          /* call callback to indicate error, clean up memory and return */
-          goto responseerr;
-        }
-
-        /* check if "question" part matches the request */
-        pbuf_copy_partial(p, &qry, SIZEOF_DNS_QUERY, res_idx);
-        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_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": response not match to query\n", entry->name));
-          /* call callback to indicate error, clean up memory and return */
-          goto responseerr;
-        }
-        /* skip the rest of the "question" part */
-        res_idx += SIZEOF_DNS_QUERY;
-
-        while ((nanswers > 0) && (res_idx < p->tot_len)) {
-          /* skip answer resource record's host name */
-          res_idx = dns_parse_name(p, res_idx);
-
-          /* Check for IP address type and Internet class. Others are discarded. */
-          pbuf_copy_partial(p, &ans, SIZEOF_DNS_ANSWER, res_idx);
-          if (ans.cls == PP_HTONS(DNS_RRCLASS_IN)) {
-#if LWIP_IPV4
-            if ((ans.type == PP_HTONS(DNS_RRTYPE_A)) && (ans.len == PP_HTONS(sizeof(ip4_addr_t)))) {
-#if LWIP_IPV4 && LWIP_IPV6
-              if (!LWIP_DNS_ADDRTYPE_IS_IPV6(entry->reqaddrtype))
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-              {
-                ip4_addr_t ip4addr;
-                res_idx += SIZEOF_DNS_ANSWER;
-                /* read the answer resource record's TTL, and maximize it if needed */
-                entry->ttl = ntohl(ans.ttl);
-                if (entry->ttl > DNS_MAX_TTL) {
-                  entry->ttl = DNS_MAX_TTL;
-                }
-                /* read the IP address after answer resource record's header */
-                pbuf_copy_partial(p, &ip4addr, sizeof(ip4_addr_t), res_idx);
-                ip_addr_copy_from_ip4(entry->ipaddr, ip4addr);
-                LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": response = ", entry->name));
-                ip_addr_debug_print(DNS_DEBUG, (&(entry->ipaddr)));
-                LWIP_DEBUGF(DNS_DEBUG, ("\n"));
-                /* call specified callback function if provided */
-                dns_call_found(entry_idx, &entry->ipaddr);
-                if (entry->ttl == 0) {
-                  /* RFC 883, page 29: "Zero values are
-                     interpreted to mean that the RR can only be used for the
-                     transaction in progress, and should not be cached."
-                     -> flush this entry now */
-                  goto flushentry;
-                }
-                /* deallocate memory and return */
-                goto memerr;
-              }
-            }
-#endif /* LWIP_IPV4 */
-#if LWIP_IPV6
-            if ((ans.type == PP_HTONS(DNS_RRTYPE_AAAA)) && (ans.len == PP_HTONS(sizeof(ip6_addr_t)))) {
-#if LWIP_IPV4 && LWIP_IPV6
-              if (LWIP_DNS_ADDRTYPE_IS_IPV6(entry->reqaddrtype))
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-              {
-                ip6_addr_t ip6addr;
-                res_idx += SIZEOF_DNS_ANSWER;
-                /* read the answer resource record's TTL, and maximize it if needed */
-                entry->ttl = ntohl(ans.ttl);
-                if (entry->ttl > DNS_MAX_TTL) {
-                  entry->ttl = DNS_MAX_TTL;
-                }
-                /* read the IP address after answer resource record's header */
-                pbuf_copy_partial(p, &ip6addr, sizeof(ip6_addr_t), res_idx);
-                ip_addr_copy_from_ip6(entry->ipaddr, ip6addr);
-                LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": response = ", entry->name));
-                ip_addr_debug_print(DNS_DEBUG, (&(entry->ipaddr)));
-                LWIP_DEBUGF(DNS_DEBUG, (" AAAA\n"));
-                /* call specified callback function if provided */
-                dns_call_found(entry_idx, &entry->ipaddr);
-                if (entry->ttl == 0) {
-                  /* RFC 883, page 29: "Zero values are
-                     interpreted to mean that the RR can only be used for the
-                     transaction in progress, and should not be cached."
-                     -> flush this entry now */
-                  goto flushentry;
-                }
-                /* deallocate memory and return */
-                goto memerr;
-              }
-            }
-#endif /* LWIP_IPV6 */
-          }
-          /* skip this answer */
-          res_idx += SIZEOF_DNS_ANSWER + htons(ans.len);
-          --nanswers;
-        }
-#if LWIP_IPV4 && LWIP_IPV6
-        if ((entry->reqaddrtype == LWIP_DNS_ADDRTYPE_IPV4_IPV6) ||
-            (entry->reqaddrtype == LWIP_DNS_ADDRTYPE_IPV6_IPV4)) {
-          if (entry->reqaddrtype == LWIP_DNS_ADDRTYPE_IPV4_IPV6) {
-            /* IPv4 failed, try IPv6 */
-            entry->reqaddrtype = LWIP_DNS_ADDRTYPE_IPV6;
-          } else {
-            /* IPv6 failed, try IPv4 */
-            entry->reqaddrtype = LWIP_DNS_ADDRTYPE_IPV4;
-          }
-          pbuf_free(p);
-          entry->state = DNS_STATE_NEW;
-          dns_check_entry(entry_idx);
-          return;
-        }
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-        LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": error in response\n", entry->name));
-        /* call callback to indicate error, clean up memory and return */
-        goto responseerr;
-      }
-    }
-  }
-
-  /* deallocate memory and return */
-  goto memerr;
-
-responseerr:
-  /* ERROR: call specified callback function with NULL as name to indicate an error */
-  dns_call_found(entry_idx, NULL);
-flushentry:
-  /* flush this entry */
-  dns_table[entry_idx].state = DNS_STATE_UNUSED;
-
-memerr:
-  /* free pbuf */
-  pbuf_free(p);
-  return;
-}
-
-/**
- * Queues a new hostname to resolve and sends out a DNS query for that hostname
- *
- * @param name the hostname that is to be queried
- * @param hostnamelen length of the hostname
- * @param found a callback function to be called on success, failure or timeout
- * @param callback_arg argument to pass to the callback function
- * @return @return a err_t return code.
- */
-static err_t
-dns_enqueue(const char *name, size_t hostnamelen, dns_found_callback found,
-            void *callback_arg LWIP_DNS_ADDRTYPE_ARG(u8_t dns_addrtype))
-{
-  u8_t i;
-  u8_t lseq, lseqi;
-  struct dns_table_entry *entry = NULL;
-  size_t namelen;
-  struct dns_req_entry* req;
-
-#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING) != 0)
-  u8_t r;
-  /* check for duplicate entries */
-  for (i = 0; i < DNS_TABLE_SIZE; i++) {
-    if ((dns_table[i].state == DNS_STATE_ASKING) &&
-        (LWIP_DNS_STRICMP(name, dns_table[i].name) == 0)) {
-#if LWIP_IPV4 && LWIP_IPV6
-      if (dns_table[i].reqaddrtype != dns_addrtype) {
-        /* requested address types don't match
-           this can lead to 2 concurrent requests, but mixing the address types
-           for the same host should not be that common */
-        continue;
-      }
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-      /* this is a duplicate entry, find a free request entry */
-      for (r = 0; r < DNS_MAX_REQUESTS; r++) {
-        if (dns_requests[r].found == 0) {
-          dns_requests[r].found = found;
-          dns_requests[r].arg = callback_arg;
-          dns_requests[r].dns_table_idx = i;
-          LWIP_DNS_SET_ADDRTYPE(dns_requests[r].reqaddrtype, dns_addrtype);
-          LWIP_DEBUGF(DNS_DEBUG, ("dns_enqueue: \"%s\": duplicate request\n", name));
-          return ERR_INPROGRESS;
-        }
-      }
-    }
-  }
-  /* no duplicate entries found */
-#endif
-
-  /* search an unused entry, or the oldest one */
-  lseq = 0;
-  lseqi = DNS_TABLE_SIZE;
-  for (i = 0; i < DNS_TABLE_SIZE; ++i) {
-    entry = &dns_table[i];
-    /* is it an unused entry ? */
-    if (entry->state == DNS_STATE_UNUSED) {
-      break;
-    }
-    /* check if this is the oldest completed entry */
-    if (entry->state == DNS_STATE_DONE) {
-      if ((u8_t)(dns_seqno - entry->seqno) > lseq) {
-        lseq = dns_seqno - entry->seqno;
-        lseqi = i;
-      }
-    }
-  }
-
-  /* if we don't have found an unused entry, use the oldest completed one */
-  if (i == DNS_TABLE_SIZE) {
-    if ((lseqi >= DNS_TABLE_SIZE) || (dns_table[lseqi].state != DNS_STATE_DONE)) {
-      /* no entry can be used now, table is full */
-      LWIP_DEBUGF(DNS_DEBUG, ("dns_enqueue: \"%s\": DNS entries table is full\n", name));
-      return ERR_MEM;
-    } else {
-      /* use the oldest completed one */
-      i = lseqi;
-      entry = &dns_table[i];
-    }
-  }
-
-#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING) != 0)
-  /* find a free request entry */
-  req = NULL;
-  for (r = 0; r < DNS_MAX_REQUESTS; r++) {
-    if (dns_requests[r].found == NULL) {
-      req = &dns_requests[r];
-      break;
-    }
-  }
-  if (req == NULL) {
-    /* no request entry can be used now, table is full */
-    LWIP_DEBUGF(DNS_DEBUG, ("dns_enqueue: \"%s\": DNS request entries table is full\n", name));
-    return ERR_MEM;
-  }
-  req->dns_table_idx = i;
-#else
-  /* in this configuration, the entry index is the same as the request index */
-  req = &dns_requests[i];
-#endif
-
-  /* use this entry */
-  LWIP_DEBUGF(DNS_DEBUG, ("dns_enqueue: \"%s\": use DNS entry %"U16_F"\n", name, (u16_t)(i)));
-
-  /* fill the entry */
-  entry->state = DNS_STATE_NEW;
-  entry->seqno = dns_seqno;
-  LWIP_DNS_SET_ADDRTYPE(entry->reqaddrtype, dns_addrtype);
-  LWIP_DNS_SET_ADDRTYPE(req->reqaddrtype, dns_addrtype);
-  req->found = found;
-  req->arg   = callback_arg;
-  namelen = LWIP_MIN(hostnamelen, DNS_MAX_NAME_LENGTH-1);
-  MEMCPY(entry->name, name, namelen);
-  entry->name[namelen] = 0;
-
-#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_RAND_SRC_PORT) != 0)
-  entry->pcb_idx = dns_alloc_pcb();
-  if (entry->pcb_idx >= DNS_MAX_SOURCE_PORTS) {
-    /* failed to get a UDP pcb */
-    LWIP_DEBUGF(DNS_DEBUG, ("dns_enqueue: \"%s\": failed to allocate a pcb\n", name));
-    entry->state = DNS_STATE_UNUSED;
-    req->found = NULL;
-    return ERR_MEM;
-  }
-  LWIP_DEBUGF(DNS_DEBUG, ("dns_enqueue: \"%s\": use DNS pcb %"U16_F"\n", name, (u16_t)(entry->pcb_idx)));
-#endif
-
-  dns_seqno++;
-
-  /* force to send query without waiting timer */
-  dns_check_entry(i);
-
-  /* dns query is enqueued */
-  return ERR_INPROGRESS;
-}
-
-/**
- * Resolve a hostname (string) into an IP address.
- * NON-BLOCKING callback version for use with raw API!!!
- *
- * Returns immediately with one of err_t return codes:
- * - ERR_OK if hostname is a valid IP address string or the host
- *   name is already in the local names table.
- * - ERR_INPROGRESS enqueue a request to be sent to the DNS server
- *   for resolution if no errors are present.
- * - ERR_ARG: dns client not initialized or invalid hostname
- *
- * @param hostname the hostname that is to be queried
- * @param addr 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!)
- * @param found a callback function to be called on success, failure or timeout (only if
- *              ERR_INPROGRESS is returned!)
- * @param callback_arg argument to pass to the callback function
- * @return a err_t return code.
- */
-err_t
-dns_gethostbyname(const char *hostname, ip_addr_t *addr, dns_found_callback found,
-                  void *callback_arg)
-{
-  return dns_gethostbyname_addrtype(hostname, addr, found, callback_arg, LWIP_DNS_ADDRTYPE_DEFAULT);
-}
-
-static bool dns_server_is_set (void)
-{
-  int i = 0;
-  for (i = 0;i < DNS_MAX_SERVERS; i++) {
-    if (!ip_addr_isany_val(dns_servers[i])) {
-      return true;
-    }
-  }
-  return false;
-}
-
-/** Like dns_gethostbyname, but returned address type can be controlled:
- * @param dns_addrtype: - LWIP_DNS_ADDRTYPE_IPV4_IPV6: try to resolve IPv4 first, try IPv6 if IPv4 fails only
- *                      - LWIP_DNS_ADDRTYPE_IPV6_IPV4: try to resolve IPv6 first, try IPv4 if IPv6 fails only
- *                      - LWIP_DNS_ADDRTYPE_IPV4: try to resolve IPv4 only
- *                      - LWIP_DNS_ADDRTYPE_IPV6: try to resolve IPv6 only
- */
-err_t
-dns_gethostbyname_addrtype(const char *hostname, ip_addr_t *addr, dns_found_callback found,
-                           void *callback_arg, u8_t dns_addrtype)
-{
-  size_t hostnamelen;
-  /* not initialized or no valid server yet, or invalid addr pointer
-   * or invalid hostname or invalid hostname length */
-  if ((addr == NULL) ||
-      (!hostname) || (!hostname[0])) {
-    return ERR_ARG;
-  }
-#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_RAND_SRC_PORT) == 0)
-  if (dns_pcbs[0] == NULL) {
-    return ERR_ARG;
-  }
-#endif
-  hostnamelen = strlen(hostname);
-  if (hostnamelen >= DNS_MAX_NAME_LENGTH) {
-    LWIP_DEBUGF(DNS_DEBUG, ("dns_gethostbyname: name too long to resolve"));
-    return ERR_ARG;
-  }
-
-
-#if LWIP_HAVE_LOOPIF
-  if (strcmp(hostname, "localhost") == 0) {
-    ip_addr_set_loopback(LWIP_DNS_ADDRTYPE_IS_IPV6(dns_addrtype), addr);
-    return ERR_OK;
-  }
-#endif /* LWIP_HAVE_LOOPIF */
-
-  /* host name already in octet notation? set ip addr and return ERR_OK */
-  if (ipaddr_aton(hostname, addr)) {
-#if LWIP_IPV4 && LWIP_IPV6
-    if ((IP_IS_V6(addr) && (dns_addrtype != LWIP_DNS_ADDRTYPE_IPV4)) ||
-        (!IP_IS_V6(addr) && (dns_addrtype != LWIP_DNS_ADDRTYPE_IPV6)))
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-    {
-      return ERR_OK;
-    }
-  }
-  /* already have this address cached? */
-  if (dns_lookup(hostname, addr LWIP_DNS_ADDRTYPE_ARG(dns_addrtype)) == ERR_OK) {
-    return ERR_OK;
-  }
-#if LWIP_IPV4 && LWIP_IPV6
-  if ((dns_addrtype == LWIP_DNS_ADDRTYPE_IPV4_IPV6) || (dns_addrtype == LWIP_DNS_ADDRTYPE_IPV6_IPV4)) {
-    /* fallback to 2nd IP type and try again to lookup */
-    u8_t fallback;
-    if (dns_addrtype == LWIP_DNS_ADDRTYPE_IPV4_IPV6) {
-      fallback = LWIP_DNS_ADDRTYPE_IPV6;
-    } else {
-      fallback = LWIP_DNS_ADDRTYPE_IPV4;
-    }
-    if (dns_lookup(hostname, addr LWIP_DNS_ADDRTYPE_ARG(fallback)) == ERR_OK) {
-      return ERR_OK;
-    }
-  }
-#else /* LWIP_IPV4 && LWIP_IPV6 */
-  LWIP_UNUSED_ARG(dns_addrtype);
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-
-  /* prevent calling found callback if no server is set, return error instead */
-  
-  if (dns_server_is_set() == false) {
-    return ERR_VAL;
-  }
-
-  /* queue query with specified callback */
-  return dns_enqueue(hostname, hostnamelen, found, callback_arg LWIP_DNS_ADDRTYPE_ARG(dns_addrtype));
-}
-
-#endif /* LWIP_DNS */
diff --git a/components/lwip/core/inet_chksum.c b/components/lwip/core/inet_chksum.c
deleted file mode 100644 (file)
index f104f6b..0000000
+++ /dev/null
@@ -1,612 +0,0 @@
-/**
- * @file
- * Incluse internet checksum functions.
- *
- */
-
-/*
- * 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>
- *
- */
-
-#include "lwip/opt.h"
-
-#include "lwip/inet_chksum.h"
-#include "lwip/def.h"
-#include "lwip/ip_addr.h"
-
-#include <stddef.h>
-#include <string.h>
-
-/* 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:
- *
- * #define LWIP_CHKSUM <your_checksum_routine>
- *
- * Or you can select from the implementations below by defining
- * LWIP_CHKSUM_ALGORITHM to 1, 2 or 3.
- */
-
-#ifndef LWIP_CHKSUM
-# define LWIP_CHKSUM lwip_standard_chksum
-# ifndef LWIP_CHKSUM_ALGORITHM
-#  define LWIP_CHKSUM_ALGORITHM 2
-# endif
-u16_t lwip_standard_chksum(const void *dataptr, int len);
-#endif
-/* If none set: */
-#ifndef LWIP_CHKSUM_ALGORITHM
-# define LWIP_CHKSUM_ALGORITHM 0
-#endif
-
-#if (LWIP_CHKSUM_ALGORITHM == 1) /* Version #1 */
-/**
- * lwip checksum
- *
- * @param dataptr points to start of data to be summed at any boundary
- * @param len length of data to be summed
- * @return host order (!) lwip checksum (non-inverted Internet sum)
- *
- * @note accumulator size limits summable length to 64k
- * @note host endianess is irrelevant (p3 RFC1071)
- */
-u16_t
-lwip_standard_chksum(const void *dataptr, int len)
-{
-  u32_t acc;
-  u16_t src;
-  const u8_t *octetptr;
-
-  acc = 0;
-  /* dataptr may be at odd or even addresses */
-  octetptr = (const u8_t*)dataptr;
-  while (len > 1) {
-    /* declare first octet as most significant
-       thus assume network order, ignoring host order */
-    src = (*octetptr) << 8;
-    octetptr++;
-    /* declare second octet as least significant */
-    src |= (*octetptr);
-    octetptr++;
-    acc += src;
-    len -= 2;
-  }
-  if (len > 0) {
-    /* accumulate remaining octet */
-    src = (*octetptr) << 8;
-    acc += src;
-  }
-  /* add deferred carry bits */
-  acc = (acc >> 16) + (acc & 0x0000ffffUL);
-  if ((acc & 0xffff0000UL) != 0) {
-    acc = (acc >> 16) + (acc & 0x0000ffffUL);
-  }
-  /* This maybe a little confusing: reorder sum using htons()
-     instead of ntohs() since it has a little less call overhead.
-     The caller must invert bits for Internet sum ! */
-  return htons((u16_t)acc);
-}
-#endif
-
-#if (LWIP_CHKSUM_ALGORITHM == 2) /* Alternative version #2 */
-/*
- * Curt McDowell
- * Broadcom Corp.
- * csm@broadcom.com
- *
- * IP checksum two bytes at a time with support for
- * unaligned buffer.
- * Works for len up to and including 0x20000.
- * by Curt McDowell, Broadcom Corp. 12/08/2005
- *
- * @param dataptr points to start of data to be summed at any boundary
- * @param len length of data to be summed
- * @return host order (!) lwip checksum (non-inverted Internet sum)
- */
-u16_t
-lwip_standard_chksum(const void *dataptr, int len)
-{
-  const u8_t *pb = (const u8_t *)dataptr;
-  const u16_t *ps;
-  u16_t t = 0;
-  u32_t sum = 0;
-  int odd = ((mem_ptr_t)pb & 1);
-
-  /* Get aligned to u16_t */
-  if (odd && len > 0) {
-    ((u8_t *)&t)[1] = *pb++;
-    len--;
-  }
-
-  /* Add the bulk of the data */
-  ps = (const u16_t *)(const void *)pb;
-  while (len > 1) {
-    sum += *ps++;
-    len -= 2;
-  }
-
-  /* Consume left-over byte, if any */
-  if (len > 0) {
-    ((u8_t *)&t)[0] = *(const u8_t *)ps;
-  }
-
-  /* Add end bytes */
-  sum += t;
-
-  /* Fold 32-bit sum to 16 bits
-     calling this twice is probably faster than if statements... */
-  sum = FOLD_U32T(sum);
-  sum = FOLD_U32T(sum);
-
-  /* Swap if alignment was odd */
-  if (odd) {
-    sum = SWAP_BYTES_IN_WORD(sum);
-  }
-
-  return (u16_t)sum;
-}
-#endif
-
-#if (LWIP_CHKSUM_ALGORITHM == 3) /* Alternative version #3 */
-/**
- * An optimized checksum routine. Basically, it uses loop-unrolling on
- * the checksum loop, treating the head and tail bytes specially, whereas
- * the inner loop acts on 8 bytes at a time.
- *
- * @arg start of buffer to be checksummed. May be an odd byte address.
- * @len number of bytes in the buffer to be checksummed.
- * @return host order (!) lwip checksum (non-inverted Internet sum)
- *
- * by Curt McDowell, Broadcom Corp. December 8th, 2005
- */
-u16_t
-lwip_standard_chksum(const void *dataptr, int len)
-{
-  const u8_t *pb = (const u8_t *)dataptr;
-  const u16_t *ps;
-  u16_t t = 0;
-  const u32_t *pl;
-  u32_t sum = 0, tmp;
-  /* starts at odd byte address? */
-  int odd = ((mem_ptr_t)pb & 1);
-
-  if (odd && len > 0) {
-    ((u8_t *)&t)[1] = *pb++;
-    len--;
-  }
-
-  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;
-
-  while (len > 7)  {
-    tmp = sum + *pl++;          /* ping */
-    if (tmp < sum) {
-      tmp++;                    /* add back carry */
-    }
-
-    sum = tmp + *pl++;          /* pong */
-    if (sum < tmp) {
-      sum++;                    /* add back carry */
-    }
-
-    len -= 8;
-  }
-
-  /* make room in upper bits */
-  sum = FOLD_U32T(sum);
-
-  ps = (const u16_t *)pl;
-
-  /* 16-bit aligned word remaining? */
-  while (len > 1) {
-    sum += *ps++;
-    len -= 2;
-  }
-
-  /* dangling tail byte remaining? */
-  if (len > 0) {                /* include odd byte */
-    ((u8_t *)&t)[0] = *(const u8_t *)ps;
-  }
-
-  sum += t;                     /* add end bytes */
-
-  /* Fold 32-bit sum to 16 bits
-     calling this twice is probably faster than if statements... */
-  sum = FOLD_U32T(sum);
-  sum = FOLD_U32T(sum);
-
-  if (odd) {
-    sum = SWAP_BYTES_IN_WORD(sum);
-  }
-
-  return (u16_t)sum;
-}
-#endif
-
-/** Parts of the pseudo checksum which are common to IPv4 and IPv6 */
-static u16_t ESP_IRAM_ATTR
-inet_cksum_pseudo_base(struct pbuf *p, u8_t proto, u16_t proto_len, u32_t acc)
-{
-  struct pbuf *q;
-  u8_t 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));
-    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;
-      acc = SWAP_BYTES_IN_WORD(acc);
-    }
-    /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): wrapped lwip_chksum()=%"X32_F" \n", acc));*/
-  }
-
-  if (swapped) {
-    acc = SWAP_BYTES_IN_WORD(acc);
-  }
-
-  acc += (u32_t)htons((u16_t)proto);
-  acc += (u32_t)htons(proto_len);
-
-  /* Fold 32-bit sum to 16 bits
-     calling this twice is probably faster than if statements... */
-  acc = FOLD_U32T(acc);
-  acc = FOLD_U32T(acc);
-  LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): pbuf chain lwip_chksum()=%"X32_F"\n", acc));
-  return (u16_t)~(acc & 0xffffUL);
-}
-
-#if LWIP_IPV4
-/* inet_chksum_pseudo:
- *
- * Calculates the IPv4 pseudo Internet checksum used by TCP and UDP for a pbuf chain.
- * IP addresses are expected to be in network byte order.
- *
- * @param p chain of pbufs over that a checksum should be calculated (ip data part)
- * @param src source ip address (used for checksum of pseudo header)
- * @param dst destination ip address (used for checksum of pseudo header)
- * @param proto ip protocol (used for checksum of pseudo header)
- * @param proto_len length of the ip data part (used for checksum of pseudo header)
- * @return checksum (as u16_t) to be saved directly in the protocol header
- */
-u16_t ESP_IRAM_ATTR
-inet_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_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);
-  addr = ip4_addr_get_u32(dest);
-  acc += (addr & 0xffffUL);
-  acc += ((addr >> 16) & 0xffffUL);
-  /* fold down to 16 bits */
-  acc = FOLD_U32T(acc);
-  acc = FOLD_U32T(acc);
-
-  return inet_cksum_pseudo_base(p, proto, proto_len, acc);
-}
-#endif /* LWIP_IPV4 */
-
-#if LWIP_IPV6
-/**
- * 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.
- *
- * @param p chain of pbufs over that a checksum should be calculated (ip data part)
- * @param src source ipv6 address (used for checksum of pseudo header)
- * @param dst destination ipv6 address (used for checksum of pseudo header)
- * @param proto ipv6 protocol/next header (used for checksum of pseudo header)
- * @param proto_len length of the ipv6 payload (used for checksum of pseudo header)
- * @return checksum (as u16_t) to be saved directly in the protocol header
- */
-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)
-{
-  u32_t acc = 0;
-  u32_t addr;
-  u8_t addr_part;
-
-  for (addr_part = 0; addr_part < 4; addr_part++) {
-    addr = src->addr[addr_part];
-    acc += (addr & 0xffffUL);
-    acc += ((addr >> 16) & 0xffffUL);
-    addr = dest->addr[addr_part];
-    acc += (addr & 0xffffUL);
-    acc += ((addr >> 16) & 0xffffUL);
-  }
-  /* fold down to 16 bits */
-  acc = FOLD_U32T(acc);
-  acc = FOLD_U32T(acc);
-
-  return inet_cksum_pseudo_base(p, proto, proto_len, acc);
-}
-#endif /* LWIP_IPV6 */
-
-/* ip_chksum_pseudo:
- *
- * Calculates the IPv4 or IPv6 pseudo Internet checksum used by TCP and UDP for a pbuf chain.
- * IP addresses are expected to be in network byte order.
- *
- * @param p chain of pbufs over that a checksum should be calculated (ip data part)
- * @param src source ip address (used for checksum of pseudo header)
- * @param dst destination ip address (used for checksum of pseudo header)
- * @param proto ip protocol (used for checksum of pseudo header)
- * @param proto_len length of the ip data part (used for checksum of pseudo header)
- * @return checksum (as u16_t) to be saved directly in the protocol header
- */
-u16_t ESP_IRAM_ATTR
-ip_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len,
-       const ip_addr_t *src, const ip_addr_t *dest)
-{
-#if LWIP_IPV6
-  if (IP_IS_V6(dest)) {
-    return ip6_chksum_pseudo(p, proto, proto_len, ip_2_ip6(src), ip_2_ip6(dest));
-  }
-#endif /* LWIP_IPV6 */
-#if LWIP_IPV4 && LWIP_IPV6
-  else
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-#if LWIP_IPV4
-  {
-    return inet_chksum_pseudo(p, proto, proto_len, ip_2_ip4(src), ip_2_ip4(dest));
-  }
-#endif /* LWIP_IPV4 */
-}
-
-/** 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)
-{
-  struct pbuf *q;
-  u8_t 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));
-    chklen = q->len;
-    if (chklen > chksum_len) {
-      chklen = chksum_len;
-    }
-    acc += LWIP_CHKSUM(q->payload, chklen);
-    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;
-      acc = SWAP_BYTES_IN_WORD(acc);
-    }
-    /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): wrapped lwip_chksum()=%"X32_F" \n", acc));*/
-  }
-
-  if (swapped) {
-    acc = SWAP_BYTES_IN_WORD(acc);
-  }
-
-  acc += (u32_t)htons((u16_t)proto);
-  acc += (u32_t)htons(proto_len);
-
-  /* Fold 32-bit sum to 16 bits
-     calling this twice is probably faster than if statements... */
-  acc = FOLD_U32T(acc);
-  acc = FOLD_U32T(acc);
-  LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): pbuf chain lwip_chksum()=%"X32_F"\n", acc));
-  return (u16_t)~(acc & 0xffffUL);
-}
-
-#if LWIP_IPV4
-/* inet_chksum_pseudo_partial:
- *
- * Calculates the IPv4 pseudo Internet checksum used by TCP and UDP for a pbuf chain.
- * IP addresses are expected to be in network byte order.
- *
- * @param p chain of pbufs over that a checksum should be calculated (ip data part)
- * @param src source ip address (used for checksum of pseudo header)
- * @param dst destination ip address (used for checksum of pseudo header)
- * @param proto ip protocol (used for checksum of pseudo header)
- * @param proto_len length of the ip data part (used for checksum of pseudo header)
- * @return checksum (as u16_t) to be saved directly in the protocol header
- */
-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)
-{
-  u32_t acc;
-  u32_t addr;
-
-  addr = ip4_addr_get_u32(src);
-  acc = (addr & 0xffffUL);
-  acc += ((addr >> 16) & 0xffffUL);
-  addr = ip4_addr_get_u32(dest);
-  acc += (addr & 0xffffUL);
-  acc += ((addr >> 16) & 0xffffUL);
-  /* fold down to 16 bits */
-  acc = FOLD_U32T(acc);
-  acc = FOLD_U32T(acc);
-
-  return inet_cksum_pseudo_partial_base(p, proto, proto_len, chksum_len, acc);
-}
-#endif /* LWIP_IPV4 */
-
-#if LWIP_IPV6
-/**
- * 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.
- *
- * @param p chain of pbufs over that a checksum should be calculated (ip data part)
- * @param src source ipv6 address (used for checksum of pseudo header)
- * @param dst destination ipv6 address (used for checksum of pseudo header)
- * @param proto ipv6 protocol/next header (used for checksum of pseudo header)
- * @param proto_len length of the ipv6 payload (used for checksum of pseudo header)
- * @param chksum_len number of payload bytes used to compute chksum
- * @return checksum (as u16_t) to be saved directly in the protocol header
- */
-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)
-{
-  u32_t acc = 0;
-  u32_t addr;
-  u8_t addr_part;
-
-  for (addr_part = 0; addr_part < 4; addr_part++) {
-    addr = src->addr[addr_part];
-    acc += (addr & 0xffffUL);
-    acc += ((addr >> 16) & 0xffffUL);
-    addr = dest->addr[addr_part];
-    acc += (addr & 0xffffUL);
-    acc += ((addr >> 16) & 0xffffUL);
-  }
-  /* fold down to 16 bits */
-  acc = FOLD_U32T(acc);
-  acc = FOLD_U32T(acc);
-
-  return inet_cksum_pseudo_partial_base(p, proto, proto_len, chksum_len, acc);
-}
-#endif /* LWIP_IPV6 */
-
-/* ip_chksum_pseudo_partial:
- *
- * Calculates the IPv4 or IPv6 pseudo Internet checksum used by TCP and UDP for a pbuf chain.
- *
- * @param p chain of pbufs over that a checksum should be calculated (ip data part)
- * @param src source ip address (used for checksum of pseudo header)
- * @param dst destination ip address (used for checksum of pseudo header)
- * @param proto ip protocol (used for checksum of pseudo header)
- * @param proto_len length of the ip data part (used for checksum of pseudo header)
- * @return checksum (as u16_t) to be saved directly in the protocol header
- */
-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)
-{
-#if LWIP_IPV6
-  if (IP_IS_V6(dest)) {
-    return ip6_chksum_pseudo_partial(p, proto, proto_len, chksum_len, ip_2_ip6(src), ip_2_ip6(dest));
-  }
-#endif /* LWIP_IPV6 */
-#if LWIP_IPV4 && LWIP_IPV6
-  else
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-#if LWIP_IPV4
-  {
-    return inet_chksum_pseudo_partial(p, proto, proto_len, chksum_len, ip_2_ip4(src), ip_2_ip4(dest));
-  }
-#endif /* LWIP_IPV4 */
-}
-
-/* inet_chksum:
- *
- * Calculates the Internet checksum over a portion of memory. Used primarily for IP
- * and ICMP.
- *
- * @param dataptr start of the buffer to calculate the checksum (no alignment needed)
- * @param len length of the buffer to calculate the checksum
- * @return checksum (as u16_t) to be saved directly in the protocol header
- */
-
-u16_t
-inet_chksum(const void *dataptr, u16_t len)
-{
-  return (u16_t)~(unsigned int)LWIP_CHKSUM(dataptr, len);
-}
-
-/**
- * Calculate a checksum over a chain of pbufs (without pseudo-header, much like
- * inet_chksum only pbufs are used).
- *
- * @param p pbuf chain over that the checksum should be calculated
- * @return checksum (as u16_t) to be saved directly in the protocol header
- */
-u16_t
-inet_chksum_pbuf(struct pbuf *p)
-{
-  u32_t acc;
-  struct pbuf *q;
-  u8_t swapped;
-
-  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;
-      acc = SWAP_BYTES_IN_WORD(acc);
-    }
-  }
-
-  if (swapped) {
-    acc = SWAP_BYTES_IN_WORD(acc);
-  }
-  return (u16_t)~(acc & 0xffffUL);
-}
-
-/* These are some implementations for LWIP_CHKSUM_COPY, which copies data
- * like MEMCPY but generates a checksum at the same time. Since this is a
- * performance-sensitive function, you might want to create your own version
- * in assembly targeted at your hardware by defining it in lwipopts.h:
- *   #define LWIP_CHKSUM_COPY(dst, src, len) your_chksum_copy(dst, src, len)
- */
-
-#if (LWIP_CHKSUM_COPY_ALGORITHM == 1) /* Version #1 */
-/** Safe but slow: first call MEMCPY, then call LWIP_CHKSUM.
- * For architectures with big caches, data might still be in cache when
- * generating the checksum after copying.
- */
-u16_t
-lwip_chksum_copy(void *dst, const void *src, u16_t len)
-{
-  MEMCPY(dst, src, len);
-  return LWIP_CHKSUM(dst, len);
-}
-#endif /* (LWIP_CHKSUM_COPY_ALGORITHM == 1) */
diff --git a/components/lwip/core/init.c b/components/lwip/core/init.c
deleted file mode 100644 (file)
index 8b2e926..0000000
+++ /dev/null
@@ -1,376 +0,0 @@
-/**
- * @file
- * Modules initialization
- *
- */
-
-/*
- * 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>
- *
- */
-
-#include "lwip/opt.h"
-
-#include "lwip/init.h"
-#include "lwip/stats.h"
-#include "lwip/sys.h"
-#include "lwip/mem.h"
-#include "lwip/memp.h"
-#include "lwip/pbuf.h"
-#include "lwip/netif.h"
-#include "lwip/sockets.h"
-#include "lwip/ip.h"
-#include "lwip/raw.h"
-#include "lwip/udp.h"
-#include "lwip/priv/tcp_priv.h"
-#include "lwip/autoip.h"
-#include "lwip/igmp.h"
-#include "lwip/dns.h"
-#include "lwip/timers.h"
-#include "netif/etharp.h"
-#include "lwip/ip6.h"
-#include "lwip/nd6.h"
-#include "lwip/mld6.h"
-#include "lwip/api.h"
-#include "netif/ppp/ppp_impl.h"
-
-#if ! ESP_PERF
-/* Compile-time sanity checks for configuration errors.
- * 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"
-#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"
-#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"
-#endif
-#if (!LWIP_UDP && LWIP_DHCP)
-  #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"
-#endif
-#if (!LWIP_UDP && LWIP_DNS)
-  #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"
-#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"
-#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"
-#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"
-#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"
-#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"
-#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"
-#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"
-#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"
-#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!"
-#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"
-//#endif
-#if (LWIP_TCP && LWIP_WND_SCALE && (TCP_RCV_SCALE > 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!"
-//#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)!"
-//#endif
-#else /* LWIP_WND_SCALE */
-
-#if ! ESP_PER_SOC_TCP_WND
-#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)"
-#endif
-#endif
-
-#endif /* LWIP_WND_SCALE */
-
-#if ! ESP_PER_SOC_TCP_WND
-#if (LWIP_TCP && (TCP_SND_QUEUELEN(0) > 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"
-#endif
-#if (LWIP_TCP && (TCP_SND_QUEUELEN(0) < 2))
-  #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"
-#endif
-#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"
-#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"
-#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"
-#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"
-#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"
-#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"
-#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"
-#endif
-#if (!LWIP_ARP && LWIP_AUTOIP)
-  #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"
-#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"
-#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"
-#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"
-#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"
-#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"
-#endif
-#if PPP_SUPPORT && !PPP_IPV4_SUPPORT && !PPP_IPV6_SUPPORT
-  #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"
-#endif
-#if PPP_SUPPORT && PPP_IPV6_SUPPORT && !LWIP_IPV6
-  #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"
-#endif
-#if (LWIP_IGMP || LWIP_IPV6) && !defined(LWIP_RAND)
-  #error "When using IGMP or IPv6, LWIP_RAND() needs to be defined to a random-function returning an u32_t random value"
-#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"
-#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"
-#endif
-#if IP_FRAG && IP_FRAG_USES_STATIC_BUF && LWIP_NETIF_TX_SINGLE_PBUF
-  #error "LWIP_NETIF_TX_SINGLE_PBUF does not work with IP_FRAG_USES_STATIC_BUF==1 as that creates pbuf queues"
-#endif
-#if LWIP_NETCONN && LWIP_TCP
-#if 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"
-#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."
-#endif
-#ifdef TCP_REXMIT_DEBUG
-  #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."
-#endif
-#ifdef ETHARP_QUEUE_FIRST
-  #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."
-#endif
-
-#ifndef LWIP_DISABLE_TCP_SANITY_CHECKS
-#define LWIP_DISABLE_TCP_SANITY_CHECKS  0
-#endif
-#ifndef LWIP_DISABLE_MEMP_SANITY_CHECKS
-#define LWIP_DISABLE_MEMP_SANITY_CHECKS 0
-#endif
-
-/* MEMP sanity checks */
-#if !LWIP_DISABLE_MEMP_SANITY_CHECKS
-#if LWIP_NETCONN
-#if MEMP_MEM_MALLOC
-#if !MEMP_NUM_NETCONN && LWIP_SOCKET
-#error "lwip_sanity_check: WARNING: MEMP_NUM_NETCONN cannot be 0 when using sockets!"
-#endif
-#else /* MEMP_MEM_MALLOC */
-#if MEMP_NUM_NETCONN > (MEMP_NUM_TCP_PCB+MEMP_NUM_TCP_PCB_LISTEN+MEMP_NUM_UDP_PCB+MEMP_NUM_RAW_PCB)
-#error "lwip_sanity_check: WARNING: MEMP_NUM_NETCONN should be less than the sum of MEMP_NUM_{TCP,RAW,UDP}_PCB+MEMP_NUM_TCP_PCB_LISTEN. If you know what you are doing, define LWIP_DISABLE_MEMP_SANITY_CHECKS to 1 to disable this error."
-#endif
-#endif /* MEMP_MEM_MALLOC */
-#endif /* LWIP_NETCONN */
-#endif /* !LWIP_DISABLE_MEMP_SANITY_CHECKS */
-
-/* TCP sanity checks */
-#if !LWIP_DISABLE_TCP_SANITY_CHECKS
-#if ! ESP_PER_SOC_TCP_WND
-#if LWIP_TCP
-#if !MEMP_MEM_MALLOC && (MEMP_NUM_TCP_SEG < TCP_SND_QUEUELEN(0))
-  #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(0) < (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."
-#endif
-#if TCP_SND_QUEUELEN(0) < (2 * (TCP_SND_BUF(0) / TCP_MSS))
-  #error "lwip_sanity_check: WARNING: TCP_SND_QUEUELEN must be at least as much as (2 * TCP_SND_BUF(0)/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(0)
-  #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!"
-#endif
-#if TCP_SNDQUEUELOWAT >= TCP_SND_QUEUELEN(0)
-  #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
-#endif
-
-#if !MEMP_MEM_MALLOC && (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."
-#endif
-
-#if ! ESP_LWIP
-#if !MEMP_MEM_MALLOC && (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."
-#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."
-#endif
-#endif
-
-#endif /* LWIP_TCP */
-#endif /* !LWIP_DISABLE_TCP_SANITY_CHECKS */
-#endif
-
-/**
- * Initialize all modules.
- */
-void
-lwip_init(void)
-{
-  /* Modules initialization */
-  stats_init();
-#if !NO_SYS
-  sys_init();
-#endif /* !NO_SYS */
-  mem_init();
-  memp_init();
-  pbuf_init();
-  netif_init();
-#if LWIP_IPV4
-  ip_init();
-#if LWIP_ARP
-  etharp_init();
-#endif /* LWIP_ARP */
-#endif /* LWIP_IPV4 */
-#if LWIP_RAW
-  raw_init();
-#endif /* LWIP_RAW */
-#if LWIP_UDP
-  udp_init();
-#endif /* LWIP_UDP */
-#if LWIP_TCP
-  tcp_init();
-#endif /* LWIP_TCP */
-#if LWIP_AUTOIP
-  autoip_init();
-#endif /* LWIP_AUTOIP */
-#if LWIP_IGMP
-  igmp_init();
-#endif /* LWIP_IGMP */
-#if LWIP_DNS
-  dns_init();
-#endif /* LWIP_DNS */
-#if PPP_SUPPORT
-  ppp_init();
-#endif
-
-#if LWIP_TIMERS
-  sys_timeouts_init();
-#endif /* LWIP_TIMERS */
-}
diff --git a/components/lwip/core/ip.c b/components/lwip/core/ip.c
deleted file mode 100644 (file)
index aa42fba..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-/**
- * @file ip.c
- * Common IPv4 and IPv6 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>
- *
- */
-
-#include "lwip/opt.h"
-
-#if LWIP_IPV4 || LWIP_IPV6
-
-#include "lwip/ip_addr.h"
-#include "lwip/ip.h"
-
-/** Global data for both IPv4 and IPv6 */
-struct ip_globals ip_data;
-
-#if LWIP_IPV4 && LWIP_IPV6
-
-const ip_addr_t ip_addr_any_type = IPADDR_ANY_TYPE_INIT;
-
-/** Convert IP address string (both versions) to numeric.
- * The version is auto-detected from the string.
- *
- * @param cp IP address string to convert
- * @param addr conversion result is stored here
- * @return 1 on success, 0 on error
- */
-int
-ipaddr_aton(const char *cp, ip_addr_t *addr)
-{
-  if (cp != NULL) {
-    const char* c;
-    for (c = cp; *c != 0; c++) {
-      if (*c == ':') {
-        /* contains a colon: IPv6 address */
-        if (addr) {
-          IP_SET_TYPE_VAL(*addr, IPADDR_TYPE_V6);
-        }
-        return ip6addr_aton(cp, ip_2_ip6(addr));
-      } else if (*c == '.') {
-        /* contains a dot: IPv4 address */
-        break;
-      }
-    }
-    /* call ip4addr_aton as fallback or if IPv4 was found */
-    if (addr) {
-      IP_SET_TYPE_VAL(*addr, IPADDR_TYPE_V4);
-    }
-    return ip4addr_aton(cp, ip_2_ip4(addr));
-  }
-  return 0;
-}
-
-/* If both IP versions are enabled, this function can dispatch packets to the correct one. */
-err_t
-ip_input(struct pbuf *p, struct netif *inp)
-{
-  if (p != NULL) {
-    if (IP_HDR_GET_VERSION(p->payload) == 6) {
-      return ip6_input(p, inp);
-    }
-    return ip4_input(p, inp);
-  }
-  return ERR_VAL;
-}
-
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-
-#endif /* LWIP_IPV4 || LWIP_IPV6 */
diff --git a/components/lwip/core/ipv4/autoip.c b/components/lwip/core/ipv4/autoip.c
deleted file mode 100644 (file)
index f27d28a..0000000
+++ /dev/null
@@ -1,551 +0,0 @@
-/**
- * @file
- * AutoIP Automatic LinkLocal IP Configuration
- *
- */
-
-/*
- *
- * Copyright (c) 2007 Dominik Spies <kontakt@dspies.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.
- *
- * Author: Dominik Spies <kontakt@dspies.de>
- *
- * This is a AutoIP implementation for the lwIP TCP/IP stack. It aims to conform
- * with RFC 3927.
- *
- *
- * Please coordinate changes and requests with Dominik Spies
- * <kontakt@dspies.de>
- */
-
-/*******************************************************************************
- * USAGE:
- *
- * define LWIP_AUTOIP 1  in your lwipopts.h
- *
- * If you don't use tcpip.c (so, don't call, you don't call tcpip_init):
- * - First, call autoip_init().
- * - call autoip_tmr() all AUTOIP_TMR_INTERVAL msces,
- *   that should be defined in autoip.h.
- *   I recommend a value of 100. The value must divide 1000 with a remainder almost 0.
- *   Possible values are 1000, 500, 333, 250, 200, 166, 142, 125, 111, 100 ....
- *
- * Without DHCP:
- * - Call autoip_start() after netif_add().
- *
- * With DHCP:
- * - define LWIP_DHCP_AUTOIP_COOP 1 in your lwipopts.h.
- * - Configure your DHCP Client.
- *
- */
-
-#include "lwip/opt.h"
-
-#if LWIP_IPV4 && LWIP_AUTOIP /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/mem.h"
-/* #include "lwip/udp.h" */
-#include "lwip/ip_addr.h"
-#include "lwip/netif.h"
-#include "lwip/autoip.h"
-#include "netif/etharp.h"
-#include "lwip/dhcp.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-/* 169.254.0.0 */
-#define AUTOIP_NET         0xA9FE0000
-/* 169.254.1.0 */
-#define AUTOIP_RANGE_START (AUTOIP_NET | 0x0100)
-/* 169.254.254.255 */
-#define AUTOIP_RANGE_END   (AUTOIP_NET | 0xFEFF)
-
-
-/** Pseudo random macro based on netif informations.
- * You could use "rand()" from the C Library if you define LWIP_AUTOIP_RAND in lwipopts.h */
-#ifndef LWIP_AUTOIP_RAND
-#define LWIP_AUTOIP_RAND(netif) ( (((u32_t)((netif->hwaddr[5]) & 0xff) << 24) | \
-                                   ((u32_t)((netif->hwaddr[3]) & 0xff) << 16) | \
-                                   ((u32_t)((netif->hwaddr[2]) & 0xff) << 8) | \
-                                   ((u32_t)((netif->hwaddr[4]) & 0xff))) + \
-                                   (netif->autoip?netif->autoip->tried_llipaddr:0))
-#endif /* LWIP_AUTOIP_RAND */
-
-/**
- * Macro that generates the initial IP address to be tried by AUTOIP.
- * If you want to override this, define it to something else in lwipopts.h.
- */
-#ifndef LWIP_AUTOIP_CREATE_SEED_ADDR
-#define LWIP_AUTOIP_CREATE_SEED_ADDR(netif) \
-  htonl(AUTOIP_RANGE_START + ((u32_t)(((u8_t)(netif->hwaddr[4])) | \
-                 ((u32_t)((u8_t)(netif->hwaddr[5]))) << 8)))
-#endif /* LWIP_AUTOIP_CREATE_SEED_ADDR */
-
-/* static functions */
-static void autoip_handle_arp_conflict(struct netif *netif);
-
-/* creates a pseudo random LL IP-Address for a network interface */
-static void autoip_create_addr(struct netif *netif, ip4_addr_t *ipaddr);
-
-/* sends an ARP probe */
-static err_t autoip_arp_probe(struct netif *netif);
-
-/* sends an ARP announce */
-static err_t autoip_arp_announce(struct netif *netif);
-
-/* configure interface for use with current LL IP-Address */
-static err_t autoip_bind(struct netif *netif);
-
-/* start sending probes for llipaddr */
-static void autoip_start_probing(struct netif *netif);
-
-
-/** Set a statically allocated struct autoip to work with.
- * Using this prevents autoip_start to allocate it using mem_malloc.
- *
- * @param netif the netif for which to set the struct autoip
- * @param dhcp (uninitialised) dhcp struct allocated by the application
- */
-void
-autoip_set_struct(struct netif *netif, struct autoip *autoip)
-{
-  LWIP_ASSERT("netif != NULL", netif != NULL);
-  LWIP_ASSERT("autoip != NULL", autoip != NULL);
-  LWIP_ASSERT("netif already has a struct autoip set", netif->autoip == NULL);
-
-  /* clear data structure */
-  memset(autoip, 0, sizeof(struct autoip));
-  /* autoip->state = AUTOIP_STATE_OFF; */
-  netif->autoip = autoip;
-}
-
-/** Restart AutoIP client and check the next address (conflict detected)
- *
- * @param netif The netif under AutoIP control
- */
-static void
-autoip_restart(struct netif *netif)
-{
-  netif->autoip->tried_llipaddr++;
-  autoip_start(netif);
-}
-
-/**
- * Handle a IP address conflict after an ARP conflict detection
- */
-static void
-autoip_handle_arp_conflict(struct netif *netif)
-{
-  /* Somehow detect if we are defending or retreating */
-  unsigned char defend = 1; /* tbd */
-
-  if (defend) {
-    if (netif->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"));
-
-      /* TODO: close all TCP sessions */
-      autoip_restart(netif);
-    } else {
-      LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
-        ("autoip_handle_arp_conflict(): we are defend, send ARP Announce\n"));
-      autoip_arp_announce(netif);
-      netif->autoip->lastconflict = DEFEND_INTERVAL * AUTOIP_TICKS_PER_SECOND;
-    }
-  } else {
-    LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
-      ("autoip_handle_arp_conflict(): we do not defend, retreating\n"));
-    /* TODO: close all TCP sessions */
-    autoip_restart(netif);
-  }
-}
-
-/**
- * Create an IP-Address out of range 169.254.1.0 to 169.254.254.255
- *
- * @param netif network interface on which create the IP-Address
- * @param ipaddr ip address to initialize
- */
-static void
-autoip_create_addr(struct netif *netif, ip4_addr_t *ipaddr)
-{
-  /* 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
-   * We have 254 * 256 possibilities */
-
-  u32_t addr = ntohl(LWIP_AUTOIP_CREATE_SEED_ADDR(netif));
-  addr += netif->autoip->tried_llipaddr;
-  addr = AUTOIP_NET | (addr & 0xffff);
-  /* Now, 169.254.0.0 <= addr <= 169.254.255.255 */
-
-  if (addr < AUTOIP_RANGE_START) {
-    addr += AUTOIP_RANGE_END - AUTOIP_RANGE_START + 1;
-  }
-  if (addr > AUTOIP_RANGE_END) {
-    addr -= AUTOIP_RANGE_END - AUTOIP_RANGE_START + 1;
-  }
-  LWIP_ASSERT("AUTOIP address not in range", (addr >= AUTOIP_RANGE_START) &&
-    (addr <= AUTOIP_RANGE_END));
-  ip4_addr_set_u32(ipaddr, 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)(netif->autoip->tried_llipaddr), ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr),
-    ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr)));
-}
-
-/**
- * Sends an ARP probe from a network interface
- *
- * @param netif network interface used to send the probe
- */
-static err_t
-autoip_arp_probe(struct netif *netif)
-{
-  return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, &ethbroadcast,
-    (struct eth_addr *)netif->hwaddr, IP4_ADDR_ANY, &ethzero,
-    &netif->autoip->llipaddr, ARP_REQUEST);
-}
-
-/**
- * Sends an ARP announce from a network interface
- *
- * @param netif network interface used to send the announce
- */
-static err_t
-autoip_arp_announce(struct netif *netif)
-{
-  return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, &ethbroadcast,
-    (struct eth_addr *)netif->hwaddr, &netif->autoip->llipaddr, &ethzero,
-    &netif->autoip->llipaddr, ARP_REQUEST);
-}
-
-/**
- * Configure interface for use with current LL IP-Address
- *
- * @param netif network interface to configure with current LL IP-Address
- */
-static err_t
-autoip_bind(struct netif *netif)
-{
-  struct autoip *autoip = netif->autoip;
-  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)));
-
-  IP4_ADDR(&sn_mask, 255, 255, 0, 0);
-  IP4_ADDR(&gw_addr, 0, 0, 0, 0);
-
-  netif_set_addr(netif, &autoip->llipaddr, &sn_mask, &gw_addr);
-  /* interface is used by routing now that an address is set */
-
-#if ESP_LWIP
-  struct dhcp *dhcp = netif->dhcp;
-  if (dhcp->cb != NULL) {
-    dhcp->cb(netif);
-  }
-#endif
-  return ERR_OK;
-}
-
-/**
- * Start AutoIP client
- *
- * @param netif network interface on which start the AutoIP client
- */
-err_t
-autoip_start(struct netif *netif)
-{
-  struct autoip *autoip = netif->autoip;
-  err_t result = ERR_OK;
-
-  LWIP_ERROR("netif is not up, old style port?", netif_is_up(netif), return ERR_ARG;);
-
-  /* Set IP-Address, Netmask and Gateway to 0 to make sure that
-   * ARP Packets are formed correctly
-   */
-  netif_set_addr(netif, IP4_ADDR_ANY, IP4_ADDR_ANY, IP4_ADDR_ANY);
-
-  LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
-    ("autoip_start(netif=%p) %c%c%"U16_F"\n", (void*)netif, netif->name[0],
-    netif->name[1], (u16_t)netif->num));
-  if (autoip == NULL) {
-    /* no AutoIP client attached yet? */
-    LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE,
-      ("autoip_start(): starting new AUTOIP client\n"));
-    autoip = (struct autoip *)mem_malloc(sizeof(struct autoip));
-    if (autoip == NULL) {
-      LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE,
-        ("autoip_start(): could not allocate autoip\n"));
-      return ERR_MEM;
-    }
-    memset(autoip, 0, sizeof(struct autoip));
-    /* store this AutoIP client in the netif */
-    netif->autoip = autoip;
-    LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, ("autoip_start(): allocated autoip"));
-  } else {
-    autoip->state = AUTOIP_STATE_OFF;
-    autoip->ttw = 0;
-    autoip->sent_num = 0;
-    ip4_addr_set_zero(&autoip->llipaddr);
-    autoip->lastconflict = 0;
-  }
-
-  autoip_create_addr(netif, &(autoip->llipaddr));
-  autoip_start_probing(netif);
-
-  return result;
-}
-
-static void
-autoip_start_probing(struct netif *netif)
-{
-  struct autoip *autoip = netif->autoip;
-
-  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(&netif->autoip->llipaddr), ip4_addr2_16(&netif->autoip->llipaddr),
-      ip4_addr3_16(&netif->autoip->llipaddr), ip4_addr4_16(&netif->autoip->llipaddr)));
-
-  /* time to wait to first probe, this is randomly
-   * chosen out of 0 to PROBE_WAIT seconds.
-   * compliant to RFC 3927 Section 2.2.1
-   */
-  autoip->ttw = (u16_t)(LWIP_AUTOIP_RAND(netif) % (PROBE_WAIT * AUTOIP_TICKS_PER_SECOND));
-
-  /*
-   * if we tried more then MAX_CONFLICTS we must limit our rate for
-   * acquiring and probing address
-   * compliant to RFC 3927 Section 2.2.1
-   */
-  if (autoip->tried_llipaddr > MAX_CONFLICTS) {
-    autoip->ttw = RATE_LIMIT_INTERVAL * AUTOIP_TICKS_PER_SECOND;
-  }
-}
-
-/**
- * Handle a possible change in the network configuration.
- *
- * If there is an AutoIP address configured, take the interface down
- * and begin probing with the same address.
- */
-void
-autoip_network_changed(struct netif *netif)
-{
-  if (netif->autoip && netif->autoip->state != AUTOIP_STATE_OFF) {
-    autoip_start_probing(netif);
-  }
-}
-
-/**
- * Stop AutoIP client
- *
- * @param netif network interface on which stop the AutoIP client
- */
-err_t
-autoip_stop(struct netif *netif)
-{
-  if (netif->autoip) {
-    netif->autoip->state = AUTOIP_STATE_OFF;
-    if (ip4_addr_islinklocal(netif_ip4_addr(netif))) {
-      netif_set_addr(netif, IP4_ADDR_ANY, IP4_ADDR_ANY, IP4_ADDR_ANY);
-    }
-  }
-  return ERR_OK;
-}
-
-/**
- * Has to be called in loop every AUTOIP_TMR_INTERVAL milliseconds
- */
-void
-autoip_tmr(void)
-{
-  struct netif *netif = netif_list;
-  /* loop through netif's */
-  while (netif != NULL) {
-    /* only act on AutoIP configured interfaces */
-    if (netif->autoip != NULL) {
-      if (netif->autoip->lastconflict > 0) {
-        netif->autoip->lastconflict--;
-      }
-
-      LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE,
-        ("autoip_tmr() AutoIP-State: %"U16_F", ttw=%"U16_F"\n",
-        (u16_t)(netif->autoip->state), netif->autoip->ttw));
-
-      switch(netif->autoip->state) {
-        case AUTOIP_STATE_PROBING:
-          if (netif->autoip->ttw > 0) {
-            netif->autoip->ttw--;
-          } else {
-            if (netif->autoip->sent_num >= PROBE_NUM) {
-              netif->autoip->state = AUTOIP_STATE_ANNOUNCING;
-              netif->autoip->sent_num = 0;
-              netif->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(&netif->autoip->llipaddr), ip4_addr2_16(&netif->autoip->llipaddr),
-                  ip4_addr3_16(&netif->autoip->llipaddr), ip4_addr4_16(&netif->autoip->llipaddr)));
-            } else {
-              autoip_arp_probe(netif);
-              LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE,
-                ("autoip_tmr() PROBING Sent Probe\n"));
-              netif->autoip->sent_num++;
-              /* calculate time to wait to next probe */
-              netif->autoip->ttw = (u16_t)((LWIP_AUTOIP_RAND(netif) %
-                ((PROBE_MAX - PROBE_MIN) * AUTOIP_TICKS_PER_SECOND) ) +
-                PROBE_MIN * AUTOIP_TICKS_PER_SECOND);
-            }
-          }
-          break;
-
-        case AUTOIP_STATE_ANNOUNCING:
-          if (netif->autoip->ttw > 0) {
-            netif->autoip->ttw--;
-          } else {
-            if (netif->autoip->sent_num == 0) {
-             /* We are here the first time, so we waited ANNOUNCE_WAIT seconds
-              * Now we can bind to an IP address and use it.
-              *
-              * autoip_bind calls netif_set_addr. This triggers a gratuitous ARP
-              * which counts as an announcement.
-              */
-              autoip_bind(netif);
-            } else {
-              autoip_arp_announce(netif);
-              LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE,
-                ("autoip_tmr() ANNOUNCING Sent Announce\n"));
-            }
-            netif->autoip->ttw = ANNOUNCE_INTERVAL * AUTOIP_TICKS_PER_SECOND;
-            netif->autoip->sent_num++;
-
-            if (netif->autoip->sent_num >= ANNOUNCE_NUM) {
-                netif->autoip->state = AUTOIP_STATE_BOUND;
-                netif->autoip->sent_num = 0;
-                netif->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(&netif->autoip->llipaddr), ip4_addr2_16(&netif->autoip->llipaddr),
-                     ip4_addr3_16(&netif->autoip->llipaddr), ip4_addr4_16(&netif->autoip->llipaddr)));
-            }
-          }
-          break;
-
-        default:
-          /* nothing to do in other states */
-          break;
-      }
-    }
-    /* proceed to next network interface */
-    netif = netif->next;
-  }
-}
-
-/**
- * Handles every incoming ARP Packet, called by etharp_arp_input.
- *
- * @param netif network interface to use for autoip processing
- * @param hdr Incoming ARP packet
- */
-void
-autoip_arp_reply(struct netif *netif, struct etharp_hdr *hdr)
-{
-  LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, ("autoip_arp_reply()\n"));
-  if ((netif->autoip != NULL) && (netif->autoip->state != AUTOIP_STATE_OFF)) {
-   /* when ip.src == llipaddr && hw.src != netif->hwaddr
-    *
-    * when probing  ip.dst == llipaddr && hw.src != netif->hwaddr
-    * we have a conflict and must solve it
-    */
-    ip4_addr_t sipaddr, dipaddr;
-    struct eth_addr netifaddr;
-    ETHADDR16_COPY(netifaddr.addr, netif->hwaddr);
-
-    /* Copy struct ip4_addr2 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);
-
-    if ((netif->autoip->state == AUTOIP_STATE_PROBING) ||
-        ((netif->autoip->state == AUTOIP_STATE_ANNOUNCING) &&
-         (netif->autoip->sent_num == 0))) {
-     /* 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, &netif->autoip->llipaddr)) ||
-          (ip4_addr_cmp(&dipaddr, &netif->autoip->llipaddr) &&
-           !eth_addr_cmp(&netifaddr, &hdr->shwaddr))) {
-        LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | LWIP_DBG_LEVEL_WARNING,
-          ("autoip_arp_reply(): Probe Conflict detected\n"));
-        autoip_restart(netif);
-      }
-    } else {
-     /* RFC 3927 Section 2.5:
-      * in any state we have a conflict if
-      * ip.src == llipaddr && hw.src != own hwaddr
-      */
-      if (ip4_addr_cmp(&sipaddr, &netif->autoip->llipaddr) &&
-          !eth_addr_cmp(&netifaddr, &hdr->shwaddr)) {
-        LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | LWIP_DBG_LEVEL_WARNING,
-          ("autoip_arp_reply(): Conflicting ARP-Packet detected\n"));
-        autoip_handle_arp_conflict(netif);
-      }
-    }
-  }
-}
-
-/** check if AutoIP supplied netif->ip_addr
- *
- * @param netif the netif to check
- * @return 1 if AutoIP supplied netif->ip_addr (state BOUND),
- *         0 otherwise
- */
-u8_t
-autoip_supplied_address(struct netif *netif)
-{
-  if ((netif != NULL) && (netif->autoip != NULL)) {
-    if (netif->autoip->state == AUTOIP_STATE_BOUND) {
-      return 1;
-    }
-  }
-  return 0;
-}
-
-#endif /* LWIP_IPV4 && LWIP_AUTOIP */
diff --git a/components/lwip/core/ipv4/dhcp.c b/components/lwip/core/ipv4/dhcp.c
deleted file mode 100644 (file)
index a31c699..0000000
+++ /dev/null
@@ -1,2036 +0,0 @@
-/**
- * @file
- * Dynamic Host Configuration Protocol client
- *
- */
-
-/*
- * Copyright (c) 2001-2004 Leon Woestenberg <leon.woestenberg@gmx.net>
- * Copyright (c) 2001-2004 Axon Digital Design B.V., The Netherlands.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- * The Swedish Institute of Computer Science and Adam Dunkels
- * are specifically granted permission to redistribute this
- * source code.
- *
- * Author: Leon Woestenberg <leon.woestenberg@gmx.net>
- *
- * This is a DHCP client for the lwIP TCP/IP stack. It aims to conform
- * with RFC 2131 and RFC 2132.
- *
- * TODO:
- * - Support for interfaces other than Ethernet (SLIP, PPP, ...)
- *
- * Please coordinate changes and requests with Leon Woestenberg
- * <leon.woestenberg@gmx.net>
- *
- * Integration with your code:
- *
- * In lwip/dhcp.h
- * #define DHCP_COARSE_TIMER_SECS (recommended 60 which is a minute)
- * #define DHCP_FINE_TIMER_MSECS (recommended 500 which equals TCP coarse timer)
- *
- * Then have your application call dhcp_coarse_tmr() and
- * dhcp_fine_tmr() on the defined intervals.
- *
- * dhcp_start(struct netif *netif);
- * starts a DHCP client instance which configures the interface by
- * obtaining an IP address lease and maintaining it.
- *
- * Use dhcp_release(netif) to end the lease and use dhcp_stop(netif)
- * to remove the DHCP client.
- *
- */
-
-#include "lwip/opt.h"
-
-#if LWIP_IPV4 && LWIP_DHCP /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/stats.h"
-#include "lwip/mem.h"
-#include "lwip/udp.h"
-#include "lwip/ip_addr.h"
-#include "lwip/netif.h"
-#include "lwip/def.h"
-#include "lwip/dhcp.h"
-#include "lwip/autoip.h"
-#include "lwip/dns.h"
-#include "netif/etharp.h"
-
-#include <string.h>
-
-/** DHCP_CREATE_RAND_XID: if this is set to 1, the xid is created using
- * LWIP_RAND() (this overrides DHCP_GLOBAL_XID)
- */
-#ifndef DHCP_CREATE_RAND_XID
-#define DHCP_CREATE_RAND_XID        1
-#endif
-
-/** 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()
- */
-#ifdef DHCP_GLOBAL_XID_HEADER
-#include DHCP_GLOBAL_XID_HEADER /* include optional starting XID generation prototypes */
-#endif
-
-/** DHCP_OPTION_MAX_MSG_SIZE is set to the MTU
- * MTU is checked to be big enough in dhcp_start */
-#define DHCP_MAX_MSG_LEN(netif)        (netif->mtu)
-#define DHCP_MAX_MSG_LEN_MIN_REQUIRED  576
-/** Minimum length for reply before packet is parsed */
-#define DHCP_MIN_REPLY_LEN             44
-
-#define REBOOT_TRIES                2
-
-/** 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). */
-#define DHCP_OPTION_IDX_OVERLOAD    0
-#define DHCP_OPTION_IDX_MSG_TYPE    1
-#define DHCP_OPTION_IDX_SERVER_ID   2
-#define DHCP_OPTION_IDX_LEASE_TIME  3
-#define DHCP_OPTION_IDX_T1          4
-#define DHCP_OPTION_IDX_T2          5
-#define DHCP_OPTION_IDX_SUBNET_MASK 6
-#define DHCP_OPTION_IDX_ROUTER      7
-#define DHCP_OPTION_IDX_DNS_SERVER  8
-#if LWIP_DHCP_GET_NTP_SRV
-#define DHCP_OPTION_IDX_NTP_SERVER  (DHCP_OPTION_IDX_DNS_SERVER + DNS_MAX_SERVERS)
-#define DHCP_OPTION_IDX_MAX         (DHCP_OPTION_IDX_NTP_SERVER + LWIP_DHCP_MAX_NTP_SERVERS)
-#else /* LWIP_DHCP_GET_NTP_SRV */
-#define DHCP_OPTION_IDX_MAX         (DHCP_OPTION_IDX_DNS_SERVER + DNS_MAX_SERVERS)
-#endif /* LWIP_DHCP_GET_NTP_SRV */
-
-/** Holds the decoded option values, only valid while in dhcp_recv.
-    @todo: move this into struct dhcp? */
-u32_t dhcp_rx_options_val[DHCP_OPTION_IDX_MAX];
-/** Holds a flag which option was received and is contained in dhcp_rx_options_val,
-    only valid while in dhcp_recv.
-    @todo: move this into struct dhcp? */
-u8_t  dhcp_rx_options_given[DHCP_OPTION_IDX_MAX];
-
-static u8_t dhcp_discover_select_options[] = {
-  DHCP_OPTION_SUBNET_MASK,
-  DHCP_OPTION_ROUTER,
-  DHCP_OPTION_BROADCAST,
-  DHCP_OPTION_DNS_SERVER
-  
-#if ESP_DHCP
-/**add options for support more router by liuHan**/
-   , DHCP_OPTION_DOMAIN_NAME, 
-    DHCP_OPTION_NB_TINS, 
-    DHCP_OPTION_NB_TINT, 
-    DHCP_OPTION_NB_TIS, 
-    DHCP_OPTION_PRD, 
-    DHCP_OPTION_STATIC_ROUTER, 
-    DHCP_OPTION_CLASSLESS_STATIC_ROUTER, 
-    DHCP_OPTION_VSN 
-#endif
-
-#if LWIP_DHCP_GET_NTP_SRV
-  , DHCP_OPTION_NTP
-#endif /* LWIP_DHCP_GET_NTP_SRV */
-  };
-
-#ifdef DHCP_GLOBAL_XID
-static u32_t xid;
-static u8_t xid_initialised;
-#endif /* DHCP_GLOBAL_XID */
-
-#define dhcp_option_given(dhcp, idx)          (dhcp_rx_options_given[idx] != 0)
-#define dhcp_got_option(dhcp, idx)            (dhcp_rx_options_given[idx] = 1)
-#define dhcp_clear_option(dhcp, idx)          (dhcp_rx_options_given[idx] = 0)
-#define dhcp_clear_all_options(dhcp)          (memset(dhcp_rx_options_given, 0, sizeof(dhcp_rx_options_given)))
-#define dhcp_get_option_value(dhcp, idx)      (dhcp_rx_options_val[idx])
-#define dhcp_set_option_value(dhcp, idx, val) (dhcp_rx_options_val[idx] = (val))
-
-static struct udp_pcb *dhcp_pcb;
-static u8_t dhcp_pcb_refcount;
-
-/* DHCP client state machine functions */
-static err_t dhcp_discover(struct netif *netif);
-static err_t dhcp_select(struct netif *netif);
-static void dhcp_bind(struct netif *netif);
-#if DHCP_DOES_ARP_CHECK
-static err_t dhcp_decline(struct netif *netif);
-#endif /* DHCP_DOES_ARP_CHECK */
-static err_t dhcp_rebind(struct netif *netif);
-static err_t dhcp_reboot(struct netif *netif);
-static void dhcp_set_state(struct dhcp *dhcp, u8_t new_state);
-
-/* receive, unfold, parse and free incoming messages */
-static void dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port);
-
-/* set the DHCP timers */
-static void dhcp_timeout(struct netif *netif);
-static void dhcp_t1_timeout(struct netif *netif);
-static void dhcp_t2_timeout(struct netif *netif);
-
-/* 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);
-/* add a DHCP option (type, then length in bytes) */
-static void dhcp_option(struct dhcp *dhcp, 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);
-#if LWIP_NETIF_HOSTNAME
-static void dhcp_option_hostname(struct dhcp *dhcp, 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);
-
-/** Ensure DHCP PCB is allocated and bound */
-static err_t
-dhcp_inc_pcb_refcount(void)
-{
-  if(dhcp_pcb_refcount == 0) {
-    LWIP_ASSERT("dhcp_inc_pcb_refcount(): memory leak", dhcp_pcb == NULL);
-
-    /* allocate UDP PCB */
-    dhcp_pcb = udp_new();
-
-    if(dhcp_pcb == NULL) {
-      return ERR_MEM;
-    }
-
-    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, IP_ADDR_ANY, DHCP_CLIENT_PORT);
-    udp_connect(dhcp_pcb, IP_ADDR_ANY, DHCP_SERVER_PORT);
-    udp_recv(dhcp_pcb, dhcp_recv, NULL);  
-  }
-
-  dhcp_pcb_refcount++;
-  
-  return ERR_OK;
-}
-
-/** Free DHCP PCB if the last netif stops using it */
-static void
-dhcp_dec_pcb_refcount(void)
-{
-  LWIP_ASSERT("dhcp_pcb_refcount(): refcount error", (dhcp_pcb_refcount > 0));
-  dhcp_pcb_refcount--;
-  
-  if(dhcp_pcb_refcount == 0) {
-    udp_remove(dhcp_pcb);
-    dhcp_pcb = NULL;
-  }
-}
-
-/**
- * Back-off the DHCP client (because of a received NAK response).
- *
- * Back-off the DHCP client because of a received NAK. Receiving a
- * NAK means the client asked for something non-sensible, for
- * example when it tries to renew a lease obtained on another network.
- *
- * We clear any existing set IP address and restart DHCP negotiation
- * afresh (as per RFC2131 3.2.3).
- *
- * @param netif the netif under DHCP control
- */
-static void
-dhcp_handle_nak(struct netif *netif)
-{
-  struct dhcp *dhcp = netif->dhcp;
-  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));
-  /* remove IP address from interface (must no longer be used, as per RFC2131) */
-  netif_set_addr(netif, IP4_ADDR_ANY, IP4_ADDR_ANY, IP4_ADDR_ANY);
-
-  if (dhcp->cb != NULL) {
-#ifdef ESP_LWIP
-    dhcp->cb(netif);
-#else
-    dhcp->cb();
-#endif
-  }
-
-  /* Change to a defined state */
-  dhcp_set_state(dhcp, DHCP_STATE_BACKING_OFF);
-  /* We can immediately restart discovery */
-  dhcp_discover(netif);
-}
-
-#if DHCP_DOES_ARP_CHECK
-/**
- * Checks if the offered IP address is already in use.
- *
- * It does so by sending an ARP request for the offered address and
- * entering CHECKING state. If no ARP reply is received within a small
- * interval, the address is assumed to be free for use by us.
- *
- * @param netif the netif under DHCP control
- */
-static void
-dhcp_check(struct netif *netif)
-{
-  struct dhcp *dhcp = netif->dhcp;
-  err_t result;
-  u16_t msecs;
-  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_check(netif=%p) %c%c\n", (void *)netif, (s16_t)netif->name[0],
-    (s16_t)netif->name[1]));
-  dhcp_set_state(dhcp, DHCP_STATE_CHECKING);
-  /* create an ARP query for the offered IP address, expecting that no host
-     responds, as the IP address should not be in use. */
-  result = etharp_query(netif, &dhcp->offered_ip_addr, NULL);
-  if (result != ERR_OK) {
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("dhcp_check: could not perform ARP query\n"));
-  }
-  if (dhcp->tries < 255) {
-    dhcp->tries++;
-  }
-  msecs = 500;
-  dhcp->request_timeout = (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 */
-
-/**
- * Remember the configuration offered by a DHCP server.
- *
- * @param netif the netif under DHCP control
- */
-static void
-dhcp_handle_offer(struct netif *netif)
-{
-  struct dhcp *dhcp = netif->dhcp;
-  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));
-  /* obtain the server address */
-  if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SERVER_ID)) {
-    ip_addr_set_ip4_u32(&dhcp->server_ip_addr, 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))));
-    /* remember offered address */
-    ip4_addr_copy(dhcp->offered_ip_addr, dhcp->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)));
-
-    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));
-  }
-}
-
-/**
- * Select a DHCP server offer out of all offers.
- *
- * Simply select the first offer received.
- *
- * @param netif the netif under DHCP control
- * @return lwIP specific error (see error.h)
- */
-static err_t
-dhcp_select(struct netif *netif)
-{
-  struct dhcp *dhcp = netif->dhcp;
-  err_t result;
-  u16_t msecs;
-  u8_t i;
-
-  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));
-
-    /* MUST request the offered IP address */
-    dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4);
-    dhcp_option_long(dhcp, ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr)));
-
-    dhcp_option(dhcp, DHCP_OPTION_SERVER_ID, 4);
-    dhcp_option_long(dhcp, ntohl(ip4_addr_get_u32(ip_2_ip4(&dhcp->server_ip_addr))));
-
-    dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, sizeof(dhcp_discover_select_options));
-    for (i = 0; i < sizeof(dhcp_discover_select_options); i++) {
-      dhcp_option_byte(dhcp, dhcp_discover_select_options[i]);
-    }
-
-#if LWIP_NETIF_HOSTNAME
-    dhcp_option_hostname(dhcp, 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);
-
-    /* send broadcast to any DHCP server */
-    udp_sendto_if_src(dhcp_pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif, IP_ADDR_ANY);
-    dhcp_delete_msg(dhcp);
-    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"));
-  }
-  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;
-  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_select(): set request timeout %"U16_F" msecs\n", msecs));
-  return result;
-}
-
-/**
- * The DHCP timer that checks for lease renewal/rebind timeouts.
- */
-void
-dhcp_coarse_tmr(void)
-{
-  struct netif *netif = netif_list;
-  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_coarse_tmr()\n"));
-  /* iterate through all network interfaces */
-  while (netif != NULL) {
-    /* only act on DHCP configured interfaces */
-    struct dhcp* dhcp = netif->dhcp;
-    if ((dhcp != NULL) && (dhcp->state != DHCP_STATE_OFF)) {
-      /* compare lease time to expire timeout */
-      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? */
-      } 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 */
-      } 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;
-  }
-}
-
-/**
- * DHCP transaction timeout handling
- *
- * A DHCP server is expected to respond within a short period of time.
- * This timer checks whether an outstanding DHCP request is timed out.
- */
-void
-dhcp_fine_tmr(void)
-{
-  struct netif *netif = netif_list;
-  /* loop through netif's */
-  while (netif != NULL) {
-    /* only act on DHCP configured interfaces */
-    if (netif->dhcp != NULL) {
-        
-//#if ESP_DHCP
-      /*add DHCP retries processing by LiuHan*/
-#if 0
-      if (DHCP_MAXRTX != 0) {
-         if (netif->dhcp->tries >= DHCP_MAXRTX){
-                         //printf("DHCP timeout\n");
-                         if (netif->dhcp_event != NULL)
-                                 netif->dhcp_event();
-                         break;
-                 }
-      }
-      
-#endif
-        
-      /* timer is active (non zero), and is about to trigger now */
-      if (netif->dhcp->request_timeout > 1) {
-        netif->dhcp->request_timeout--;
-      }
-      else if (netif->dhcp->request_timeout == 1) {
-        netif->dhcp->request_timeout--;
-        /* { netif->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;
-  }
-}
-
-/**
- * A DHCP negotiation transaction, or ARP request, has timed out.
- *
- * The timer that was started with the DHCP or ARP request has
- * timed out, indicating no response was received in time.
- *
- * @param netif the netif under DHCP control
- */
-static void
-dhcp_timeout(struct netif *netif)
-{
-  struct dhcp *dhcp = netif->dhcp;
-  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_timeout()\n"));
-  /* back-off period has passed, or server selection timed out */
-  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 */
-  } 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);
-    }
-#if DHCP_DOES_ARP_CHECK
-  /* received no ARP reply for the offered address (which is good) */
-  } else if (dhcp->state == DHCP_STATE_CHECKING) {
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): CHECKING, ARP request timed out\n"));
-    if (dhcp->tries <= 1) {
-      dhcp_check(netif);
-    /* no ARP replies on the offered address,
-       looks like the IP address is indeed free */
-    } else {
-      /* bind the interface to the offered address */
-      dhcp_bind(netif);
-    }
-#endif /* DHCP_DOES_ARP_CHECK */
-  } else if (dhcp->state == DHCP_STATE_REBOOTING) {
-    if (dhcp->tries < REBOOT_TRIES) {
-      dhcp_reboot(netif);
-    } else {
-      dhcp_discover(netif);
-    }
-  }
-}
-
-/**
- * The renewal period has timed out.
- *
- * @param netif the netif under DHCP control
- */
-static void
-dhcp_t1_timeout(struct netif *netif)
-{
-  struct dhcp *dhcp = netif->dhcp;
-  int half_t2_timeout;
-
-  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_t1_timeout()\n"));
-  if ((dhcp->state == DHCP_STATE_REQUESTING) || (dhcp->state == DHCP_STATE_BOUND) ||
-      (dhcp->state == DHCP_STATE_RENEWING)) {
-    /* just retry to renew - note that the rebind timer (t2) will
-     * eventually time-out if renew tries fail. */
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
-                ("dhcp_t1_timeout(): must renew\n"));
-    /* This slightly different to RFC2131: DHCPREQUEST will be sent from state
-       DHCP_STATE_RENEWING, not DHCP_STATE_BOUND */
-    dhcp_renew(netif);
-    /* Calculate next timeout */
-    half_t2_timeout = (netif->dhcp->t2_timeout - dhcp->lease_used) / 2;
-#if ESP_DHCP_TIMER
-    if (half_t2_timeout*DHCP_COARSE_TIMER_SECS >= 3)
-    {
-       netif->dhcp->t1_renew_time = half_t2_timeout;
-    }
-#else
-    if (half_t2_timeout >= ((60 + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS))
-    {
-       netif->dhcp->t1_renew_time = half_t2_timeout;
-    }
-#endif
-  }
-}
-
-/**
- * The rebind period has timed out.
- *
- * @param netif the netif under DHCP control
- */
-static void
-dhcp_t2_timeout(struct netif *netif)
-{
-  struct dhcp *dhcp = netif->dhcp;
-  int half_t0_timeout;
-  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_t2_timeout()\n"));
-  if ((dhcp->state == DHCP_STATE_REQUESTING) || (dhcp->state == DHCP_STATE_BOUND) ||
-      (dhcp->state == DHCP_STATE_RENEWING) || (dhcp->state == DHCP_STATE_REBINDING)) {
-    /* just retry to rebind */
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
-                ("dhcp_t2_timeout(): must rebind\n"));
-    /* This slightly different to RFC2131: DHCPREQUEST will be sent from state
-       DHCP_STATE_REBINDING, not DHCP_STATE_BOUND */
-    dhcp_rebind(netif);
-    /* Calculate next timeout */
-    half_t0_timeout = (netif->dhcp->t0_timeout - dhcp->lease_used) / 2;
-#if ESP_DHCP_TIMER
-    if (half_t0_timeout*DHCP_COARSE_TIMER_SECS >= 3)
-    {
-       netif->dhcp->t2_rebind_time = half_t0_timeout;
-    }
-#else
-    if (half_t0_timeout >= ((60 + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS))
-    {
-       netif->dhcp->t2_rebind_time = half_t0_timeout;
-    }
-#endif
-  }
-}
-
-/**
- * Handle a DHCP ACK packet
- *
- * @param netif the netif under DHCP control
- */
-static void
-dhcp_handle_ack(struct netif *netif)
-{
-  struct dhcp *dhcp = netif->dhcp;
-#if LWIP_DNS || LWIP_DHCP_GET_NTP_SRV
-  u8_t n;
-#endif /* LWIP_DNS || LWIP_DHCP_GET_NTP_SRV */
-#if LWIP_DHCP_GET_NTP_SRV
-  ip4_addr_t ntp_server_addrs[LWIP_DHCP_MAX_NTP_SERVERS];
-#endif
-
-  /* clear options we might not get from the ACK */
-  ip4_addr_set_zero(&dhcp->offered_sn_mask);
-  ip4_addr_set_zero(&dhcp->offered_gw_addr);
-#if LWIP_DHCP_BOOTP_FILE
-  ip4_addr_set_zero(&dhcp->offered_si_addr);
-#endif /* LWIP_DHCP_BOOTP_FILE */
-
-  /* lease time given? */
-  if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_LEASE_TIME)) {
-    /* remember offered lease time */
-    dhcp->offered_t0_lease = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_LEASE_TIME);
-  }
-  /* renewal period given? */
-  if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_T1)) {
-    /* remember given renewal period */
-    dhcp->offered_t1_renew = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_T1);
-  } else {
-    /* calculate safe periods for renewal */
-    dhcp->offered_t1_renew = dhcp->offered_t0_lease / 2;
-  }
-
-  /* renewal period given? */
-  if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_T2)) {
-    /* remember given rebind period */
-    dhcp->offered_t2_rebind = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_T2);
-  } else {
-    /* calculate safe periods for rebinding (offered_t0_lease * 0.875 -> 87.5%)*/
-    dhcp->offered_t2_rebind = (dhcp->offered_t0_lease * 7U) / 8U;
-  }
-
-  /* (y)our internet address */
-  ip4_addr_copy(dhcp->offered_ip_addr, dhcp->msg_in->yiaddr);
-
-#if LWIP_DHCP_BOOTP_FILE
-  /* copy boot server address,
-     boot file name copied in dhcp_parse_reply if not overloaded */
-  ip_addr_copy(dhcp->offered_si_addr, dhcp->msg_in->siaddr);
-#endif /* LWIP_DHCP_BOOTP_FILE */
-
-  /* subnet mask given? */
-  if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SUBNET_MASK)) {
-    /* remember given subnet mask */
-    ip4_addr_set_u32(&dhcp->offered_sn_mask, htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_SUBNET_MASK)));
-    dhcp->subnet_mask_given = 1;
-  } else {
-    dhcp->subnet_mask_given = 0;
-  }
-
-  /* gateway router */
-  if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_ROUTER)) {
-    ip4_addr_set_u32(&dhcp->offered_gw_addr, htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_ROUTER)));
-  }
-
-#if LWIP_DHCP_GET_NTP_SRV
-  /* NTP servers */
-  for (n = 0; (n < LWIP_DHCP_MAX_NTP_SERVERS) && dhcp_option_given(dhcp, DHCP_OPTION_IDX_NTP_SERVER + n); n++) {
-    ip4_addr_set_u32(&ntp_server_addrs[n], htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_NTP_SERVER + n)));
-  }
-  dhcp_set_ntp_servers(n, ntp_server_addrs);
-#endif /* LWIP_DHCP_GET_NTP_SRV */
-
-#if LWIP_DNS
-  /* DNS servers */
-  for (n = 0; (n < DNS_MAX_SERVERS) && dhcp_option_given(dhcp, DHCP_OPTION_IDX_DNS_SERVER + n); n++) {
-    ip_addr_t dns_addr;
-    if (n == DNS_FALLBACK_SERVER_INDEX) {
-        continue;
-    }
-    ip_addr_set_ip4_u32(&dns_addr, htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_DNS_SERVER + n)));
-    dns_setserver(n, &dns_addr);
-  }
-#endif /* LWIP_DNS */
-}
-
-/** Set a statically allocated struct dhcp to work with.
- * Using this prevents dhcp_start to allocate it using mem_malloc.
- *
- * @param netif the netif for which to set the struct dhcp
- * @param dhcp (uninitialised) dhcp struct allocated by the application
- */
-void
-dhcp_set_struct(struct netif *netif, struct dhcp *dhcp)
-{
-  LWIP_ASSERT("netif != NULL", netif != NULL);
-  LWIP_ASSERT("dhcp != NULL", dhcp != NULL);
-  LWIP_ASSERT("netif already has a struct dhcp set", netif->dhcp == NULL);
-
-  /* clear data structure */
-  memset(dhcp, 0, sizeof(struct dhcp));
-  /* dhcp_set_state(&dhcp, DHCP_STATE_OFF); */
-  netif->dhcp = dhcp;
-}
-
-/** Removes a struct dhcp from a netif.
- *
- * ATTENTION: Only use this when not using dhcp_set_struct() to allocate the
- *            struct dhcp since the memory is passed back to the heap.
- *
- * @param netif the netif from which to remove the struct dhcp
- */
-void dhcp_cleanup(struct netif *netif)
-{
-  LWIP_ASSERT("netif != NULL", netif != NULL);
-
-  if (netif->dhcp != NULL) {
-    mem_free(netif->dhcp);
-    netif->dhcp = NULL;
-  }
-}
-
-/* Espressif add start. */
-
-/** Set callback for dhcp, reserved parameter for future use.
- *
- * @param netif the netif from which to remove the struct dhcp
- * @param cb    callback for dhcp
- */
-#ifdef ESP_LWIP
-void dhcp_set_cb(struct netif *netif, void (*cb)(struct netif*))
-#else
-void dhcp_set_cb(struct netif *netif, void (*cb)(void))
-#endif
-{
-  LWIP_ASSERT("netif != NULL", netif != NULL);
-
-  if (netif->dhcp != NULL) {
-    netif->dhcp->cb = cb;
-  }
-}
-
-/* Espressif add end. */
-
-/**
- * Start DHCP negotiation for a network interface.
- *
- * 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.
- *
- * @param netif The lwIP network interface
- * @return lwIP error code
- * - ERR_OK - No error
- * - ERR_MEM - Out of memory
- */
-err_t
-dhcp_start(struct netif *netif)
-{
-  struct dhcp *dhcp;
-  err_t result;
-
-  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;
-  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 hwtype of the netif */
-  if ((netif->flags & NETIF_FLAG_ETHARP) == 0) {
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): No ETHARP netif\n"));
-    return ERR_ARG;
-  }
-
-  /* check MTU of the netif */
-  if (netif->mtu < DHCP_MAX_MSG_LEN_MIN_REQUIRED) {
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): Cannot use this netif with DHCP: MTU is too small\n"));
-    return ERR_MEM;
-  }
-
-  /* no DHCP client attached yet? */
-  if (dhcp == NULL) {
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): starting new DHCP client\n"));
-    dhcp = (struct dhcp *)mem_malloc(sizeof(struct dhcp));
-    if (dhcp == NULL) {
-      LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): could not allocate dhcp\n"));
-      return ERR_MEM;
-    }
-    
-    /* store this dhcp client in the netif */
-    netif->dhcp = dhcp;
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): allocated dhcp"));
-  /* 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 */
-    }
-    /* dhcp is cleared below, no need to reset flag*/
-  }
-
-  /* clear data structure */
-  memset(dhcp, 0, sizeof(struct dhcp));
-  /* dhcp_set_state(&dhcp, DHCP_STATE_OFF); */
-
-  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): starting DHCP configuration\n"));  
-
-  if(dhcp_inc_pcb_refcount() != ERR_OK) { /* ensure DHCP PCB is allocated */
-    return ERR_MEM;
-  }
-  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);
-    return ERR_MEM;
-  }
-  return result;
-}
-
-/**
- * Inform a DHCP server of our manual configuration.
- *
- * 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.
- *
- * @param netif The lwIP network interface
- */
-void
-dhcp_inform(struct netif *netif)
-{
-  struct dhcp dhcp;
-  err_t result = ERR_OK;
-
-  LWIP_ERROR("netif != NULL", (netif != NULL), return;);
-
-  if(dhcp_inc_pcb_refcount() != ERR_OK) { /* ensure DHCP PCB is allocated */
-    return;
-  }
-
-  memset(&dhcp, 0, sizeof(struct dhcp));
-  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));
-
-    dhcp_option_trailer(&dhcp);
-
-    pbuf_realloc(dhcp.p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp.options_out_len);
-
-    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);
-
-    dhcp_delete_msg(&dhcp);
-  } else {
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_inform: could not allocate DHCP request\n"));
-  }
-
-  dhcp_dec_pcb_refcount(); /* delete DHCP PCB if not needed any more */
-}
-
-/** Handle a possible change in the network configuration.
- *
- * This enters the REBOOTING state to verify that the currently bound
- * address is still valid.
- */
-void
-dhcp_network_changed(struct netif *netif)
-{
-  struct dhcp *dhcp = netif->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 */
-#if LWIP_DHCP_AUTOIP_COOP
-    if (dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_ON) {
-      autoip_stop(netif);
-      dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_OFF;
-    }
-#endif /* LWIP_DHCP_AUTOIP_COOP */
-    /* ensure we start with short timeouts, even if already discovering */
-    dhcp->tries = 0;
-    dhcp_discover(netif);
-    break;
-  }
-}
-
-#if DHCP_DOES_ARP_CHECK
-/**
- * Match an ARP reply with the offered IP address.
- *
- * @param netif the network interface on which the reply was received
- * @param addr The IP address we received a reply from
- */
-void dhcp_arp_reply(struct netif *netif, const ip4_addr_t *addr)
-{
-  LWIP_ERROR("netif != NULL", (netif != NULL), return;);
-  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_arp_reply()\n"));
-  /* is a DHCP client doing an ARP check? */
-  if ((netif->dhcp != NULL) && (netif->dhcp->state == DHCP_STATE_CHECKING)) {
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_arp_reply(): CHECKING, arp reply for 0x%08"X32_F"\n",
-      ip4_addr_get_u32(addr)));
-    /* did a host respond with the address we
-       were offered by the DHCP server? */
-    if (ip4_addr_cmp(addr, &netif->dhcp->offered_ip_addr)) {
-      /* we will not accept the offered address */
-      LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | LWIP_DBG_LEVEL_WARNING,
-        ("dhcp_arp_reply(): arp reply matched with offered address, declining\n"));
-      dhcp_decline(netif);
-    }
-  }
-}
-
-/**
- * Decline an offered lease.
- *
- * Tell the DHCP server we do not accept the offered address.
- * One reason to decline the lease is when we find out the address
- * is already in use by another host (through ARP).
- *
- * @param netif the netif under DHCP control
- */
-static err_t
-dhcp_decline(struct netif *netif)
-{
-  struct dhcp *dhcp = netif->dhcp;
-  err_t result = ERR_OK;
-  u16_t msecs;
-  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, 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);
-
-    /* per section 4.4.4, broadcast DECLINE messages */
-    udp_sendto_if_src(dhcp_pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif, IP_ADDR_ANY);
-    dhcp_delete_msg(dhcp);
-    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"));
-  }
-  if (dhcp->tries < 255) {
-    dhcp->tries++;
-  }
-  msecs = 10*1000;
-  dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
-  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_decline(): set request timeout %"U16_F" msecs\n", msecs));
-  return result;
-}
-#endif /* DHCP_DOES_ARP_CHECK */
-
-
-/**
- * Start the DHCP process, discover a DHCP server.
- *
- * @param netif the netif under DHCP control
- */
-static err_t
-dhcp_discover(struct netif *netif)
-{
-  struct dhcp *dhcp = netif->dhcp;
-  err_t result = ERR_OK;
-  u16_t msecs;
-  u8_t i;
-  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) {
-    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));
-
-#if ESP_DHCP
-#if LWIP_NETIF_HOSTNAME
-    dhcp_option_hostname(dhcp, netif);
-#endif /* LWIP_NETIF_HOSTNAME */
-#endif
-
-    dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, sizeof(dhcp_discover_select_options));
-    for (i = 0; i < sizeof(dhcp_discover_select_options); i++) {
-      dhcp_option_byte(dhcp, dhcp_discover_select_options[i]);
-    }
-    dhcp_option_trailer(dhcp);
-
-    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, IP_ADDR_ANY);
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: deleting()ing\n"));
-    dhcp_delete_msg(dhcp);
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_discover: SELECTING\n"));
-  } else {
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_discover: could not allocate DHCP request\n"));
-  }
-  if (dhcp->tries < 255) {
-    dhcp->tries++;
-  }
-#if LWIP_DHCP_AUTOIP_COOP
-  if (dhcp->tries >= LWIP_DHCP_AUTOIP_COOP_TRIES && dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_OFF) {
-    dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_ON;
-    autoip_start(netif);
-  }
-#endif /* LWIP_DHCP_AUTOIP_COOP */
-
-  /* Since for embedded devices it's not that hard to miss a discover packet, so lower
-   * the discover retry backoff time from (2,4,8,16,32,60,60)s to (500m,1,2,4,8,15,15)s.
-   * Original msecs = (dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000;
-   */
-  msecs = (dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 250;
-  dhcp->request_timeout = (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;
-}
-
-
-/**
- * Bind the interface to the offered IP address.
- *
- * @param netif network interface to bind to the offered address
- */
-static void
-dhcp_bind(struct netif *netif)
-{
-  u32_t timeout;
-  struct dhcp *dhcp;
-  ip4_addr_t sn_mask, gw_addr;
-  LWIP_ERROR("dhcp_bind: netif != NULL", (netif != NULL), return;);
-  dhcp = netif->dhcp;
-  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));
-
-  /* reset time used of lease */
-  dhcp->lease_used = 0;
-
-#if ESP_DHCP_TIMER
-  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->t0_timeout = timeout;
-     if (dhcp->t0_timeout == 0) {
-       dhcp->t0_timeout = 120;
-     }
-     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? */
-  if (dhcp->offered_t1_renew != 0xffffffffUL) {
-    /* set renewal period timer */
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(): t1 renewal timer %"U32_F" secs\n", dhcp->offered_t1_renew));
-    timeout = dhcp->offered_t1_renew;
-    dhcp->t1_timeout = timeout;
-    if (dhcp->t1_timeout == 0) {
-      dhcp->t1_timeout = 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_t1_renew*1000));
-    dhcp->t1_renew_time = dhcp->t1_timeout;
-  }
-  /* set renewal period timer */
-  if (dhcp->offered_t2_rebind != 0xffffffffUL) {
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(): t2 rebind timer %"U32_F" secs\n", dhcp->offered_t2_rebind));
-    timeout = dhcp->offered_t2_rebind;
-    dhcp->t2_timeout = timeout;
-    if (dhcp->t2_timeout == 0) {
-      dhcp->t2_timeout = (dhcp->t0_timeout>>3)*7;
-    }
-    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;
-  }
-
-  /* If we have sub 1 minute lease, t2 and t1 will kick in at the same time. */
-  if ((dhcp->t1_timeout >= dhcp->t2_timeout) && (dhcp->t2_timeout > 0)) {
-    dhcp->t1_timeout = 0;
-  }
-#else
-  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));
-  }
-
-  /* temporary DHCP lease? */
-  if (dhcp->offered_t1_renew != 0xffffffffUL) {
-    /* set renewal period timer */
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(): t1 renewal timer %"U32_F" secs\n", dhcp->offered_t1_renew));
-    timeout = (dhcp->offered_t1_renew + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS;
-    if (timeout > 0xffff) {
-      timeout = 0xffff;
-    }
-    dhcp->t1_timeout = (u16_t)timeout;
-    if (dhcp->t1_timeout == 0) {
-      dhcp->t1_timeout = 1;
-    }
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_bind(): set request timeout %"U32_F" msecs\n", dhcp->offered_t1_renew*1000));
-    dhcp->t1_renew_time = dhcp->t1_timeout;
-  }
-  /* set renewal period timer */
-  if (dhcp->offered_t2_rebind != 0xffffffffUL) {
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(): t2 rebind timer %"U32_F" secs\n", dhcp->offered_t2_rebind));
-    timeout = (dhcp->offered_t2_rebind + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS;
-    if (timeout > 0xffff) {
-      timeout = 0xffff;
-    }
-    dhcp->t2_timeout = (u16_t)timeout;
-    if (dhcp->t2_timeout == 0) {
-      dhcp->t2_timeout = 1;
-    }
-    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;
-  }
-
-  /* If we have sub 1 minute lease, t2 and t1 will kick in at the same time. */
-  if ((dhcp->t1_timeout >= dhcp->t2_timeout) && (dhcp->t2_timeout > 0)) {
-    dhcp->t1_timeout = 0;
-  }
-#endif
-
-  if (dhcp->subnet_mask_given) {
-    /* copy offered network mask */
-    ip4_addr_copy(sn_mask, dhcp->offered_sn_mask);
-  } else {
-    /* subnet mask not given, choose a safe subnet mask given the network class */
-    u8_t first_octet = ip4_addr1(&dhcp->offered_ip_addr);
-    if (first_octet <= 127) {
-      ip4_addr_set_u32(&sn_mask, PP_HTONL(0xff000000UL));
-    } else if (first_octet >= 192) {
-      ip4_addr_set_u32(&sn_mask, PP_HTONL(0xffffff00UL));
-    } else {
-      ip4_addr_set_u32(&sn_mask, PP_HTONL(0xffff0000UL));
-    }
-  }
-
-  ip4_addr_copy(gw_addr, dhcp->offered_gw_addr);
-  /* gateway address not given? */
-  if (ip4_addr_isany_val(gw_addr)) {
-    /* copy network address */
-    ip4_addr_get_network(&gw_addr, &dhcp->offered_ip_addr, &sn_mask);
-    /* use first host address on network as gateway */
-    ip4_addr_set_u32(&gw_addr, ip4_addr_get_u32(&gw_addr) | PP_HTONL(0x00000001UL));
-  }
-
-#if LWIP_DHCP_AUTOIP_COOP
-  if (dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_ON) {
-    autoip_stop(netif);
-    dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_OFF;
-  }
-#endif /* LWIP_DHCP_AUTOIP_COOP */
-
-  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_bind(): IP: 0x%08"X32_F" SN: 0x%08"X32_F" GW: 0x%08"X32_F"\n",
-    ip4_addr_get_u32(&dhcp->offered_ip_addr), ip4_addr_get_u32(&sn_mask), ip4_addr_get_u32(&gw_addr)));
-  netif_set_addr(netif, &dhcp->offered_ip_addr, &sn_mask, &gw_addr);
-  /* interface is used by routing now that an address is set */
-
-  /* netif is now bound to DHCP leased address */
-  dhcp_set_state(dhcp, DHCP_STATE_BOUND);
-
-  /* Espressif add start. */
-  if (dhcp->cb != NULL) {
-#ifdef ESP_LWIP
-      dhcp->cb(netif);
-#else
-      dhcp->cb();
-#endif
-  }
-  /* Espressif add end. */
-}
-
-/**
- * Renew an existing DHCP lease at the involved DHCP server.
- *
- * @param netif network interface which must renew its lease
- */
-err_t
-dhcp_renew(struct netif *netif)
-{
-  struct dhcp *dhcp = netif->dhcp;
-  err_t result;
-  u16_t msecs;
-  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));
-
-#if LWIP_NETIF_HOSTNAME
-    dhcp_option_hostname(dhcp, netif);
-#endif /* LWIP_NETIF_HOSTNAME */
-
-    /* append DHCP message trailer */
-    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, &dhcp->server_ip_addr, DHCP_SERVER_PORT, netif);
-    dhcp_delete_msg(dhcp);
-
-    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"));
-  }
-  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;
-  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_renew(): set request timeout %"U16_F" msecs\n", msecs));
-  return result;
-}
-
-/**
- * Rebind with a DHCP server for an existing DHCP lease.
- *
- * @param netif network interface which must rebind with a DHCP server
- */
-static err_t
-dhcp_rebind(struct netif *netif)
-{
-  struct dhcp *dhcp = netif->dhcp;
-  err_t result;
-  u16_t msecs;
-  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));
-
-#if LWIP_NETIF_HOSTNAME
-    dhcp_option_hostname(dhcp, 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);
-
-    /* broadcast to server */
-    udp_sendto_if(dhcp_pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif);
-    dhcp_delete_msg(dhcp);
-    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"));
-  }
-  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;
-  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind(): set request timeout %"U16_F" msecs\n", msecs));
-  return result;
-}
-
-/**
- * Enter REBOOTING state to verify an existing lease
- *
- * @param netif network interface which must reboot
- */
-static err_t
-dhcp_reboot(struct netif *netif)
-{
-  struct dhcp *dhcp = netif->dhcp;
-  err_t result;
-  u16_t msecs;
-  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, 576);
-
-    dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4);
-    dhcp_option_long(dhcp, ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr)));
-
-    dhcp_option_trailer(dhcp);
-
-    pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
-
-    /* broadcast to server */
-    udp_sendto_if(dhcp_pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif);
-    dhcp_delete_msg(dhcp);
-    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"));
-  }
-  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;
-  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot(): set request timeout %"U16_F" msecs\n", msecs));
-  return result;
-}
-
-
-/**
- * Release a DHCP lease.
- *
- * @param netif network interface which must release its lease
- */
-err_t
-dhcp_release(struct netif *netif)
-{
-  struct dhcp *dhcp = netif->dhcp;
-  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"));
-  if (dhcp == NULL) {
-    return ERR_ARG;
-  }
-  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);
-  ip4_addr_set_zero(&dhcp->offered_sn_mask);
-  ip4_addr_set_zero(&dhcp->offered_gw_addr);
-#if LWIP_DHCP_BOOTP_FILE
-  ip4_addr_set_zero(&dhcp->offered_si_addr);
-#endif /* LWIP_DHCP_BOOTP_FILE */
-  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;
-  }
-
-  /* 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, 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_ANY, IP4_ADDR_ANY, IP4_ADDR_ANY);
-
-  if (dhcp->cb != NULL) {
-#ifdef ESP_LWIP
-    dhcp->cb(netif);
-#else
-    dhcp->cb();
-#endif
-  }
-
-  return result;
-}
-
-/**
- * Remove the DHCP client from the interface.
- *
- * @param netif The network interface to stop DHCP on
- */
-void
-dhcp_stop(struct netif *netif)
-{
-  struct dhcp *dhcp;
-  LWIP_ERROR("dhcp_stop: netif != NULL", (netif != NULL), return;);
-  dhcp = netif->dhcp;
-
-  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;
-    }
-  }
-}
-
-/*
- * Set the DHCP state of a DHCP client.
- *
- * If the state changed, reset the number of tries.
- */
-static void
-dhcp_set_state(struct dhcp *dhcp, u8_t new_state)
-{
-  if (new_state != dhcp->state) {
-    dhcp->state = new_state;
-    dhcp->tries = 0;
-    dhcp->request_timeout = 0;
-  }
-}
-
-/*
- * Concatenate an option type and length field to the outgoing
- * DHCP message.
- *
- */
-static void
-dhcp_option(struct dhcp *dhcp, 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;
-}
-/*
- * Concatenate a single byte to the outgoing DHCP message.
- *
- */
-static void
-dhcp_option_byte(struct dhcp *dhcp, 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;
-}
-
-static void
-dhcp_option_short(struct dhcp *dhcp, 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);
-}
-
-static void
-dhcp_option_long(struct dhcp *dhcp, 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));
-}
-
-#if LWIP_NETIF_HOSTNAME
-static void
-dhcp_option_hostname(struct dhcp *dhcp, struct netif *netif)
-{
-  if (netif->hostname != NULL) {
-    size_t namelen = strlen(netif->hostname);
-    if (namelen > 0) {
-      u8_t len;
-      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;
-      LWIP_ASSERT("DHCP: hostname is too long!", namelen <= available);
-      len = LWIP_MIN(namelen, available);
-      dhcp_option(dhcp, DHCP_OPTION_HOSTNAME, len);
-      while (len--) {
-        dhcp_option_byte(dhcp, *p++);
-      }
-    }
-  }
-}
-#endif /* LWIP_NETIF_HOSTNAME */
-
-/**
- * Extract the DHCP message and the DHCP options.
- *
- * Extract the DHCP message and the DHCP options, each into a contiguous
- * piece of memory. As a DHCP message is variable sized by its options,
- * and also allows overriding some fields for options, the easy approach
- * is to first unfold the options into a contiguous piece of memory, and
- * use that further on.
- *
- */
-static err_t
-dhcp_parse_reply(struct dhcp *dhcp, struct pbuf *p)
-{
-  u8_t *options;
-  u16_t offset;
-  u16_t offset_max;
-  u16_t options_idx;
-  u16_t options_idx_max;
-  struct pbuf *q;
-  int parse_file_as_options = 0;
-  int parse_sname_as_options = 0;
-
-  /* clear received options */
-  dhcp_clear_all_options(dhcp);
-  /* check that beginning of dhcp_msg (up to and including chaddr) is in first pbuf */
-  if (p->len < DHCP_SNAME_OFS) {
-    return ERR_BUF;
-  }
-  dhcp->msg_in = (struct dhcp_msg *)p->payload;
-#if LWIP_DHCP_BOOTP_FILE
-  /* clear boot file name */
-  dhcp->boot_file_name[0] = 0;
-#endif /* LWIP_DHCP_BOOTP_FILE */
-
-  /* parse options */
-
-  /* start with options field */
-  options_idx = DHCP_OPTIONS_OFS;
-  /* parse options to the end of the received packet */
-  options_idx_max = p->tot_len;
-again:
-  q = p;
-  while ((q != NULL) && (options_idx >= q->len)) {
-    options_idx -= q->len;
-    options_idx_max -= q->len;
-    q = q->next;
-  }
-  if (q == NULL) {
-    return ERR_BUF;
-  }
-  offset = options_idx;
-  offset_max = options_idx_max;
-  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) && (options[offset] != DHCP_OPTION_END) && (offset < offset_max)) {
-    u8_t op = options[offset];
-    u8_t len;
-    u8_t decode_len = 0;
-    int decode_idx = -1;
-    u16_t val_offset = offset + 2;
-    /* 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);
-    }
-    /* LWIP_DEBUGF(DHCP_DEBUG, ("msg_offset=%"U16_F", q->len=%"U16_F, msg_offset, q->len)); */
-    decode_len = len;
-    switch(op) {
-      /* case(DHCP_OPTION_END): handled above */
-      case(DHCP_OPTION_PAD):
-        /* special option: no len encoded */
-        decode_len = len = 0;
-        /* will be increased below */
-        offset--;
-        break;
-      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):
-        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;
-      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 */
-        decode_len = LWIP_MIN(len, 4 * DNS_MAX_SERVERS);
-        LWIP_ERROR("len >= decode_len", len >= decode_len, return ERR_VAL;);
-        decode_idx = DHCP_OPTION_IDX_DNS_SERVER;
-        break;
-      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):
-        /* 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 */
-        decode_len = LWIP_MIN(len, 4 * LWIP_DHCP_MAX_NTP_SERVERS);
-        LWIP_ERROR("len >= decode_len", len >= decode_len, return ERR_VAL;);
-        decode_idx = DHCP_OPTION_IDX_NTP_SERVER;
-        break;
-#endif /* LWIP_DHCP_GET_NTP_SRV*/
-      case(DHCP_OPTION_OVERLOAD):
-        LWIP_ERROR("len == 1", len == 1, return ERR_VAL;);
-        decode_idx = DHCP_OPTION_IDX_OVERLOAD;
-        break;
-      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):
-        LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
-        decode_idx = DHCP_OPTION_IDX_SERVER_ID;
-        break;
-      case(DHCP_OPTION_T1):
-        LWIP_ERROR("len == 4", len == 4, return ERR_VAL;);
-        decode_idx = DHCP_OPTION_IDX_T1;
-        break;
-      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", op));
-        break;
-    }
-    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);
-        pbuf_copy_partial(q, &value, copy_len, val_offset);
-        if (decode_len > 4) {
-          /* decode more than one u32_t */
-          //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, htonl(value));
-          decode_len -= 4;
-          val_offset += 4;
-          decode_idx++;
-          goto decode_next;
-        } else if (decode_len == 4) {
-          value = 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, value);
-      }
-    }
-    if (offset >= q->len) {
-      offset -= q->len;
-      offset_max -= q->len;
-      if ((offset < offset_max) && offset_max) {
-        q = q->next;
-        LWIP_ERROR("offset pointed to next pbuf which is null", q , return ERR_VAL;);
-        options = (u8_t*)q->payload;
-      } else {
-        /* We've run out of bytes, probably no end marker. Don't proceed. */
-        break;
-      }
-    }
-  }
-  /* is this an overloaded message? */
-  if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_OVERLOAD)) {
-    u32_t overload = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_OVERLOAD);
-    dhcp_clear_option(dhcp, DHCP_OPTION_IDX_OVERLOAD);
-    if (overload == DHCP_OVERLOAD_FILE) {
-      parse_file_as_options = 1;
-      LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("overloaded file field\n"));
-    } else if (overload == DHCP_OVERLOAD_SNAME) {
-      parse_sname_as_options = 1;
-      LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("overloaded sname field\n"));
-    } else if (overload == DHCP_OVERLOAD_SNAME_FILE) {
-      parse_sname_as_options = 1;
-      parse_file_as_options = 1;
-      LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("overloaded sname and file field\n"));
-    } 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) */
-      pbuf_copy_partial(p, dhcp->boot_file_name, DHCP_FILE_LEN-1, DHCP_FILE_OFS);
-      /* 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;
-    goto again;
-  } else if (parse_sname_as_options) {
-    parse_sname_as_options = 0;
-    options_idx = DHCP_SNAME_OFS;
-    options_idx_max = DHCP_SNAME_OFS + DHCP_SNAME_LEN;
-    goto again;
-  }
-  return ERR_OK;
-}
-
-/**
- * If an incoming DHCP message is in response to us, then trigger the state machine
- */
-static void
-dhcp_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 dhcp *dhcp = netif->dhcp;
-  struct dhcp_msg *reply_msg = (struct dhcp_msg *)p->payload;
-  u8_t msg_type;
-  u8_t i;
-  
-  LWIP_UNUSED_ARG(arg);
-
-  /* Caught DHCP message from netif that does not have DHCP enabled? -> not interested */
-  if((dhcp == NULL) || (dhcp->pcb_allocated == 0)) {
-    goto free_pbuf_and_return;
-  }
-
-  LWIP_ASSERT("invalid server address type", !IP_IS_V6(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, ("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 */
-  LWIP_UNUSED_ARG(pcb);
-  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;
-  }
-
-  if (reply_msg->op != DHCP_BOOTREPLY) {
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("not a DHCP reply message, but type %"U16_F"\n", (u16_t)reply_msg->op));
-    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++) {
-    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]));
-      goto free_pbuf_and_return;
-    }
-  }
-  /* match transaction ID against what we expected */
-  if (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",ntohl(reply_msg->xid),dhcp->xid));
-    goto free_pbuf_and_return;
-  }
-  /* option fields could be unfold? */
-  if (dhcp_parse_reply(dhcp, p) != ERR_OK) {
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,
-      ("problem unfolding DHCP message - too short on memory?\n"));
-    goto free_pbuf_and_return;
-  }
-
-  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("searching DHCP_OPTION_MESSAGE_TYPE\n"));
-  /* obtain pointer to DHCP message type */
-  if (!dhcp_option_given(dhcp, DHCP_OPTION_IDX_MSG_TYPE)) {
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("DHCP_OPTION_MESSAGE_TYPE option not found\n"));
-    goto free_pbuf_and_return;
-  }
-
-  /* read DHCP message type */
-  msg_type = (u8_t)dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_MSG_TYPE);
-  /* message type is DHCP ACK? */
-  if (msg_type == DHCP_ACK) {
-    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("DHCP_ACK received\n"));
-    /* in requesting state? */
-    if (dhcp->state == DHCP_STATE_REQUESTING) {
-      dhcp_handle_ack(netif);
-#if DHCP_DOES_ARP_CHECK
-      /* check if the acknowledged lease address is already in use */
-      dhcp_check(netif);
-#else
-      /* bind interface to the acknowledged lease address */
-      dhcp_bind(netif);
-#endif
-    }
-    /* 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_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  ))) {
-    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);
-  }
-free_pbuf_and_return:
-  dhcp->msg_in = NULL;
-  pbuf_free(p);
-}
-
-/**
- * Create a DHCP request, fill in common headers
- *
- * @param netif the netif under DHCP control
- * @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)
-{
-  u16_t i;
-#ifndef DHCP_GLOBAL_XID
-  /** default global transaction identifier starting value (easy to match
-   *  with a packet analyser). We simply increment for each new request.
-   *  Predefine DHCP_GLOBAL_XID to a better value or a function call to generate one
-   *  at runtime, any supporting function prototypes can be defined in DHCP_GLOBAL_XID_HEADER */
-#if DHCP_CREATE_RAND_XID && defined(LWIP_RAND)
-  static u32_t xid;
-#else /* DHCP_CREATE_RAND_XID && defined(LWIP_RAND) */
-  static u32_t xid = 0xABCD0000;
-#endif /* DHCP_CREATE_RAND_XID && defined(LWIP_RAND) */
-#else
-  if (!xid_initialised) {
-    xid = DHCP_GLOBAL_XID;
-    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_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,
-      ("dhcp_create_msg(): could not allocate pbuf\n"));
-    return ERR_MEM;
-  }
-  LWIP_ASSERT("dhcp_create_msg: check that first pbuf can hold struct dhcp_msg",
-           (dhcp->p_out->len >= sizeof(struct dhcp_msg)));
-
-  /* DHCP_REQUEST should reuse 'xid' from DHCPOFFER */
-  if (message_type != DHCP_REQUEST) {
-    /* reuse transaction identifier in retransmissions */
-    if (dhcp->tries == 0) {
-#if DHCP_CREATE_RAND_XID && defined(LWIP_RAND)
-      xid = LWIP_RAND();
-#else /* DHCP_CREATE_RAND_XID && defined(LWIP_RAND) */
-      xid++;
-#endif /* DHCP_CREATE_RAND_XID && defined(LWIP_RAND) */
-    }
-    dhcp->xid = xid;
-  }
-  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE,
-              ("transaction id xid(%"X32_F")\n", xid));
-
-  dhcp->msg_out = (struct dhcp_msg *)dhcp->p_out->payload;
-
-  dhcp->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 = htonl(dhcp->xid);
-  dhcp->msg_out->secs = 0;
-  /* 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));
-  }
-  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 < 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 */
-  }
-  /* 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);
-  }
-  dhcp->p_out = NULL;
-  dhcp->msg_out = NULL;
-}
-
-/**
- * Add a DHCP message trailer
- *
- * 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)
-{
-  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;
-  /* 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)) {
-    /* add a fill/padding byte */
-    dhcp->msg_out->options[dhcp->options_out_len++] = 0;
-  }
-}
-
-/** check if DHCP supplied netif->ip_addr
- *
- * @param netif the netif to check
- * @return 1 if DHCP supplied netif->ip_addr (states BOUND or RENEWING),
- *         0 otherwise
- */
-u8_t
-dhcp_supplied_address(struct netif *netif)
-{
-  if ((netif != NULL) && (netif->dhcp != NULL)) {
-    if ((netif->dhcp->state == DHCP_STATE_BOUND) ||
-      (netif->dhcp->state == DHCP_STATE_RENEWING)) {
-      return 1;
-    }
-  }
-  return 0;
-}
-
-#endif /* LWIP_IPV4 && LWIP_DHCP */
diff --git a/components/lwip/core/ipv4/icmp.c b/components/lwip/core/ipv4/icmp.c
deleted file mode 100644 (file)
index 9202bb6..0000000
+++ /dev/null
@@ -1,386 +0,0 @@
-/**
- * @file
- * ICMP - Internet Control Message Protocol
- *
- */
-
-/*
- * 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>
- *
- */
-
-/* Some ICMP messages should be passed to the transport protocols. This
-   is not implemented. */
-
-#include "lwip/opt.h"
-
-#if LWIP_IPV4 && LWIP_ICMP /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/icmp.h"
-#include "lwip/inet_chksum.h"
-#include "lwip/ip.h"
-#include "lwip/def.h"
-#include "lwip/stats.h"
-
-#include <string.h>
-
-/** 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) */
-#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 */
-
-/* The amount of data from the original packet to return in a dest-unreachable */
-#define ICMP_DEST_UNREACH_DATASIZE 8
-
-static void icmp_send_response(struct pbuf *p, u8_t type, u8_t code);
-
-/**
- * Processes ICMP input packets, called from ip_input().
- *
- * Currently only processes icmp echo requests and sends
- * out the echo response.
- *
- * @param p the icmp echo request packet, p->payload pointing to the icmp header
- * @param inp the netif on which this packet was received
- */
-void
-icmp_input(struct pbuf *p, struct netif *inp)
-{
-  u8_t type;
-#ifdef LWIP_DEBUG
-  u8_t code;
-#endif /* LWIP_DEBUG */
-  struct icmp_echo_hdr *iecho;
-  const struct ip_hdr *iphdr_in;
-  s16_t hlen;
-  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;
-  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);
-#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())) {
-#if LWIP_MULTICAST_PING
-      /* 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;
-#endif /* LWIP_MULTICAST_PING */
-    }
-    /* 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);
-#else /* LWIP_BROADCAST_PING */
-      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;
-    }
-#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, (PBUF_IP_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;
-      }
-      LWIP_ASSERT("check that first pbuf can hold struct the ICMP header",
-                  (r->len >= hlen + sizeof(struct icmp_echo_hdr)));
-      /* copy the ip header */
-      MEMCPY(r->payload, iphdr_in, hlen);
-      /* switch r->payload back to icmp header */
-      if (pbuf_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_ASSERT("icmp_input: copying to new pbuf failed\n", 0);
-        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 */
-      if (pbuf_header(p, -(s16_t)(PBUF_IP_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, hlen)) {
-      LWIP_ASSERT("Can't move over header in packet", 0);
-    } 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 LWIP_CHECKSUM_CTRL_PER_NETIF
-      else {
-        iecho->chksum = 0;
-      }
-#endif /* LWIP_CHECKSUM_CTRL_PER_NETIF */
-#else /* CHECKSUM_GEN_ICMP */
-      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);
-#if CHECKSUM_GEN_IP
-      IF__NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_GEN_IP) {
-        IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, IP_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);
-
-      /* send an ICMP packet */
-      ret = ip4_output_if(p, src, 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.icmpindestunreachs);
-    } 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;
-lenerr:
-  pbuf_free(p);
-  ICMP_STATS_INC(icmp.lenerr);
-  MIB2_STATS_INC(mib2.icmpinerrors);
-  return;
-#if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN || !LWIP_MULTICAST_PING || !LWIP_BROADCAST_PING
-icmperr:
-  pbuf_free(p);
-  ICMP_STATS_INC(icmp.err);
-  MIB2_STATS_INC(mib2.icmpinerrors);
-  return;
-#endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN || !LWIP_MULTICAST_PING || !LWIP_BROADCAST_PING */
-}
-
-/**
- * Send an icmp 'destination unreachable' packet, called from ip_input() if
- * the transport layer protocol is unknown and from udp_input() if the local
- * port is not bound.
- *
- * @param p the input packet for which the 'unreachable' should be sent,
- *          p->payload pointing to the IP header
- * @param t type of the 'unreachable' packet
- */
-void
-icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t)
-{
-  MIB2_STATS_INC(mib2.icmpoutdestunreachs);
-  icmp_send_response(p, ICMP_DUR, t);
-}
-
-#if IP_FORWARD || IP_REASSEMBLY
-/**
- * Send a 'time exceeded' packet, called from ip_forward() if TTL is 0.
- *
- * @param p the input packet for which the 'time exceeded' should be sent,
- *          p->payload pointing to the IP header
- * @param t type of the 'time exceeded' packet
- */
-void
-icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t)
-{
-  MIB2_STATS_INC(mib2.icmpouttimeexcds);
-  icmp_send_response(p, ICMP_TE, t);
-}
-
-#endif /* IP_FORWARD || IP_REASSEMBLY */
-
-/**
- * Send an icmp packet in response to an incoming packet.
- *
- * @param p the input packet for which the 'unreachable' should be sent,
- *          p->payload pointing to the IP header
- * @param type Type of the ICMP header
- * @param code Code of the ICMP header
- */
-static void
-icmp_send_response(struct pbuf *p, u8_t type, u8_t code)
-{
-  struct pbuf *q;
-  struct ip_hdr *iphdr;
-  /* we can use the echo header here */
-  struct icmp_echo_hdr *icmphdr;
-  ip4_addr_t iphdr_src;
-  struct netif *netif;
-
-  /* increase number of messages attempted to send */
-  MIB2_STATS_INC(mib2.icmpoutmsgs);
-
-  /* ICMP header + IP header + 8 bytes of data */
-  q = pbuf_alloc(PBUF_IP, sizeof(struct icmp_echo_hdr) + IP_HLEN + ICMP_DEST_UNREACH_DATASIZE,
-                 PBUF_RAM);
-  if (q == NULL) {
-    LWIP_DEBUGF(ICMP_DEBUG, ("icmp_time_exceeded: failed to allocate pbuf for ICMP packet.\n"));
-    MIB2_STATS_INC(mib2.icmpouterrors);
-    return;
-  }
-  LWIP_ASSERT("check that first pbuf can hold icmp message",
-             (q->len >= (sizeof(struct icmp_echo_hdr) + IP_HLEN + ICMP_DEST_UNREACH_DATASIZE)));
-
-  iphdr = (struct ip_hdr *)p->payload;
-  LWIP_DEBUGF(ICMP_DEBUG, ("icmp_time_exceeded from "));
-  ip4_addr_debug_print_val(ICMP_DEBUG, iphdr->src);
-  LWIP_DEBUGF(ICMP_DEBUG, (" to "));
-  ip4_addr_debug_print_val(ICMP_DEBUG, iphdr->dest);
-  LWIP_DEBUGF(ICMP_DEBUG, ("\n"));
-
-  icmphdr = (struct icmp_echo_hdr *)q->payload;
-  icmphdr->type = type;
-  icmphdr->code = code;
-  icmphdr->id = 0;
-  icmphdr->seqno = 0;
-
-  /* copy fields from original packet */
-  SMEMCPY((u8_t *)q->payload + sizeof(struct icmp_echo_hdr), (u8_t *)p->payload,
-          IP_HLEN + ICMP_DEST_UNREACH_DATASIZE);
-
-  ip4_addr_copy(iphdr_src, iphdr->src);
-#ifdef LWIP_HOOK_IP4_ROUTE_SRC
-  {
-    ip4_addr_t iphdr_dst;
-    ip4_addr_copy(iphdr_dst, iphdr->dest);
-    netif = ip4_route_src(&iphdr_src, &iphdr_dst);
-  }
-#else
-  netif = ip4_route(&iphdr_src);
-#endif
-  if (netif != NULL) {
-    /* calculate checksum */
-    icmphdr->chksum = 0;
-#if CHECKSUM_GEN_ICMP
-    IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_ICMP) {
-      icmphdr->chksum = inet_chksum(icmphdr, q->len);
-    }
-#endif
-    ICMP_STATS_INC(icmp.xmit);
-    ip4_output_if(q, NULL, &iphdr_src, ICMP_TTL, 0, IP_PROTO_ICMP, netif);
-  }
-  pbuf_free(q);
-}
-
-#endif /* LWIP_IPV4 && LWIP_ICMP */
diff --git a/components/lwip/core/ipv4/igmp.c b/components/lwip/core/ipv4/igmp.c
deleted file mode 100644 (file)
index 03f3ae3..0000000
+++ /dev/null
@@ -1,827 +0,0 @@
-/**
- * @file
- * IGMP - Internet Group Management Protocol
- *
- */
-
-/*
- * Copyright (c) 2002 CITEL 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. Neither the name of CITEL Technologies Ltd nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY CITEL TECHNOLOGIES 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 CITEL TECHNOLOGIES OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This file is a contribution to the lwIP TCP/IP stack.
- * The Swedish Institute of Computer Science and Adam Dunkels
- * are specifically granted permission to redistribute this
- * source code.
-*/
-
-/*-------------------------------------------------------------
-Note 1)
-Although the rfc requires V1 AND V2 capability
-we will only support v2 since now V1 is very old (August 1989)
-V1 can be added if required
-
-a debug print and statistic have been implemented to
-show this up.
--------------------------------------------------------------
--------------------------------------------------------------
-Note 2)
-A query for a specific group address (as opposed to ALLHOSTS)
-has now been implemented as I am unsure if it is required
-
-a debug print and statistic have been implemented to
-show this up.
--------------------------------------------------------------
--------------------------------------------------------------
-Note 3)
-The router alert rfc 2113 is implemented in outgoing packets
-but not checked rigorously incoming
--------------------------------------------------------------
-Steve Reynolds
-------------------------------------------------------------*/
-
-/*-----------------------------------------------------------------------------
- * RFC 988  - Host extensions for IP multicasting                         - V0
- * RFC 1054 - Host extensions for IP multicasting                         -
- * RFC 1112 - Host extensions for IP multicasting                         - V1
- * RFC 2236 - Internet Group Management Protocol, Version 2               - V2  <- this code is based on this RFC (it's the "de facto" standard)
- * RFC 3376 - Internet Group Management Protocol, Version 3               - V3
- * RFC 4604 - Using Internet Group Management Protocol Version 3...       - V3+
- * RFC 2113 - IP Router Alert Option                                      -
- *----------------------------------------------------------------------------*/
-
-/*-----------------------------------------------------------------------------
- * Includes
- *----------------------------------------------------------------------------*/
-
-#include "lwip/opt.h"
-
-#if LWIP_IPV4 && LWIP_IGMP /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/igmp.h"
-#include "lwip/debug.h"
-#include "lwip/def.h"
-#include "lwip/mem.h"
-#include "lwip/ip.h"
-#include "lwip/inet_chksum.h"
-#include "lwip/netif.h"
-#include "lwip/stats.h"
-
-#include "string.h"
-
-/*
- * IGMP constants
- */
-#define IGMP_TTL                       1
-#define IGMP_MINLEN                    8
-#define ROUTER_ALERT                   0x9404U
-#define ROUTER_ALERTLEN                4
-
-/*
- * IGMP message types, including version number.
- */
-#define IGMP_MEMB_QUERY                0x11 /* Membership query         */
-#define IGMP_V1_MEMB_REPORT            0x12 /* Ver. 1 membership report */
-#define IGMP_V2_MEMB_REPORT            0x16 /* Ver. 2 membership report */
-#define IGMP_LEAVE_GROUP               0x17 /* Leave-group message      */
-
-/* Group  membership states */
-#define IGMP_GROUP_NON_MEMBER          0
-#define IGMP_GROUP_DELAYING_MEMBER     1
-#define IGMP_GROUP_IDLE_MEMBER         2
-
-/**
- * IGMP packet format.
- */
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct igmp_msg {
-  PACK_STRUCT_FLD_8(u8_t         igmp_msgtype);
-  PACK_STRUCT_FLD_8(u8_t         igmp_maxresp);
-  PACK_STRUCT_FIELD(u16_t        igmp_checksum);
-  PACK_STRUCT_FLD_S(ip4_addr_p_t igmp_group_address);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
-
-static struct igmp_group *igmp_lookup_group(struct netif *ifp, const ip4_addr_t *addr);
-static err_t  igmp_remove_group(struct igmp_group *group);
-static void   igmp_timeout( 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);
-static err_t  igmp_ip_output_if(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, struct netif *netif);
-static void   igmp_send(struct igmp_group *group, u8_t type);
-
-
-static struct igmp_group* igmp_group_list;
-static ip4_addr_t     allsystems;
-static ip4_addr_t     allrouters;
-
-
-/**
- * Initialize the IGMP module
- */
-void
-igmp_init(void)
-{
-  LWIP_DEBUGF(IGMP_DEBUG, ("igmp_init: initializing\n"));
-
-  IP4_ADDR(&allsystems, 224, 0, 0, 1);
-  IP4_ADDR(&allrouters, 224, 0, 0, 2);
-}
-
-/**
- * Start IGMP processing on interface
- *
- * @param netif network interface on which start IGMP processing
- */
-err_t
-igmp_start(struct netif *netif)
-{
-  struct igmp_group* group;
-  LWIP_DEBUGF(IGMP_DEBUG, ("igmp_start: starting IGMP processing on if %p\n", (void*)netif));
-  group = igmp_lookup_group(netif, &allsystems);
-
-  if (group != NULL) {
-    group->group_state = IGMP_GROUP_IDLE_MEMBER;
-    group->use++;
-
-    /* Allow the igmp messages at the MAC level */
-    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));
-      netif->igmp_mac_filter(netif, &allsystems, IGMP_ADD_MAC_FILTER);
-    }
-    return ERR_OK;
-  }
-  return ERR_MEM;
-}
-
-/**
- * Stop IGMP processing on interface
- *
- * @param netif network interface on which stop IGMP processing
- */
-err_t
-igmp_stop(struct netif *netif)
-{
-  struct igmp_group *group = igmp_group_list;
-  struct igmp_group *prev  = NULL;
-  struct igmp_group *next;
-
-  /* look for groups joined on this interface further down the list */
-  while (group != NULL) {
-    next = group->next;
-    /* is it a group joined on this interface? */
-    if (group->netif == netif) {
-      /* is it the first group of the list? */
-      if (group == igmp_group_list) {
-        igmp_group_list = next;
-      }
-      /* is there a "previous" group defined? */
-      if (prev != NULL) {
-        prev->next = next;
-      }
-      /* 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));
-        netif->igmp_mac_filter(netif, &(group->group_address), IGMP_DEL_MAC_FILTER);
-      }
-      /* free group */
-      memp_free(MEMP_IGMP_GROUP, group);
-    } else {
-      /* change the "previous" */
-      prev = group;
-    }
-    /* move to "next" */
-    group = next;
-  }
-  return ERR_OK;
-}
-
-/**
- * Report IGMP memberships for this interface
- *
- * @param netif network interface on which report IGMP memberships
- */
-void
-igmp_report_groups(struct netif *netif)
-{
-  struct igmp_group *group = igmp_group_list;
-
-  LWIP_DEBUGF(IGMP_DEBUG, ("igmp_report_groups: sending IGMP reports on if %p\n", (void*)netif));
-
-  while (group != NULL) {
-    if ((group->netif == netif) && (!(ip4_addr_cmp(&(group->group_address), &allsystems)))) {
-      igmp_delaying_member(group, IGMP_JOIN_DELAYING_MEMBER_TMR);
-    }
-    group = group->next;
-  }
-}
-
-/**
- * Search for a group in the global igmp_group_list
- *
- * @param ifp the network interface for which to look
- * @param addr the group ip address to search for
- * @return a struct igmp_group* if the group has been found,
- *         NULL if the group wasn't found.
- */
-struct igmp_group *
-igmp_lookfor_group(struct netif *ifp, const ip4_addr_t *addr)
-{
-  struct igmp_group *group = igmp_group_list;
-
-  while (group != NULL) {
-    if ((group->netif == ifp) && (ip4_addr_cmp(&(group->group_address), addr))) {
-      return group;
-    }
-    group = group->next;
-  }
-
-  /* to be clearer, we return NULL here instead of
-   * 'group' (which is also NULL at this point).
-   */
-  return NULL;
-}
-
-/**
- * Search for a specific igmp group and create a new one if not found-
- *
- * @param ifp the network interface for which to look
- * @param addr the group ip address to search
- * @return a struct igmp_group*,
- *         NULL on memory error.
- */
-struct igmp_group *
-igmp_lookup_group(struct netif *ifp, const ip4_addr_t *addr)
-{
-  struct igmp_group *group;
-  /* Search if the group already exists */
-  group = igmp_lookfor_group(ifp, addr);
-  
-  if (group != NULL) {
-    /* 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) {
-    group->netif              = ifp;
-    ip4_addr_set(&(group->group_address), addr);
-    group->timer              = 0; /* Not running */
-    group->group_state        = IGMP_GROUP_NON_MEMBER;
-    group->last_reporter_flag = 0;
-    group->use                = 0;
-    group->next               = igmp_group_list;
-
-    igmp_group_list = group;
-  }
-
-  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));
-
-  return group;
-}
-
-/**
- * Remove a group in the global igmp_group_list
- *
- * @param group the group to remove from the global igmp_group_list
- * @return ERR_OK if group was removed from the list, an err_t otherwise
- */
-static err_t
-igmp_remove_group(struct igmp_group *group)
-{
-  err_t err = ERR_OK;
-
-  /* Is it the first group? */
-  if (igmp_group_list == group) {
-    igmp_group_list = group->next;
-  } else {
-    /* look for group further down the list */
-    struct igmp_group *tmpGroup;
-    for (tmpGroup = igmp_group_list; tmpGroup != NULL; tmpGroup = tmpGroup->next) {
-      if (tmpGroup->next == group) {
-        tmpGroup->next = group->next;
-        break;
-      }
-    }
-    /* Group not found in the global igmp_group_list */
-    if (tmpGroup == NULL) {
-      err = ERR_ARG;
-    }
-  }
-  /* free group */
-  memp_free(MEMP_IGMP_GROUP, group);
-
-  return err;
-}
-
-/**
- * Called from ip_input() if a new IGMP packet is received.
- *
- * @param p received igmp packet, p->payload pointing to the igmp header
- * @param inp network interface on which the packet was received
- * @param dest destination ip address of the igmp packet
- */
-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;
-
-  IGMP_STATS_INC(igmp.recv);
-
-  /* Note that the length CAN be greater than 8 but only 8 are used - All are included in the checksum */
-  if (p->len < IGMP_MINLEN) {
-    pbuf_free(p);
-    IGMP_STATS_INC(igmp.lenerr);
-    LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: length error\n"));
-    return;
-  }
-
-  LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: message from "));
-  ip4_addr_debug_print(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));
-
-  /* Now calculate and check the checksum */
-  igmp = (struct igmp_msg *)p->payload;
-  if (inet_chksum(igmp, p->len)) {
-    pbuf_free(p);
-    IGMP_STATS_INC(igmp.chkerr);
-    LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: checksum error\n"));
-    return;
-  }
-
-  /* Packet is ok so find an existing group */
-  group = igmp_lookfor_group(inp, dest); /* use the destination IP address of incoming packet */
-
-  /* If group can be found or create... */
-  if (!group) {
-    pbuf_free(p);
-    IGMP_STATS_INC(igmp.drop);
-    LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: IGMP frame not for us\n"));
-    return;
-  }
-
-  /* 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)));
-
-      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 = igmp_group_list;
-      while (groupref) {
-        /* Do not send messages on the all systems group address! */
-        if ((groupref->netif == inp) && (!(ip4_addr_cmp(&(groupref->group_address), &allsystems)))) {
-          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);
-        } 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*)group->netif));
-    IGMP_STATS_INC(igmp.proterr);
-    break;
-  }
-
-  pbuf_free(p);
-  return;
-}
-
-/**
- * Join a group on one network interface.
- *
- * @param ifaddr ip address of the network interface which should join a new group
- * @param groupaddr the ip address of the group which to join
- * @return ERR_OK if group was joined on the netif(s), an err_t otherwise
- */
-err_t
-igmp_joingroup(const ip4_addr_t *ifaddr, const ip4_addr_t *groupaddr)
-{
-  err_t err = ERR_VAL; /* no matching interface */
-  struct netif *netif;
-
-  /* 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) {
-    /* 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);
-      if (err != ERR_OK) {
-        /* Return an error even if some network interfaces are joined */
-        /** @todo undo any other netif already joined */
-        return err;
-      }
-    }
-    /* proceed to next network interface */
-    netif = netif->next;
-  }
-
-  return err;
-}
-
-/**
- * Join a group on one network interface.
- *
- * @param netif the network interface which should join a new group
- * @param groupaddr the ip address of the group which to join
- * @return ERR_OK if group was joined on the netif, an err_t otherwise
- */
-err_t
-igmp_joingroup_netif(struct netif *netif, const ip4_addr_t *groupaddr)
-{
-  struct igmp_group *group;
-
-  /* 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;);
-
-  /* make sure it is an igmp-enabled netif */
-  LWIP_ERROR("igmp_joingroup_netif: attempt to join on non-IGMP netif", netif->flags & NETIF_FLAG_IGMP, return ERR_VAL;);
-
-  /* find group or create a new one if not found */
-  group = igmp_lookup_group(netif, groupaddr);
-
-  if (group != NULL) {
-    /* This should create a new group, check the state to make sure */
-    if (group->group_state != IGMP_GROUP_NON_MEMBER) {
-      LWIP_DEBUGF(IGMP_DEBUG, ("igmp_joingroup_netif: join to group not in state IGMP_GROUP_NON_MEMBER\n"));
-    } else {
-      /* OK - it was new group */
-      LWIP_DEBUGF(IGMP_DEBUG, ("igmp_joingroup_netif: join to new group: "));
-      ip4_addr_debug_print(IGMP_DEBUG, groupaddr);
-      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)) {
-        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));
-        netif->igmp_mac_filter(netif, groupaddr, IGMP_ADD_MAC_FILTER);
-      }
-
-      IGMP_STATS_INC(igmp.tx_join);
-      igmp_send(group, IGMP_V2_MEMB_REPORT);
-
-      igmp_start_timer(group, IGMP_JOIN_DELAYING_MEMBER_TMR);
-
-      /* Need to work out where this timer comes from */
-      group->group_state = IGMP_GROUP_DELAYING_MEMBER;
-    }
-    /* Increment group use */
-    group->use++;
-    /* Join on this interface */
-    return ERR_OK;
-  } else {
-    LWIP_DEBUGF(IGMP_DEBUG, ("igmp_joingroup_netif: Not enough memory to join to group\n"));
-    return ERR_MEM;
-  }
-}
-
-/**
- * Leave a group on one network interface.
- *
- * @param ifaddr ip address of the network interface which should leave a group
- * @param groupaddr the ip address of the group which to leave
- * @return ERR_OK if group was left on the netif(s), an err_t otherwise
- */
-err_t
-igmp_leavegroup(const ip4_addr_t *ifaddr, const ip4_addr_t *groupaddr)
-{
-  err_t err = ERR_VAL; /* no matching interface */
-  struct netif *netif;
-
-  /* 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) {
-    /* 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);
-      if (err != ERR_OK) {
-        /* Store this result if we have not yet gotten a success */
-        err = res;
-      }
-    }
-    /* proceed to next network interface */
-    netif = netif->next;
-  }
-
-  return err;
-}
-
-/**
- * Leave a group on one network interface.
- *
- * @param netif the network interface which should leave a group
- * @param groupaddr the ip address of the group which to leave
- * @return ERR_OK if group was left on the netif, an err_t otherwise
- */
-err_t
-igmp_leavegroup_netif(struct netif *netif, const ip4_addr_t *groupaddr)
-{
-  struct igmp_group *group;
-
-  /* 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;);
-
-  /* make sure it is an igmp-enabled netif */
-  LWIP_ERROR("igmp_leavegroup_netif: attempt to leave on non-IGMP netif", netif->flags & NETIF_FLAG_IGMP, return ERR_VAL;);
-
-  /* find group */
-  group = igmp_lookfor_group(netif, groupaddr);
-
-  if (group != NULL) {
-    /* Only send a leave if the flag is set according to the state diagram */
-    LWIP_DEBUGF(IGMP_DEBUG, ("igmp_leavegroup_netif: Leaving group: "));
-    ip4_addr_debug_print(IGMP_DEBUG, groupaddr);
-    LWIP_DEBUGF(IGMP_DEBUG, ("\n"));
-
-    /* If there is no other use of the group */
-    if (group->use <= 1) {
-      /* If we are the last reporter for this group */
-      if (group->last_reporter_flag) {
-        LWIP_DEBUGF(IGMP_DEBUG, ("igmp_leavegroup_netif: sending leaving group\n"));
-        IGMP_STATS_INC(igmp.tx_leave);
-        igmp_send(group, IGMP_LEAVE_GROUP);
-      }
-
-      /* Disable the group at the MAC level */
-      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));
-        netif->igmp_mac_filter(netif, groupaddr, IGMP_DEL_MAC_FILTER);
-      }
-
-      LWIP_DEBUGF(IGMP_DEBUG, ("igmp_leavegroup_netif: remove group: "));
-      ip4_addr_debug_print(IGMP_DEBUG, groupaddr);
-      LWIP_DEBUGF(IGMP_DEBUG, ("\n"));
-
-      /* Free the group */
-      igmp_remove_group(group);
-    } else {
-      /* Decrement group use */
-      group->use--;
-    }
-    return ERR_OK;
-  } else {
-    LWIP_DEBUGF(IGMP_DEBUG, ("igmp_leavegroup_netif: not member of group\n"));
-    return ERR_VAL;
-  }
-}
-
-/**
- * The igmp timer function (both for NO_SYS=1 and =0)
- * Should be called every IGMP_TMR_INTERVAL milliseconds (100 ms is default).
- */
-void
-igmp_tmr(void)
-{
-  struct igmp_group *group = igmp_group_list;
-
-  while (group != NULL) {
-    if (group->timer > 0) {
-      group->timer--;
-      if (group->timer == 0) {
-        igmp_timeout(group);
-      }
-    }
-    group = group->next;
-  }
-}
-
-/**
- * Called if a timeout for one group is reached.
- * Sends a report for this group.
- *
- * @param group an igmp_group for which a timeout is reached
- */
-static void
-igmp_timeout(struct igmp_group *group)
-{
-  /* If the state is IGMP_GROUP_DELAYING_MEMBER then we send a report for this group
-     (unless it is the allsystems group) */
-  if ((group->group_state == IGMP_GROUP_DELAYING_MEMBER) &&
-      (!(ip4_addr_cmp(&(group->group_address), &allsystems)))) {
-    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*)group->netif));
-
-    IGMP_STATS_INC(igmp.tx_report);
-    igmp_send(group, IGMP_V2_MEMB_REPORT);
-  }
-}
-
-/**
- * Start a timer for an igmp group
- *
- * @param group the igmp_group for which to start a timer
- * @param max_time the time in multiples of IGMP_TMR_INTERVAL (decrease with
- *        every call to igmp_tmr())
- */
-static void
-igmp_start_timer(struct igmp_group *group, u8_t max_time)
-{
-#ifdef LWIP_RAND
-  group->timer = max_time > 2 ? (LWIP_RAND() % max_time) : 1;
-#else /* LWIP_RAND */
-  /* ATTENTION: use this only if absolutely necessary! */
-  group->timer = max_time / 2;
-#endif /* LWIP_RAND */
-
-  if (group->timer == 0) {
-    group->timer = 1;
-  }
-}
-
-/**
- * Delaying membership report for a group if necessary
- *
- * @param group the igmp_group for which "delaying" membership report
- * @param maxresp query delay
- */
-static void
-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)))) {
-    igmp_start_timer(group, maxresp);
-    group->group_state = IGMP_GROUP_DELAYING_MEMBER;
-  }
-}
-
-
-/**
- * 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.
- *
- * @param p the packet to send (p->payload points to the data, e.g. next
-            protocol header; if dest == IP_HDRINCL, p already includes an IP
-            header and p->payload points to that IP header)
- * @param src the source IP address to send from (if src == IP_ADDR_ANY, the
- *         IP  address of the netif used to send is used as source address)
- * @param dest the destination IP address to send the packet to
- * @param ttl the TTL value to be set in the IP header
- * @param proto the PROTOCOL to be set in the IP 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 IP/LINK headers
- *         returns errors returned by netif->output
- */
-static err_t
-igmp_ip_output_if(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, struct netif *netif)
-{
-  /* This is the "router alert" option */
-  u16_t ra[2];
-  ra[0] = PP_HTONS(ROUTER_ALERT);
-  ra[1] = 0x0000; /* Router shall examine packet */
-  IGMP_STATS_INC(igmp.xmit);
-  return ip4_output_if_opt(p, src, dest, IGMP_TTL, 0, IP_PROTO_IGMP, netif, ra, ROUTER_ALERTLEN);
-}
-
-/**
- * Send an igmp packet to a specific group.
- *
- * @param group the group to which to send the packet
- * @param type the type of igmp packet to send
- */
-static void
-igmp_send(struct igmp_group *group, u8_t type)
-{
-  struct pbuf*     p    = NULL;
-  struct igmp_msg* igmp = NULL;
-  ip4_addr_t   src  = *IP4_ADDR_ANY;
-  ip4_addr_t*  dest = NULL;
-
-  /* IP header + "router alert" option + IGMP header */
-  p = pbuf_alloc(PBUF_TRANSPORT, IGMP_MINLEN, PBUF_RAM);
-
-  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)));
-    ip4_addr_copy(src, *netif_ip4_addr(group->netif));
-
-    if (type == IGMP_V2_MEMB_REPORT) {
-      dest = &(group->group_address);
-      ip4_addr_copy(igmp->igmp_group_address, group->group_address);
-      group->last_reporter_flag = 1; /* Remember we were the last to report */
-    } else {
-      if (type == IGMP_LEAVE_GROUP) {
-        dest = &allrouters;
-        ip4_addr_copy(igmp->igmp_group_address, group->group_address);
-      }
-    }
-
-    if ((type == IGMP_V2_MEMB_REPORT) || (type == IGMP_LEAVE_GROUP)) {
-      igmp->igmp_msgtype  = type;
-      igmp->igmp_maxresp  = 0;
-      igmp->igmp_checksum = 0;
-      igmp->igmp_checksum = inet_chksum(igmp, IGMP_MINLEN);
-
-      igmp_ip_output_if(p, &src, dest, group->netif);
-    }
-
-    pbuf_free(p);
-  } else {
-    LWIP_DEBUGF(IGMP_DEBUG, ("igmp_send: not enough memory for igmp_send\n"));
-    IGMP_STATS_INC(igmp.memerr);
-  }
-}
-
-#endif /* LWIP_IPV4 && LWIP_IGMP */
diff --git a/components/lwip/core/ipv4/ip4.c b/components/lwip/core/ipv4/ip4.c
deleted file mode 100644 (file)
index 3b05faf..0000000
+++ /dev/null
@@ -1,1111 +0,0 @@
-/**
- * @file
- * This is the IPv4 layer implementation for incoming and outgoing IP traffic.
- *
- * @see ip_frag.c
- *
- */
-
-/*
- * 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>
- *
- */
-
-#include "lwip/opt.h"
-
-#if LWIP_IPV4
-
-#include "lwip/ip.h"
-#include "lwip/def.h"
-#include "lwip/mem.h"
-#include "lwip/ip_frag.h"
-#include "lwip/inet_chksum.h"
-#include "lwip/netif.h"
-#include "lwip/icmp.h"
-#include "lwip/igmp.h"
-#include "lwip/raw.h"
-#include "lwip/udp.h"
-#include "lwip/priv/tcp_priv.h"
-#include "lwip/dhcp.h"
-#include "lwip/autoip.h"
-#include "lwip/stats.h"
-
-#include <string.h>
-
-/** 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). */
-#ifndef LWIP_INLINE_IP_CHKSUM
-#if LWIP_CHECKSUM_CTRL_PER_NETIF
-#define LWIP_INLINE_IP_CHKSUM   0
-#else /* LWIP_CHECKSUM_CTRL_PER_NETIF */
-#define LWIP_INLINE_IP_CHKSUM   1
-#endif /* LWIP_CHECKSUM_CTRL_PER_NETIF */
-#endif
-
-#if LWIP_INLINE_IP_CHKSUM && CHECKSUM_GEN_IP
-#define CHECKSUM_GEN_IP_INLINE  1
-#else
-#define CHECKSUM_GEN_IP_INLINE  0
-#endif
-
-#if LWIP_DHCP || defined(LWIP_IP_ACCEPT_UDP_PORT)
-#define IP_ACCEPT_LINK_LAYER_ADDRESSING 1
-
-/** 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.
- */
-#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)) \
-         || (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))
-#endif /* LWIP_DHCP && defined(LWIP_IP_ACCEPT_UDP_PORT) */
-
-#else /* LWIP_DHCP */
-#define IP_ACCEPT_LINK_LAYER_ADDRESSING 0
-#endif /* LWIP_DHCP */
-
-/** The IP header ID of the next outgoing IP packet */
-static u16_t ip_id;
-
-#if LWIP_MULTICAST_TX_OPTIONS
-/** The default netif used for multicast */
-static struct netif* ip4_default_multicast_netif;
-
-/** Set a default netif for IPv4 multicast. */
-void
-ip4_set_default_multicast_netif(struct netif* default_multicast_netif)
-{
-  ip4_default_multicast_netif = default_multicast_netif;
-}
-#endif /* LWIP_MULTICAST_TX_OPTIONS */
-
-#ifdef LWIP_HOOK_IP4_ROUTE_SRC
-bool ip4_netif_exist(const ip4_addr_t *src, const ip4_addr_t *dest)
-{
-  struct netif *netif = NULL;
-  
-  for (netif = netif_list; netif != NULL; netif = netif->next) {
-    /* 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))) {
-      /* source netif and dest netif match? */
-      if (ip4_addr_netcmp(src, netif_ip4_addr(netif), netif_ip4_netmask(netif)) || ip4_addr_netcmp(dest, netif_ip4_addr(netif), netif_ip4_netmask(netif))) {
-        /* return false when both netif don't match */
-        return true;
-      }
-    }
-  }
-
-  return false;
-}
-/**
- * Source based IPv4 routing hook function. 
- */
-struct netif * ESP_IRAM_ATTR
-ip4_route_src_hook(const ip4_addr_t *dest, const ip4_addr_t *src)
-{
-  struct netif *netif = NULL;
-
-  if ((src != NULL) && !ip4_addr_isany(src)) {
-    /* iterate through netifs */
-    for (netif = netif_list; netif != NULL; netif = netif->next) {
-      /* 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))) {
-        /* source IP matches? */
-        if (ip4_addr_cmp(src, netif_ip4_addr(netif))) {
-          /* return netif on which to forward IP packet */
-          return netif;
-        }
-      }
-    }
-  }
-  return netif;
-}
-
-/**
- * Source based IPv4 routing must be fully implemented in
- * LWIP_HOOK_IP4_ROUTE_SRC(). This function only provides the parameters.
- */
-struct netif * ESP_IRAM_ATTR
-ip4_route_src(const ip4_addr_t *dest, const ip4_addr_t *src)
-{
-  if (src != NULL) {
-    if (!ip4_addr_isany(src) && (ip4_netif_exist(src,dest) == false)) {
-      return NULL;
-    }
-    /* when src==NULL, the hook is called from ip4_route(dest) */
-    struct netif *netif = LWIP_HOOK_IP4_ROUTE_SRC(dest, src);
-    if (netif != NULL) {
-      return netif;
-    }
-  }
-
-  return ip4_route(dest);
-}
-#endif /* LWIP_HOOK_IP4_ROUTE_SRC */
-
-/**
- * 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.
- *
- * @param dest the destination IP address for which to find the route
- * @return the netif on which to send to reach dest
- */
-struct netif * ESP_IRAM_ATTR
-ip4_route(const ip4_addr_t *dest)
-{
-  struct netif *netif;
-
-#if LWIP_MULTICAST_TX_OPTIONS
-  /* Use administratively selected interface for multicast by default */
-  if (ip4_addr_ismulticast(dest) && ip4_default_multicast_netif) {
-    return ip4_default_multicast_netif;
-  }
-#endif /* LWIP_MULTICAST_TX_OPTIONS */
-
-  /* iterate through netifs */
-  for (netif = netif_list; netif != NULL; netif = netif->next) {
-    /* is the netif up, does it have a link and a valid address? */
-    if (netif_is_up(netif) && netif_is_link_up(netif) && !ip4_addr_isany_val(*netif_ip4_addr(netif))) {
-      /* network mask matches? */
-      if (ip4_addr_netcmp(dest, netif_ip4_addr(netif), netif_ip4_netmask(netif))) {
-        /* return netif on which to forward IP packet */
-        return netif;
-      }
-      /* gateway matches on a non broadcast interface? (i.e. peer in a point to point interface) */
-      if (((netif->flags & NETIF_FLAG_BROADCAST) == 0) && ip4_addr_cmp(dest, netif_ip4_gw(netif))) {
-        /* return netif on which to forward IP packet */
-        return netif;
-      }
-    }
-  }
-#if LWIP_NETIF_LOOPBACK && !LWIP_HAVE_LOOPIF
-  /* loopif is disabled, looopback traffic is passed through any netif */
-  if (ip4_addr_isloopback(dest)) {
-    /* don't check for link on loopback traffic */
-    if (netif_is_up(netif_default)) {
-      return netif_default;
-    }
-    /* default netif is not up, just use any netif for loopback traffic */
-    for (netif = netif_list; netif != NULL; netif = netif->next) {
-      if (netif_is_up(netif)) {
-        return netif;
-      }
-    }
-    return NULL;
-  }
-#endif /* LWIP_NETIF_LOOPBACK && !LWIP_HAVE_LOOPIF */
-
-#ifdef LWIP_HOOK_IP4_ROUTE_SRC
-  netif = LWIP_HOOK_IP4_ROUTE_SRC(dest, NULL);
-  if (netif != NULL) {
-    return netif;
-  }
-#elif defined(LWIP_HOOK_IP4_ROUTE)
-  netif = LWIP_HOOK_IP4_ROUTE(dest);
-  if (netif != NULL) {
-    return netif;
-  }
-#endif
-
-  if ((netif_default == NULL) || !netif_is_up(netif_default) || !netif_is_link_up(netif_default) ||
-      ip4_addr_isany_val(*netif_ip4_addr(netif_default))) {
-    /* 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)));
-    IP_STATS_INC(ip.rterr);
-    MIB2_STATS_INC(mib2.ipoutnoroutes);
-    return NULL;
-  }
-
-  return netif_default;
-}
-
-#if IP_FORWARD
-/**
- * Determine whether an IP address is in a reserved set of addresses
- * that may not be forwarded, or whether datagrams to that destination
- * may be forwarded.
- * @param p the packet to forward
- * @param dest the destination IP address
- * @return 1: can forward 0: discard
- */
-static int
-ip4_canforward(struct pbuf *p)
-{
-  u32_t addr = htonl(ip4_addr_get_u32(ip4_current_dest_addr()));
-
-  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 */
-    return 0;
-  }
-  if (IP_EXPERIMENTAL(addr)) {
-    return 0;
-  }
-  if (IP_CLASSA(addr)) {
-    u32_t net = addr & IP_CLASSA_NET;
-    if ((net == 0) || (net == ((u32_t)IP_LOOPBACKNET << IP_CLASSA_NSHIFT))) {
-      /* don't route loopback packets */
-      return 0;
-    }
-  }
-  return 1;
-}
-
-/**
- * Forwards an IP packet. It finds an appropriate route for the
- * packet, decrements the TTL value of the packet, adjusts the
- * checksum and outputs the packet on the appropriate interface.
- *
- * @param p the packet to forward (p->payload points to IP header)
- * @param iphdr the IP header of the input packet
- * @param inp the netif on which this packet was received
- */
-static void
-ip4_forward(struct pbuf *p, struct ip_hdr *iphdr, struct netif *inp)
-{
-  struct netif *netif;
-
-  PERF_START;
-
-  if (!ip4_canforward(p)) {
-    goto return_noroute;
-  }
-
-  /* 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())));
-    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());
-  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())));
-    /* @todo: send ICMP_DUR_NET? */
-    goto return_noroute;
-  }
-#if !IP_FORWARD_ALLOW_TX_ON_RX_NETIF
-  /* Do not forward packets onto the same network interface on which
-   * they arrived. */
-  if (netif == inp) {
-    LWIP_DEBUGF(IP_DEBUG, ("ip4_forward: not bouncing packets back on incoming interface.\n"));
-    goto return_noroute;
-  }
-#endif /* IP_FORWARD_ALLOW_TX_ON_RX_NETIF */
-
-  /* decrement TTL */
-  IPH_TTL_SET(iphdr, IPH_TTL(iphdr) - 1);
-  /* send ICMP if TTL == 0 */
-  if (IPH_TTL(iphdr) == 0) {
-    MIB2_STATS_INC(mib2.ipinhdrerrors);
-#if LWIP_ICMP
-    /* Don't send ICMP messages in response to ICMP messages */
-    if (IPH_PROTO(iphdr) != IP_PROTO_ICMP) {
-      icmp_time_exceeded(p, ICMP_TE_TTL);
-    }
-#endif /* LWIP_ICMP */
-    return;
-  }
-
-  /* Incrementally update the IP checksum. */
-  if (IPH_CHKSUM(iphdr) >= PP_HTONS(0xffffU - 0x100)) {
-    IPH_CHKSUM_SET(iphdr, IPH_CHKSUM(iphdr) + PP_HTONS(0x100) + 1);
-  } else {
-    IPH_CHKSUM_SET(iphdr, 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())));
-
-  IP_STATS_INC(ip.fw);
-  MIB2_STATS_INC(mib2.ipforwdatagrams);
-  IP_STATS_INC(ip.xmit);
-
-  PERF_STOP("ip4_forward");
-  /* don't fragment if interface has mtu set to 0 [loopif] */
-  if (netif->mtu && (p->tot_len > netif->mtu)) {
-    if ((IPH_OFFSET(iphdr) & PP_NTOHS(IP_DF)) == 0) {
-#if IP_FRAG
-      ip4_frag(p, netif, ip4_current_dest_addr());
-#else /* IP_FRAG */
-      /* @todo: send ICMP Destination Unreachable code 13 "Communication administratively prohibited"? */
-#endif /* IP_FRAG */
-    } else {
-#if LWIP_ICMP
-      /* send ICMP Destination Unreachable code 4: "Fragmentation Needed and DF Set" */
-      icmp_dest_unreach(p, ICMP_DUR_FRAG);
-#endif /* LWIP_ICMP */
-    }
-    return;
-  }
-  /* transmit pbuf on chosen interface */
-  netif->output(netif, p, ip4_current_dest_addr());
-  return;
-return_noroute:
-  MIB2_STATS_INC(mib2.ipoutnoroutes);
-}
-#endif /* IP_FORWARD */
-
-/**
- * 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.
- *
- * Finally, the packet is sent to the upper layer protocol input function.
- *
- * @param p the received IP packet (p->payload points to IP header)
- * @param inp the netif on which this packet was received
- * @return ERR_OK if the packet was processed (could return ERR_* if it wasn't
- *         processed, but currently always returns ERR_OK)
- */
-err_t ESP_IRAM_ATTR
-ip4_input(struct pbuf *p, struct netif *inp)
-{
-  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 */
-
-  IP_STATS_INC(ip.recv);
-  MIB2_STATS_INC(mib2.ipinreceives);
-
-  /* identify the IP header */
-  iphdr = (struct ip_hdr *)p->payload;
-  if (IPH_V(iphdr) != 4) {
-    LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_WARNING, ("IP packet dropped due to bad version number %"U16_F"\n", IPH_V(iphdr)));
-    ip4_debug_print(p);
-    pbuf_free(p);
-    IP_STATS_INC(ip.err);
-    IP_STATS_INC(ip.drop);
-    MIB2_STATS_INC(mib2.ipinhdrerrors);
-    return ERR_OK;
-  }
-
-#ifdef LWIP_HOOK_IP4_INPUT
-  if (LWIP_HOOK_IP4_INPUT(p, inp)) {
-    /* the packet has been eaten */
-    return ERR_OK;
-  }
-#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 length in bytes */
-  iphdr_len = ntohs(IPH_LEN(iphdr));
-
-  /* Trim pbuf. This is especially required for packets < 60 bytes. */
-  if (iphdr_len < p->tot_len) {
-    pbuf_realloc(p, iphdr_len);
-  }
-
-  /* header length exceeds first pbuf length, or ip length exceeds total pbuf length? */
-  if ((iphdr_hlen > p->len) || (iphdr_len > p->tot_len)) {
-    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));
-    }
-    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));
-    }
-    /* free (drop) packet pbufs */
-    pbuf_free(p);
-    IP_STATS_INC(ip.lenerr);
-    IP_STATS_INC(ip.drop);
-    MIB2_STATS_INC(mib2.ipindiscards);
-    return ERR_OK;
-  }
-
-  /* verify checksum */
-#if CHECKSUM_CHECK_IP
-  IF__NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_CHECK_IP) {
-    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)));
-      ip4_debug_print(p);
-      pbuf_free(p);
-      IP_STATS_INC(ip.chkerr);
-      IP_STATS_INC(ip.drop);
-      MIB2_STATS_INC(mib2.ipinhdrerrors);
-      return ERR_OK;
-    }
-  }
-#endif
-
-  /* copy IP addresses to aligned ip_addr_t */
-  ip_addr_copy_from_ip4(ip_data.current_iphdr_dest, iphdr->dest);
-  ip_addr_copy_from_ip4(ip_data.current_iphdr_src, iphdr->src);
-
-  /* match packet against an interface, i.e. is this packet for us? */
-  if (ip4_addr_ismulticast(ip4_current_dest_addr())) {
-#if LWIP_IGMP
-    if ((inp->flags & NETIF_FLAG_IGMP) && (igmp_lookfor_group(inp, ip4_current_dest_addr()))) {
-      /* IGMP snooping switches need 0.0.0.0 to be allowed as source address (RFC 4541) */
-      ip4_addr_t allsystems;
-      IP4_ADDR(&allsystems, 224, 0, 0, 1);
-      if (ip4_addr_cmp(ip4_current_dest_addr(), &allsystems) &&
-          ip4_addr_isany(ip4_current_src_addr())) {
-        check_ip_src = 0;
-      }
-      netif = inp;
-    } else {
-      netif = NULL;
-    }
-#else /* LWIP_IGMP */
-    if ((netif_is_up(inp)) && (!ip4_addr_isany_val(*netif_ip4_addr(inp)))) {
-      netif = inp;
-    } else {
-      netif = NULL;
-    }
-#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 ((netif->autoip != NULL) &&
-            ip4_addr_cmp(ip4_current_dest_addr(), &(netif->autoip->llipaddr))) {
-          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) {
-        first = 0;
-        netif = netif_list;
-      } else {
-        netif = netif->next;
-      }
-      if (netif == inp) {
-        netif = netif->next;
-      }
-    } while (netif != NULL);
-  }
-
-#if IP_ACCEPT_LINK_LAYER_ADDRESSING
-  /* Pass DHCP messages regardless of destination address. DHCP traffic is addressed
-   * using link layer addressing (such as Ethernet MAC) so we must not filter on IP.
-   * According to RFC 1542 section 3.1.1, referred by RFC 2131).
-   *
-   * If you want to accept private broadcast communication while a netif is down,
-   * define LWIP_IP_ACCEPT_UDP_PORT(dst_port), e.g.:
-   *
-   * #define LWIP_IP_ACCEPT_UDP_PORT(dst_port) ((dst_port) == PP_NTOHS(12345))
-   */
-  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);
-      LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip4_input: UDP packet to DHCP client port %"U16_F"\n",
-        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;
-        check_ip_src = 0;
-      }
-    }
-  }
-#endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */
-
-  /* broadcast or multicast packet source address? Compliant with RFC 1122: 3.2.1.3 */
-#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) */
-      && !ip4_addr_isany_val(*ip4_current_src_addr())
-#endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */
-     )
-#endif /* LWIP_IGMP || IP_ACCEPT_LINK_LAYER_ADDRESSING */
-  {
-    if ((ip4_addr_isbroadcast(ip4_current_src_addr(), inp)) ||
-        (ip4_addr_ismulticast(ip4_current_src_addr()))) {
-      /* packet source is not valid */
-      LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("ip4_input: packet source is not valid.\n"));
-      /* free (drop) packet pbufs */
-      pbuf_free(p);
-      IP_STATS_INC(ip.drop);
-      MIB2_STATS_INC(mib2.ipinaddrerrors);
-      MIB2_STATS_INC(mib2.ipindiscards);
-      return ERR_OK;
-    }
-  }
-
-  /* packet not for us? */
-  if (netif == NULL) {
-    /* packet not for us, route or discard */
-    LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip4_input: packet not for us.\n"));
-#if IP_FORWARD
-    /* 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);
-    } else
-#endif /* IP_FORWARD */
-    {
-      MIB2_STATS_INC(mib2.ipinaddrerrors);
-      MIB2_STATS_INC(mib2.ipindiscards);
-    }
-    pbuf_free(p);
-    return ERR_OK;
-  }
-  /* packet consists of multiple fragments? */
-  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",
-      ntohs(IPH_ID(iphdr)), p->tot_len, ntohs(IPH_LEN(iphdr)), !!(IPH_OFFSET(iphdr) & PP_HTONS(IP_MF)), (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;
-#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",
-      ntohs(IPH_OFFSET(iphdr))));
-    IP_STATS_INC(ip.opterr);
-    IP_STATS_INC(ip.drop);
-    /* unsupported protocol feature */
-    MIB2_STATS_INC(mib2.ipinunknownprotos);
-    return ERR_OK;
-#endif /* IP_REASSEMBLY */
-  }
-
-#if IP_OPTIONS_ALLOWED == 0 /* no support for IP options in the IP header? */
-
-#if LWIP_IGMP
-  /* there is an extra "router alert" option in IGMP messages which we allow for but do not police */
-  if ((iphdr_hlen > IP_HLEN) &&  (IPH_PROTO(iphdr) != IP_PROTO_IGMP)) {
-#else
-  if (iphdr_hlen > IP_HLEN) {
-#endif /* LWIP_IGMP */
-    LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("IP packet dropped since there were IP options (while IP_OPTIONS_ALLOWED == 0).\n"));
-    pbuf_free(p);
-    IP_STATS_INC(ip.opterr);
-    IP_STATS_INC(ip.drop);
-    /* unsupported protocol feature */
-    MIB2_STATS_INC(mib2.ipinunknownprotos);
-    return ERR_OK;
-  }
-#endif /* IP_OPTIONS_ALLOWED == 0 */
-
-  /* send to upper layers */
-  LWIP_DEBUGF(IP_DEBUG, ("ip4_input: \n"));
-  ip4_debug_print(p);
-  LWIP_DEBUGF(IP_DEBUG, ("ip4_input: p->len %"U16_F" p->tot_len %"U16_F"\n", p->len, p->tot_len));
-
-  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;
-
-#if LWIP_RAW
-  /* raw input did not eat the packet? */
-  if (raw_input(p, inp) == 0)
-#endif /* LWIP_RAW */
-  {
-    pbuf_header(p, -(s16_t)iphdr_hlen); /* Move to payload, no check necessary. */
-
-    switch (IPH_PROTO(iphdr)) {
-#if LWIP_UDP
-    case IP_PROTO_UDP:
-#if LWIP_UDPLITE
-    case IP_PROTO_UDPLITE:
-#endif /* LWIP_UDPLITE */
-      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;
-#endif /* LWIP_TCP */
-#if LWIP_ICMP
-    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;
-#endif /* LWIP_IGMP */
-    default:
-#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);
-      }
-#endif /* LWIP_ICMP */
-      pbuf_free(p);
-
-      LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("Unsupported transport protocol %"U16_F"\n", IPH_PROTO(iphdr)));
-
-      IP_STATS_INC(ip.proterr);
-      IP_STATS_INC(ip.drop);
-      MIB2_STATS_INC(mib2.ipinunknownprotos);
-    }
-  }
-
-  /* @todo: this is not really necessary... */
-  ip_data.current_netif = NULL;
-  ip_data.current_input_netif = NULL;
-  ip_data.current_ip4_header = NULL;
-  ip_data.current_ip_header_tot_len = 0;
-  ip4_addr_set_any(ip4_current_src_addr());
-  ip4_addr_set_any(ip4_current_dest_addr());
-
-  return ERR_OK;
-}
-
-/**
- * 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 IP_HDRINCL, p is assumed to already
- * include an IP header and p->payload points to it instead of the data.
- *
- * @param p the packet to send (p->payload points to the data, e.g. next
-            protocol header; if dest == IP_HDRINCL, p already includes an IP
-            header and p->payload points to that IP header)
- * @param src the source IP address to send from (if src == IP_ADDR_ANY, the
- *         IP  address of the netif used to send is used as source address)
- * @param dest the destination IP address to send the packet to
- * @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 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 IP/LINK headers
- *         returns errors returned by netif->output
- *
- * @note ip_id: RFC791 "some host may be able to simply use
- *  unique identifiers independent of destination"
- */
-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)
-{
-#if IP_OPTIONS_SEND
-  return ip4_output_if_opt(p, src, dest, ttl, tos, proto, netif, NULL, 0);
-}
-
-/**
- * Same as ip_output_if() but with the possibility to include IP options:
- *
- * @ param ip_options pointer to the IP options, copied into the IP header
- * @ param optlen length of ip_options
- */
-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)
-{
-#endif /* IP_OPTIONS_SEND */
-  const ip4_addr_t *src_used = src;
-  if (dest != IP_HDRINCL) {
-    if (ip4_addr_isany(src)) {
-      src_used = netif_ip4_addr(netif);
-    }
-  }
-
-#if IP_OPTIONS_SEND
-  return ip4_output_if_opt_src(p, src_used, dest, ttl, tos, proto, netif,
-    ip_options, optlen);
-#else /* IP_OPTIONS_SEND */
-  return ip4_output_if_src(p, src_used, dest, ttl, tos, proto, netif);
-#endif /* IP_OPTIONS_SEND */
-}
-
-/**
- * Same as ip_output_if() but 'src' address is not replaced by netif address
- * when it is 'any'.
- */
-err_t ESP_IRAM_ATTR
-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 IP_OPTIONS_SEND
-  return ip4_output_if_opt_src(p, src, dest, ttl, tos, proto, netif, NULL, 0);
-}
-
-/**
- * Same as ip_output_if_opt() but 'src' address is not replaced by netif address
- * when it is 'any'.
- */
-err_t ESP_IRAM_ATTR
-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)
-{
-#endif /* IP_OPTIONS_SEND */
-  struct ip_hdr *iphdr;
-  ip4_addr_t dest_addr;
-#if CHECKSUM_GEN_IP_INLINE
-  u32_t chk_sum = 0;
-#endif /* CHECKSUM_GEN_IP_INLINE */
-
-  LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX(p);
-
-  MIB2_STATS_INC(mib2.ipoutrequests);
-
-  /* Should the IP header be generated or is it already included in p? */
-  if (dest != IP_HDRINCL) {
-    u16_t ip_hlen = IP_HLEN;
-#if IP_OPTIONS_SEND
-    u16_t optlen_aligned = 0;
-    if (optlen != 0) {
-#if CHECKSUM_GEN_IP_INLINE
-      int i;
-#endif /* CHECKSUM_GEN_IP_INLINE */
-      /* round up to a multiple of 4 */
-      optlen_aligned = ((optlen + 3) & ~3);
-      ip_hlen += optlen_aligned;
-      /* First write in the IP options */
-      if (pbuf_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);
-        return ERR_BUF;
-      }
-      MEMCPY(p->payload, ip_options, optlen);
-      if (optlen < optlen_aligned) {
-        /* zero the remaining bytes */
-        memset(((char*)p->payload) + optlen, 0, optlen_aligned - optlen);
-      }
-#if CHECKSUM_GEN_IP_INLINE
-      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)) {
-      LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip4_output: not enough room for IP header in pbuf\n"));
-
-      IP_STATS_INC(ip.err);
-      MIB2_STATS_INC(mib2.ipoutdiscards);
-      return ERR_BUF;
-    }
-
-    iphdr = (struct ip_hdr *)p->payload;
-    LWIP_ASSERT("check that first pbuf can hold struct ip_hdr",
-               (p->len >= sizeof(struct ip_hdr)));
-
-    IPH_TTL_SET(iphdr, ttl);
-    IPH_PROTO_SET(iphdr, proto);
-#if CHECKSUM_GEN_IP_INLINE
-    chk_sum += LWIP_MAKE_U16(proto, ttl);
-#endif /* CHECKSUM_GEN_IP_INLINE */
-
-    /* dest cannot be NULL here */
-    ip4_addr_copy(iphdr->dest, *dest);
-#if CHECKSUM_GEN_IP_INLINE
-    chk_sum += ip4_addr_get_u32(&iphdr->dest) & 0xFFFF;
-    chk_sum += ip4_addr_get_u32(&iphdr->dest) >> 16;
-#endif /* CHECKSUM_GEN_IP_INLINE */
-
-    IPH_VHL_SET(iphdr, 4, ip_hlen / 4);
-    IPH_TOS_SET(iphdr, tos);
-#if CHECKSUM_GEN_IP_INLINE
-    chk_sum += LWIP_MAKE_U16(tos, iphdr->_v_hl);
-#endif /* CHECKSUM_GEN_IP_INLINE */
-    IPH_LEN_SET(iphdr, htons(p->tot_len));
-#if CHECKSUM_GEN_IP_INLINE
-    chk_sum += iphdr->_len;
-#endif /* CHECKSUM_GEN_IP_INLINE */
-    IPH_OFFSET_SET(iphdr, 0);
-    IPH_ID_SET(iphdr, htons(ip_id));
-#if CHECKSUM_GEN_IP_INLINE
-    chk_sum += iphdr->_id;
-#endif /* CHECKSUM_GEN_IP_INLINE */
-    ++ip_id;
-
-    if (src == NULL) {
-      ip4_addr_copy(iphdr->src, *IP4_ADDR_ANY);
-    } else {
-      /* src cannot be NULL here */
-      ip4_addr_copy(iphdr->src, *src);
-    }
-
-#if CHECKSUM_GEN_IP_INLINE
-    chk_sum += ip4_addr_get_u32(&iphdr->src) & 0xFFFF;
-    chk_sum += ip4_addr_get_u32(&iphdr->src) >> 16;
-    chk_sum = (chk_sum >> 16) + (chk_sum & 0xFFFF);
-    chk_sum = (chk_sum >> 16) + chk_sum;
-    chk_sum = ~chk_sum;
-    IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_IP) {
-      iphdr->_chksum = (u16_t)chk_sum; /* network order */
-    }
-#if LWIP_CHECKSUM_CTRL_PER_NETIF
-    else {
-      IPH_CHKSUM_SET(iphdr, 0);
-    }
-#endif /* LWIP_CHECKSUM_CTRL_PER_NETIF*/
-#else /* CHECKSUM_GEN_IP_INLINE */
-    IPH_CHKSUM_SET(iphdr, 0);
-#if CHECKSUM_GEN_IP
-    IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_IP) {
-      IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, ip_hlen));
-    }
-#endif /* CHECKSUM_GEN_IP */
-#endif /* CHECKSUM_GEN_IP_INLINE */
-  } else {
-    /* IP header already included in p */
-    iphdr = (struct ip_hdr *)p->payload;
-    ip4_addr_copy(dest_addr, iphdr->dest);
-    dest = &dest_addr;
-  }
-
-  IP_STATS_INC(ip.xmit);
-
-  LWIP_DEBUGF(IP_DEBUG, ("ip4_output_if: %c%c%"U16_F"\n", netif->name[0], netif->name[1], netif->num));
-  ip4_debug_print(p);
-
-#if ENABLE_LOOPBACK
-  if (ip4_addr_cmp(dest, netif_ip4_addr(netif))
-#if !LWIP_HAVE_LOOPIF
-      || ip4_addr_isloopback(dest)
-#endif /* !LWIP_HAVE_LOOPIF */
-      ) {
-    /* Packet to self, enqueue it for loopback */
-    LWIP_DEBUGF(IP_DEBUG, ("netif_loop_output()"));
-    return netif_loop_output(netif, p);
-  }
-#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 IP_FRAG
-  /* don't fragment if interface has mtu set to 0 [loopif] */
-  if (netif->mtu && (p->tot_len > netif->mtu)) {
-    return ip4_frag(p, netif, dest);
-  }
-#endif /* IP_FRAG */
-
-  LWIP_DEBUGF(IP_DEBUG, ("ip4_output_if: call netif->output()\n"));
-  return netif->output(netif, p, dest);
-}
-
-/**
- * Simple interface to ip_output_if. It finds the outgoing network
- * interface and calls upon ip_output_if to do the actual work.
- *
- * @param p the packet to send (p->payload points to the data, e.g. next
-            protocol header; if dest == IP_HDRINCL, p already includes an IP
-            header and p->payload points to that IP header)
- * @param src the source IP address to send from (if src == IP_ADDR_ANY, the
- *         IP  address of the netif used to send is used as source address)
- * @param dest the destination IP address to send the packet to
- * @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
- *
- * @return ERR_RTE if no route is found
- *         see ip_output_if() for more return values
- */
-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)
-{
-  struct netif *netif;
-
-  LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX(p);
-
-  if ((netif = ip4_route_src(dest, src)) == 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)));
-    IP_STATS_INC(ip.rterr);
-    return ERR_RTE;
-  }
-
-  return ip4_output_if(p, src, dest, ttl, tos, proto, netif);
-}
-
-#if LWIP_NETIF_HWADDRHINT
-/** Like ip_output, but takes and addr_hint pointer that is passed on to netif->addr_hint
- *  before calling ip_output_if.
- *
- * @param p the packet to send (p->payload points to the data, e.g. next
-            protocol header; if dest == IP_HDRINCL, p already includes an IP
-            header and p->payload points to that IP header)
- * @param src the source IP address to send from (if src == IP_ADDR_ANY, the
- *         IP  address of the netif used to send is used as source address)
- * @param dest the destination IP address to send the packet to
- * @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
- *        calling ip_output_if()
- *
- * @return ERR_RTE if no route is found
- *         see ip_output_if() for more return values
- */
-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)
-{
-  struct netif *netif;
-  err_t err;
-
-  LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX(p);
-
-  if ((netif = ip4_route_src(dest, src)) == 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)));
-    IP_STATS_INC(ip.rterr);
-    return ERR_RTE;
-  }
-
-  NETIF_SET_HWADDRHINT(netif, addr_hint);
-  err = ip4_output_if(p, src, dest, ttl, tos, proto, netif);
-  NETIF_SET_HWADDRHINT(netif, NULL);
-
-  return err;
-}
-#endif /* LWIP_NETIF_HWADDRHINT*/
-
-#if IP_DEBUG
-/* Print an IP header by using LWIP_DEBUGF
- * @param p an IP packet, p->payload pointing to the IP header
- */
-void
-ip4_debug_print(struct pbuf *p)
-{
-  struct ip_hdr *iphdr = (struct ip_hdr *)p->payload;
-
-  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",
-                    IPH_V(iphdr),
-                    IPH_HL(iphdr),
-                    IPH_TOS(iphdr),
-                    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",
-                    ntohs(IPH_ID(iphdr)),
-                    ntohs(IPH_OFFSET(iphdr)) >> 15 & 1,
-                    ntohs(IPH_OFFSET(iphdr)) >> 14 & 1,
-                    ntohs(IPH_OFFSET(iphdr)) >> 13 & 1,
-                    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",
-                    IPH_TTL(iphdr),
-                    IPH_PROTO(iphdr),
-                    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)));
-  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)));
-  LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n"));
-}
-#endif /* IP_DEBUG */
-
-#endif /* LWIP_IPV4 */
diff --git a/components/lwip/core/ipv4/ip4_addr.c b/components/lwip/core/ipv4/ip4_addr.c
deleted file mode 100644 (file)
index b143f36..0000000
+++ /dev/null
@@ -1,362 +0,0 @@
-/**
- * @file
- * This is the IPv4 address tools implementation.
- *
- */
-
-/*
- * 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>
- *
- */
-
-#include "lwip/opt.h"
-
-#if LWIP_IPV4
-
-#include "lwip/ip_addr.h"
-#include "lwip/netif.h"
-
-/* used by IP_ADDR_ANY and IP_ADDR_BROADCAST in ip_addr.h */
-
-const ip_addr_t ip_addr_any = IPADDR4_INIT(IPADDR_ANY);
-const ip_addr_t ip_addr_broadcast = IPADDR4_INIT(IPADDR_BROADCAST);
-
-/**
- * Determine if an address is a broadcast address on a network interface
- *
- * @param addr address to be checked
- * @param netif the network interface against which the address is checked
- * @return returns non-zero if the address is a broadcast address
- */
-u8_t ESP_IRAM_ATTR
-ip4_addr_isbroadcast_u32(u32_t addr, const struct netif *netif)
-{
-  ip4_addr_t ipaddr;
-  ip4_addr_set_u32(&ipaddr, addr);
-
-  /* all ones (broadcast) or all zeroes (old skool broadcast) */
-  if ((~addr == IPADDR_ANY) ||
-      (addr == IPADDR_ANY)) {
-    return 1;
-  /* 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 */
-  } else if (addr == ip4_addr_get_u32(netif_ip4_addr(netif))) {
-    return 0;
-  /*  on the same (sub) network... */
-  } else if (ip4_addr_netcmp(&ipaddr, netif_ip4_addr(netif), netif_ip4_netmask(netif))
-         /* ...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 {
-    return 0;
-  }
-}
-
-/** Checks if a netmask is valid (starting with ones, then only zeros)
- *
- * @param netmask the IPv4 netmask to check (in network byte order!)
- * @return 1 if the netmask is valid, 0 if it is not
- */
-u8_t
-ip4_addr_netmask_valid(u32_t netmask)
-{
-  u32_t mask;
-  u32_t nm_hostorder = lwip_htonl(netmask);
-
-  /* first, check for the first zero */
-  for (mask = 1UL << 31 ; mask != 0; mask >>= 1) {
-    if ((nm_hostorder & mask) == 0) {
-      break;
-    }
-  }
-  /* then check that there is no one */
-  for (; mask != 0; mask >>= 1) {
-    if ((nm_hostorder & mask) != 0) {
-      /* there is a one after the first zero -> invalid */
-      return 0;
-    }
-  }
-  /* no one after the first zero -> valid */
-  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.
- *
- * @param cp IP address in ascii representation (e.g. "127.0.0.1")
- * @return ip address in network order
- */
-u32_t
-ipaddr_addr(const char *cp)
-{
-  ip4_addr_t val;
-
-  if (ip4addr_aton(cp, &val)) {
-    return ip4_addr_get_u32(&val);
-  }
-  return (IPADDR_NONE);
-}
-
-/**
- * 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.
- *
- * @param cp IP address in ascii representation (e.g. "127.0.0.1")
- * @param addr pointer to which to save the ip address in network order
- * @return 1 if cp could be converted to addr, 0 on failure
- */
-int
-ip4addr_aton(const char *cp, ip4_addr_t *addr)
-{
-  u32_t val;
-  u8_t base;
-  char c;
-  u32_t parts[4];
-  u32_t *pp = parts;
-
-#if ESP_LWIP
-//#if 0
-  char ch;
-  unsigned long cutoff;
-  int cutlim;
-#endif
-
-  c = *cp;
-  for (;;) {
-    /*
-     * Collect number up to ``.''.
-     * Values are specified as for C:
-     * 0x=hex, 0=octal, 1-9=decimal.
-     */
-    if (!isdigit(c)) {
-      return 0;
-    }
-    val = 0;
-    base = 10;
-    if (c == '0') {
-      c = *++cp;
-      if (c == 'x' || c == 'X') {
-        base = 16;
-        c = *++cp;
-      } else {
-        base = 8;
-      }
-    }
-    
-#if ESP_IP4_ATON
-    cutoff =(unsigned long)0xffffffff / (unsigned long)base;
-    cutlim =(unsigned long)0xffffffff % (unsigned long)base;
-    for (;;) {
-      if (isdigit(c)) {
-       ch = (int)(c - '0');
-       if (val > cutoff || (val == cutoff && ch > cutlim))
-               return (0);
-        val = (val * base) + (int)(c - '0');
-        c = *++cp;
-      } else if (base == 16 && isxdigit(c)) {
-       ch = (int)(c + 10 - (islower(c) ? 'a' : 'A'));
-       if (val > cutoff || (val == cutoff && ch > cutlim))
-               return (0);
-       val = (val << 4) | (int)(c + 10 - (islower(c) ? 'a' : 'A'));
-        c = *++cp;
-      } else
-        break;
-    }
-#else
-    for (;;) {
-      if (isdigit(c)) {
-        val = (val * base) + (int)(c - '0');
-        c = *++cp;
-      } else if (base == 16 && isxdigit(c)) {
-        val = (val << 4) | (int)(c + 10 - (islower(c) ? 'a' : 'A'));
-        c = *++cp;
-      } else {
-        break;
-      }
-    }
-#endif
-    
-    if (c == '.') {
-      /*
-       * Internet format:
-       *  a.b.c.d
-       *  a.b.c   (with c treated as 16 bits)
-       *  a.b (with b treated as 24 bits)
-       */
-      if (pp >= parts + 3) {
-        return 0;
-      }
-      *pp++ = val;
-      c = *++cp;
-    } else {
-      break;
-    }
-  }
-  /*
-   * Check for trailing characters.
-   */
-  if (c != '\0' && !isspace(c)) {
-    return 0;
-  }
-  /*
-   * Concoct the address according to
-   * the number of parts specified.
-   */
-  switch (pp - parts + 1) {
-
-  case 0:
-    return 0;       /* initial nondigit */
-
-  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 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;
-  }
-  if (addr) {
-    ip4_addr_set_u32(addr, htonl(val));
-  }
-  return 1;
-}
-
-/**
- * Convert numeric IP address into decimal dotted 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*
-ip4addr_ntoa(const ip4_addr_t *addr)
-{
-  static char str[IP4ADDR_STRLEN_MAX];
-  return ip4addr_ntoa_r(addr, str, IP4ADDR_STRLEN_MAX);
-}
-
-/**
- * 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*
-ip4addr_ntoa_r(const ip4_addr_t *addr, char *buf, int buflen)
-{
-  u32_t s_addr;
-  char inv[3];
-  char *rp;
-  u8_t *ap;
-  u8_t rem;
-  u8_t n;
-  u8_t i;
-  int len = 0;
-
-  s_addr = ip4_addr_get_u32(addr);
-
-  rp = buf;
-  ap = (u8_t *)&s_addr;
-  for (n = 0; n < 4; n++) {
-    i = 0;
-    do {
-      rem = *ap % (u8_t)10;
-      *ap /= (u8_t)10;
-      inv[i++] = '0' + rem;
-    } while (*ap);
-    while (i--) {
-      if (len++ >= buflen) {
-        return NULL;
-      }
-      *rp++ = inv[i];
-    }
-    if (len++ >= buflen) {
-      return NULL;
-    }
-    *rp++ = '.';
-    ap++;
-  }
-  *--rp = 0;
-  return buf;
-}
-
-#endif /* LWIP_IPV4 */
diff --git a/components/lwip/core/ipv4/ip_frag.c b/components/lwip/core/ipv4/ip_frag.c
deleted file mode 100644 (file)
index a647433..0000000
+++ /dev/null
@@ -1,897 +0,0 @@
-/**
- * @file
- * This is the IPv4 packet segmentation and reassembly implementation.
- *
- */
-
-/*
- * 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: Jani Monoses <jani@iv.ro>
- *         Simon Goldschmidt
- * original reassembly code by Adam Dunkels <adam@sics.se>
- *
- */
-
-#include "lwip/opt.h"
-
-#if LWIP_IPV4
-
-#include "lwip/ip_frag.h"
-#include "lwip/def.h"
-#include "lwip/inet_chksum.h"
-#include "lwip/netif.h"
-#include "lwip/stats.h"
-#include "lwip/icmp.h"
-
-#include <string.h>
-
-#if IP_REASSEMBLY
-/**
- * The IP reassembly code currently has the following limitations:
- * - IP header options are not supported
- * - 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)!
- *
- * @todo: work with IP header options
- */
-
-/** 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! */
-#ifndef IP_REASS_CHECK_OVERLAP
-#define IP_REASS_CHECK_OVERLAP 1
-#endif /* IP_REASS_CHECK_OVERLAP */
-
-/** 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. */
-#ifndef IP_REASS_FREE_OLDEST
-#define IP_REASS_FREE_OLDEST 1
-#endif /* IP_REASS_FREE_OLDEST */
-
-#define IP_REASS_FLAG_LASTFRAG 0x01
-
-/** 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. (-> If the IP header doesn't need packing,
- * this struct doesn't need packing, too.)
- */
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct ip_reass_helper {
-  PACK_STRUCT_FIELD(struct pbuf *next_pbuf);
-  PACK_STRUCT_FIELD(u16_t start);
-  PACK_STRUCT_FIELD(u16_t end);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
-#define IP_ADDRESSES_AND_ID_MATCH(iphdrA, iphdrB)  \
-  (ip4_addr_cmp(&(iphdrA)->src, &(iphdrB)->src) && \
-   ip4_addr_cmp(&(iphdrA)->dest, &(iphdrB)->dest) && \
-   IPH_ID(iphdrA) == IPH_ID(iphdrB)) ? 1 : 0
-
-/* global variables */
-static struct ip_reassdata *reassdatagrams;
-static u16_t ip_reass_pbufcount;
-
-/* function prototypes */
-static void ip_reass_dequeue_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev);
-static int ip_reass_free_complete_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev);
-
-/**
- * Reassembly timer base function
- * for both NO_SYS == 0 and 1 (!).
- *
- * Should be called every 1000 msec (defined by IP_TMR_INTERVAL).
- */
-void
-ip_reass_tmr(void)
-{
-  struct ip_reassdata *r, *prev = NULL;
-
-  r = reassdatagrams;
-  while (r != NULL) {
-    /* Decrement the timer. Once it reaches 0,
-     * 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));
-      prev = r;
-      r = r->next;
-    } else {
-      /* reassembly timed out */
-      struct ip_reassdata *tmp;
-      LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass_tmr: timer timed out\n"));
-      tmp = r;
-      /* get the next pointer before freeing */
-      r = r->next;
-      /* free the helper struct and all enqueued pbufs */
-      ip_reass_free_complete_datagram(tmp, prev);
-     }
-   }
-}
-
-/**
- * Free a datagram (struct ip_reassdata) and all its pbufs.
- * Updates the total count of enqueued pbufs (ip_reass_pbufcount),
- * SNMP counters and sends an ICMP time exceeded packet.
- *
- * @param ipr datagram to free
- * @param prev the previous datagram in the linked list
- * @return the number of pbufs freed
- */
-static int
-ip_reass_free_complete_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev)
-{
-  u16_t pbufs_freed = 0;
-  u8_t clen;
-  struct pbuf *p;
-  struct ip_reass_helper *iprh;
-
-  LWIP_ASSERT("prev != ipr", prev != ipr);
-  if (prev != NULL) {
-    LWIP_ASSERT("prev->next == ipr", prev->next == ipr);
-  }
-
-  MIB2_STATS_INC(mib2.ipreasmfails);
-#if LWIP_ICMP
-  iprh = (struct ip_reass_helper *)ipr->p->payload;
-  if (iprh->start == 0) {
-    /* The first fragment was received, send ICMP time exceeded. */
-    /* First, de-queue the first pbuf from r->p. */
-    p = ipr->p;
-    ipr->p = iprh->next_pbuf;
-    /* Then, copy the original header into it. */
-    SMEMCPY(p->payload, &ipr->iphdr, IP_HLEN);
-    icmp_time_exceeded(p, ICMP_TE_FRAG);
-    clen = pbuf_clen(p);
-    LWIP_ASSERT("pbufs_freed + clen <= 0xffff", pbufs_freed + clen <= 0xffff);
-    pbufs_freed += clen;
-    pbuf_free(p);
-  }
-#endif /* LWIP_ICMP */
-
-  /* First, free all received pbufs.  The individual pbufs need to be released
-     separately as they have not yet been chained */
-  p = ipr->p;
-  while (p != NULL) {
-    struct pbuf *pcur;
-    iprh = (struct ip_reass_helper *)p->payload;
-    pcur = p;
-    /* get the next pointer before freeing */
-    p = iprh->next_pbuf;
-    clen = pbuf_clen(pcur);
-    LWIP_ASSERT("pbufs_freed + clen <= 0xffff", pbufs_freed + clen <= 0xffff);
-    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;
-
-  return pbufs_freed;
-}
-
-#if IP_REASS_FREE_OLDEST
-/**
- * Free the oldest datagram to make room for enqueueing new fragments.
- * The datagram 'fraghdr' belongs to is not freed!
- *
- * @param fraghdr IP header of the current fragment
- * @param pbufs_needed number of pbufs needed to enqueue
- *        (used for freeing other datagrams if not enough space)
- * @return the number of pbufs freed
- */
-static int
-ip_reass_remove_oldest_datagram(struct ip_hdr *fraghdr, int pbufs_needed)
-{
-  /* @todo Can't we simply remove the last datagram in the
-   *       linked list behind reassdatagrams?
-   */
-  struct ip_reassdata *r, *oldest, *prev, *oldest_prev;
-  int pbufs_freed = 0, pbufs_freed_current;
-  int other_datagrams;
-
-  /* Free datagrams until being allowed to enqueue 'pbufs_needed' pbufs,
-   * but don't free the datagram that 'fraghdr' belongs to! */
-  do {
-    oldest = NULL;
-    prev = NULL;
-    oldest_prev = NULL;
-    other_datagrams = 0;
-    r = reassdatagrams;
-    while (r != NULL) {
-      if (!IP_ADDRESSES_AND_ID_MATCH(&r->iphdr, fraghdr)) {
-        /* Not the same datagram as fraghdr */
-        other_datagrams++;
-        if (oldest == NULL) {
-          oldest = r;
-          oldest_prev = prev;
-        } else if (r->timer <= oldest->timer) {
-          /* older than the previous oldest */
-          oldest = r;
-          oldest_prev = prev;
-        }
-      }
-      if (r->next != NULL) {
-        prev = r;
-      }
-      r = r->next;
-    }
-    if (oldest != NULL) {
-      pbufs_freed_current = ip_reass_free_complete_datagram(oldest, oldest_prev);
-      pbufs_freed += pbufs_freed_current;
-    }
-  } while ((pbufs_freed < pbufs_needed) && (other_datagrams > 1));
-  return pbufs_freed;
-}
-#endif /* IP_REASS_FREE_OLDEST */
-
-/**
- * Enqueues a new fragment into the fragment queue
- * @param fraghdr points to the new fragments IP hdr
- * @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*
-ip_reass_enqueue_new_datagram(struct ip_hdr *fraghdr, int clen)
-{
-  struct ip_reassdata* ipr;
-#if ! IP_REASS_FREE_OLDEST
-  LWIP_UNUSED_ARG(clen);
-#endif
-
-  /* No matching previous fragment found, allocate a new reassdata struct */
-  ipr = (struct ip_reassdata *)memp_malloc(MEMP_REASSDATA);
-  if (ipr == NULL) {
-#if IP_REASS_FREE_OLDEST
-    if (ip_reass_remove_oldest_datagram(fraghdr, clen) >= clen) {
-      ipr = (struct ip_reassdata *)memp_malloc(MEMP_REASSDATA);
-    }
-    if (ipr == NULL)
-#endif /* IP_REASS_FREE_OLDEST */
-    {
-      IPFRAG_STATS_INC(ip_frag.memerr);
-      LWIP_DEBUGF(IP_REASS_DEBUG,("Failed to alloc reassdata struct\n"));
-      return NULL;
-    }
-  }
-  memset(ipr, 0, sizeof(struct ip_reassdata));
-  ipr->timer = IP_REASS_MAXAGE;
-
-  /* enqueue the new structure to the front of the list */
-  ipr->next = reassdatagrams;
-  reassdatagrams = ipr;
-  /* copy the ip header for later tests and input */
-  /* @todo: no ip options supported? */
-  SMEMCPY(&(ipr->iphdr), fraghdr, IP_HLEN);
-  return ipr;
-}
-
-/**
- * Dequeues a datagram from the datagram queue. Doesn't deallocate the pbufs.
- * @param ipr points to the queue entry to dequeue
- */
-static void
-ip_reass_dequeue_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev)
-{
-  /* dequeue the reass struct  */
-  if (reassdatagrams == ipr) {
-    /* it was the first in the list */
-    reassdatagrams = ipr->next;
-  } else {
-    /* it wasn't the first, so it must have a valid 'prev' */
-    LWIP_ASSERT("sanity check linked list", prev != NULL);
-    prev->next = ipr->next;
-  }
-
-  /* now we can free the ip_reassdata struct */
-  memp_free(MEMP_REASSDATA, ipr);
-}
-
-/**
- * Chain a new pbuf into the pbuf list that composes the datagram.  The pbuf list
- * will grow over time as  new pbufs are rx.
- * Also checks that the datagram passes basic continuity checks (if the last
- * fragment was received at least once).
- * @param root_p points to the 'root' pbuf for the current datagram being assembled.
- * @param new_p points to the pbuf for the current fragment
- * @return 0 if invalid, >0 otherwise
- */
-static int
-ip_reass_chain_frag_into_datagram_and_validate(struct ip_reassdata *ipr, struct pbuf *new_p)
-{
-  struct ip_reass_helper *iprh, *iprh_tmp, *iprh_prev=NULL;
-  struct pbuf *q;
-  u16_t offset,len;
-  struct ip_hdr *fraghdr;
-  int valid = 1;
-
-  /* Extract length and fragment offset from current fragment */
-  fraghdr = (struct ip_hdr*)new_p->payload;
-  len = ntohs(IPH_LEN(fraghdr)) - IPH_HL(fraghdr) * 4;
-  offset = (ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) * 8;
-
-  /* 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->next_pbuf = NULL;
-  iprh->start = offset;
-  iprh->end = offset + len;
-
-  /* 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;
-    if (iprh->start < iprh_tmp->start) {
-      /* the new pbuf should be inserted before this */
-      iprh->next_pbuf = q;
-      if (iprh_prev != NULL) {
-        /* not the fragment with the lowest offset */
-#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;
-        }
-#endif /* IP_REASS_CHECK_OVERLAP */
-        iprh_prev->next_pbuf = new_p;
-      } else {
-        /* fragment with the lowest offset */
-        ipr->p = new_p;
-      }
-      break;
-    } else if (iprh->start == iprh_tmp->start) {
-      /* received the same datagram twice: no need to keep the datagram */
-      goto freepbuf;
-#if IP_REASS_CHECK_OVERLAP
-    } else if (iprh->start < iprh_tmp->end) {
-      /* overlap: no need to keep the new datagram */
-      goto freepbuf;
-#endif /* IP_REASS_CHECK_OVERLAP */
-    } else {
-      /* Check if the fragments received so far have no holes. */
-      if (iprh_prev != NULL) {
-        if (iprh_prev->end != iprh_tmp->start) {
-          /* There is a fragment missing between the current
-           * and the previous fragment */
-          valid = 0;
-        }
-      }
-    }
-    q = iprh_tmp->next_pbuf;
-    iprh_prev = iprh_tmp;
-  }
-
-  /* If q is NULL, then we made it to the end of the list. Determine what to do now */
-  if (q == NULL) {
-    if (iprh_prev != NULL) {
-      /* 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);
-#endif /* IP_REASS_CHECK_OVERLAP */
-      iprh_prev->next_pbuf = new_p;
-      if (iprh_prev->end != iprh->start) {
-        valid = 0;
-      }
-    } else {
-#if IP_REASS_CHECK_OVERLAP
-      LWIP_ASSERT("no previous fragment, this must be the first fragment!",
-        ipr->p == NULL);
-#endif /* IP_REASS_CHECK_OVERLAP */
-      /* this is the first fragment we ever received for this ip datagram */
-      ipr->p = new_p;
-    }
-  }
-
-  /* At this point, the validation part begins: */
-  /* If we already received the last fragment */
-  if ((ipr->flags & IP_REASS_FLAG_LASTFRAG) != 0) {
-    /* and had no holes so far */
-    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)) {
-        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;
-          if (iprh_prev->end != iprh->start) {
-            valid = 0;
-            break;
-          }
-          iprh_prev = iprh;
-          q = iprh->next_pbuf;
-        }
-        /* if still valid, all fragments are received
-         * (because to the MF==0 already arrived */
-        if (valid) {
-          LWIP_ASSERT("sanity check", ipr->p != NULL);
-          LWIP_ASSERT("sanity check",
-            ((struct ip_reass_helper*)ipr->p->payload) != iprh);
-          LWIP_ASSERT("validate_datagram:next_pbuf!=NULL",
-            iprh->next_pbuf == NULL);
-          LWIP_ASSERT("validate_datagram:datagram end!=datagram len",
-            iprh->end == ipr->datagram_len);
-        }
-      }
-    }
-    /* If valid is 0 here, there are some fragments missing in the middle
-     * (since MF == 0 has already arrived). Such datagrams simply time out if
-     * no more fragments are received... */
-    return valid;
-  }
-  /* If we come here, not all fragments were received, yet! */
-  return 0; /* not yet valid! */
-#if IP_REASS_CHECK_OVERLAP
-freepbuf:
-  ip_reass_pbufcount -= pbuf_clen(new_p);
-  pbuf_free(new_p);
-  return 0;
-#endif /* IP_REASS_CHECK_OVERLAP */
-}
-
-/**
- * Reassembles incoming IP fragments into an IP datagram.
- *
- * @param p points to a pbuf chain of the fragment
- * @return NULL if reassembly is incomplete, ? otherwise
- */
-struct pbuf *
-ip4_reass(struct pbuf *p)
-{
-  struct pbuf *r;
-  struct ip_hdr *fraghdr;
-  struct ip_reassdata *ipr;
-  struct ip_reass_helper *iprh;
-  u16_t offset, len;
-  u8_t clen;
-
-  IPFRAG_STATS_INC(ip_frag.recv);
-  MIB2_STATS_INC(mib2.ipreasmreqds);
-
-  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"));
-    IPFRAG_STATS_INC(ip_frag.err);
-    goto nullreturn;
-  }
-
-  offset = (ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) * 8;
-  len = ntohs(IPH_LEN(fraghdr)) - IPH_HL(fraghdr) * 4;
-
-  /* Check if we are allowed to enqueue more datagrams. */
-  clen = pbuf_clen(p);
-  if ((ip_reass_pbufcount + clen) > IP_REASS_MAX_PBUFS) {
-#if IP_REASS_FREE_OLDEST
-    if (!ip_reass_remove_oldest_datagram(fraghdr, clen) ||
-        ((ip_reass_pbufcount + clen) > IP_REASS_MAX_PBUFS))
-#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));
-      IPFRAG_STATS_INC(ip_frag.memerr);
-      /* @todo: send ICMP time exceeded here? */
-      /* drop this pbuf */
-      goto nullreturn;
-    }
-  }
-
-  /* Look for the datagram the fragment belongs to in the current datagram queue,
-   * remembering the previous in the queue for later dequeueing. */
-  for (ipr = reassdatagrams; ipr != NULL; ipr = ipr->next) {
-    /* Check if the incoming fragment matches the one currently present
-       in the reassembly buffer. If so, we proceed with copying the
-       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",
-        ntohs(IPH_ID(fraghdr))));
-      IPFRAG_STATS_INC(ip_frag.cachehit);
-      break;
-    }
-  }
-
-  if (ipr == NULL) {
-  /* Enqueue a new datagram into the datagram queue */
-    ipr = ip_reass_enqueue_new_datagram(fraghdr, clen);
-    /* Bail if unable to enqueue */
-    if (ipr == NULL) {
-      goto nullreturn;
-    }
-  } else {
-    if (((ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) == 0) &&
-      ((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
-       * all options, if supported)*/
-      SMEMCPY(&ipr->iphdr, fraghdr, IP_HLEN);
-    }
-  }
-  /* 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 */
-  ip_reass_pbufcount += clen;
-
-  /* At this point, we have either created a new entry or pointing
-   * to an existing one */
-
-  /* check for 'no more fragments', and update queue entry*/
-  if ((IPH_OFFSET(fraghdr) & PP_NTOHS(IP_MF)) == 0) {
-    ipr->flags |= IP_REASS_FLAG_LASTFRAG;
-    ipr->datagram_len = offset + len;
-    LWIP_DEBUGF(IP_REASS_DEBUG,
-     ("ip4_reass: last fragment seen, total len %"S16_F"\n",
-      ipr->datagram_len));
-  }
-  /* find the right place to insert this pbuf */
-  /* @todo: trim pbufs if fragments are overlapping */
-  if (ip_reass_chain_frag_into_datagram_and_validate(ipr, p)) {
-    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;
-
-    /* save the second pbuf before copying the header over the pointer */
-    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);
-    SMEMCPY(fraghdr, &ipr->iphdr, IP_HLEN);
-    IPH_LEN_SET(fraghdr, htons(ipr->datagram_len));
-    IPH_OFFSET_SET(fraghdr, 0);
-    IPH_CHKSUM_SET(fraghdr, 0);
-    /* @todo: do we need to set/calculate the correct checksum? */
-#if CHECKSUM_GEN_IP
-    IF__NETIF_CHECKSUM_ENABLED(ip_current_input_netif(), NETIF_CHECKSUM_GEN_IP) {
-      IPH_CHKSUM_SET(fraghdr, inet_chksum(fraghdr, IP_HLEN));
-    }
-#endif /* CHECKSUM_GEN_IP */
-
-    p = ipr->p;
-
-    /* chain together the pbufs contained within the reass_data list. */
-    while (r != NULL) {
-      iprh = (struct ip_reass_helper*)r->payload;
-
-      /* hide the ip header for every succeeding fragment */
-      pbuf_header(r, -IP_HLEN);
-      pbuf_cat(p, r);
-      r = iprh->next_pbuf;
-    }
-
-    /* find the previous entry in the linked list */
-    if (ipr == reassdatagrams) {
-      ipr_prev = NULL;
-    } else {
-      for (ipr_prev = reassdatagrams; ipr_prev != NULL; ipr_prev = ipr_prev->next) {
-        if (ipr_prev->next == ipr) {
-          break;
-        }
-      }
-    }
-
-    /* release the sources allocate for the fragment queue entry */
-    ip_reass_dequeue_datagram(ipr, ipr_prev);
-
-    /* and adjust the number of pbufs currently queued for reassembly. */
-    ip_reass_pbufcount -= pbuf_clen(p);
-
-    MIB2_STATS_INC(mib2.ipreasmoks);
-
-    /* Return the pbuf chain */
-    return p;
-  }
-  /* the datagram is not (yet?) reassembled completely */
-  LWIP_DEBUGF(IP_REASS_DEBUG,("ip_reass_pbufcount: %d out\n", ip_reass_pbufcount));
-  return NULL;
-
-nullreturn:
-  LWIP_DEBUGF(IP_REASS_DEBUG,("ip4_reass: nullreturn\n"));
-  IPFRAG_STATS_INC(ip_frag.drop);
-  pbuf_free(p);
-  return NULL;
-}
-#endif /* IP_REASSEMBLY */
-
-#if IP_FRAG
-#if IP_FRAG_USES_STATIC_BUF
-static u8_t buf[LWIP_MEM_ALIGN_SIZE(IP_FRAG_MAX_MTU + MEM_ALIGNMENT - 1)];
-#else /* IP_FRAG_USES_STATIC_BUF */
-
-#if !LWIP_NETIF_TX_SINGLE_PBUF
-/** Allocate a new 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);
-}
-
-/** Free a struct pbuf_custom_ref */
-static void
-ip_frag_free_pbuf_custom_ref(struct pbuf_custom_ref* p)
-{
-  LWIP_ASSERT("p != NULL", p != NULL);
-  memp_free(MEMP_FRAG_PBUF, p);
-}
-
-/** Free-callback function to free a 'struct pbuf_custom_ref', called by
- * pbuf_free. */
-static void
-ipfrag_free_pbuf_custom(struct pbuf *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);
-  if (pcr->original != NULL) {
-    pbuf_free(pcr->original);
-  }
-  ip_frag_free_pbuf_custom_ref(pcr);
-}
-#endif /* !LWIP_NETIF_TX_SINGLE_PBUF */
-#endif /* IP_FRAG_USES_STATIC_BUF */
-
-/**
- * Fragment an IP datagram if too large for the netif.
- *
- * Chop the datagram in MTU sized chunks and send them in order
- * by using a fixed size static memory buffer (PBUF_REF) or
- * point PBUF_REFs into p (depending on IP_FRAG_USES_STATIC_BUF).
- *
- * @param p ip packet to send
- * @param netif the netif on which to send
- * @param dest destination ip address to which to send
- *
- * @return ERR_OK if sent successfully, err_t otherwise
- */
-err_t
-ip4_frag(struct pbuf *p, struct netif *netif, const ip4_addr_t *dest)
-{
-  struct pbuf *rambuf;
-#if IP_FRAG_USES_STATIC_BUF
-  struct pbuf *header;
-#else
-#if !LWIP_NETIF_TX_SINGLE_PBUF
-  struct pbuf *newpbuf;
-#endif
-  struct ip_hdr *original_iphdr;
-#endif
-  struct ip_hdr *iphdr;
-  u16_t nfb;
-  u16_t left, cop;
-  u16_t mtu = netif->mtu;
-  u16_t ofo, omf;
-  u16_t last;
-  u16_t poff = IP_HLEN;
-  u16_t tmp;
-#if !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF
-  u16_t newpbuflen = 0;
-  u16_t left_to_copy;
-#endif
-
-  /* Get a RAM based MTU sized pbuf */
-#if IP_FRAG_USES_STATIC_BUF
-  /* When using a static buffer, we use a PBUF_REF, which we will
-   * use to reference the packet (without link header).
-   * Layer and length is irrelevant.
-   */
-  rambuf = pbuf_alloc(PBUF_LINK, 0, PBUF_REF);
-  if (rambuf == NULL) {
-    LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_frag: pbuf_alloc(PBUF_LINK, 0, PBUF_REF) failed\n"));
-    goto memerr;
-  }
-  rambuf->tot_len = rambuf->len = mtu;
-  rambuf->payload = LWIP_MEM_ALIGN((void *)buf);
-
-  /* Copy the IP header in it */
-  iphdr = (struct ip_hdr *)rambuf->payload;
-  SMEMCPY(iphdr, p->payload, IP_HLEN);
-#else /* IP_FRAG_USES_STATIC_BUF */
-  original_iphdr = (struct ip_hdr *)p->payload;
-  iphdr = original_iphdr;
-#endif /* IP_FRAG_USES_STATIC_BUF */
-
-  /* Save original offset */
-  tmp = ntohs(IPH_OFFSET(iphdr));
-  ofo = tmp & IP_OFFMASK;
-  omf = tmp & IP_MF;
-
-  left = p->tot_len - IP_HLEN;
-
-  nfb = (mtu - IP_HLEN) / 8;
-
-  while (left) {
-    last = (left <= mtu - IP_HLEN);
-
-    /* Set new offset and MF flag */
-    tmp = omf | (IP_OFFMASK & (ofo));
-    if (!last) {
-      tmp = tmp | IP_MF;
-    }
-
-    /* Fill this fragment */
-    cop = last ? left : nfb * 8;
-
-#if IP_FRAG_USES_STATIC_BUF
-    poff += pbuf_copy_partial(p, (u8_t*)iphdr + IP_HLEN, cop, poff);
-#else /* IP_FRAG_USES_STATIC_BUF */
-#if LWIP_NETIF_TX_SINGLE_PBUF
-    rambuf = pbuf_alloc(PBUF_IP, cop, PBUF_RAM);
-    if (rambuf == NULL) {
-      goto memerr;
-    }
-    LWIP_ASSERT("this needs a pbuf in one piece!",
-      (rambuf->len == rambuf->tot_len) && (rambuf->next == NULL));
-    poff += pbuf_copy_partial(p, rambuf->payload, cop, poff);
-    /* make room for the IP header */
-    if (pbuf_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;
-#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.
-     * The rest will be PBUF_REFs mirroring the pbuf chain to be fragged,
-     * but limited to the size of an mtu.
-     */
-    rambuf = pbuf_alloc(PBUF_LINK, IP_HLEN, PBUF_RAM);
-    if (rambuf == NULL) {
-      goto memerr;
-    }
-    LWIP_ASSERT("this needs a pbuf in one piece!",
-                (p->len >= (IP_HLEN)));
-    SMEMCPY(rambuf->payload, original_iphdr, IP_HLEN);
-    iphdr = (struct ip_hdr *)rambuf->payload;
-
-    /* Can just adjust p directly for needed offset. */
-    p->payload = (u8_t *)p->payload + poff;
-    p->len -= poff;
-
-    left_to_copy = cop;
-    while (left_to_copy) {
-      struct pbuf_custom_ref *pcr;
-      newpbuflen = (left_to_copy < p->len) ? left_to_copy : p->len;
-      /* Is this pbuf already empty? */
-      if (!newpbuflen) {
-        p = p->next;
-        continue;
-      }
-      pcr = ip_frag_alloc_pbuf_custom_ref();
-      if (pcr == NULL) {
-        pbuf_free(rambuf);
-        goto memerr;
-      }
-      /* Mirror this pbuf, although we might not need all of it. */
-      newpbuf = pbuf_alloced_custom(PBUF_RAW, newpbuflen, PBUF_REF, &pcr->pc, p->payload, newpbuflen);
-      if (newpbuf == NULL) {
-        ip_frag_free_pbuf_custom_ref(pcr);
-        pbuf_free(rambuf);
-        goto memerr;
-      }
-      pbuf_ref(p);
-      pcr->original = p;
-      pcr->pc.custom_free_function = ipfrag_free_pbuf_custom;
-
-      /* Add it to end of rambuf's chain, but using pbuf_cat, not pbuf_chain
-       * so that it is removed when pbuf_dechain is later called on rambuf.
-       */
-      pbuf_cat(rambuf, newpbuf);
-      left_to_copy -= newpbuflen;
-      if (left_to_copy) {
-        p = p->next;
-      }
-    }
-    poff = newpbuflen;
-#endif /* LWIP_NETIF_TX_SINGLE_PBUF */
-#endif /* IP_FRAG_USES_STATIC_BUF */
-
-    /* Correct header */
-    IPH_OFFSET_SET(iphdr, htons(tmp));
-    IPH_LEN_SET(iphdr, htons(cop + IP_HLEN));
-    IPH_CHKSUM_SET(iphdr, 0);
-#if CHECKSUM_GEN_IP
-    IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_IP) {
-      IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, IP_HLEN));
-    }
-#endif /* CHECKSUM_GEN_IP */
-
-#if IP_FRAG_USES_STATIC_BUF
-    if (last) {
-      pbuf_realloc(rambuf, left + IP_HLEN);
-    }
-
-    /* This part is ugly: we alloc a RAM based pbuf for
-     * the link level header for each chunk and then
-     * free it. A PBUF_ROM style pbuf for which pbuf_header
-     * worked would make things simpler.
-     */
-    header = pbuf_alloc(PBUF_LINK, 0, PBUF_RAM);
-    if (header != NULL) {
-      pbuf_chain(header, rambuf);
-      netif->output(netif, header, dest);
-      IPFRAG_STATS_INC(ip_frag.xmit);
-      MIB2_STATS_INC(mib2.ipfragcreates);
-      pbuf_free(header);
-    } else {
-      LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_frag: pbuf_alloc() for header failed\n"));
-      pbuf_free(rambuf);
-      goto memerr;
-    }
-#else /* IP_FRAG_USES_STATIC_BUF */
-    /* No need for separate header pbuf - we allowed room for it in rambuf
-     * when allocated.
-     */
-    netif->output(netif, rambuf, dest);
-    IPFRAG_STATS_INC(ip_frag.xmit);
-
-    /* Unfortunately we can't reuse rambuf - the hardware may still be
-     * using the buffer. Instead we free it (and the ensuing chain) and
-     * recreate it next time round the loop. If we're lucky the hardware
-     * will have already sent the packet, the free will really free, and
-     * there will be zero memory penalty.
-     */
-
-    pbuf_free(rambuf);
-#endif /* IP_FRAG_USES_STATIC_BUF */
-    left -= cop;
-    ofo += nfb;
-  }
-#if IP_FRAG_USES_STATIC_BUF
-  pbuf_free(rambuf);
-#endif /* IP_FRAG_USES_STATIC_BUF */
-  MIB2_STATS_INC(mib2.ipfragoks);
-  return ERR_OK;
-memerr:
-  MIB2_STATS_INC(mib2.ipfragfails);
-  return ERR_MEM;
-}
-#endif /* IP_FRAG */
-
-#endif /* LWIP_IPV4 */
diff --git a/components/lwip/core/ipv6/README b/components/lwip/core/ipv6/README
deleted file mode 100644 (file)
index 3620004..0000000
+++ /dev/null
@@ -1 +0,0 @@
-IPv6 support in lwIP is very experimental.
diff --git a/components/lwip/core/ipv6/dhcp6.c b/components/lwip/core/ipv6/dhcp6.c
deleted file mode 100644 (file)
index f27a725..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * @file
- *
- * DHCPv6.
- */
-
-/*
- * Copyright (c) 2010 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>
- */
-
-#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/def.h"
-
-
-#endif /* LWIP_IPV6 && LWIP_IPV6_DHCP6 */
diff --git a/components/lwip/core/ipv6/ethip6.c b/components/lwip/core/ipv6/ethip6.c
deleted file mode 100644 (file)
index 36aa952..0000000
+++ /dev/null
@@ -1,159 +0,0 @@
-/**
- * @file
- *
- * Ethernet output for IPv6. Uses ND tables for link-layer addressing.
- */
-
-/*
- * Copyright (c) 2010 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>
- */
-
-#include "lwip/opt.h"
-
-#if LWIP_IPV6 && LWIP_ETHERNET
-
-#include "lwip/ethip6.h"
-#include "lwip/nd6.h"
-#include "lwip/pbuf.h"
-#include "lwip/ip6.h"
-#include "lwip/ip6_addr.h"
-#include "lwip/inet_chksum.h"
-#include "lwip/netif.h"
-#include "lwip/icmp6.h"
-#include "netif/ethernet.h"
-
-#include <string.h>
-
-/**
- * Send an IPv6 packet on the network using netif->linkoutput
- * The ethernet header is filled in before sending.
- *
- * @params netif the lwIP network interface on which to send the packet
- * @params p the packet to send, p->payload pointing to the (uninitialized) ethernet header
- * @params src the source MAC address to be copied into the ethernet header
- * @params dst the destination MAC address to be copied into the ethernet header
- * @return ERR_OK if the packet was sent, any other err_t on failure
- */
-static err_t
-ethip6_send(struct netif *netif, struct pbuf *p, struct eth_addr *src, struct eth_addr *dst)
-{
-  struct eth_hdr *ethhdr = (struct eth_hdr *)p->payload;
-
-  LWIP_ASSERT("netif->hwaddr_len must be 6 for ethip6!",
-              (netif->hwaddr_len == 6));
-  SMEMCPY(&ethhdr->dest, dst, 6);
-  SMEMCPY(&ethhdr->src, src, 6);
-  ethhdr->type = PP_HTONS(ETHTYPE_IPV6);
-  LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("ethip6_send: sending packet %p\n", (void *)p));
-  /* send the packet */
-  return netif->linkoutput(netif, p);
-}
-
-/**
- * Resolve and fill-in Ethernet address header for outgoing IPv6 packet.
- *
- * For IPv6 multicast, corresponding Ethernet addresses
- * are selected and the packet is transmitted on the link.
- *
- * For unicast addresses, ...
- *
- * @TODO anycast addresses
- *
- * @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
- * - ERR_RTE No route to destination (no gateway to external networks),
- * or the return type of either etharp_query() or etharp_send_ip().
- */
-err_t
-ethip6_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr)
-{
-  struct eth_addr dest;
-  s8_t i;
-
-  /* make room for Ethernet header - should not fail */
-  if (pbuf_header(q, sizeof(struct eth_hdr)) != 0) {
-    /* bail out */
-    LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,
-      ("etharp_output: could not allocate room for header.\n"));
-    return ERR_BUF;
-  }
-
-  /* multicast destination IP address? */
-  if (ip6_addr_ismulticast(ip6addr)) {
-    /* Hash IP multicast address to MAC address.*/
-    dest.addr[0] = 0x33;
-    dest.addr[1] = 0x33;
-    dest.addr[2] = ((const u8_t *)(&(ip6addr->addr[3])))[0];
-    dest.addr[3] = ((const u8_t *)(&(ip6addr->addr[3])))[1];
-    dest.addr[4] = ((const u8_t *)(&(ip6addr->addr[3])))[2];
-    dest.addr[5] = ((const u8_t *)(&(ip6addr->addr[3])))[3];
-
-    /* Send out. */
-    return ethip6_send(netif, q, (struct eth_addr*)(netif->hwaddr), &dest);
-  }
-
-  /* We have a unicast destination IP address */
-  /* TODO anycast? */
-  /* Get next hop record. */
-  i = nd6_get_next_hop_entry(ip6addr, netif);
-  if (i < 0) {
-    /* failed to get a next hop neighbor record. */
-    return ERR_MEM;
-  }
-
-  /* Now that we have a destination record, send or queue the packet. */
-  if (neighbor_cache[i].state == ND6_STALE) {
-    /* Switch to delay state. */
-    neighbor_cache[i].state = ND6_DELAY;
-    neighbor_cache[i].counter.delay_time = LWIP_ND6_DELAY_FIRST_PROBE_TIME;
-  }
-  /* TODO should we send or queue if PROBE? send for now, to let unicast NS pass. */
-  if ((neighbor_cache[i].state == ND6_REACHABLE) ||
-      (neighbor_cache[i].state == ND6_DELAY) ||
-      (neighbor_cache[i].state == ND6_PROBE)) {
-
-    /* Send out. */
-    SMEMCPY(dest.addr, neighbor_cache[i].lladdr, 6);
-    return ethip6_send(netif, q, (struct eth_addr*)(netif->hwaddr), &dest);
-  }
-
-  /* We should queue packet on this interface. */
-  pbuf_header(q, -(s16_t)SIZEOF_ETH_HDR);
-  return nd6_queue_packet(i, q);
-}
-
-#endif /* LWIP_IPV6 && LWIP_ETHERNET */
diff --git a/components/lwip/core/ipv6/icmp6.c b/components/lwip/core/ipv6/icmp6.c
deleted file mode 100644 (file)
index 013983b..0000000
+++ /dev/null
@@ -1,349 +0,0 @@
-/**
- * @file
- *
- * IPv6 version of ICMP, as per RFC 4443.
- */
-
-/*
- * Copyright (c) 2010 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>
- */
-
-#include "lwip/opt.h"
-
-#if LWIP_ICMP6 && LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/icmp6.h"
-#include "lwip/ip6.h"
-#include "lwip/ip6_addr.h"
-#include "lwip/inet_chksum.h"
-#include "lwip/pbuf.h"
-#include "lwip/netif.h"
-#include "lwip/nd6.h"
-#include "lwip/mld6.h"
-#include "lwip/ip.h"
-#include "lwip/stats.h"
-
-#include <string.h>
-
-#ifndef LWIP_ICMP6_DATASIZE
-#define LWIP_ICMP6_DATASIZE   8
-#endif
-#if LWIP_ICMP6_DATASIZE == 0
-#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);
-
-
-/**
- * Process an input ICMPv6 message. Called by ip6_input.
- *
- * Will generate a reply for echo requests. Other messages are forwarded
- * to nd6_input, or mld6_input.
- *
- * @param p the mld packet, p->payload pointing to the icmpv6 header
- * @param inp the netif on which this packet was received
- */
-void
-icmp6_input(struct pbuf *p, struct netif *inp)
-{
-  struct icmp6_hdr *icmp6hdr;
-  struct pbuf * r;
-  const ip6_addr_t * reply_src;
-
-  ICMP6_STATS_INC(icmp6.recv);
-
-  /* Check that ICMPv6 header fits in payload */
-  if (p->len < sizeof(struct icmp6_hdr)) {
-    /* drop short packets */
-    pbuf_free(p);
-    ICMP6_STATS_INC(icmp6.lenerr);
-    ICMP6_STATS_INC(icmp6.drop);
-    return;
-  }
-
-  icmp6hdr = (struct icmp6_hdr *)p->payload;
-
-#if CHECKSUM_CHECK_ICMP6
-  IF__NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_CHECK_ICMP6) {
-    if (ip6_chksum_pseudo(p, IP6_NEXTH_ICMP6, p->tot_len, ip6_current_src_addr(),
-                          ip6_current_dest_addr()) != 0) {
-      /* Checksum failed */
-      pbuf_free(p);
-      ICMP6_STATS_INC(icmp6.chkerr);
-      ICMP6_STATS_INC(icmp6.drop);
-      return;
-    }
-  }
-#endif /* CHECKSUM_CHECK_ICMP6 */
-
-  switch (icmp6hdr->type) {
-  case ICMP6_TYPE_NA: /* Neighbor advertisement */
-  case ICMP6_TYPE_NS: /* Neighbor solicitation */
-  case ICMP6_TYPE_RA: /* Router advertisement */
-  case ICMP6_TYPE_RD: /* Redirect */
-  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 */
-#endif
-    break;
-#if LWIP_IPV6_MLD
-  case ICMP6_TYPE_MLQ:
-  case ICMP6_TYPE_MLR:
-  case ICMP6_TYPE_MLD:
-    mld6_input(p, inp);
-    return;
-    break;
-#endif
-  case ICMP6_TYPE_EREQ:
-#if !LWIP_MULTICAST_PING
-    /* multicast destination address? */
-    if (ip6_addr_ismulticast(ip6_current_dest_addr())) {
-      /* drop */
-      pbuf_free(p);
-      ICMP6_STATS_INC(icmp6.drop);
-      return;
-    }
-#endif /* LWIP_MULTICAST_PING */
-
-    /* Allocate reply. */
-    r = pbuf_alloc(PBUF_IP, p->tot_len, PBUF_RAM);
-    if (r == NULL) {
-      /* drop */
-      pbuf_free(p);
-      ICMP6_STATS_INC(icmp6.memerr);
-      return;
-    }
-
-    /* Copy echo request. */
-    if (pbuf_copy(r, p) != ERR_OK) {
-      /* drop */
-      pbuf_free(p);
-      pbuf_free(r);
-      ICMP6_STATS_INC(icmp6.err);
-      return;
-    }
-
-    /* Determine reply source IPv6 address. */
-#if LWIP_MULTICAST_PING
-    if (ip6_addr_ismulticast(ip6_current_dest_addr())) {
-      reply_src = ip_2_ip6(ip6_select_source_address(inp, ip6_current_src_addr()));
-      if (reply_src == NULL) {
-        /* drop */
-        pbuf_free(p);
-        pbuf_free(r);
-        ICMP6_STATS_INC(icmp6.rterr);
-        return;
-      }
-    }
-    else
-#endif /* LWIP_MULTICAST_PING */
-    {
-      reply_src = ip6_current_dest_addr();
-    }
-
-    /* Set fields in reply. */
-    ((struct icmp6_echo_hdr *)(r->payload))->type = ICMP6_TYPE_EREP;
-    ((struct icmp6_echo_hdr *)(r->payload))->chksum = 0;
-#if CHECKSUM_GEN_ICMP6
-    IF__NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_GEN_ICMP6) {
-      ((struct icmp6_echo_hdr *)(r->payload))->chksum = ip6_chksum_pseudo(r,
-          IP6_NEXTH_ICMP6, r->tot_len, reply_src, ip6_current_src_addr());
-    }
-#endif /* CHECKSUM_GEN_ICMP6 */
-
-    /* Send reply. */
-    ICMP6_STATS_INC(icmp6.xmit);
-    ip6_output_if(r, reply_src, ip6_current_src_addr(),
-        LWIP_ICMP6_HL, 0, IP6_NEXTH_ICMP6, inp);
-    pbuf_free(r);
-
-    break;
-  default:
-    ICMP6_STATS_INC(icmp6.proterr);
-    ICMP6_STATS_INC(icmp6.drop);
-    break;
-  }
-
-  pbuf_free(p);
-}
-
-
-/**
- * Send an icmpv6 'destination unreachable' packet.
- *
- * @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
- */
-void
-icmp6_dest_unreach(struct pbuf *p, enum icmp6_dur_code c)
-{
-  icmp6_send_response(p, c, 0, ICMP6_TYPE_DUR);
-}
-
-/**
- * Send an icmpv6 'packet too big' packet.
- *
- * @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
- */
-void
-icmp6_packet_too_big(struct pbuf *p, u32_t mtu)
-{
-  icmp6_send_response(p, 0, mtu, ICMP6_TYPE_PTB);
-}
-
-/**
- * Send an icmpv6 'time exceeded' packet.
- *
- * @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 time exceeded type
- */
-void
-icmp6_time_exceeded(struct pbuf *p, enum icmp6_te_code c)
-{
-  icmp6_send_response(p, c, 0, ICMP6_TYPE_TE);
-}
-
-/**
- * Send an icmpv6 'parameter problem' packet.
- *
- * @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_send_response(p, c, pointer, ICMP6_TYPE_PP);
-}
-
-/**
- * Send an ICMPv6 packet in response to an incoming packet.
- *
- * @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
- */
-static void
-icmp6_send_response(struct pbuf *p, u8_t code, u32_t data, u8_t type)
-{
-  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,
-                 PBUF_RAM);
-  if (q == NULL) {
-    LWIP_DEBUGF(ICMP_DEBUG, ("icmp_time_exceeded: failed to allocate pbuf for ICMPv6 packet.\n"));
-    ICMP6_STATS_INC(icmp6.memerr);
-    return;
-  }
-  LWIP_ASSERT("check that first pbuf can hold icmp 6message",
-             (q->len >= (sizeof(struct icmp6_hdr) + IP6_HLEN + LWIP_ICMP6_DATASIZE)));
-
-  icmp6hdr = (struct icmp6_hdr *)q->payload;
-  icmp6hdr->type = type;
-  icmp6hdr->code = code;
-  icmp6hdr->data = 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
-  IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_ICMP6) {
-    icmp6hdr->chksum = ip6_chksum_pseudo(q, IP6_NEXTH_ICMP6, q->tot_len,
-      reply_src, reply_dest);
-  }
-#endif /* CHECKSUM_GEN_ICMP6 */
-
-  ICMP6_STATS_INC(icmp6.xmit);
-  ip6_output_if(q, reply_src, reply_dest, LWIP_ICMP6_HL, 0, IP6_NEXTH_ICMP6, netif);
-  pbuf_free(q);
-}
-
-#endif /* LWIP_ICMP6 && LWIP_IPV6 */
diff --git a/components/lwip/core/ipv6/inet6.c b/components/lwip/core/ipv6/inet6.c
deleted file mode 100644 (file)
index d9a992c..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * @file
- *
- * INET v6 addresses.
- */
-
-/*
- * Copyright (c) 2010 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>
- */
-
-#include "lwip/opt.h"
-
-#if LWIP_IPV6 && LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/def.h"
-#include "lwip/inet.h"
-
-/** This variable is initialized by the system to contain the wildcard IPv6 address.
- */
-const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT;
-
-#endif /* LWIP_IPV6 */
diff --git a/components/lwip/core/ipv6/ip6.c b/components/lwip/core/ipv6/ip6.c
deleted file mode 100644 (file)
index acd28fb..0000000
+++ /dev/null
@@ -1,1105 +0,0 @@
-/**
- * @file
- *
- * IPv6 layer.
- */
-
-/*
- * Copyright (c) 2010 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>
- */
-
-#include "lwip/opt.h"
-
-#if LWIP_IPV6  /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/def.h"
-#include "lwip/mem.h"
-#include "lwip/netif.h"
-#include "lwip/ip6.h"
-#include "lwip/ip6_addr.h"
-#include "lwip/ip6_frag.h"
-#include "lwip/icmp6.h"
-#include "lwip/raw.h"
-#include "lwip/udp.h"
-#include "lwip/priv/tcp_priv.h"
-#include "lwip/dhcp6.h"
-#include "lwip/nd6.h"
-#include "lwip/mld6.h"
-#include "lwip/debug.h"
-#include "lwip/stats.h"
-
-/**
- * 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
- *
- * @param src the source IPv6 address, if known
- * @param dest the destination IPv6 address for which to find the route
- * @return the netif on which to send to reach dest
- */
-struct netif *
-ip6_route(const ip6_addr_t *src, const ip6_addr_t *dest)
-{
-  struct netif *netif;
-  s8_t i;
-
-  /* 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)) {
-      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_is_up(netif_default) || !netif_is_link_up(netif_default)) {
-        return NULL;
-      }
-      return netif_default;
-    }
-
-    /* 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))) {
-          return netif;
-        }
-      }
-    }
-
-    /* netif not found, use default netif, if up */
-    if (!netif_is_up(netif_default) || !netif_is_link_up(netif_default)) {
-      return NULL;
-    }
-    return netif_default;
-  }
-
-  /* we come here for non-link-local addresses */
-#ifdef LWIP_HOOK_IP6_ROUTE
-  netif = LWIP_HOOK_IP6_ROUTE(src, dest);
-  if (netif != NULL) {
-    return netif;
-  }
-#endif
-
-  /* See if the destination subnet matches a configured address. */
-  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_netcmp(dest, netif_ip6_addr(netif, i))) {
-        return netif;
-      }
-    }
-  }
-
-  /* Get the netif for a suitable router. */
-  i = nd6_select_router(dest, NULL);
-  if (i >= 0) {
-    if (default_router_list[i].neighbor_entry != NULL) {
-      if (default_router_list[i].neighbor_entry->netif != NULL) {
-        if (netif_is_up(default_router_list[i].neighbor_entry->netif) && netif_is_link_up(default_router_list[i].neighbor_entry->netif)) {
-          return default_router_list[i].neighbor_entry->netif;
-        }
-      }
-    }
-  }
-
-  /* try with the netif that matches the source address. */
-  if (!ip6_addr_isany(src)) {
-    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))) {
-          return netif;
-        }
-      }
-    }
-  }
-
-#if LWIP_NETIF_LOOPBACK && !LWIP_HAVE_LOOPIF
-  /* loopif is disabled, loopback traffic is passed through any netif */
-  if (ip6_addr_isloopback(dest)) {
-    /* don't check for link on loopback traffic */
-    if (netif_is_up(netif_default)) {
-      return netif_default;
-    }
-    /* default netif is not up, just use any netif for loopback traffic */
-    for (netif = netif_list; netif != NULL; netif = netif->next) {
-      if (netif_is_up(netif)) {
-        return netif;
-      }
-    }
-    return NULL;
-  }
-#endif /* LWIP_NETIF_LOOPBACK && !LWIP_HAVE_LOOPIF */
-
-  /* no matching netif 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;
-}
-
-/**
- * Select the best IPv6 source address for a given destination
- * IPv6 address. Loosely follows RFC 3484. "Strong host" behavior
- * is assumed.
- *
- * @param netif the netif on which to send a packet
- * @param dest the destination we are trying to reach
- * @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;
-
-  /* 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);
-      }
-    }
-  }
-
-  /* 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);
-      }
-    }
-  }
-
-  /* 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);
-    }
-  }
-
-  return NULL;
-}
-
-#if LWIP_IPV6_FORWARD
-/**
- * Forwards an IPv6 packet. It finds an appropriate route for the
- * packet, decrements the HL value of the packet, and outputs
- * the packet on the appropriate interface.
- *
- * @param p the packet to forward (p->payload points to IP header)
- * @param iphdr the IPv6 header of the input packet
- * @param inp the netif on which this packet was received
- */
-static void
-ip6_forward(struct pbuf *p, struct ip6_hdr *iphdr, struct netif *inp)
-{
-  struct netif *netif;
-
-  /* do not forward link-local addresses */
-  if (ip6_addr_islinklocal(ip6_current_dest_addr())) {
-    LWIP_DEBUGF(IP6_DEBUG, ("ip6_forward: not forwarding link-local address.\n"));
-    IP6_STATS_INC(ip6.rterr);
-    IP6_STATS_INC(ip6.drop);
-    return;
-  }
-
-  /* Find network interface where to forward this IP packet to. */
-  netif = ip6_route(IP6_ADDR_ANY6, ip6_current_dest_addr());
-  if (netif == NULL) {
-    LWIP_DEBUGF(IP6_DEBUG, ("ip6_forward: no route for %"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F"\n",
-        IP6_ADDR_BLOCK1(ip6_current_dest_addr()),
-        IP6_ADDR_BLOCK2(ip6_current_dest_addr()),
-        IP6_ADDR_BLOCK3(ip6_current_dest_addr()),
-        IP6_ADDR_BLOCK4(ip6_current_dest_addr()),
-        IP6_ADDR_BLOCK5(ip6_current_dest_addr()),
-        IP6_ADDR_BLOCK6(ip6_current_dest_addr()),
-        IP6_ADDR_BLOCK7(ip6_current_dest_addr()),
-        IP6_ADDR_BLOCK8(ip6_current_dest_addr())));
-#if LWIP_ICMP6
-    /* Don't send ICMP messages in response to ICMP messages */
-    if (IP6H_NEXTH(iphdr) != IP6_NEXTH_ICMP6) {
-      icmp6_dest_unreach(p, ICMP6_DUR_NO_ROUTE);
-    }
-#endif /* LWIP_ICMP6 */
-    IP6_STATS_INC(ip6.rterr);
-    IP6_STATS_INC(ip6.drop);
-    return;
-  }
-  /* Do not forward packets onto the same network interface on which
-   * they arrived. */
-  if (netif == inp) {
-    LWIP_DEBUGF(IP6_DEBUG, ("ip6_forward: not bouncing packets back on incoming interface.\n"));
-    IP6_STATS_INC(ip6.rterr);
-    IP6_STATS_INC(ip6.drop);
-    return;
-  }
-
-  /* decrement HL */
-  IP6H_HOPLIM_SET(iphdr, IP6H_HOPLIM(iphdr) - 1);
-  /* send ICMP6 if HL == 0 */
-  if (IP6H_HOPLIM(iphdr) == 0) {
-#if LWIP_ICMP6
-    /* Don't send ICMP messages in response to ICMP messages */
-    if (IP6H_NEXTH(iphdr) != IP6_NEXTH_ICMP6) {
-      icmp6_time_exceeded(p, ICMP6_TE_HL);
-    }
-#endif /* LWIP_ICMP6 */
-    IP6_STATS_INC(ip6.drop);
-    return;
-  }
-
-  if (netif->mtu && (p->tot_len > netif->mtu)) {
-#if LWIP_ICMP6
-    /* Don't send ICMP messages in response to ICMP messages */
-    if (IP6H_NEXTH(iphdr) != IP6_NEXTH_ICMP6) {
-      icmp6_packet_too_big(p, netif->mtu);
-    }
-#endif /* LWIP_ICMP6 */
-    IP6_STATS_INC(ip6.drop);
-    return;
-  }
-
-  LWIP_DEBUGF(IP6_DEBUG, ("ip6_forward: forwarding packet to %"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F"\n",
-      IP6_ADDR_BLOCK1(ip6_current_dest_addr()),
-      IP6_ADDR_BLOCK2(ip6_current_dest_addr()),
-      IP6_ADDR_BLOCK3(ip6_current_dest_addr()),
-      IP6_ADDR_BLOCK4(ip6_current_dest_addr()),
-      IP6_ADDR_BLOCK5(ip6_current_dest_addr()),
-      IP6_ADDR_BLOCK6(ip6_current_dest_addr()),
-      IP6_ADDR_BLOCK7(ip6_current_dest_addr()),
-      IP6_ADDR_BLOCK8(ip6_current_dest_addr())));
-
-  /* transmit pbuf on chosen interface */
-  netif->output_ip6(netif, p, ip6_current_dest_addr());
-  IP6_STATS_INC(ip6.fw);
-  IP6_STATS_INC(ip6.xmit);
-  return;
-}
-#endif /* LWIP_IPV6_FORWARD */
-
-/**
- * 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).
- *
- * Finally, the packet is sent to the upper layer protocol input function.
- *
- * @param p the received IPv6 packet (p->payload points to IPv6 header)
- * @param inp the netif on which this packet was received
- * @return ERR_OK if the packet was processed (could return ERR_* if it wasn't
- *         processed, but currently always returns ERR_OK)
- */
-err_t
-ip6_input(struct pbuf *p, struct netif *inp)
-{
-  struct ip6_hdr *ip6hdr;
-  struct netif *netif;
-  u8_t nexth;
-  u16_t hlen; /* the current header length */
-  u8_t i;
-#if 0 /*IP_ACCEPT_LINK_LAYER_ADDRESSING*/
-  @todo
-  int check_ip_src=1;
-#endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */
-
-  IP6_STATS_INC(ip6.recv);
-
-  /* identify the IP header */
-  ip6hdr = (struct ip6_hdr *)p->payload;
-  if (IP6H_V(ip6hdr) != 6) {
-    LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_WARNING, ("IPv6 packet dropped due to bad version number %"U32_F"\n",
-        IP6H_V(ip6hdr)));
-    pbuf_free(p);
-    IP6_STATS_INC(ip6.err);
-    IP6_STATS_INC(ip6.drop);
-    return ERR_OK;
-  }
-
-#ifdef LWIP_HOOK_IP6_INPUT
-  if (LWIP_HOOK_IP6_INPUT(p, inp)) {
-    /* the packet has been eaten */
-    return ERR_OK;
-  }
-#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) {
-      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",
-            IP6_HLEN, p->len));
-    }
-    if ((IP6H_PLEN(ip6hdr) + IP6_HLEN) > p->tot_len) {
-      LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
-        ("IPv6 (plen %"U16_F") is longer than pbuf (len %"U16_F"), IP packet dropped.\n",
-            IP6H_PLEN(ip6hdr) + IP6_HLEN, p->tot_len));
-    }
-    /* free (drop) packet pbufs */
-    pbuf_free(p);
-    IP6_STATS_INC(ip6.lenerr);
-    IP6_STATS_INC(ip6.drop);
-    return ERR_OK;
-  }
-
-  /* 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));
-
-  /* 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);
-
-  /* current header pointer. */
-  ip_data.current_ip6_header = ip6hdr;
-
-  /* In netif, used in case we need to send ICMPv6 packets back. */
-  ip_data.current_netif = inp;
-  ip_data.current_input_netif = inp;
-
-  /* match packet against an interface, i.e. is this packet for us? */
-  if (ip6_addr_ismulticast(ip6_current_dest_addr())) {
-    /* Always joined to multicast if-local and link-local all-nodes group. */
-    if (ip6_addr_isallnodes_iflocal(ip6_current_dest_addr()) ||
-        ip6_addr_isallnodes_linklocal(ip6_current_dest_addr())) {
-      netif = inp;
-    }
-#if LWIP_IPV6_MLD
-    else if (mld6_lookfor_group(inp, ip6_current_dest_addr())) {
-      netif = inp;
-    }
-#else /* LWIP_IPV6_MLD */
-    else if (ip6_addr_issolicitednode(ip6_current_dest_addr())) {
-      /* Filter solicited node packets when MLD is not enabled
-       * (for Neighbor discovery). */
-      netif = NULL;
-      for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
-        if (ip6_addr_isvalid(netif_ip6_addr_state(inp, i)) &&
-            ip6_addr_cmp_solicitednode(ip6_current_dest_addr(), netif_ip6_addr(inp, i))) {
-          netif = inp;
-          LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: solicited node packet accepted on interface %c%c\n",
-              netif->name[0], netif->name[1]));
-          break;
-        }
-      }
-    }
-#endif /* LWIP_IPV6_MLD */
-    else {
-      netif = NULL;
-    }
-  } 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;
-          }
-        }
-      }
-      if (ip6_addr_islinklocal(ip6_current_dest_addr())) {
-        /* Do not match link-local addresses to other netifs. */
-        netif = NULL;
-        break;
-      }
-      if (first) {
-        first = 0;
-        netif = netif_list;
-      } else {
-        netif = netif->next;
-      }
-      if (netif == inp) {
-        netif = netif->next;
-      }
-    } while (netif != NULL);
-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'));
-  }
-
-  /* "::" packet source address? (used in duplicate address detection) */
-  if (ip6_addr_isany(ip6_current_src_addr()) &&
-      (!ip6_addr_issolicitednode(ip6_current_dest_addr()))) {
-    /* packet source is not valid */
-    /* free (drop) packet pbufs */
-    LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with src ANY_ADDRESS dropped\n"));
-    pbuf_free(p);
-    IP6_STATS_INC(ip6.drop);
-    goto ip6_input_cleanup;
-  }
-
-  /* packet not for us? */
-  if (netif == NULL) {
-    /* packet not for us, route or discard */
-    LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_TRACE, ("ip6_input: packet not for us.\n"));
-#if LWIP_IPV6_FORWARD
-    /* non-multicast packet? */
-    if (!ip6_addr_ismulticast(ip6_current_dest_addr())) {
-      /* try to forward IP packet on (other) interfaces */
-      ip6_forward(p, ip6hdr, inp);
-    }
-#endif /* LWIP_IPV6_FORWARD */
-    pbuf_free(p);
-    goto ip6_input_cleanup;
-  }
-
-  /* current netif pointer. */
-  ip_data.current_netif = netif;
-
-  /* Save next header type. */
-  nexth = IP6H_NEXTH(ip6hdr);
-
-  /* Init header length. */
-  hlen = ip_data.current_ip_header_tot_len = IP6_HLEN;
-
-  /* Move to payload. */
-  pbuf_header(p, -IP6_HLEN);
-
-  /* Process known option extension headers, if present. */
-  while (nexth != IP6_NEXTH_NONE)
-  {
-    switch (nexth) {
-    case IP6_NEXTH_HOPBYHOP:
-      LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with Hop-by-Hop options header\n"));
-      /* Get next header type. */
-      nexth = *((u8_t *)p->payload);
-
-      /* 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) {
-        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));
-        /* free (drop) packet pbufs */
-        pbuf_free(p);
-        IP6_STATS_INC(ip6.lenerr);
-        IP6_STATS_INC(ip6.drop);
-        goto ip6_input_cleanup;
-      }
-
-      pbuf_header(p, -(s16_t)hlen);
-      break;
-    case IP6_NEXTH_DESTOPTS:
-      LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with Destination options header\n"));
-      /* Get next header type. */
-      nexth = *((u8_t *)p->payload);
-
-      /* 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) {
-        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));
-        /* free (drop) packet pbufs */
-        pbuf_free(p);
-        IP6_STATS_INC(ip6.lenerr);
-        IP6_STATS_INC(ip6.drop);
-        goto ip6_input_cleanup;
-      }
-
-      pbuf_header(p, -(s16_t)hlen);
-      break;
-    case IP6_NEXTH_ROUTING:
-      LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with Routing header\n"));
-      /* Get next header type. */
-      nexth = *((u8_t *)p->payload);
-
-      /* 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) {
-        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));
-        /* free (drop) packet pbufs */
-        pbuf_free(p);
-        IP6_STATS_INC(ip6.lenerr);
-        IP6_STATS_INC(ip6.drop);
-        goto ip6_input_cleanup;
-      }
-
-      pbuf_header(p, -(s16_t)hlen);
-      break;
-
-    case IP6_NEXTH_FRAGMENT:
-    {
-      struct ip6_frag_hdr * frag_hdr;
-      LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with Fragment header\n"));
-
-      frag_hdr = (struct ip6_frag_hdr *)p->payload;
-
-      /* Get next header type. */
-      nexth = frag_hdr->_nexth;
-
-      /* 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) {
-        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));
-        /* free (drop) packet pbufs */
-        pbuf_free(p);
-        IP6_FRAG_STATS_INC(ip6_frag.lenerr);
-        IP6_FRAG_STATS_INC(ip6_frag.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);
-      } else {
-#if LWIP_IPV6_REASS
-
-        /* reassemble the packet */
-        p = ip6_reass(p);
-        /* packet not fully reassembled yet? */
-        if (p == NULL) {
-          goto ip6_input_cleanup;
-        }
-
-        /* 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);
-
-#else /* LWIP_IPV6_REASS */
-        /* free (drop) packet pbufs */
-        LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with Fragment header dropped (with LWIP_IPV6_REASS==0)\n"));
-        pbuf_free(p);
-        IP6_STATS_INC(ip6.opterr);
-        IP6_STATS_INC(ip6.drop);
-        goto ip6_input_cleanup;
-#endif /* LWIP_IPV6_REASS */
-      }
-      break;
-    }
-    default:
-      goto options_done;
-      break;
-    }
-  }
-options_done:
-
-  /* p points to IPv6 header again. */
-  pbuf_header_force(p, ip_data.current_ip_header_tot_len);
-
-  /* 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));
-
-#if LWIP_RAW
-  /* raw input did not eat the packet? */
-  if (raw_input(p, inp) == 0)
-#endif /* LWIP_RAW */
-  {
-    switch (nexth) {
-    case IP6_NEXTH_NONE:
-      pbuf_free(p);
-      break;
-#if LWIP_UDP
-    case IP6_NEXTH_UDP:
-#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_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);
-      }
-#endif /* LWIP_ICMP */
-      LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip6_input: Unsupported transport protocol %"U16_F"\n", IP6H_NEXTH(ip6hdr)));
-      pbuf_free(p);
-      IP6_STATS_INC(ip6.proterr);
-      IP6_STATS_INC(ip6.drop);
-      break;
-    }
-  }
-
-ip6_input_cleanup:
-  ip_data.current_netif = NULL;
-  ip_data.current_input_netif = NULL;
-  ip_data.current_ip6_header = NULL;
-  ip_data.current_ip_header_tot_len = 0;
-  ip6_addr_set_zero(ip6_current_src_addr());
-  ip6_addr_set_zero(ip6_current_dest_addr());
-
-  return ERR_OK;
-}
-
-
-/**
- * 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
- * IP_HDRINCL, p is assumed to already include an IPv6 header and p->payload points
- * to it instead of the data.
- *
- * @param p the packet to send (p->payload points to the data, e.g. next
-            protocol header; if dest == IP_HDRINCL, p already includes an
-            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
- * @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
- */
-err_t
-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)
-{
-  const ip6_addr_t *src_used = src;
-  if (dest != IP_HDRINCL) {
-    if (src != NULL && ip6_addr_isany(src)) {
-      src = ip_2_ip6(ip6_select_source_address(netif, dest));
-      if ((src == NULL) || ip6_addr_isany(src)) {
-        /* No appropriate source address was found for this packet. */
-        LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip6_output: No suitable source address for packet.\n"));
-        IP6_STATS_INC(ip6.rterr);
-        return ERR_RTE;
-      }
-    }
-  }
-  return ip6_output_if_src(p, src_used, dest, hl, tc, nexth, netif);
-}
-
-/**
- * Same as ip6_output_if() but 'src' address is not replaced by netif address
- * when it is 'any'.
- */
-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)
-{
-  struct ip6_hdr *ip6hdr;
-  ip6_addr_t dest_addr;
-
-  LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX(p);
-
-  /* Should the IPv6 header be generated or is it already included in p? */
-  if (dest != IP_HDRINCL) {
-    /* generate IPv6 header */
-    if (pbuf_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;
-    }
-
-    ip6hdr = (struct ip6_hdr *)p->payload;
-    LWIP_ASSERT("check that first pbuf can hold struct ip6_hdr",
-               (p->len >= sizeof(struct ip6_hdr)));
-
-    IP6H_HOPLIM_SET(ip6hdr, hl);
-    IP6H_NEXTH_SET(ip6hdr, nexth);
-
-    /* dest cannot be NULL here */
-    ip6_addr_copy(ip6hdr->dest, *dest);
-
-    IP6H_VTCFL_SET(ip6hdr, 6, tc, 0);
-    IP6H_PLEN_SET(ip6hdr, p->tot_len - IP6_HLEN);
-
-    if (src == NULL) {
-      src = IP6_ADDR_ANY6;
-    }
-    /* src cannot be NULL here */
-    ip6_addr_copy(ip6hdr->src, *src);
-
-  } else {
-    /* IP header already included in p */
-    ip6hdr = (struct ip6_hdr *)p->payload;
-    ip6_addr_copy(dest_addr, ip6hdr->dest);
-    dest = &dest_addr;
-  }
-
-  IP6_STATS_INC(ip6.xmit);
-
-  LWIP_DEBUGF(IP6_DEBUG, ("ip6_output_if: %c%c%"U16_F"\n", netif->name[0], netif->name[1], netif->num));
-  ip6_debug_print(p);
-
-#if ENABLE_LOOPBACK
-  {
-    int i;
-#if !LWIP_HAVE_LOOPIF
-    if (ip6_addr_isloopback(dest)) {
-      return netif_loop_output(netif, p);
-    }
-#endif /* !LWIP_HAVE_LOOPIF */
-    for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
-      if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) &&
-          ip6_addr_cmp(dest, netif_ip6_addr(netif, i))) {
-        /* Packet to self, enqueue it for loopback */
-        LWIP_DEBUGF(IP6_DEBUG, ("netif_loop_output()\n"));
-        return netif_loop_output(netif, p);
-      }
-    }
-  }
-#if LWIP_IPV6_MLD
-  if ((p->flags & PBUF_FLAG_MCASTLOOP) != 0) {
-    netif_loop_output(netif, p);
-  }
-#endif /* LWIP_IPV6_MLD */
-#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))) {
-    return ip6_frag(p, netif, dest);
-  }
-#endif /* LWIP_IPV6_FRAG */
-
-  LWIP_DEBUGF(IP6_DEBUG, ("netif->output_ip6()\n"));
-  return netif->output_ip6(netif, p, dest);
-}
-
-/**
- * Simple interface to ip6_output_if. It finds the outgoing network
- * interface and calls upon ip6_output_if to do the actual work.
- *
- * @param p the packet to send (p->payload points to the data, e.g. next
-            protocol header; if dest == IP_HDRINCL, p already includes an
-            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
- * @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
- *
- * @return ERR_RTE if no route is found
- *         see ip_output_if() for more return values
- */
-err_t
-ip6_output(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;
-  struct ip6_hdr *ip6hdr;
-  ip6_addr_t src_addr, dest_addr;
-
-  LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX(p);
-
-  if (dest != IP_HDRINCL) {
-    netif = ip6_route(src, dest);
-  } 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);
-    netif = ip6_route(&src_addr, &dest_addr);
-  }
-
-  if (netif == NULL) {
-    LWIP_DEBUGF(IP6_DEBUG, ("ip6_output: no route for %"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F"\n",
-        IP6_ADDR_BLOCK1(dest),
-        IP6_ADDR_BLOCK2(dest),
-        IP6_ADDR_BLOCK3(dest),
-        IP6_ADDR_BLOCK4(dest),
-        IP6_ADDR_BLOCK5(dest),
-        IP6_ADDR_BLOCK6(dest),
-        IP6_ADDR_BLOCK7(dest),
-        IP6_ADDR_BLOCK8(dest)));
-    IP6_STATS_INC(ip6.rterr);
-    return ERR_RTE;
-  }
-
-  return ip6_output_if(p, src, dest, hl, tc, nexth, netif);
-}
-
-
-#if LWIP_NETIF_HWADDRHINT
-/** Like ip6_output, but takes and addr_hint pointer that is passed on to netif->addr_hint
- *  before calling ip6_output_if.
- *
- * @param p the packet to send (p->payload points to the data, e.g. next
-            protocol header; if dest == IP_HDRINCL, p already includes an
-            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
- * @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
- *        calling ip_output_if()
- *
- * @return ERR_RTE if no route is found
- *         see ip_output_if() for more return values
- */
-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)
-{
-  struct netif *netif;
-  struct ip6_hdr *ip6hdr;
-  ip6_addr_t src_addr, dest_addr;
-  err_t err;
-
-  LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX(p);
-
-  if (dest != IP_HDRINCL) {
-    netif = ip6_route(src, dest);
-  } 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);
-    netif = ip6_route(&src_addr, &dest_addr);
-  }
-
-  if (netif == NULL) {
-    LWIP_DEBUGF(IP6_DEBUG, ("ip6_output: no route for %"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F"\n",
-        IP6_ADDR_BLOCK1(dest),
-        IP6_ADDR_BLOCK2(dest),
-        IP6_ADDR_BLOCK3(dest),
-        IP6_ADDR_BLOCK4(dest),
-        IP6_ADDR_BLOCK5(dest),
-        IP6_ADDR_BLOCK6(dest),
-        IP6_ADDR_BLOCK7(dest),
-        IP6_ADDR_BLOCK8(dest)));
-    IP6_STATS_INC(ip6.rterr);
-    return ERR_RTE;
-  }
-
-  NETIF_SET_HWADDRHINT(netif, addr_hint);
-  err = ip6_output_if(p, src, dest, hl, tc, nexth, netif);
-  NETIF_SET_HWADDRHINT(netif, NULL);
-
-  return err;
-}
-#endif /* LWIP_NETIF_HWADDRHINT*/
-
-#if LWIP_IPV6_MLD
-/**
- * Add a hop-by-hop options header with a router alert option and padding.
- *
- * Used by MLD when sending a Multicast listener report/done message.
- *
- * @param p the packet to which we will prepend the options header
- * @param nexth the next header protocol number (e.g. IP6_NEXTH_ICMP6)
- * @param value the value of the router alert option data (e.g. IP6_ROUTER_ALERT_VALUE_MLD)
- * @return ERR_OK if hop-by-hop header was added, ERR_* otherwise
- */
-err_t
-ip6_options_add_hbh_ra(struct pbuf * p, u8_t nexth, u8_t value)
-{
-  struct ip6_hbh_hdr * hbh_hdr;
-
-  /* Move pointer to make room for hop-by-hop options header. */
-  if (pbuf_header(p, sizeof(struct ip6_hbh_hdr))) {
-    LWIP_DEBUGF(IP6_DEBUG, ("ip6_options: no space for options header\n"));
-    IP6_STATS_INC(ip6.err);
-    return ERR_BUF;
-  }
-
-  hbh_hdr = (struct ip6_hbh_hdr *)p->payload;
-
-  /* Set fields. */
-  hbh_hdr->_nexth = 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;
-
-  return ERR_OK;
-}
-#endif /* LWIP_IPV6_MLD */
-
-#if IP6_DEBUG
-/* Print an IPv6 header by using LWIP_DEBUGF
- * @param p an IPv6 packet, p->payload pointing to the IPv6 header
- */
-void
-ip6_debug_print(struct pbuf *p)
-{
-  struct ip6_hdr *ip6hdr = (struct ip6_hdr *)p->payload;
-
-  LWIP_DEBUGF(IP6_DEBUG, ("IPv6 header:\n"));
-  LWIP_DEBUGF(IP6_DEBUG, ("+-------------------------------+\n"));
-  LWIP_DEBUGF(IP6_DEBUG, ("| %2"U16_F" |  %3"U16_F"  |      %7"U32_F"     | (ver, class, flow)\n",
-                    IP6H_V(ip6hdr),
-                    IP6H_TC(ip6hdr),
-                    IP6H_FL(ip6hdr)));
-  LWIP_DEBUGF(IP6_DEBUG, ("+-------------------------------+\n"));
-  LWIP_DEBUGF(IP6_DEBUG, ("|     %5"U16_F"     |  %3"U16_F"  |  %3"U16_F"  | (plen, nexth, hopl)\n",
-                    IP6H_PLEN(ip6hdr),
-                    IP6H_NEXTH(ip6hdr),
-                    IP6H_HOPLIM(ip6hdr)));
-  LWIP_DEBUGF(IP6_DEBUG, ("+-------------------------------+\n"));
-  LWIP_DEBUGF(IP6_DEBUG, ("|  %4"X32_F" |  %4"X32_F" |  %4"X32_F" |  %4"X32_F" | (src)\n",
-                    IP6_ADDR_BLOCK1(&(ip6hdr->src)),
-                    IP6_ADDR_BLOCK2(&(ip6hdr->src)),
-                    IP6_ADDR_BLOCK3(&(ip6hdr->src)),
-                    IP6_ADDR_BLOCK4(&(ip6hdr->src))));
-  LWIP_DEBUGF(IP6_DEBUG, ("|  %4"X32_F" |  %4"X32_F" |  %4"X32_F" |  %4"X32_F" |\n",
-                    IP6_ADDR_BLOCK5(&(ip6hdr->src)),
-                    IP6_ADDR_BLOCK6(&(ip6hdr->src)),
-                    IP6_ADDR_BLOCK7(&(ip6hdr->src)),
-                    IP6_ADDR_BLOCK8(&(ip6hdr->src))));
-  LWIP_DEBUGF(IP6_DEBUG, ("+-------------------------------+\n"));
-  LWIP_DEBUGF(IP6_DEBUG, ("|  %4"X32_F" |  %4"X32_F" |  %4"X32_F" |  %4"X32_F" | (dest)\n",
-                    IP6_ADDR_BLOCK1(&(ip6hdr->dest)),
-                    IP6_ADDR_BLOCK2(&(ip6hdr->dest)),
-                    IP6_ADDR_BLOCK3(&(ip6hdr->dest)),
-                    IP6_ADDR_BLOCK4(&(ip6hdr->dest))));
-  LWIP_DEBUGF(IP6_DEBUG, ("|  %4"X32_F" |  %4"X32_F" |  %4"X32_F" |  %4"X32_F" |\n",
-                    IP6_ADDR_BLOCK5(&(ip6hdr->dest)),
-                    IP6_ADDR_BLOCK6(&(ip6hdr->dest)),
-                    IP6_ADDR_BLOCK7(&(ip6hdr->dest)),
-                    IP6_ADDR_BLOCK8(&(ip6hdr->dest))));
-  LWIP_DEBUGF(IP6_DEBUG, ("+-------------------------------+\n"));
-}
-#endif /* IP6_DEBUG */
-
-#endif /* LWIP_IPV6 */
diff --git a/components/lwip/core/ipv6/ip6_addr.c b/components/lwip/core/ipv6/ip6_addr.c
deleted file mode 100644 (file)
index 44d5760..0000000
+++ /dev/null
@@ -1,292 +0,0 @@
-/**
- * @file
- *
- * IPv6 addresses.
- */
-
-/*
- * Copyright (c) 2010 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>
- *
- * Functions for handling IPv6 addresses.
- *
- * Please coordinate changes and requests with Ivan Delamer
- * <delamer@inicotech.com>
- */
-
-#include "lwip/opt.h"
-
-#if LWIP_IPV6  /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/ip_addr.h"
-#include "lwip/def.h"
-
-/* 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
-
-/**
- * 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.
- *
- * @param cp IPv6 address in ascii representation (e.g. "FF01::1")
- * @param addr pointer to which to save the ip address in network order
- * @return 1 if cp could be converted to addr, 0 on failure
- */
-int
-ip6addr_aton(const char *cp, ip6_addr_t *addr)
-{
-  u32_t addr_index, zero_blocks, current_block_index, current_block_value;
-  const char * s;
-
-  /* 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 */
-  zero_blocks = 8;
-  for (s = cp; *s != 0; s++) {
-    if (*s == ':') {
-      zero_blocks--;
-    } else if (!isxdigit(*s)) {
-      break;
-    }
-  }
-
-  /* parse each block */
-  addr_index = 0;
-  current_block_index = 0;
-  current_block_value = 0;
-  for (s = cp; *s != 0; s++) {
-    if (*s == ':') {
-      if (addr) {
-        if (current_block_index & 0x1) {
-          addr->addr[addr_index++] |= current_block_value;
-        }
-        else {
-          addr->addr[addr_index] = current_block_value << 16;
-        }
-      }
-      current_block_index++;
-      current_block_value = 0;
-      if (current_block_index > 7) {
-        /* address too long! */
-        return 0;
-      }
-      if (s[1] == ':') {
-        if (s[2] == ':') {
-          /* invalid format: three successive colons */
-          return 0;
-        }
-        s++;
-        /* "::" found, set zeros */
-        while (zero_blocks > 0) {
-          zero_blocks--;
-          if (current_block_index & 0x1) {
-            addr_index++;
-          } else {
-            if (addr) {
-              addr->addr[addr_index] = 0;
-            }
-          }
-          current_block_index++;
-          if (current_block_index > 7) {
-            /* address too long! */
-            return 0;
-          }
-        }
-      }
-    } else if (isxdigit(*s)) {
-      /* add current digit */
-      current_block_value = (current_block_value << 4) +
-          (isdigit(*s) ? *s - '0' :
-          10 + (islower(*s) ? *s - 'a' : *s - 'A'));
-    } else {
-      /* unexpected digit, space? CRLF? */
-      break;
-    }
-  }
-
-  if (addr) {
-    if (current_block_index & 0x1) {
-      addr->addr[addr_index++] |= current_block_value;
-    }
-    else {
-      addr->addr[addr_index] = current_block_value << 16;
-    }
-  }
-
-  /* convert to network byte order. */
-  if (addr) {
-    for (addr_index = 0; addr_index < 4; addr_index++) {
-      addr->addr[addr_index] = htonl(addr->addr[addr_index]);
-    }
-  }
-
-  if (current_block_index != 7) {
-    return 0;
-  }
-
-  return 1;
-}
-
-/**
- * Convert numeric IPv6 address into ASCII representation.
- * returns ptr to static buffer; not reentrant!
- *
- * @param addr ip6 address in network order to convert
- * @return pointer to a global static (!) buffer that holds the ASCII
- *         representation of addr
- */
-char *
-ip6addr_ntoa(const ip6_addr_t *addr)
-{
-  static char str[40];
-  return ip6addr_ntoa_r(addr, str, 40);
-}
-
-/**
- * Same as ipaddr_ntoa, but reentrant since a user-supplied buffer is used.
- *
- * @param addr ip6 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 *
-ip6addr_ntoa_r(const ip6_addr_t *addr, char *buf, int buflen)
-{
-  u32_t current_block_index, current_block_value, next_block_value;
-  s32_t i;
-  u8_t zero_flag, empty_block_flag;
-
-  i = 0;
-  empty_block_flag = 0; /* used to indicate a zero chain for "::' */
-
-  for (current_block_index = 0; current_block_index < 8; current_block_index++) {
-    /* get the current 16-bit block */
-    current_block_value = htonl(addr->addr[current_block_index >> 1]);
-    if ((current_block_index & 0x1) == 0) {
-      current_block_value = current_block_value >> 16;
-    }
-    current_block_value &= 0xffff;
-
-    /* Check for empty block. */
-    if (current_block_value == 0) {
-      if (current_block_index == 7) {
-        /* special case, we must render a ':' for the last block. */
-        buf[i++] = ':';
-        if (i >= buflen) {
-          return NULL;
-        }
-        break;
-      }
-      if (empty_block_flag == 0) {
-        /* generate empty block "::", but only if more than one contiguous zero block,
-         * according to current formatting suggestions RFC 5952. */
-        next_block_value = htonl(addr->addr[(current_block_index + 1) >> 1]);
-        if ((current_block_index & 0x1) == 0x01) {
-            next_block_value = next_block_value >> 16;
-        }
-        next_block_value &= 0xffff;
-        if (next_block_value == 0) {
-          empty_block_flag = 1;
-          buf[i++] = ':';
-          if (i >= buflen) {
-            return NULL;
-          }
-          continue; /* move on to next block. */
-        }
-      } else if (empty_block_flag == 1) {
-        /* move on to next block. */
-        continue;
-      }
-    } else if (empty_block_flag == 1) {
-      /* Set this flag value so we don't produce multiple empty blocks. */
-      empty_block_flag = 2;
-    }
-
-    if (current_block_index > 0) {
-      buf[i++] = ':';
-      if (i >= buflen) {
-        return NULL;
-      }
-    }
-
-    if ((current_block_value & 0xf000) == 0) {
-      zero_flag = 1;
-    } else {
-      buf[i++] = xchar(((current_block_value & 0xf000) >> 12));
-      zero_flag = 0;
-      if (i >= buflen) {
-        return NULL;
-      }
-    }
-
-    if (((current_block_value & 0xf00) == 0) && (zero_flag)) {
-      /* do nothing */
-    } else {
-      buf[i++] = xchar(((current_block_value & 0xf00) >> 8));
-      zero_flag = 0;
-      if (i >= buflen) {
-        return NULL;
-      }
-    }
-
-    if (((current_block_value & 0xf0) == 0) && (zero_flag)) {
-      /* do nothing */
-    }
-    else {
-      buf[i++] = xchar(((current_block_value & 0xf0) >> 4));
-      zero_flag = 0;
-      if (i >= buflen) {
-        return NULL;
-      }
-    }
-
-    buf[i++] = xchar((current_block_value & 0xf));
-    if (i >= buflen) {
-      return NULL;
-    }
-  }
-
-  buf[i] = 0;
-
-  return buf;
-}
-
-#endif /* LWIP_IPV6 */
diff --git a/components/lwip/core/ipv6/ip6_frag.c b/components/lwip/core/ipv6/ip6_frag.c
deleted file mode 100644 (file)
index c9e13cd..0000000
+++ /dev/null
@@ -1,773 +0,0 @@
-/**
- * @file
- *
- * IPv6 fragmentation and reassembly.
- */
-
-/*
- * Copyright (c) 2010 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>
- */
-
-#include "lwip/opt.h"
-#include "lwip/ip6_frag.h"
-#include "lwip/ip6.h"
-#include "lwip/icmp6.h"
-#include "lwip/nd6.h"
-#include "lwip/ip.h"
-
-#include "lwip/pbuf.h"
-#include "lwip/memp.h"
-#include "lwip/stats.h"
-
-#include <string.h>
-
-#if LWIP_IPV6 && LWIP_IPV6_REASS  /* don't build if not configured for use in lwipopts.h */
-
-
-/** 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! */
-#ifndef IP_REASS_CHECK_OVERLAP
-#define IP_REASS_CHECK_OVERLAP 1
-#endif /* IP_REASS_CHECK_OVERLAP */
-
-/** 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. */
-#ifndef IP_REASS_FREE_OLDEST
-#define IP_REASS_FREE_OLDEST 1
-#endif /* IP_REASS_FREE_OLDEST */
-
-#if IPV6_FRAG_COPYHEADER
-#define IPV6_FRAG_REQROOM ((s16_t)(sizeof(struct ip6_reass_helper) - IP6_FRAG_HLEN))
-#endif
-
-#define IP_REASS_FLAG_LASTFRAG 0x01
-
-/** 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.
- */
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct ip6_reass_helper {
-  PACK_STRUCT_FIELD(struct pbuf *next_pbuf);
-  PACK_STRUCT_FIELD(u16_t start);
-  PACK_STRUCT_FIELD(u16_t end);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
-/* static variables */
-static struct ip6_reassdata *reassdatagrams;
-static u16_t ip6_reass_pbufcount;
-
-/* Forward declarations. */
-static void ip6_reass_free_complete_datagram(struct ip6_reassdata *ipr);
-#if IP_REASS_FREE_OLDEST
-static void ip6_reass_remove_oldest_datagram(struct ip6_reassdata *ipr, int pbufs_needed);
-#endif /* IP_REASS_FREE_OLDEST */
-
-void
-ip6_reass_tmr(void)
-{
-  struct ip6_reassdata *r, *tmp;
-
-#if !IPV6_FRAG_COPYHEADER
-  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 */
-
-  r = reassdatagrams;
-  while (r != NULL) {
-    /* Decrement the timer. Once it reaches 0,
-     * clean up the incomplete fragment assembly */
-    if (r->timer > 0) {
-      r->timer--;
-      r = r->next;
-    } else {
-      /* reassembly timed out */
-      tmp = r;
-      /* get the next pointer before freeing */
-      r = r->next;
-      /* free the helper struct and all enqueued pbufs */
-      ip6_reass_free_complete_datagram(tmp);
-     }
-   }
-}
-
-/**
- * Free a datagram (struct ip6_reassdata) and all its pbufs.
- * Updates the total count of enqueued pbufs (ip6_reass_pbufcount),
- * sends an ICMP time exceeded packet.
- *
- * @param ipr datagram to free
- */
-static void
-ip6_reass_free_complete_datagram(struct ip6_reassdata *ipr)
-{
-  struct ip6_reassdata *prev;
-  u16_t pbufs_freed = 0;
-  u8_t clen;
-  struct pbuf *p;
-  struct ip6_reass_helper *iprh;
-
-#if LWIP_ICMP6
-  iprh = (struct ip6_reass_helper *)ipr->p->payload;
-  if (iprh->start == 0) {
-    /* The first fragment was received, send ICMP time exceeded. */
-    /* First, de-queue the first pbuf from r->p. */
-    p = ipr->p;
-    ipr->p = iprh->next_pbuf;
-    /* 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)))) {
-      LWIP_ASSERT("ip6_reass_free: moving p->payload to ip6 header failed\n", 0);
-    }
-    else {
-      icmp6_time_exceeded(p, ICMP6_TE_FRAG);
-    }
-    clen = pbuf_clen(p);
-    LWIP_ASSERT("pbufs_freed + clen <= 0xffff", pbufs_freed + clen <= 0xffff);
-    pbufs_freed += clen;
-    pbuf_free(p);
-  }
-#endif /* LWIP_ICMP6 */
-
-  /* First, free all received pbufs.  The individual pbufs need to be released
-     separately as they have not yet been chained */
-  p = ipr->p;
-  while (p != NULL) {
-    struct pbuf *pcur;
-    iprh = (struct ip6_reass_helper *)p->payload;
-    pcur = p;
-    /* get the next pointer before freeing */
-    p = iprh->next_pbuf;
-    clen = pbuf_clen(pcur);
-    LWIP_ASSERT("pbufs_freed + clen <= 0xffff", pbufs_freed + clen <= 0xffff);
-    pbufs_freed += clen;
-    pbuf_free(pcur);
-  }
-
-  /* Then, unchain the struct ip6_reassdata from the list and free it. */
-  if (ipr == reassdatagrams) {
-    reassdatagrams = ipr->next;
-  } else {
-    prev = reassdatagrams;
-    while (prev != NULL) {
-      if (prev->next == ipr) {
-        break;
-      }
-      prev = prev->next;
-    }
-    if (prev != NULL) {
-      prev->next = ipr->next;
-    }
-  }
-  memp_free(MEMP_IP6_REASSDATA, ipr);
-
-  /* Finally, update number of pbufs in reassembly queue */
-  LWIP_ASSERT("ip_reass_pbufcount >= clen", ip6_reass_pbufcount >= pbufs_freed);
-  ip6_reass_pbufcount -= pbufs_freed;
-}
-
-#if IP_REASS_FREE_OLDEST
-/**
- * Free the oldest datagram to make room for enqueueing new fragments.
- * The datagram ipr is not freed!
- *
- * @param ipr ip6_reassdata for the current fragment
- * @param pbufs_needed number of pbufs needed to enqueue
- *        (used for freeing other datagrams if not enough space)
- */
-static void
-ip6_reass_remove_oldest_datagram(struct ip6_reassdata *ipr, int pbufs_needed)
-{
-  struct ip6_reassdata *r, *oldest;
-
-  /* Free datagrams until being allowed to enqueue 'pbufs_needed' pbufs,
-   * but don't free the current datagram! */
-  do {
-    r = oldest = reassdatagrams;
-    while (r != NULL) {
-      if (r != ipr) {
-        if (r->timer <= oldest->timer) {
-          /* older than the previous oldest */
-          oldest = r;
-        }
-      }
-      r = r->next;
-    }
-    if (oldest == ipr) {
-      /* nothing to free, ipr is the only element on the list */
-      return;
-    }
-    if (oldest != NULL) {
-      ip6_reass_free_complete_datagram(oldest);
-    }
-  } while (((ip6_reass_pbufcount + pbufs_needed) > IP_REASS_MAX_PBUFS) && (reassdatagrams != NULL));
-}
-#endif /* IP_REASS_FREE_OLDEST */
-
-/**
- * Reassembles incoming IPv6 fragments into an IPv6 datagram.
- *
- * @param p points to the IPv6 Fragment Header
- * @param len the length of the payload (after Fragment Header)
- * @return NULL if reassembly is incomplete, pbuf pointing to
- *         IPv6 Header if reassembly is complete
- */
-struct pbuf *
-ip6_reass(struct pbuf *p)
-{
-  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;
-  u8_t clen, valid = 1;
-  struct pbuf *q;
-
-  IP6_FRAG_STATS_INC(ip6_frag.recv);
-
-  LWIP_ASSERT("ip6_frag_hdr must be in the first pbuf, not chained",
-     (const void*)ip6_current_header() == ((u8_t*)p->payload) - IP6_HLEN);
-
-  frag_hdr = (struct ip6_frag_hdr *) p->payload;
-
-  clen = pbuf_clen(p);
-
-  offset = ntohs(frag_hdr->_fragment_offset);
-
-  /* Calculate fragment length from IPv6 payload length.
-   * Adjust for headers before Fragment Header.
-   * And finally adjust by Fragment Header length. */
-  len = ntohs(ip6_current_header()->_plen);
-  len -= (u16_t)(((u8_t*)p->payload - (const u8_t*)ip6_current_header()) - IP6_HLEN);
-  len -= IP6_FRAG_HLEN;
-
-  /* Look for the datagram the fragment belongs to in the current datagram queue,
-   * remembering the previous in the queue for later dequeueing. */
-  for (ipr = reassdatagrams, ipr_prev = NULL; ipr != NULL; ipr = ipr->next) {
-    /* Check if the incoming fragment matches the one currently present
-       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_FRAG_STATS_INC(ip6_frag.cachehit);
-      break;
-    }
-    ipr_prev = ipr;
-  }
-
-  if (ipr == NULL) {
-  /* Enqueue a new datagram into the datagram queue */
-    ipr = (struct ip6_reassdata *)memp_malloc(MEMP_IP6_REASSDATA);
-    if (ipr == NULL) {
-#if IP_REASS_FREE_OLDEST
-      /* Make room and try again. */
-      ip6_reass_remove_oldest_datagram(ipr, clen);
-      ipr = (struct ip6_reassdata *)memp_malloc(MEMP_IP6_REASSDATA);
-      if (ipr != NULL) {
-        /* re-search ipr_prev since it might have been removed */
-        for (ipr_prev = reassdatagrams; ipr_prev != NULL; ipr_prev = ipr_prev->next) {
-          if (ipr_prev->next == ipr) {
-            break;
-          }
-        }
-      } else
-#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;
-
-    /* enqueue the new structure to the front of the list */
-    ipr->next = reassdatagrams;
-    reassdatagrams = ipr;
-
-    /* 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;
-#endif /* IPV6_FRAG_COPYHEADER */
-
-    /* copy the fragmented packet id. */
-    ipr->identification = frag_hdr->_identification;
-
-    /* copy the nexth field */
-    ipr->nexth = frag_hdr->_nexth;
-  }
-
-  /* Check if we are allowed to enqueue more datagrams. */
-  if ((ip6_reass_pbufcount + clen) > IP_REASS_MAX_PBUFS) {
-#if IP_REASS_FREE_OLDEST
-    ip6_reass_remove_oldest_datagram(ipr, clen);
-    if ((ip6_reass_pbufcount + clen) <= IP_REASS_MAX_PBUFS) {
-      /* re-search ipr_prev since it might have been removed */
-      for (ipr_prev = reassdatagrams; ipr_prev != NULL; ipr_prev = ipr_prev->next) {
-        if (ipr_prev->next == ipr) {
-          break;
-        }
-      }
-    } else
-#endif /* IP_REASS_FREE_OLDEST */
-    {
-      /* @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;
-    }
-  }
-
-  /* Overwrite Fragment Header with our own helper struct. */
-#if IPV6_FRAG_COPYHEADER
-  if (IPV6_FRAG_REQROOM > 0) {
-    /* Make room for struct ip6_reass_helper (only required if sizeof(void*) > 4).
-       This cannot fail since we already checked when receiving this fragment. */
-    err_t hdrerr = pbuf_header_force(p, IPV6_FRAG_REQROOM);
-    LWIP_ASSERT("no room for struct ip6_reass_helper", hdrerr == ERR_OK);
-  }
-#else /* IPV6_FRAG_COPYHEADER */
-  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 */
-  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;
-
-  /* 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 IP_REASS_CHECK_OVERLAP
-      if (iprh->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) {
-          /* 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;
-      if (iprh_prev != NULL) {
-        /* not the fragment with the lowest offset */
-        iprh_prev->next_pbuf = p;
-      } else {
-        /* fragment with the lowest offset */
-        ipr->p = p;
-      }
-      break;
-    } else if (iprh->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) {
-      /* 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 {
-      /* Check if the fragments received so far have no gaps. */
-      if (iprh_prev != NULL) {
-        if (iprh_prev->end != iprh_tmp->start) {
-          /* There is a fragment missing between the current
-           * and the previous fragment */
-          valid = 0;
-        }
-      }
-    }
-    q = iprh_tmp->next_pbuf;
-    iprh_prev = iprh_tmp;
-  }
-
-  /* If q is NULL, then we made it to the end of the list. Determine what to do now */
-  if (q == NULL) {
-    if (iprh_prev != NULL) {
-      /* 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);
-#endif /* IP_REASS_CHECK_OVERLAP */
-      iprh_prev->next_pbuf = p;
-      if (iprh_prev->end != iprh->start) {
-        valid = 0;
-      }
-    } else {
-#if IP_REASS_CHECK_OVERLAP
-      LWIP_ASSERT("no previous fragment, this must be the first fragment!",
-        ipr->p == NULL);
-#endif /* IP_REASS_CHECK_OVERLAP */
-      /* this is the first fragment we ever received for this ip datagram */
-      ipr->p = p;
-    }
-  }
-
-  /* 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;
-
-  /* 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 */
-    /* need to use the none-const pointer here: */
-    ipr->iphdr = ip_data.current_ip6_header;
-#endif /* IPV6_FRAG_COPYHEADER */
-  }
-
-  /* If this is the last fragment, calculate total packet length. */
-  if ((offset & IP6_FRAG_MORE_FLAG) == 0) {
-    ipr->datagram_len = iprh->end;
-  }
-
-  /* Additional validity tests: we have received first and last fragment. */
-  iprh_tmp = (struct ip6_reass_helper*)ipr->p->payload;
-  if (iprh_tmp->start != 0) {
-    valid = 0;
-  }
-  if (ipr->datagram_len == 0) {
-    valid = 0;
-  }
-
-  /* Final validity test: no gaps between current and last fragment. */
-  iprh_prev = iprh;
-  q = iprh->next_pbuf;
-  while ((q != NULL) && valid) {
-    iprh = (struct ip6_reass_helper*)q->payload;
-    if (iprh_prev->end != iprh->start) {
-      valid = 0;
-      break;
-    }
-    iprh_prev = iprh;
-    q = iprh->next_pbuf;
-  }
-
-  if (valid) {
-    /* All fragments have been received */
-    struct ip6_hdr* iphdr_ptr;
-
-    /* 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;
-      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);
-#if IPV6_FRAG_COPYHEADER
-        if (IPV6_FRAG_REQROOM > 0) {
-          /* hide the extra bytes borrowed from ip6_hdr for struct ip6_reass_helper */
-          err_t hdrerr = pbuf_header(next_pbuf, -(s16_t)(IPV6_FRAG_REQROOM));
-          LWIP_ASSERT("no room for struct ip6_reass_helper", hdrerr == ERR_OK);
-        }
-#endif
-        pbuf_cat(ipr->p, next_pbuf);
-      }
-      else {
-        iprh_tmp = NULL;
-      }
-
-      iprh = iprh_tmp;
-    }
-
-#if IPV6_FRAG_COPYHEADER
-    if (IPV6_FRAG_REQROOM > 0) {
-      /* get back room for struct ip6_reass_helper (only required if sizeof(void*) > 4) */
-      err_t hdrerr = pbuf_header(ipr->p, -(s16_t)(IPV6_FRAG_REQROOM));
-      LWIP_ASSERT("no room for struct ip6_reass_helper", hdrerr == ERR_OK);
-    }
-    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
-
-    /* Adjust datagram length by adding header lengths. */
-    ipr->datagram_len += (u16_t)(((u8_t*)ipr->p->payload - (u8_t*)iphdr_ptr)
-                         + IP6_FRAG_HLEN
-                         - IP6_HLEN);
-
-    /* Set payload length in ip header. */
-    iphdr_ptr->_plen = htons(ipr->datagram_len);
-
-    /* Get the first pbuf. */
-    p = ipr->p;
-
-    /* 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 */
-    if (reassdatagrams == ipr) {
-      /* it was the first in the list */
-      reassdatagrams = ipr->next;
-    } else {
-      /* it wasn't the first, so it must have a valid 'prev' */
-      LWIP_ASSERT("sanity check linked list", ipr_prev != NULL);
-      ipr_prev->next = ipr->next;
-    }
-    memp_free(MEMP_IP6_REASSDATA, ipr);
-
-    /* adjust the number of pbufs currently queued for reassembly. */
-    ip6_reass_pbufcount -= pbuf_clen(p);
-
-    /* Move pbuf back to IPv6 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*)iphdr_ptr))) {
-      LWIP_ASSERT("ip6_reass: moving p->payload to ip6 header failed\n", 0);
-      pbuf_free(p);
-      return NULL;
-    }
-
-    /* Return the pbuf chain */
-    return p;
-  }
-  /* the datagram is not (yet?) reassembled completely */
-  return NULL;
-
-nullreturn:
-  pbuf_free(p);
-  return NULL;
-}
-
-#endif /* LWIP_IPV6 && LWIP_IPV6_REASS */
-
-#if LWIP_IPV6 && LWIP_IPV6_FRAG
-
-/** Allocate a new struct pbuf_custom_ref */
-static struct pbuf_custom_ref*
-ip6_frag_alloc_pbuf_custom_ref(void)
-{
-  return (struct pbuf_custom_ref*)memp_malloc(MEMP_FRAG_PBUF);
-}
-
-/** Free a struct pbuf_custom_ref */
-static void
-ip6_frag_free_pbuf_custom_ref(struct pbuf_custom_ref* p)
-{
-  LWIP_ASSERT("p != NULL", p != NULL);
-  memp_free(MEMP_FRAG_PBUF, p);
-}
-
-/** Free-callback function to free a 'struct pbuf_custom_ref', called by
- * pbuf_free. */
-static void
-ip6_frag_free_pbuf_custom(struct pbuf *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);
-  if (pcr->original != NULL) {
-    pbuf_free(pcr->original);
-  }
-  ip6_frag_free_pbuf_custom_ref(pcr);
-}
-
-/**
- * Fragment an IPv6 datagram if too large for the netif or path MTU.
- *
- * Chop the datagram in MTU sized chunks and send them in order
- * by pointing PBUF_REFs into p
- *
- * @param p ipv6 packet to send
- * @param netif the netif on which to send
- * @param dest destination ipv6 address to which to send
- *
- * @return ERR_OK if sent successfully, err_t otherwise
- */
-err_t
-ip6_frag(struct pbuf *p, struct netif *netif, const ip6_addr_t *dest)
-{
-  struct ip6_hdr *original_ip6hdr;
-  struct ip6_hdr *ip6hdr;
-  struct ip6_frag_hdr * frag_hdr;
-  struct pbuf *rambuf;
-  struct pbuf *newpbuf;
-  static u32_t identification;
-  u16_t nfb;
-  u16_t left, cop;
-  u16_t mtu;
-  u16_t fragment_offset = 0;
-  u16_t last;
-  u16_t poff = IP6_HLEN;
-  u16_t newpbuflen = 0;
-  u16_t left_to_copy;
-
-  identification++;
-
-  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;
-
-  while (left) {
-    last = (left <= nfb);
-
-    /* Fill this fragment */
-    cop = last ? left : nfb;
-
-    /* When not using a static buffer, create a chain of pbufs.
-     * The first will be a PBUF_RAM holding the link, IPv6, and Fragment header.
-     * The rest will be PBUF_REFs mirroring the pbuf chain to be fragged,
-     * but limited to the size of an mtu.
-     */
-    rambuf = pbuf_alloc(PBUF_LINK, IP6_HLEN + IP6_FRAG_HLEN, PBUF_RAM);
-    if (rambuf == NULL) {
-      IP6_FRAG_STATS_INC(ip6_frag.memerr);
-      return ERR_MEM;
-    }
-    LWIP_ASSERT("this needs a pbuf in one piece!",
-                (p->len >= (IP6_HLEN + IP6_FRAG_HLEN)));
-    SMEMCPY(rambuf->payload, original_ip6hdr, IP6_HLEN);
-    ip6hdr = (struct ip6_hdr *)rambuf->payload;
-    frag_hdr = (struct ip6_frag_hdr *)((u8_t*)rambuf->payload + IP6_HLEN);
-
-    /* Can just adjust p directly for needed offset. */
-    p->payload = (u8_t *)p->payload + poff;
-    p->len -= poff;
-    p->tot_len -= poff;
-
-    left_to_copy = cop;
-    while (left_to_copy) {
-      struct pbuf_custom_ref *pcr;
-      newpbuflen = (left_to_copy < p->len) ? left_to_copy : p->len;
-      /* Is this pbuf already empty? */
-      if (!newpbuflen) {
-        p = p->next;
-        continue;
-      }
-      pcr = ip6_frag_alloc_pbuf_custom_ref();
-      if (pcr == NULL) {
-        pbuf_free(rambuf);
-        IP6_FRAG_STATS_INC(ip6_frag.memerr);
-        return ERR_MEM;
-      }
-      /* Mirror this pbuf, although we might not need all of it. */
-      newpbuf = pbuf_alloced_custom(PBUF_RAW, newpbuflen, PBUF_REF, &pcr->pc, p->payload, newpbuflen);
-      if (newpbuf == NULL) {
-        ip6_frag_free_pbuf_custom_ref(pcr);
-        pbuf_free(rambuf);
-        IP6_FRAG_STATS_INC(ip6_frag.memerr);
-        return ERR_MEM;
-      }
-      pbuf_ref(p);
-      pcr->original = p;
-      pcr->pc.custom_free_function = ip6_frag_free_pbuf_custom;
-
-      /* Add it to end of rambuf's chain, but using pbuf_cat, not pbuf_chain
-       * so that it is removed when pbuf_dechain is later called on rambuf.
-       */
-      pbuf_cat(rambuf, newpbuf);
-      left_to_copy -= newpbuflen;
-      if (left_to_copy) {
-        p = p->next;
-      }
-    }
-    poff = newpbuflen;
-
-    /* Set headers */
-    frag_hdr->_nexth = original_ip6hdr->_nexth;
-    frag_hdr->reserved = 0;
-    frag_hdr->_fragment_offset = htons((fragment_offset & IP6_FRAG_OFFSET_MASK) | (last ? 0 : IP6_FRAG_MORE_FLAG));
-    frag_hdr->_identification = htonl(identification);
-
-    IP6H_NEXTH_SET(ip6hdr, IP6_NEXTH_FRAGMENT);
-    IP6H_PLEN_SET(ip6hdr, cop + IP6_FRAG_HLEN);
-
-    /* No need for separate header pbuf - we allowed room for it in rambuf
-     * when allocated.
-     */
-    IP6_FRAG_STATS_INC(ip6_frag.xmit);
-    netif->output_ip6(netif, rambuf, dest);
-
-    /* Unfortunately we can't reuse rambuf - the hardware may still be
-     * using the buffer. Instead we free it (and the ensuing chain) and
-     * recreate it next time round the loop. If we're lucky the hardware
-     * will have already sent the packet, the free will really free, and
-     * there will be zero memory penalty.
-     */
-
-    pbuf_free(rambuf);
-    left -= cop;
-    fragment_offset += cop;
-  }
-  return ERR_OK;
-}
-
-#endif /* LWIP_IPV6 && LWIP_IPV6_FRAG */
diff --git a/components/lwip/core/ipv6/mld6.c b/components/lwip/core/ipv6/mld6.c
deleted file mode 100644 (file)
index 489c506..0000000
+++ /dev/null
@@ -1,588 +0,0 @@
-/**
- * @file
- *
- * Multicast listener discovery for IPv6. Aims to be compliant with RFC 2710.
- * No support for MLDv2.
- */
-
-/*
- * Copyright (c) 2010 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>
- */
-
-/* Based on igmp.c implementation of igmp v2 protocol */
-
-#include "lwip/opt.h"
-
-#if LWIP_IPV6 && LWIP_IPV6_MLD  /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/mld6.h"
-#include "lwip/icmp6.h"
-#include "lwip/ip6.h"
-#include "lwip/ip6_addr.h"
-#include "lwip/ip.h"
-#include "lwip/inet_chksum.h"
-#include "lwip/pbuf.h"
-#include "lwip/netif.h"
-#include "lwip/memp.h"
-#include "lwip/stats.h"
-
-#include <string.h>
-
-/*
- * MLD constants
- */
-#define MLD6_HL                           1
-#define MLD6_JOIN_DELAYING_MEMBER_TMR_MS  (500)
-
-#define MLD6_GROUP_NON_MEMBER             0
-#define MLD6_GROUP_DELAYING_MEMBER        1
-#define MLD6_GROUP_IDLE_MEMBER            2
-
-
-/* The list of joined groups. */
-static struct mld_group* mld_group_list;
-
-
-/* Forward declarations. */
-static struct mld_group * mld6_new_group(struct netif *ifp, const ip6_addr_t *addr);
-static err_t mld6_free_group(struct mld_group *group);
-static void mld6_delayed_report(struct mld_group *group, u16_t maxresp);
-static void mld6_send(struct mld_group *group, u8_t type);
-
-
-/**
- * Stop MLD processing on interface
- *
- * @param netif network interface on which stop MLD processing
- */
-err_t
-mld6_stop(struct netif *netif)
-{
-  struct mld_group *group = mld_group_list;
-  struct mld_group *prev  = NULL;
-  struct mld_group *next;
-
-  /* look for groups joined on this interface further down the list */
-  while (group != NULL) {
-    next = group->next;
-    /* is it a group joined on this interface? */
-    if (group->netif == netif) {
-      /* is it the first group of the list? */
-      if (group == mld_group_list) {
-        mld_group_list = next;
-      }
-      /* is there a "previous" group defined? */
-      if (prev != NULL) {
-        prev->next = next;
-      }
-      /* disable the group at the MAC level */
-      if (netif->mld_mac_filter != NULL) {
-        netif->mld_mac_filter(netif, &(group->group_address), MLD6_DEL_MAC_FILTER);
-      }
-      /* free group */
-      memp_free(MEMP_MLD6_GROUP, group);
-    } else {
-      /* change the "previous" */
-      prev = group;
-    }
-    /* move to "next" */
-    group = next;
-  }
-  return ERR_OK;
-}
-
-/**
- * Report MLD memberships for this interface
- *
- * @param netif network interface on which report MLD memberships
- */
-void
-mld6_report_groups(struct netif *netif)
-{
-  struct mld_group *group = mld_group_list;
-
-  while (group != NULL) {
-    if (group->netif == netif) {
-      mld6_delayed_report(group, MLD6_JOIN_DELAYING_MEMBER_TMR_MS);
-    }
-    group = group->next;
-  }
-}
-
-/**
- * Search for a group that is joined on a netif
- *
- * @param ifp the network interface for which to look
- * @param addr the group ipv6 address to search for
- * @return a struct mld_group* if the group has been found,
- *         NULL if the group wasn't found.
- */
-struct mld_group *
-mld6_lookfor_group(struct netif *ifp, const ip6_addr_t *addr)
-{
-  struct mld_group *group = mld_group_list;
-
-  while (group != NULL) {
-    if ((group->netif == ifp) && (ip6_addr_cmp(&(group->group_address), addr))) {
-      return group;
-    }
-    group = group->next;
-  }
-
-  return NULL;
-}
-
-
-/**
- * create a new group
- *
- * @param ifp the network interface for which to create
- * @param addr the new group ipv6
- * @return a struct mld_group*,
- *         NULL on memory error.
- */
-static struct mld_group *
-mld6_new_group(struct netif *ifp, const ip6_addr_t *addr)
-{
-  struct mld_group *group;
-
-  group = (struct mld_group *)memp_malloc(MEMP_MLD6_GROUP);
-  if (group != NULL) {
-    group->netif              = ifp;
-    ip6_addr_set(&(group->group_address), addr);
-    group->timer              = 0; /* Not running */
-    group->group_state        = MLD6_GROUP_IDLE_MEMBER;
-    group->last_reporter_flag = 0;
-    group->use                = 0;
-    group->next               = mld_group_list;
-
-    mld_group_list = group;
-  }
-
-  return group;
-}
-
-/**
- * Remove a group in the mld_group_list and free
- *
- * @param group the group to remove
- * @return ERR_OK if group was removed from the list, an err_t otherwise
- */
-static err_t
-mld6_free_group(struct mld_group *group)
-{
-  err_t err = ERR_OK;
-
-  /* Is it the first group? */
-  if (mld_group_list == group) {
-    mld_group_list = group->next;
-  } else {
-    /* look for group further down the list */
-    struct mld_group *tmpGroup;
-    for (tmpGroup = mld_group_list; tmpGroup != NULL; tmpGroup = tmpGroup->next) {
-      if (tmpGroup->next == group) {
-        tmpGroup->next = group->next;
-        break;
-      }
-    }
-    /* Group not find group */
-    if (tmpGroup == NULL) {
-      err = ERR_ARG;
-    }
-  }
-  /* free group */
-  memp_free(MEMP_MLD6_GROUP, group);
-
-  return err;
-}
-
-
-/**
- * Process an input MLD message. Called by icmp6_input.
- *
- * @param p the mld packet, p->payload pointing to the icmpv6 header
- * @param inp the netif on which this packet was received
- */
-void
-mld6_input(struct pbuf *p, struct netif *inp)
-{
-  struct mld_header * mld_hdr;
-  struct mld_group* group;
-
-  MLD6_STATS_INC(mld6.recv);
-
-  /* Check that mld header fits in packet. */
-  if (p->len < sizeof(struct mld_header)) {
-    /* TODO debug message */
-    pbuf_free(p);
-    MLD6_STATS_INC(mld6.lenerr);
-    MLD6_STATS_INC(mld6.drop);
-    return;
-  }
-
-  mld_hdr = (struct mld_header *)p->payload;
-
-  switch (mld_hdr->type) {
-  case ICMP6_TYPE_MLQ: /* Multicast listener query. */
-    /* Is it a general query? */
-    if (ip6_addr_isallnodes_linklocal(ip6_current_dest_addr()) &&
-        ip6_addr_isany(&(mld_hdr->multicast_address))) {
-      MLD6_STATS_INC(mld6.rx_general);
-      /* Report all groups, except all nodes group, and if-local groups. */
-      group = mld_group_list;
-      while (group != NULL) {
-        if ((group->netif == inp) &&
-            (!(ip6_addr_ismulticast_iflocal(&(group->group_address)))) &&
-            (!(ip6_addr_isallnodes_linklocal(&(group->group_address))))) {
-          mld6_delayed_report(group, mld_hdr->max_resp_delay);
-        }
-        group = group->next;
-      }
-    } else {
-      /* Have we joined this group?
-       * We use IP6 destination address to have a memory aligned copy.
-       * mld_hdr->multicast_address should be the same. */
-      MLD6_STATS_INC(mld6.rx_group);
-      group = mld6_lookfor_group(inp, ip6_current_dest_addr());
-      if (group != NULL) {
-        /* Schedule a report. */
-        mld6_delayed_report(group, mld_hdr->max_resp_delay);
-      }
-    }
-    break; /* ICMP6_TYPE_MLQ */
-  case ICMP6_TYPE_MLR: /* Multicast listener report. */
-    /* Have we joined this group?
-     * We use IP6 destination address to have a memory aligned copy.
-     * mld_hdr->multicast_address should be the same. */
-    MLD6_STATS_INC(mld6.rx_report);
-    group = mld6_lookfor_group(inp, ip6_current_dest_addr());
-    if (group != NULL) {
-      /* If we are waiting to report, cancel it. */
-      if (group->group_state == MLD6_GROUP_DELAYING_MEMBER) {
-        group->timer = 0; /* stopped */
-        group->group_state = MLD6_GROUP_IDLE_MEMBER;
-        group->last_reporter_flag = 0;
-      }
-    }
-    break; /* ICMP6_TYPE_MLR */
-  case ICMP6_TYPE_MLD: /* Multicast listener done. */
-    /* Do nothing, router will query us. */
-    break; /* ICMP6_TYPE_MLD */
-  default:
-    MLD6_STATS_INC(mld6.proterr);
-    MLD6_STATS_INC(mld6.drop);
-    break;
-  }
-
-  pbuf_free(p);
-}
-
-/**
- * Join a group on a network interface.
- *
- * @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
- * @return ERR_OK if group was joined on the netif(s), an err_t otherwise
- */
-err_t
-mld6_joingroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr)
-{
-  err_t         err = ERR_VAL; /* no matching interface */
-  struct netif *netif;
-
-  /* loop through netif's */
-  netif = netif_list;
-  while (netif != NULL) {
-    /* Should we join this interface ? */
-    if (ip6_addr_isany(srcaddr) ||
-        netif_get_ip6_addr_match(netif, srcaddr) >= 0) {
-      err = mld6_joingroup_netif(netif, groupaddr);
-      if (err != ERR_OK) {
-        return err;
-      }
-    }
-
-    /* proceed to next network interface */
-    netif = netif->next;
-  }
-
-  return err;
-}
-
-/**
- * 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
- * @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;
-
-  /* find group or create a new one if not found */
-  group = mld6_lookfor_group(netif, groupaddr);
-
-  if (group == NULL) {
-    /* Joining a new group. Create a new group entry. */
-    group = mld6_new_group(netif, groupaddr);
-    if (group == NULL) {
-      return ERR_MEM;
-    }
-
-    /* Activate this address on the MAC layer. */
-    if (netif->mld_mac_filter != NULL) {
-      netif->mld_mac_filter(netif, groupaddr, MLD6_ADD_MAC_FILTER);
-    }
-
-    /* Report our membership. */
-    MLD6_STATS_INC(mld6.tx_report);
-    mld6_send(group, ICMP6_TYPE_MLR);
-    mld6_delayed_report(group, MLD6_JOIN_DELAYING_MEMBER_TMR_MS);
-  }
-
-  /* Increment group use */
-  group->use++;
-  return ERR_OK;
-}
-
-/**
- * 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
- * @return ERR_OK if group was left on the netif(s), an err_t otherwise
- */
-err_t
-mld6_leavegroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr)
-{
-  err_t         err = ERR_VAL; /* no matching interface */
-  struct netif *netif;
-
-  /* loop through netif's */
-  netif = netif_list;
-  while (netif != NULL) {
-    /* Should we leave this interface ? */
-    if (ip6_addr_isany(srcaddr) ||
-        netif_get_ip6_addr_match(netif, srcaddr) >= 0) {
-      err_t res = mld6_leavegroup_netif(netif, groupaddr);
-      if (err != ERR_OK) {
-        /* Store this result if we have not yet gotten a success */
-        err = res;
-      }
-    }
-    /* proceed to next network interface */
-    netif = netif->next;
-  }
-
-  return err;
-}
-
-/**
- * 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
- * @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;
-
-  /* find group */
-  group = mld6_lookfor_group(netif, groupaddr);
-
-  if (group != NULL) {
-    /* Leave if there is no other use of the group */
-    if (group->use <= 1) {
-      /* If we are the last reporter for this group */
-      if (group->last_reporter_flag) {
-        MLD6_STATS_INC(mld6.tx_leave);
-        mld6_send(group, ICMP6_TYPE_MLD);
-      }
-
-      /* Disable the group at the MAC level */
-      if (netif->mld_mac_filter != NULL) {
-        netif->mld_mac_filter(netif, groupaddr, MLD6_DEL_MAC_FILTER);
-      }
-
-      /* Free the group */
-      mld6_free_group(group);
-    } else {
-      /* Decrement group use */
-      group->use--;
-    }
-
-    /* Left group */
-    return ERR_OK;
-  }
-
-  /* Group not found */
-  return ERR_VAL;
-}
-
-
-/**
- * Periodic timer for mld processing. Must be called every
- * MLD6_TMR_INTERVAL milliseconds (100).
- *
- * When a delaying member expires, a membership report is sent.
- */
-void
-mld6_tmr(void)
-{
-  struct mld_group *group = mld_group_list;
-
-  while (group != NULL) {
-    if (group->timer > 0) {
-      group->timer--;
-      if (group->timer == 0) {
-        /* If the state is MLD6_GROUP_DELAYING_MEMBER then we send a report for this group */
-        if (group->group_state == MLD6_GROUP_DELAYING_MEMBER) {
-          MLD6_STATS_INC(mld6.tx_report);
-          mld6_send(group, ICMP6_TYPE_MLR);
-          group->group_state = MLD6_GROUP_IDLE_MEMBER;
-        }
-      }
-    }
-    group = group->next;
-  }
-}
-
-/**
- * Schedule a delayed membership report for a group
- *
- * @param group the mld_group for which "delaying" membership report
- *              should be sent
- * @param maxresp the max resp delay provided in the query
- */
-static void
-mld6_delayed_report(struct mld_group *group, u16_t maxresp)
-{
-  /* Convert maxresp from milliseconds to tmr ticks */
-  maxresp = maxresp / MLD6_TMR_INTERVAL;
-  if (maxresp == 0) {
-    maxresp = 1;
-  }
-
-#ifdef LWIP_RAND
-  /* Randomize maxresp. (if LWIP_RAND is supported) */
-  maxresp = LWIP_RAND() % maxresp;
-  if (maxresp == 0) {
-    maxresp = 1;
-  }
-#endif /* LWIP_RAND */
-
-  /* Apply timer value if no report has been scheduled already. */
-  if ((group->group_state == MLD6_GROUP_IDLE_MEMBER) ||
-     ((group->group_state == MLD6_GROUP_DELAYING_MEMBER) &&
-      ((group->timer == 0) || (maxresp < group->timer)))) {
-    group->timer = maxresp;
-    group->group_state = MLD6_GROUP_DELAYING_MEMBER;
-  }
-}
-
-/**
- * Send a MLD message (report or done).
- *
- * An IPv6 hop-by-hop options header with a router alert option
- * is prepended.
- *
- * @param group the group to report or quit
- * @param type ICMP6_TYPE_MLR (report) or ICMP6_TYPE_MLD (done)
- */
-static void
-mld6_send(struct mld_group *group, u8_t type)
-{
-  struct mld_header * mld_hdr;
-  struct pbuf * p;
-  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);
-  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)) {
-    pbuf_free(p);
-    MLD6_STATS_INC(mld6.lenerr);
-    return;
-  }
-
-  /* Select our source address. */
-  if (!ip6_addr_isvalid(netif_ip6_addr_state(group->netif, 0))) {
-    /* This is a special case, when we are performing duplicate address detection.
-     * We must join the multicast group, but we don't have a valid address yet. */
-    src_addr = IP6_ADDR_ANY6;
-  } else {
-    /* Use link-local address as source address. */
-    src_addr = netif_ip6_addr(group->netif, 0);
-  }
-
-  /* MLD message header pointer. */
-  mld_hdr = (struct mld_header *)p->payload;
-
-  /* Set fields. */
-  mld_hdr->type = type;
-  mld_hdr->code = 0;
-  mld_hdr->chksum = 0;
-  mld_hdr->max_resp_delay = 0;
-  mld_hdr->reserved = 0;
-  ip6_addr_set(&(mld_hdr->multicast_address), &(group->group_address));
-
-#if CHECKSUM_GEN_ICMP6
-  IF__NETIF_CHECKSUM_ENABLED(group->netif, NETIF_CHECKSUM_GEN_ICMP6) {
-    mld_hdr->chksum = ip6_chksum_pseudo(p, IP6_NEXTH_ICMP6, p->len,
-      src_addr, &(group->group_address));
-  }
-#endif /* CHECKSUM_GEN_ICMP6 */
-
-  /* Add hop-by-hop headers options: router alert with MLD value. */
-  ip6_options_add_hbh_ra(p, IP6_NEXTH_ICMP6, IP6_ROUTER_ALERT_VALUE_MLD);
-
-  /* Send the packet out. */
-  MLD6_STATS_INC(mld6.xmit);
-  ip6_output_if(p, (ip6_addr_isany(src_addr)) ? NULL : src_addr, &(group->group_address),
-      MLD6_HL, 0, IP6_NEXTH_HOPBYHOP, group->netif);
-  pbuf_free(p);
-}
-
-#endif /* LWIP_IPV6 */
diff --git a/components/lwip/core/ipv6/nd6.c b/components/lwip/core/ipv6/nd6.c
deleted file mode 100644 (file)
index 1cec55d..0000000
+++ /dev/null
@@ -1,1863 +0,0 @@
-/**
- * @file
- *
- * Neighbor discovery and stateless address autoconfiguration for IPv6.
- * Aims to be compliant with RFC 4861 (Neighbor discovery) and RFC 4862
- * (Address autoconfiguration).
- */
-
-/*
- * Copyright (c) 2010 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>
- */
-
-#include "lwip/opt.h"
-
-#if LWIP_IPV6  /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/nd6.h"
-#include "lwip/pbuf.h"
-#include "lwip/mem.h"
-#include "lwip/memp.h"
-#include "lwip/ip6.h"
-#include "lwip/ip6_addr.h"
-#include "lwip/inet_chksum.h"
-#include "lwip/netif.h"
-#include "lwip/icmp6.h"
-#include "lwip/mld6.h"
-#include "lwip/ip.h"
-#include "lwip/stats.h"
-
-#include <string.h>
-
-/* Router tables. */
-struct nd6_neighbor_cache_entry neighbor_cache[LWIP_ND6_NUM_NEIGHBORS];
-struct nd6_destination_cache_entry destination_cache[LWIP_ND6_NUM_DESTINATIONS];
-struct nd6_prefix_list_entry prefix_list[LWIP_ND6_NUM_PREFIXES];
-struct nd6_router_list_entry default_router_list[LWIP_ND6_NUM_ROUTERS];
-
-/* Default values, can be updated by a RA message. */
-u32_t reachable_time = LWIP_ND6_REACHABLE_TIME;
-u32_t retrans_timer = LWIP_ND6_RETRANS_TIMER; /* TODO implement this value in timer */
-
-/* Index for cache entries. */
-static u8_t nd6_cached_neighbor_index;
-static u8_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)];
-
-/* 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 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);
-
-#define ND6_SEND_FLAG_MULTICAST_DEST 0x01
-#define ND6_SEND_FLAG_ALLNODES_DEST 0x02
-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);
-#if LWIP_IPV6_SEND_ROUTER_SOLICIT
-static err_t nd6_send_rs(struct netif * netif);
-#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */
-
-#if LWIP_ND6_QUEUEING
-static void nd6_free_q(struct nd6_q_entry *q);
-#else /* LWIP_ND6_QUEUEING */
-#define nd6_free_q(q) pbuf_free(q)
-#endif /* LWIP_ND6_QUEUEING */
-static void nd6_send_q(s8_t i);
-
-
-/**
- * Process an incoming neighbor discovery message
- *
- * @param p the nd packet, p->payload pointing to the icmpv6 header
- * @param inp the netif on which this packet was received
- */
-void
-nd6_input(struct pbuf *p, struct netif *inp)
-{
-  u8_t msg_type;
-  s8_t i;
-
-  ND6_STATS_INC(nd6.recv);
-
-  msg_type = *((u8_t *)p->payload);
-  switch (msg_type) {
-  case ICMP6_TYPE_NA: /* Neighbor Advertisement. */
-  {
-    struct na_header * na_hdr;
-    struct lladdr_option * lladdr_opt;
-
-    /* Check that na header fits in packet. */
-    if (p->len < (sizeof(struct na_header))) {
-      /* TODO debug message */
-      pbuf_free(p);
-      ND6_STATS_INC(nd6.lenerr);
-      ND6_STATS_INC(nd6.drop);
-      return;
-    }
-
-    na_hdr = (struct na_header *)p->payload;
-
-    /* Unsolicited NA?*/
-    if (ip6_addr_ismulticast(ip6_current_dest_addr())) {
-      /* This is an unsolicited NA.
-       * link-layer changed?
-       * part of DAD mechanism? */
-
-      /* Check that link-layer address option also fits in packet. */
-      if (p->len < (sizeof(struct na_header) + 2)) {
-        /* TODO debug message */
-        pbuf_free(p);
-        ND6_STATS_INC(nd6.lenerr);
-        ND6_STATS_INC(nd6.drop);
-        return;
-      }
-
-      lladdr_opt = (struct lladdr_option *)((u8_t*)p->payload + sizeof(struct na_header));
-
-      if (p->len < (sizeof(struct na_header) + (lladdr_opt->length << 3))) {
-        /* TODO debug message */
-        pbuf_free(p);
-        ND6_STATS_INC(nd6.lenerr);
-        ND6_STATS_INC(nd6.drop);
-        return;
-      }
-
-      /* Override ip6_current_dest_addr() so that we have an aligned copy. */
-      ip6_addr_set(ip6_current_dest_addr(), &(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_cmp(ip6_current_dest_addr(), netif_ip6_addr(inp, i))) {
-          /* We are using a duplicate address. */
-          netif_ip6_addr_set_state(inp, i, IP6_ADDR_INVALID);
-
-#if LWIP_IPV6_MLD
-          /* Leave solicited node multicast group. */
-          ip6_addr_set_solicitednode(&multicast_address, netif_ip6_addr(inp, i)->addr[3]);
-          mld6_leavegroup(netif_ip6_addr(inp, i), &multicast_address);
-#endif /* LWIP_IPV6_MLD */
-
-#if LWIP_IPV6_AUTOCONFIG
-          /* Check to see if this address was autoconfigured. */
-          if (!ip6_addr_islinklocal(ip6_current_dest_addr())) {
-            i = nd6_get_onlink_prefix(ip6_current_dest_addr(), 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 */
-
-          pbuf_free(p);
-          return;
-        }
-      }
-#endif /* LWIP_IPV6_DUP_DETECT_ATTEMPTS */
-
-      /* This is an unsolicited NA, most likely there was a LLADDR change. */
-      i = nd6_find_neighbor_cache_entry(ip6_current_dest_addr());
-      if (i >= 0) {
-        if (na_hdr->flags & ND6_FLAG_OVERRIDE) {
-          MEMCPY(neighbor_cache[i].lladdr, lladdr_opt->addr, inp->hwaddr_len);
-        }
-      }
-    } else {
-      /* This is a solicited NA.
-       * neighbor address resolution response?
-       * neighbor unreachability detection response? */
-
-      /* Override ip6_current_dest_addr() so that we have an aligned copy. */
-      ip6_addr_set(ip6_current_dest_addr(), &(na_hdr->target_address));
-
-      /* Find the cache entry corresponding to this na. */
-      i = nd6_find_neighbor_cache_entry(ip6_current_dest_addr());
-      if (i < 0) {
-        /* We no longer care about this target address. drop it. */
-        pbuf_free(p);
-        return;
-      }
-
-      /* Update cache entry. */
-      neighbor_cache[i].netif = inp;
-      neighbor_cache[i].counter.reachable_time = reachable_time;
-      if ((na_hdr->flags & ND6_FLAG_OVERRIDE) ||
-          (neighbor_cache[i].state == ND6_INCOMPLETE)) {
-        /* Check that link-layer address option also fits in packet. */
-        if (p->len < (sizeof(struct na_header) + 2)) {
-          /* TODO debug message */
-          pbuf_free(p);
-          ND6_STATS_INC(nd6.lenerr);
-          ND6_STATS_INC(nd6.drop);
-          return;
-        }
-
-        lladdr_opt = (struct lladdr_option *)((u8_t*)p->payload + sizeof(struct na_header));
-
-        if (p->len < (sizeof(struct na_header) + (lladdr_opt->length << 3))) {
-          /* TODO debug message */
-          pbuf_free(p);
-          ND6_STATS_INC(nd6.lenerr);
-          ND6_STATS_INC(nd6.drop);
-          return;
-        }
-
-        MEMCPY(neighbor_cache[i].lladdr, lladdr_opt->addr, inp->hwaddr_len);
-      }
-      neighbor_cache[i].state = ND6_REACHABLE;
-
-      /* Send queued packets, if any. */
-      if (neighbor_cache[i].q != NULL) {
-        nd6_send_q(i);
-      }
-    }
-
-    break; /* ICMP6_TYPE_NA */
-  }
-  case ICMP6_TYPE_NS: /* Neighbor solicitation. */
-  {
-    struct ns_header * ns_hdr;
-    struct lladdr_option * lladdr_opt;
-    u8_t accepted;
-
-    /* Check that ns header fits in packet. */
-    if (p->len < sizeof(struct ns_header)) {
-      /* TODO debug message */
-      pbuf_free(p);
-      ND6_STATS_INC(nd6.lenerr);
-      ND6_STATS_INC(nd6.drop);
-      return;
-    }
-
-    ns_hdr = (struct ns_header *)p->payload;
-
-    /* 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));
-      if (p->len < (sizeof(struct ns_header) + (lladdr_opt->length << 3))) {
-        lladdr_opt = NULL;
-      }
-    } else {
-      lladdr_opt = NULL;
-    }
-
-    /* Check if the target address is configured on the receiving netif. */
-    accepted = 0;
-    for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; ++i) {
-      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))) {
-        accepted = 1;
-        break;
-      }
-    }
-
-    /* NS not for us? */
-    if (!accepted) {
-      pbuf_free(p);
-      return;
-    }
-
-    /* Check for ANY address in src (DAD algorithm). */
-    if (ip6_addr_isany(ip6_current_src_addr())) {
-      /* 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))) {
-          /* 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);
-          }
-        }
-      }
-    } else {
-      /* Sender is trying to resolve our address. */
-      /* Verify that they included their own link-layer address. */
-      if (lladdr_opt == NULL) {
-        /* Not a valid message. */
-        pbuf_free(p);
-        ND6_STATS_INC(nd6.proterr);
-        ND6_STATS_INC(nd6.drop);
-        return;
-      }
-
-      i = nd6_find_neighbor_cache_entry(ip6_current_src_addr());
-      if (i>= 0) {
-        /* We already have a record for the solicitor. */
-        if (neighbor_cache[i].state == ND6_INCOMPLETE) {
-          neighbor_cache[i].netif = inp;
-          MEMCPY(neighbor_cache[i].lladdr, lladdr_opt->addr, inp->hwaddr_len);
-
-          /* Delay probe in case we get confirmation of reachability from upper layer (TCP). */
-          neighbor_cache[i].state = ND6_DELAY;
-          neighbor_cache[i].counter.delay_time = LWIP_ND6_DELAY_FIRST_PROBE_TIME;
-        }
-      } else {
-        /* Add their IPv6 address and link-layer address to neighbor cache.
-         * We will need it at least to send a unicast NA message, but most
-         * likely we will also be communicating with this node soon. */
-        i = nd6_new_neighbor_cache_entry();
-        if (i < 0) {
-          /* We couldn't assign a cache entry for this neighbor.
-           * we won't be able to reply. drop it. */
-          pbuf_free(p);
-          ND6_STATS_INC(nd6.memerr);
-          return;
-        }
-        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), ip6_current_src_addr());
-
-        /* Receiving a message does not prove reachability: only in one direction.
-         * Delay probe in case we get confirmation of reachability from upper layer (TCP). */
-        neighbor_cache[i].state = ND6_DELAY;
-        neighbor_cache[i].counter.delay_time = LWIP_ND6_DELAY_FIRST_PROBE_TIME;
-      }
-
-      /* Override ip6_current_dest_addr() so that we have an aligned copy. */
-      ip6_addr_set(ip6_current_dest_addr(), &(ns_hdr->target_address));
-
-      /* Send back a NA for us. Allocate the reply pbuf. */
-      nd6_send_na(inp, ip6_current_dest_addr(), ND6_FLAG_SOLICITED | ND6_FLAG_OVERRIDE);
-    }
-
-    break; /* ICMP6_TYPE_NS */
-  }
-  case ICMP6_TYPE_RA: /* Router Advertisement. */
-  {
-    struct ra_header * ra_hdr;
-    u8_t * buffer; /* Used to copy options. */
-    u16_t offset;
-
-    /* Check that RA header fits in packet. */
-    if (p->len < sizeof(struct ra_header)) {
-      /* TODO debug message */
-      pbuf_free(p);
-      ND6_STATS_INC(nd6.lenerr);
-      ND6_STATS_INC(nd6.drop);
-      return;
-    }
-
-    ra_hdr = (struct ra_header *)p->payload;
-
-    /* If we are sending RS messages, stop. */
-#if LWIP_IPV6_SEND_ROUTER_SOLICIT
-    /* ensure at least one solicitation is sent */
-    if ((inp->rs_count < LWIP_ND6_MAX_MULTICAST_SOLICIT) ||
-        (nd6_send_rs(inp) == ERR_OK)) {
-      inp->rs_count = 0;
-    }
-#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */
-
-    /* Get the matching default router entry. */
-    i = nd6_get_router(ip6_current_src_addr(), inp);
-    if (i < 0) {
-      /* Create a new router entry. */
-      i = nd6_new_router(ip6_current_src_addr(), inp);
-    }
-
-    if (i < 0) {
-      /* Could not create a new router entry. */
-      pbuf_free(p);
-      ND6_STATS_INC(nd6.memerr);
-      return;
-    }
-
-    /* Re-set invalidation timer. */
-    default_router_list[i].invalidation_timer = htons(ra_hdr->router_lifetime);
-
-    /* Re-set default timer values. */
-#if LWIP_ND6_ALLOW_RA_UPDATES
-    if (ra_hdr->retrans_timer > 0) {
-      retrans_timer = htonl(ra_hdr->retrans_timer);
-    }
-    if (ra_hdr->reachable_time > 0) {
-      reachable_time = htonl(ra_hdr->reachable_time);
-    }
-#endif /* LWIP_ND6_ALLOW_RA_UPDATES */
-
-    /* TODO set default hop limit... */
-    /* ra_hdr->current_hop_limit;*/
-
-    /* Update flags in local entry (incl. preference). */
-    default_router_list[i].flags = ra_hdr->flags;
-
-    /* Offset to options. */
-    offset = sizeof(struct ra_header);
-
-    /* Process each option. */
-    while ((p->tot_len - offset) > 0) {
-      if (p->len == p->tot_len) {
-        /* no need to copy from contiguous pbuf */
-        buffer = &((u8_t*)p->payload)[offset];
-      } else {
-        buffer = nd6_ra_buffer;
-        pbuf_copy_partial(p, buffer, sizeof(struct prefix_option), offset);
-      }
-      switch (buffer[0]) {
-      case ND6_OPTION_TYPE_SOURCE_LLADDR:
-      {
-        struct lladdr_option * lladdr_opt;
-        lladdr_opt = (struct lladdr_option *)buffer;
-        if ((default_router_list[i].neighbor_entry != NULL) &&
-            (default_router_list[i].neighbor_entry->state == ND6_INCOMPLETE)) {
-          SMEMCPY(default_router_list[i].neighbor_entry->lladdr, lladdr_opt->addr, inp->hwaddr_len);
-          default_router_list[i].neighbor_entry->state = ND6_REACHABLE;
-          default_router_list[i].neighbor_entry->counter.reachable_time = reachable_time;
-        }
-        break;
-      }
-      case ND6_OPTION_TYPE_MTU:
-      {
-        struct mtu_option * mtu_opt;
-        mtu_opt = (struct mtu_option *)buffer;
-        if (htonl(mtu_opt->mtu) >= 1280) {
-#if LWIP_ND6_ALLOW_RA_UPDATES
-          inp->mtu = (u16_t)htonl(mtu_opt->mtu);
-#endif /* LWIP_ND6_ALLOW_RA_UPDATES */
-        }
-        break;
-      }
-      case ND6_OPTION_TYPE_PREFIX_INFO:
-      {
-        struct prefix_option * prefix_opt;
-        prefix_opt = (struct prefix_option *)buffer;
-
-        if (prefix_opt->flags & ND6_PREFIX_FLAG_ON_LINK) {
-          /* Add to on-link prefix list. */
-          s8_t prefix;
-
-          /* Get a memory-aligned copy of the prefix. */
-          ip6_addr_set(ip6_current_dest_addr(), &(prefix_opt->prefix));
-
-          /* find cache entry for this prefix. */
-          prefix = nd6_get_onlink_prefix(ip6_current_dest_addr(), inp);
-          if (prefix < 0) {
-            /* Create a new cache entry. */
-            prefix = nd6_new_onlink_prefix(ip6_current_dest_addr(), inp);
-          }
-          if (prefix >= 0) {
-            prefix_list[prefix].invalidation_timer = 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;
-            }
-#endif /* LWIP_IPV6_AUTOCONFIG */
-          }
-        }
-
-        break;
-      }
-      case ND6_OPTION_TYPE_ROUTE_INFO:
-        /* TODO implement preferred routes.
-        struct route_option * route_opt;
-        route_opt = (struct route_option *)buffer;*/
-
-        break;
-      default:
-        /* Unrecognized option, abort. */
-        ND6_STATS_INC(nd6.proterr);
-        break;
-      }
-      offset += 8 * ((u16_t)buffer[1]);
-    }
-
-    break; /* ICMP6_TYPE_RA */
-  }
-  case ICMP6_TYPE_RD: /* Redirect */
-  {
-    struct redirect_header * redir_hdr;
-    struct lladdr_option * lladdr_opt;
-
-    /* Check that Redir header fits in packet. */
-    if (p->len < sizeof(struct redirect_header)) {
-      /* TODO debug message */
-      pbuf_free(p);
-      ND6_STATS_INC(nd6.lenerr);
-      ND6_STATS_INC(nd6.drop);
-      return;
-    }
-
-    redir_hdr = (struct redirect_header *)p->payload;
-
-    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))) {
-        lladdr_opt = NULL;
-      }
-    } else {
-      lladdr_opt = NULL;
-    }
-
-    /* Copy original destination address to current source address, to have an aligned copy. */
-    ip6_addr_set(ip6_current_src_addr(), &(redir_hdr->destination_address));
-
-    /* Find dest address in cache */
-    i = nd6_find_destination_cache_entry(ip6_current_src_addr());
-    if (i < 0) {
-      /* Destination not in cache, drop packet. */
-      pbuf_free(p);
-      return;
-    }
-
-    /* Set the new target address. */
-    ip6_addr_set(&(destination_cache[i].next_hop_addr), &(redir_hdr->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(ip6_current_src_addr(), &(redir_hdr->target_address));
-
-        i = nd6_find_neighbor_cache_entry(ip6_current_src_addr());
-        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), ip6_current_src_addr());
-
-            /* Receiving a message does not prove reachability: only in one direction.
-             * Delay probe in case we get confirmation of reachability from upper layer (TCP). */
-            neighbor_cache[i].state = ND6_DELAY;
-            neighbor_cache[i].counter.delay_time = LWIP_ND6_DELAY_FIRST_PROBE_TIME;
-          }
-        }
-        if (i >= 0) {
-          if (neighbor_cache[i].state == ND6_INCOMPLETE) {
-            MEMCPY(neighbor_cache[i].lladdr, lladdr_opt->addr, inp->hwaddr_len);
-            /* Receiving a message does not prove reachability: only in one direction.
-             * Delay probe in case we get confirmation of reachability from upper layer (TCP). */
-            neighbor_cache[i].state = ND6_DELAY;
-            neighbor_cache[i].counter.delay_time = LWIP_ND6_DELAY_FIRST_PROBE_TIME;
-          }
-        }
-      }
-    }
-    break; /* ICMP6_TYPE_RD */
-  }
-  case ICMP6_TYPE_PTB: /* Packet too big */
-  {
-    struct icmp6_hdr *icmp6hdr; /* Packet too big message */
-    struct ip6_hdr * ip6hdr; /* IPv6 header of the packet which caused the error */
-    u32_t pmtu;
-
-    /* Check that ICMPv6 header + IPv6 header fit in payload */
-    if (p->len < (sizeof(struct icmp6_hdr) + IP6_HLEN)) {
-      /* drop short packets */
-      pbuf_free(p);
-      ND6_STATS_INC(nd6.lenerr);
-      ND6_STATS_INC(nd6.drop);
-      return;
-    }
-
-    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(ip6_current_src_addr(), &(ip6hdr->dest));
-
-    /* Look for entry in destination cache. */
-    i = nd6_find_destination_cache_entry(ip6_current_src_addr());
-    if (i < 0) {
-      /* Destination not in cache, drop packet. */
-      pbuf_free(p);
-      return;
-    }
-
-    /* Change the Path MTU. */
-    pmtu = htonl(icmp6hdr->data);
-    destination_cache[i].pmtu = (u16_t)LWIP_MIN(pmtu, 0xFFFF);
-
-    break; /* ICMP6_TYPE_PTB */
-  }
-
-  default:
-    ND6_STATS_INC(nd6.proterr);
-    ND6_STATS_INC(nd6.drop);
-    break; /* default */
-  }
-
-  pbuf_free(p);
-}
-
-#ifdef ESP_LWIP
-
-/** Set callback for ipv6 addr status changed .
- *
- * @param netif the netif from which to remove the struct dhcp
- * @param cb    callback for dhcp
- */
-void nd6_set_cb(struct netif *netif, void (*cb)(struct netif *netif, u8_t ip_index))
-{
-  LWIP_ASSERT("netif != NULL", netif != NULL);
-
-  if (netif != NULL && netif_is_up(netif)) {
-      netif->ipv6_addr_cb = cb;
-  }
-}
-#endif
-
-/**
- * Periodic timer for Neighbor discovery functions:
- *
- * - Update neighbor reachability states
- * - Update destination cache entries age
- * - Update invalidation timers of default routers and on-link prefixes
- * - Perform duplicate address detection (DAD) for our addresses
- * - Send router solicitations
- */
-void
-nd6_tmr(void)
-{
-  s8_t i;
-  struct netif * netif;
-
-  /* Process neighbor entries. */
-  for (i = 0; i < LWIP_ND6_NUM_NEIGHBORS; i++) {
-    switch (neighbor_cache[i].state) {
-    case ND6_INCOMPLETE:
-      if ((neighbor_cache[i].counter.probes_sent >= LWIP_ND6_MAX_MULTICAST_SOLICIT) &&
-          (!neighbor_cache[i].isrouter)) {
-        /* Retries exceeded. */
-        nd6_free_neighbor_cache_entry(i);
-      } else {
-        /* Send a NS for this entry. */
-        neighbor_cache[i].counter.probes_sent++;
-        nd6_send_ns(neighbor_cache[i].netif, &(neighbor_cache[i].next_hop_address), ND6_SEND_FLAG_MULTICAST_DEST);
-      }
-      break;
-    case ND6_REACHABLE:
-      /* Send queued packets, if any are left. Should have been sent already. */
-      if (neighbor_cache[i].q != NULL) {
-        nd6_send_q(i);
-      }
-      if (neighbor_cache[i].counter.reachable_time <= ND6_TMR_INTERVAL) {
-        /* Change to stale state. */
-        neighbor_cache[i].state = ND6_STALE;
-        neighbor_cache[i].counter.stale_time = 0;
-      } else {
-        neighbor_cache[i].counter.reachable_time -= ND6_TMR_INTERVAL;
-      }
-      break;
-    case ND6_STALE:
-      neighbor_cache[i].counter.stale_time += ND6_TMR_INTERVAL;
-      break;
-    case ND6_DELAY:
-      if (neighbor_cache[i].counter.delay_time <= ND6_TMR_INTERVAL) {
-        /* Change to PROBE state. */
-        neighbor_cache[i].state = ND6_PROBE;
-        neighbor_cache[i].counter.probes_sent = 0;
-      } else {
-        neighbor_cache[i].counter.delay_time -= ND6_TMR_INTERVAL;
-      }
-      break;
-    case ND6_PROBE:
-      if ((neighbor_cache[i].counter.probes_sent >= LWIP_ND6_MAX_MULTICAST_SOLICIT) &&
-          (!neighbor_cache[i].isrouter)) {
-        /* Retries exceeded. */
-        nd6_free_neighbor_cache_entry(i);
-      } else {
-        /* Send a NS for this entry. */
-        neighbor_cache[i].counter.probes_sent++;
-        nd6_send_ns(neighbor_cache[i].netif, &(neighbor_cache[i].next_hop_address), 0);
-      }
-      break;
-    case ND6_NO_ENTRY:
-    default:
-      /* Do nothing. */
-      break;
-    }
-  }
-
-  /* Process destination entries. */
-  for (i = 0; i < LWIP_ND6_NUM_DESTINATIONS; i++) {
-    destination_cache[i].age++;
-  }
-
-  /* Process router entries. */
-  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. */
-        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;
-      }
-    }
-  }
-
-  /* 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) {
-        /* 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. */
-              IP_ADDR6(&prefix_list[i].netif->ip6_addr[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) {
-    for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; ++i) {
-      if (ip6_addr_istentative(netif->ip6_addr_state[i])) {
-        if ((netif->ip6_addr_state[i] & 0x07) >= LWIP_IPV6_DUP_DETECT_ATTEMPTS) {
-          /* No NA received in response. Mark address as valid. */
-          netif->ip6_addr_state[i] = IP6_ADDR_PREFERRED;
-#ifdef ESP_LWIP
-          if (netif->ipv6_addr_cb != NULL) {
-              netif->ipv6_addr_cb(netif, i);
-          }
-#endif
-
-          /* TODO implement preferred and valid lifetimes. */
-        } else if (netif->flags & NETIF_FLAG_UP) {
-#if LWIP_IPV6_MLD
-          if ((netif->ip6_addr_state[i] & 0x07) == 0) {
-            /* Join solicited node multicast group. */
-            ip6_addr_set_solicitednode(&multicast_address, netif_ip6_addr(netif, i)->addr[3]);
-            mld6_joingroup(netif_ip6_addr(netif, i), &multicast_address);
-          }
-#endif /* LWIP_IPV6_MLD */
-          /* Send a NS for this address. */
-          nd6_send_ns(netif, netif_ip6_addr(netif, i), ND6_SEND_FLAG_MULTICAST_DEST);
-          (netif->ip6_addr_state[i])++;
-          /* TODO send max 1 NS per tmr call? enable return*/
-          /*return;*/
-        }
-      }
-    }
-  }
-
-#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--;
-      }
-    }
-  }
-#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */
-
-}
-
-/**
- * Send a neighbor solicitation message
- *
- * @param netif the netif on which to send the message
- * @param target_addr the IPv6 target address for the ND message
- * @param flags one of ND6_SEND_FLAG_*
- */
-static void
-nd6_send_ns(struct netif * netif, const ip6_addr_t * target_addr, u8_t flags)
-{
-  struct ns_header * ns_hdr;
-  struct lladdr_option * lladdr_opt;
-  struct pbuf * p;
-  const ip6_addr_t * src_addr;
-  u16_t lladdr_opt_len;
-
-  if (ip6_addr_isvalid(netif_ip6_addr_state(netif,0))) {
-    /* Use link-local address as source address. */
-    src_addr = netif_ip6_addr(netif, 0);
-  } else {
-    src_addr = IP6_ADDR_ANY6;
-  }
-
-  /* Allocate a packet. */
-  lladdr_opt_len = ((netif->hwaddr_len + 2) >> 3) + (((netif->hwaddr_len + 2) & 0x07) ? 1 : 0);
-  p = pbuf_alloc(PBUF_IP, sizeof(struct ns_header) + (lladdr_opt_len << 3), PBUF_RAM);
-  if (p == NULL) {
-    ND6_STATS_INC(nd6.memerr);
-    return;
-  }
-
-  /* Set fields. */
-  ns_hdr = (struct ns_header *)p->payload;
-  lladdr_opt = (struct lladdr_option *)((u8_t*)p->payload + sizeof(struct ns_header));
-
-  ns_hdr->type = ICMP6_TYPE_NS;
-  ns_hdr->code = 0;
-  ns_hdr->chksum = 0;
-  ns_hdr->reserved = 0;
-  ip6_addr_set(&(ns_hdr->target_address), target_addr);
-
-  lladdr_opt->type = ND6_OPTION_TYPE_SOURCE_LLADDR;
-  lladdr_opt->length = (u8_t)lladdr_opt_len;
-  SMEMCPY(lladdr_opt->addr, netif->hwaddr, netif->hwaddr_len);
-
-  /* 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]);
-    target_addr = &multicast_address;
-  }
-
-#if CHECKSUM_GEN_ICMP6
-  IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_ICMP6) {
-    ns_hdr->chksum = ip6_chksum_pseudo(p, IP6_NEXTH_ICMP6, p->len, src_addr,
-      target_addr);
-  }
-#endif /* CHECKSUM_GEN_ICMP6 */
-
-  /* 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);
-  pbuf_free(p);
-}
-
-/**
- * Send a neighbor advertisement message
- *
- * @param netif the netif on which to send the message
- * @param target_addr the IPv6 target address for the ND message
- * @param flags one of ND6_SEND_FLAG_*
- */
-static void
-nd6_send_na(struct netif * netif, const ip6_addr_t * target_addr, u8_t flags)
-{
-  struct na_header * na_hdr;
-  struct lladdr_option * lladdr_opt;
-  struct pbuf * p;
-  const ip6_addr_t * src_addr;
-  const ip6_addr_t * dest_addr;
-  u16_t lladdr_opt_len;
-
-  /* Use link-local address as source address. */
-  /* src_addr = &(netif->ip6_addr[0]); */
-  /* Use target address as source address. */
-  src_addr = target_addr;
-
-  /* Allocate a packet. */
-  lladdr_opt_len = ((netif->hwaddr_len + 2) >> 3) + (((netif->hwaddr_len + 2) & 0x07) ? 1 : 0);
-  p = pbuf_alloc(PBUF_IP, sizeof(struct na_header) + (lladdr_opt_len << 3), PBUF_RAM);
-  if (p == NULL) {
-    ND6_STATS_INC(nd6.memerr);
-    return;
-  }
-
-  /* Set fields. */
-  na_hdr = (struct na_header *)p->payload;
-  lladdr_opt = (struct lladdr_option *)((u8_t*)p->payload + sizeof(struct na_header));
-
-  na_hdr->type = ICMP6_TYPE_NA;
-  na_hdr->code = 0;
-  na_hdr->chksum = 0;
-  na_hdr->flags = flags & 0xf0;
-  na_hdr->reserved[0] = 0;
-  na_hdr->reserved[1] = 0;
-  na_hdr->reserved[2] = 0;
-  ip6_addr_set(&(na_hdr->target_address), target_addr);
-
-  lladdr_opt->type = ND6_OPTION_TYPE_TARGET_LLADDR;
-  lladdr_opt->length = (u8_t)lladdr_opt_len;
-  SMEMCPY(lladdr_opt->addr, netif->hwaddr, netif->hwaddr_len);
-
-  /* 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]);
-    dest_addr = &multicast_address;
-  } else if (flags & ND6_SEND_FLAG_ALLNODES_DEST) {
-    ip6_addr_set_allnodes_linklocal(&multicast_address);
-    dest_addr = &multicast_address;
-  } else {
-    dest_addr = ip6_current_src_addr();
-  }
-
-#if CHECKSUM_GEN_ICMP6
-  IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_ICMP6) {
-    na_hdr->chksum = ip6_chksum_pseudo(p, IP6_NEXTH_ICMP6, p->len, src_addr,
-      dest_addr);
-  }
-#endif /* CHECKSUM_GEN_ICMP6 */
-
-  /* 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);
-  pbuf_free(p);
-}
-
-#if LWIP_IPV6_SEND_ROUTER_SOLICIT
-/**
- * Send a router solicitation message
- *
- * @param netif the netif on which to send the message
- */
-static err_t
-nd6_send_rs(struct netif * netif)
-{
-  struct rs_header * rs_hdr;
-  struct lladdr_option * lladdr_opt;
-  struct pbuf * p;
-  const ip6_addr_t * src_addr;
-  err_t err;
-  u16_t lladdr_opt_len = 0;
-
-  /* Link-local source address, or unspecified address? */
-  if (ip6_addr_isvalid(netif_ip6_addr_state(netif, 0))) {
-    src_addr = netif_ip6_addr(netif, 0);
-  } else {
-    src_addr = IP6_ADDR_ANY6;
-  }
-
-  /* Generate the all routers target address. */
-  ip6_addr_set_allrouters_linklocal(&multicast_address);
-
-  /* Allocate a packet. */
-  if (src_addr != IP6_ADDR_ANY6) {
-    lladdr_opt_len = ((netif->hwaddr_len + 2) >> 3) + (((netif->hwaddr_len + 2) & 0x07) ? 1 : 0);
-  }
-  p = pbuf_alloc(PBUF_IP, sizeof(struct rs_header) + (lladdr_opt_len << 3), PBUF_RAM);
-  if (p == NULL) {
-    ND6_STATS_INC(nd6.memerr);
-    return ERR_BUF;
-  }
-
-  /* Set fields. */
-  rs_hdr = (struct rs_header *)p->payload;
-
-  rs_hdr->type = ICMP6_TYPE_RS;
-  rs_hdr->code = 0;
-  rs_hdr->chksum = 0;
-  rs_hdr->reserved = 0;
-
-  if (src_addr != IP6_ADDR_ANY6) {
-    /* Include our hw address. */
-    lladdr_opt = (struct lladdr_option *)((u8_t*)p->payload + sizeof(struct rs_header));
-    lladdr_opt->type = ND6_OPTION_TYPE_SOURCE_LLADDR;
-    lladdr_opt->length = (u8_t)lladdr_opt_len;
-    SMEMCPY(lladdr_opt->addr, netif->hwaddr, netif->hwaddr_len);
-  }
-
-#if CHECKSUM_GEN_ICMP6
-  IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_ICMP6) {
-    rs_hdr->chksum = ip6_chksum_pseudo(p, IP6_NEXTH_ICMP6, p->len, src_addr,
-      &multicast_address);
-  }
-#endif /* CHECKSUM_GEN_ICMP6 */
-
-  /* Send the packet out. */
-  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);
-  pbuf_free(p);
-
-  return err;
-}
-#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */
-
-/**
- * Search for a neighbor cache entry
- *
- * @param ip6addr the IPv6 address of the neighbor
- * @return The neighbor cache entry index that matched, -1 if no
- * entry is found
- */
-static s8_t
-nd6_find_neighbor_cache_entry(const ip6_addr_t * ip6addr)
-{
-  s8_t i;
-  for (i = 0; i < LWIP_ND6_NUM_NEIGHBORS; i++) {
-    if (ip6_addr_cmp(ip6addr, &(neighbor_cache[i].next_hop_address))) {
-      return i;
-    }
-  }
-  return -1;
-}
-
-/**
- * Create a new neighbor cache entry.
- *
- * If no unused entry is found, will try to recycle an old entry
- * according to ad-hoc "age" heuristic.
- *
- * @return The neighbor cache entry index that was created, -1 if no
- * entry could be created
- */
-static s8_t
-nd6_new_neighbor_cache_entry(void)
-{
-  s8_t i;
-  s8_t j;
-  u32_t time;
-
-
-  /* First, try to find an empty entry. */
-  for (i = 0; i < LWIP_ND6_NUM_NEIGHBORS; i++) {
-    if (neighbor_cache[i].state == ND6_NO_ENTRY) {
-      return i;
-    }
-  }
-
-  /* We need to recycle an entry. in general, do not recycle if it is a router. */
-
-  /* Next, try to find a Stale entry. */
-  for (i = 0; i < LWIP_ND6_NUM_NEIGHBORS; i++) {
-    if ((neighbor_cache[i].state == ND6_STALE) &&
-        (!neighbor_cache[i].isrouter)) {
-      nd6_free_neighbor_cache_entry(i);
-      return i;
-    }
-  }
-
-  /* Next, try to find a Probe entry. */
-  for (i = 0; i < LWIP_ND6_NUM_NEIGHBORS; i++) {
-    if ((neighbor_cache[i].state == ND6_PROBE) &&
-        (!neighbor_cache[i].isrouter)) {
-      nd6_free_neighbor_cache_entry(i);
-      return i;
-    }
-  }
-
-  /* Next, try to find a Delayed entry. */
-  for (i = 0; i < LWIP_ND6_NUM_NEIGHBORS; i++) {
-    if ((neighbor_cache[i].state == ND6_DELAY) &&
-        (!neighbor_cache[i].isrouter)) {
-      nd6_free_neighbor_cache_entry(i);
-      return i;
-    }
-  }
-
-  /* Next, try to find the oldest reachable entry. */
-  time = 0xfffffffful;
-  j = -1;
-  for (i = 0; i < LWIP_ND6_NUM_NEIGHBORS; i++) {
-    if ((neighbor_cache[i].state == ND6_REACHABLE) &&
-        (!neighbor_cache[i].isrouter)) {
-      if (neighbor_cache[i].counter.reachable_time < time) {
-        j = i;
-        time = neighbor_cache[i].counter.reachable_time;
-      }
-    }
-  }
-  if (j >= 0) {
-    nd6_free_neighbor_cache_entry(j);
-    return j;
-  }
-
-  /* Next, find oldest incomplete entry without queued packets. */
-  time = 0;
-  j = -1;
-  for (i = 0; i < LWIP_ND6_NUM_NEIGHBORS; i++) {
-    if (
-        (neighbor_cache[i].q == NULL) &&
-        (neighbor_cache[i].state == ND6_INCOMPLETE) &&
-        (!neighbor_cache[i].isrouter)) {
-      if (neighbor_cache[i].counter.probes_sent >= time) {
-        j = i;
-        time = neighbor_cache[i].counter.probes_sent;
-      }
-    }
-  }
-  if (j >= 0) {
-    nd6_free_neighbor_cache_entry(j);
-    return j;
-  }
-
-  /* Next, find oldest incomplete entry with queued packets. */
-  time = 0;
-  j = -1;
-  for (i = 0; i < LWIP_ND6_NUM_NEIGHBORS; i++) {
-    if ((neighbor_cache[i].state == ND6_INCOMPLETE) &&
-        (!neighbor_cache[i].isrouter)) {
-      if (neighbor_cache[i].counter.probes_sent >= time) {
-        j = i;
-        time = neighbor_cache[i].counter.probes_sent;
-      }
-    }
-  }
-  if (j >= 0) {
-    nd6_free_neighbor_cache_entry(j);
-    return j;
-  }
-
-  /* No more entries to try. */
-  return -1;
-}
-
-/**
- * Will free any resources associated with a neighbor cache
- * entry, and will mark it as unused.
- *
- * @param i the neighbor cache entry index to free
- */
-static void
-nd6_free_neighbor_cache_entry(s8_t i)
-{
-  if ((i < 0) || (i >= LWIP_ND6_NUM_NEIGHBORS)) {
-    return;
-  }
-  if (neighbor_cache[i].isrouter) {
-    /* isrouter needs to be cleared before deleting a neighbor cache entry */
-    return;
-  }
-
-  /* Free any queued packets. */
-  if (neighbor_cache[i].q != NULL) {
-    nd6_free_q(neighbor_cache[i].q);
-    neighbor_cache[i].q = NULL;
-  }
-
-  neighbor_cache[i].state = ND6_NO_ENTRY;
-  neighbor_cache[i].isrouter = 0;
-  neighbor_cache[i].netif = NULL;
-  neighbor_cache[i].counter.reachable_time = 0;
-  ip6_addr_set_zero(&(neighbor_cache[i].next_hop_address));
-}
-
-/**
- * Search for a destination cache entry
- *
- * @param ip6addr the IPv6 address of the destination
- * @return The destination cache entry index that matched, -1 if no
- * entry is found
- */
-static s8_t
-nd6_find_destination_cache_entry(const ip6_addr_t * ip6addr)
-{
-  s8_t i;
-  for (i = 0; i < LWIP_ND6_NUM_DESTINATIONS; i++) {
-    if (ip6_addr_cmp(ip6addr, &(destination_cache[i].destination_addr))) {
-      return i;
-    }
-  }
-  return -1;
-}
-
-/**
- * Create a new destination cache entry. If no unused entry is found,
- * will recycle oldest entry.
- *
- * @return The destination cache entry index that was created, -1 if no
- * entry was created
- */
-static s8_t
-nd6_new_destination_cache_entry(void)
-{
-  s8_t i, j;
-  u32_t age;
-
-  /* Find an empty entry. */
-  for (i = 0; i < LWIP_ND6_NUM_DESTINATIONS; i++) {
-    if (ip6_addr_isany(&(destination_cache[i].destination_addr))) {
-      return i;
-    }
-  }
-
-  /* Find oldest entry. */
-  age = 0;
-  j = LWIP_ND6_NUM_DESTINATIONS - 1;
-  for (i = 0; i < LWIP_ND6_NUM_DESTINATIONS; i++) {
-    if (destination_cache[i].age > age) {
-      j = i;
-    }
-  }
-
-  return j;
-}
-
-/**
- * Determine whether an address matches an on-link prefix.
- *
- * @param ip6addr the IPv6 address to match
- * @return 1 if the address is on-link, 0 otherwise
- */
-static s8_t
-nd6_is_prefix_in_netif(const ip6_addr_t * ip6addr, struct netif * netif)
-{
-  s8_t i;
-  for (i = 0; i < LWIP_ND6_NUM_PREFIXES; i++) {
-    if ((prefix_list[i].netif == netif) &&
-        (prefix_list[i].invalidation_timer > 0) &&
-        ip6_addr_netcmp(ip6addr, &(prefix_list[i].prefix))) {
-      return 1;
-    }
-  }
-  /* Check to see if address prefix matches a (manually?) configured address. */
-  for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
-    if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) &&
-        ip6_addr_netcmp(ip6addr, netif_ip6_addr(netif, i))) {
-      return 1;
-    }
-  }
-  return 0;
-}
-
-/**
- * Select a default router for a destination.
- *
- * @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
- *         router is found
- */
-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. */
-  static s8_t last_router;
-  (void)ip6addr; /* TODO match preferred routes!! (must implement ND6_OPTION_TYPE_ROUTE_INFO) */
-
-  /* TODO: implement default router preference */
-
-  /* Look for reachable routers. */
-  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;
-    }
-  }
-
-  /* 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;
-    }
-  }
-
-  /* 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;
-    }
-    if (default_router_list[i].neighbor_entry != NULL &&
-        (netif != NULL ? netif == default_router_list[i].neighbor_entry->netif : 1)) {
-      return i;
-    }
-  }
-
-  /* no suitable router found. */
-  return -1;
-}
-
-/**
- * Find an entry for a default router.
- *
- * @param router_addr the IPv6 address of the router
- * @param netif the netif on which the router is found, if known
- * @return the index of the router entry, or -1 if not found
- */
-static s8_t
-nd6_get_router(const ip6_addr_t * router_addr, struct netif * netif)
-{
-  s8_t i;
-
-  /* Look for router. */
-  for (i = 0; i < LWIP_ND6_NUM_ROUTERS; i++) {
-    if ((default_router_list[i].neighbor_entry != NULL) &&
-        ((netif != NULL) ? netif == default_router_list[i].neighbor_entry->netif : 1) &&
-        ip6_addr_cmp(router_addr, &(default_router_list[i].neighbor_entry->next_hop_address))) {
-      return i;
-    }
-  }
-
-  /* router not found. */
-  return -1;
-}
-
-/**
- * Create a new entry for a default router.
- *
- * @param router_addr the IPv6 address of the router
- * @param netif the netif on which the router is connected, if known
- * @return the index on the router table, or -1 if could not be created
- */
-static s8_t
-nd6_new_router(const ip6_addr_t * router_addr, struct netif * netif)
-{
-  s8_t router_index;
-  s8_t neighbor_index;
-
-  /* Do we have a neighbor entry for this router? */
-  neighbor_index = nd6_find_neighbor_cache_entry(router_addr);
-  if (neighbor_index < 0) {
-    /* Create a neighbor entry for this router. */
-    neighbor_index = nd6_new_neighbor_cache_entry();
-    if (neighbor_index < 0) {
-      /* Could not create neighbor entry for this router. */
-      return -1;
-    }
-    ip6_addr_set(&(neighbor_cache[neighbor_index].next_hop_address), router_addr);
-    neighbor_cache[neighbor_index].netif = netif;
-    neighbor_cache[neighbor_index].q = NULL;
-    neighbor_cache[neighbor_index].state = ND6_INCOMPLETE;
-    neighbor_cache[neighbor_index].counter.probes_sent = 0;
-  }
-
-  /* Mark neighbor as router. */
-  neighbor_cache[neighbor_index].isrouter = 1;
-
-  /* Look for empty entry. */
-  for (router_index = 0; router_index < LWIP_ND6_NUM_ROUTERS; router_index++) {
-    if (default_router_list[router_index].neighbor_entry == NULL) {
-      default_router_list[router_index].neighbor_entry = &(neighbor_cache[neighbor_index]);
-      return router_index;
-    }
-  }
-
-  /* Could not create a router entry. */
-
-  /* Mark neighbor entry as not-router. Entry might be useful as neighbor still. */
-  neighbor_cache[neighbor_index].isrouter = 0;
-
-  /* router not found. */
-  return -1;
-}
-
-/**
- * Find the cached entry for an on-link prefix.
- *
- * @param prefix the IPv6 prefix that is on-link
- * @param netif the netif on which the prefix is on-link
- * @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)
-{
-  s8_t i;
-
-  /* Look for prefix in list. */
-  for (i = 0; i < LWIP_ND6_NUM_PREFIXES; ++i) {
-    if ((ip6_addr_netcmp(&(prefix_list[i].prefix), prefix)) &&
-        (prefix_list[i].netif == netif)) {
-      return i;
-    }
-  }
-
-  /* Entry not available. */
-  return -1;
-}
-
-/**
- * Creates a new entry for an on-link prefix.
- *
- * @param prefix the IPv6 prefix that is on-link
- * @param netif the netif on which the prefix is on-link
- * @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)
-{
-  s8_t i;
-
-  /* Create new entry. */
-  for (i = 0; i < LWIP_ND6_NUM_PREFIXES; ++i) {
-    if ((prefix_list[i].netif == NULL) ||
-        (prefix_list[i].invalidation_timer == 0)) {
-      /* 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;
-    }
-  }
-
-  /* Entry not available. */
-  return -1;
-}
-
-/**
- * Determine the next hop for a destination. Will determine if the
- * destination is on-link, else a suitable on-link router is selected.
- *
- * The last entry index is cached for fast entry search.
- *
- * @param ip6addr the destination address
- * @param netif the netif on which the packet will be sent
- * @return the neighbor cache entry for the next hop, ERR_RTE if no
- *         suitable next hop was found, ERR_MEM if no cache entry
- *         could be created
- */
-s8_t
-nd6_get_next_hop_entry(const ip6_addr_t * ip6addr, struct netif * netif)
-{
-  s8_t i;
-
-#if LWIP_NETIF_HWADDRHINT
-  if (netif->addr_hint != NULL) {
-    /* per-pcb cached entry was given */
-    u8_t addr_hint = *(netif->addr_hint);
-    if (addr_hint < LWIP_ND6_NUM_DESTINATIONS) {
-      nd6_cached_destination_index = addr_hint;
-    }
-  }
-#endif /* LWIP_NETIF_HWADDRHINT */
-
-  /* Look for ip6addr in destination cache. */
-  if (ip6_addr_cmp(ip6addr, &(destination_cache[nd6_cached_destination_index].destination_addr))) {
-    /* the cached entry index is the right one! */
-    /* do nothing. */
-    ND6_STATS_INC(nd6.cachehit);
-  } else {
-    /* Search destination cache. */
-    i = nd6_find_destination_cache_entry(ip6addr);
-    if (i >= 0) {
-      /* found destination entry. make it our new cached index. */
-      nd6_cached_destination_index = i;
-    } else {
-      /* Not found. Create a new destination entry. */
-      i = nd6_new_destination_cache_entry();
-      if (i >= 0) {
-        /* got new destination entry. make it our new cached index. */
-        nd6_cached_destination_index = i;
-      } else {
-        /* Could not create a destination cache entry. */
-        return ERR_MEM;
-      }
-
-      /* Copy dest address to destination cache. */
-      ip6_addr_set(&(destination_cache[nd6_cached_destination_index].destination_addr), ip6addr);
-
-      /* Now find the next hop. is it a neighbor? */
-      if (ip6_addr_islinklocal(ip6addr) ||
-          nd6_is_prefix_in_netif(ip6addr, netif)) {
-        /* Destination in local link. */
-        destination_cache[nd6_cached_destination_index].pmtu = netif->mtu;
-        ip6_addr_copy(destination_cache[nd6_cached_destination_index].next_hop_addr, destination_cache[nd6_cached_destination_index].destination_addr);
-      } else {
-        /* We need to select a router. */
-        i = nd6_select_router(ip6addr, netif);
-        if (i < 0) {
-          /* No router found. */
-          ip6_addr_set_any(&(destination_cache[nd6_cached_destination_index].destination_addr));
-          return ERR_RTE;
-        }
-        destination_cache[nd6_cached_destination_index].pmtu = netif->mtu; /* 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) {
-    /* per-pcb cached entry was given */
-    *(netif->addr_hint) = nd6_cached_destination_index;
-  }
-#endif /* LWIP_NETIF_HWADDRHINT */
-
-  /* Look in neighbor cache for the next-hop address. */
-  if (ip6_addr_cmp(&(destination_cache[nd6_cached_destination_index].next_hop_addr),
-                   &(neighbor_cache[nd6_cached_neighbor_index].next_hop_address))) {
-    /* Cache hit. */
-    /* Do nothing. */
-    ND6_STATS_INC(nd6.cachehit);
-  } else {
-    i = nd6_find_neighbor_cache_entry(&(destination_cache[nd6_cached_destination_index].next_hop_addr));
-    if (i >= 0) {
-      /* Found a matching record, make it new cached entry. */
-      nd6_cached_neighbor_index = i;
-    } else {
-      /* Neighbor not in cache. Make a new entry. */
-      i = nd6_new_neighbor_cache_entry();
-      if (i >= 0) {
-        /* got new neighbor entry. make it our new cached index. */
-        nd6_cached_neighbor_index = i;
-      } else {
-        /* Could not create a neighbor cache entry. */
-        return ERR_MEM;
-      }
-
-      /* Initialize fields. */
-      ip6_addr_copy(neighbor_cache[i].next_hop_address,
-                   destination_cache[nd6_cached_destination_index].next_hop_addr);
-      neighbor_cache[i].isrouter = 0;
-      neighbor_cache[i].netif = netif;
-      neighbor_cache[i].state = ND6_INCOMPLETE;
-      neighbor_cache[i].counter.probes_sent = 0;
-    }
-  }
-
-  /* Reset this destination's age. */
-  destination_cache[nd6_cached_destination_index].age = 0;
-
-  return nd6_cached_neighbor_index;
-}
-
-/**
- * Queue a packet for a neighbor.
- *
- * @param neighbor_index the index in the neighbor cache table
- * @param q packet to be queued
- * @return ERR_OK if succeeded, ERR_MEM if out of memory
- */
-err_t
-nd6_queue_packet(s8_t neighbor_index, struct pbuf * q)
-{
-  err_t result = ERR_MEM;
-  struct pbuf *p;
-  int copy_needed = 0;
-#if LWIP_ND6_QUEUEING
-  struct nd6_q_entry *new_entry, *r;
-#endif /* LWIP_ND6_QUEUEING */
-
-  if ((neighbor_index < 0) || (neighbor_index >= LWIP_ND6_NUM_NEIGHBORS)) {
-    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. */
-  p = q;
-  while (p) {
-    if (p->type != PBUF_ROM) {
-      copy_needed = 1;
-      break;
-    }
-    p = p->next;
-  }
-  if (copy_needed) {
-    /* copy the whole packet into new pbufs */
-    p = pbuf_alloc(PBUF_LINK, q->tot_len, PBUF_RAM);
-    while ((p == NULL) && (neighbor_cache[neighbor_index].q != NULL)) {
-      /* Free oldest packet (as per RFC recommendation) */
-#if LWIP_ND6_QUEUEING
-      r = neighbor_cache[neighbor_index].q;
-      neighbor_cache[neighbor_index].q = r->next;
-      r->next = NULL;
-      nd6_free_q(r);
-#else /* LWIP_ND6_QUEUEING */
-      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;
-      }
-    }
-  } else {
-    /* referencing the old pbuf is enough */
-    p = q;
-    pbuf_ref(p);
-  }
-  /* packet was copied/ref'd? */
-  if (p != NULL) {
-    /* queue packet ... */
-#if LWIP_ND6_QUEUEING
-    /* allocate a new nd6 queue entry */
-    new_entry = (struct nd6_q_entry *)memp_malloc(MEMP_ND6_QUEUE);
-    if ((new_entry == NULL) && (neighbor_cache[neighbor_index].q != NULL)) {
-      /* Free oldest packet (as per RFC recommendation) */
-      r = neighbor_cache[neighbor_index].q;
-      neighbor_cache[neighbor_index].q = r->next;
-      r->next = NULL;
-      nd6_free_q(r);
-      new_entry = (struct nd6_q_entry *)memp_malloc(MEMP_ND6_QUEUE);
-    }
-    if (new_entry != NULL) {
-      new_entry->next = NULL;
-      new_entry->p = p;
-      if (neighbor_cache[neighbor_index].q != NULL) {
-        /* queue was already existent, append the new entry to the end */
-        r = neighbor_cache[neighbor_index].q;
-        while (r->next != NULL) {
-          r = r->next;
-        }
-        r->next = new_entry;
-      } else {
-        /* queue did not exist, first item in queue */
-        neighbor_cache[neighbor_index].q = new_entry;
-      }
-      LWIP_DEBUGF(LWIP_DBG_TRACE, ("ipv6: queued packet %p on neighbor entry %"S16_F"\n", (void *)p, (s16_t)neighbor_index));
-      result = ERR_OK;
-    } else {
-      /* the pool MEMP_ND6_QUEUE is empty */
-      pbuf_free(p);
-      LWIP_DEBUGF(LWIP_DBG_TRACE, ("ipv6: could not queue a copy of packet %p (out of memory)\n", (void *)p));
-      /* { result == ERR_MEM } through initialization */
-    }
-#else /* LWIP_ND6_QUEUEING */
-    /* Queue a single packet. If an older packet is already queued, free it as per RFC. */
-    if (neighbor_cache[neighbor_index].q != NULL) {
-      pbuf_free(neighbor_cache[neighbor_index].q);
-    }
-    neighbor_cache[neighbor_index].q = p;
-    LWIP_DEBUGF(LWIP_DBG_TRACE, ("ipv6: queued packet %p on neighbor entry %"S16_F"\n", (void *)p, (s16_t)neighbor_index));
-    result = ERR_OK;
-#endif /* LWIP_ND6_QUEUEING */
-  } else {
-    LWIP_DEBUGF(LWIP_DBG_TRACE, ("ipv6: could not queue a copy of packet %p (out of memory)\n", (void *)q));
-    /* { result == ERR_MEM } through initialization */
-  }
-
-  return result;
-}
-
-#if LWIP_ND6_QUEUEING
-/**
- * Free a complete queue of nd6 q entries
- *
- * @param q a queue of nd6_q_entry to free
- */
-static void
-nd6_free_q(struct nd6_q_entry *q)
-{
-  struct nd6_q_entry *r;
-  LWIP_ASSERT("q != NULL", q != NULL);
-  LWIP_ASSERT("q->p != NULL", q->p != NULL);
-  while (q) {
-    r = q;
-    q = q->next;
-    LWIP_ASSERT("r->p != NULL", (r->p != NULL));
-    pbuf_free(r->p);
-    memp_free(MEMP_ND6_QUEUE, r);
-  }
-}
-#endif /* LWIP_ND6_QUEUEING */
-
-/**
- * Send queued packets for a neighbor
- *
- * @param i the neighbor to send packets to
- */
-static void
-nd6_send_q(s8_t i)
-{
-  struct ip6_hdr *ip6hdr;
-#if LWIP_ND6_QUEUEING
-  struct nd6_q_entry *q;
-#endif /* LWIP_ND6_QUEUEING */
-
-  if ((i < 0) || (i >= LWIP_ND6_NUM_NEIGHBORS)) {
-    return;
-  }
-
-#if LWIP_ND6_QUEUEING
-  while (neighbor_cache[i].q != NULL) {
-    /* remember first in queue */
-    q = neighbor_cache[i].q;
-    /* pop first item off the queue */
-    neighbor_cache[i].q = q->next;
-    /* Get ipv6 header. */
-    ip6hdr = (struct ip6_hdr *)(q->p->payload);
-    /* Override ip6_current_dest_addr() so that we have an aligned copy. */
-    ip6_addr_set(ip6_current_dest_addr(), &(ip6hdr->dest));
-    /* send the queued IPv6 packet */
-    (neighbor_cache[i].netif)->output_ip6(neighbor_cache[i].netif, q->p, ip6_current_dest_addr());
-    /* free the queued IP packet */
-    pbuf_free(q->p);
-    /* now queue entry can be freed */
-    memp_free(MEMP_ND6_QUEUE, q);
-  }
-#else /* LWIP_ND6_QUEUEING */
-  if (neighbor_cache[i].q != NULL) {
-    /* Get ipv6 header. */
-    ip6hdr = (struct ip6_hdr *)(neighbor_cache[i].q->payload);
-    /* Override ip6_current_dest_addr() so that we have an aligned copy. */
-    ip6_addr_set(ip6_current_dest_addr(), &(ip6hdr->dest));
-    /* send the queued IPv6 packet */
-    (neighbor_cache[i].netif)->output_ip6(neighbor_cache[i].netif, neighbor_cache[i].q, ip6_current_dest_addr());
-    /* free the queued IP packet */
-    pbuf_free(neighbor_cache[i].q);
-    neighbor_cache[i].q = NULL;
-  }
-#endif /* LWIP_ND6_QUEUEING */
-}
-
-
-/**
- * Get the Path MTU for a destination.
- *
- * @param ip6addr the destination address
- * @param netif the netif on which the packet will be sent
- * @return the Path MTU, if known, or the netif default MTU
- */
-u16_t
-nd6_get_destination_mtu(const ip6_addr_t * ip6addr, struct netif * netif)
-{
-  s8_t i;
-
-  i = nd6_find_destination_cache_entry(ip6addr);
-  if (i >= 0) {
-    if (destination_cache[i].pmtu > 0) {
-      return destination_cache[i].pmtu;
-    }
-  }
-
-  if (netif != NULL) {
-    return netif->mtu;
-  }
-
-  return 1280; /* Minimum MTU */
-}
-
-
-#if LWIP_ND6_TCP_REACHABILITY_HINTS
-/**
- * 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.
- *
- * @param ip6addr the destination address which is know to be reachable
- *                by an upper layer protocol (TCP)
- */
-void
-nd6_reachability_hint(const ip6_addr_t * ip6addr)
-{
-  s8_t i;
-
-  /* Find destination in cache. */
-  if (ip6_addr_cmp(ip6addr, &(destination_cache[nd6_cached_destination_index].destination_addr))) {
-    i = nd6_cached_destination_index;
-    ND6_STATS_INC(nd6.cachehit);
-  } else {
-    i = nd6_find_destination_cache_entry(ip6addr);
-  }
-  if (i < 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))) {
-    i = nd6_cached_neighbor_index;
-    ND6_STATS_INC(nd6.cachehit);
-  } else {
-    i = nd6_find_neighbor_cache_entry(&(destination_cache[i].next_hop_addr));
-  }
-  if (i < 0) {
-    return;
-  }
-
-  /* For safety: don't set as reachable if we don't have a LL address yet. Misuse protection. */
-  if (neighbor_cache[i].state == ND6_INCOMPLETE || neighbor_cache[i].state == ND6_NO_ENTRY) {
-    return;
-  }
-
-  /* Set reachability state. */
-  neighbor_cache[i].state = ND6_REACHABLE;
-  neighbor_cache[i].counter.reachable_time = reachable_time;
-}
-#endif /* LWIP_ND6_TCP_REACHABILITY_HINTS */
-
-#endif /* LWIP_IPV6 */
diff --git a/components/lwip/core/mem.c b/components/lwip/core/mem.c
deleted file mode 100644 (file)
index 9ca9e3c..0000000
+++ /dev/null
@@ -1,682 +0,0 @@
-/**
- * @file
- * Dynamic memory manager
- *
- * This is a lightweight replacement for the standard C library malloc().
- *
- * If you want to use the standard C library malloc() instead, define
- * MEM_LIBC_MALLOC to 1 in your lwipopts.h
- *
- * To let mem_malloc() use pools (prevents fragmentation and is much faster than
- * a heap but might waste some memory), define MEM_USE_POOLS to 1, define
- * MEM_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):
- *
- * 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
- */
-
-/*
- * 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>
- *         Simon Goldschmidt
- *
- */
-
-#include "lwip/opt.h"
-
-#if !MEM_LIBC_MALLOC /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/def.h"
-#include "lwip/mem.h"
-#include "lwip/sys.h"
-#include "lwip/stats.h"
-#include "lwip/err.h"
-
-#include <string.h>
-
-#if MEM_USE_POOLS
-
-#if MEMP_MEM_MALLOC
-#error MEM_USE_POOLS and MEMP_MEM_MALLOC cannot be used together
-#endif
-
-/* lwIP head implemented with different sized pools */
-
-/**
- * Allocate memory: determine the smallest pool that is big enough
- * to contain an element of 'size' and get an element from that pool.
- *
- * @param size the size in bytes of the memory needed
- * @return a pointer to the allocated memory or NULL if the pool is empty
- */
-void *
-mem_malloc(mem_size_t size)
-{
-  void *ret;
-  struct memp_malloc_helper *element;
-  memp_t poolnr;
-  mem_size_t required_size = size + LWIP_MEM_ALIGN_SIZE(sizeof(struct memp_malloc_helper));
-
-  for (poolnr = MEMP_POOL_FIRST; poolnr <= MEMP_POOL_LAST; poolnr = (memp_t)(poolnr + 1)) {
-#if MEM_USE_POOLS_TRY_BIGGER_POOL
-again:
-#endif /* MEM_USE_POOLS_TRY_BIGGER_POOL */
-    /* 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) {
-      break;
-    }
-  }
-  if (poolnr > MEMP_POOL_LAST) {
-    LWIP_ASSERT("mem_malloc(): no pool is that big!", 0);
-    return NULL;
-  }
-  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
-    /** Try a bigger pool if this one is empty! */
-    if (poolnr < MEMP_POOL_LAST) {
-      poolnr++;
-      goto again;
-    }
-#endif /* MEM_USE_POOLS_TRY_BIGGER_POOL */
-    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));
-
-#if MEMP_OVERFLOW_CHECK
-  /* initialize unused memory */
-  element->size = size;
-  memset((u8_t*)ret + size, 0xcd, memp_pools[poolnr]->size - size);
-#endif /* MEMP_OVERFLOW_CHECK */
-  return ret;
-}
-
-/**
- * Free memory previously allocated by mem_malloc. Loads the pool number
- * and calls memp_free with that pool number to put the element back into
- * its pool
- *
- * @param rmem the memory element to free
- */
-void
-mem_free(void *rmem)
-{
-  struct memp_malloc_helper *hmem;
-
-  LWIP_ASSERT("rmem != NULL", (rmem != NULL));
-  LWIP_ASSERT("rmem == MEM_ALIGN(rmem)", (rmem == LWIP_MEM_ALIGN(rmem)));
-
-  /* get the original 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));
-
-#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 */
-     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 */
-
-  /* and put it in the pool we saved earlier */
-  memp_free(hmem->poolnr, hmem);
-}
-
-#else /* MEM_USE_POOLS */
-/* lwIP replacement for your libc malloc() */
-
-/**
- * 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.
- */
-struct mem {
-  /** index (-> ram[next]) of the next struct */
-  mem_size_t next;
-  /** index (-> ram[prev]) of the previous struct */
-  mem_size_t prev;
-  /** 1: this area is used; 0: this area is unused */
-  u8_t used;
-};
-
-/** 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. */
-#ifndef MIN_SIZE
-#define MIN_SIZE             12
-#endif /* MIN_SIZE */
-/* some alignment macros: we define them here for better source code layout */
-#define MIN_SIZE_ALIGNED     LWIP_MEM_ALIGN_SIZE(MIN_SIZE)
-#define SIZEOF_STRUCT_MEM    LWIP_MEM_ALIGN_SIZE(sizeof(struct mem))
-#define MEM_SIZE_ALIGNED     LWIP_MEM_ALIGN_SIZE(MEM_SIZE)
-
-/** 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). */
-#ifndef LWIP_RAM_HEAP_POINTER
-/** the heap. we need one struct mem at the end and some room for alignment */
-u8_t ram_heap[MEM_SIZE_ALIGNED + (2U*SIZEOF_STRUCT_MEM) + MEM_ALIGNMENT];
-#define LWIP_RAM_HEAP_POINTER ram_heap
-#endif /* LWIP_RAM_HEAP_POINTER */
-
-/** pointer to the heap (ram_heap): for alignment, ram is now a pointer instead of an array */
-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
-static sys_mutex_t mem_mutex;
-#endif
-
-#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
-
-static volatile u8_t mem_free_count;
-
-/* Allow mem_free from other (e.g. interrupt) context */
-#define LWIP_MEM_FREE_DECL_PROTECT()  SYS_ARCH_DECL_PROTECT(lev_free)
-#define LWIP_MEM_FREE_PROTECT()       SYS_ARCH_PROTECT(lev_free)
-#define LWIP_MEM_FREE_UNPROTECT()     SYS_ARCH_UNPROTECT(lev_free)
-#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)
-
-#else /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
-
-/* Protect the heap only by using a semaphore */
-#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 */
-#define LWIP_MEM_ALLOC_DECL_PROTECT()
-#define LWIP_MEM_ALLOC_PROTECT()
-#define LWIP_MEM_ALLOC_UNPROTECT()
-
-#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
-
-
-/**
- * "Plug holes" by combining adjacent empty struct mems.
- * After this function is through, there should not exist
- * one empty struct mem pointing to another empty struct mem.
- *
- * @param mem this points to a struct mem which just has been freed
- * @internal this function is only called by mem_free() and mem_trim()
- *
- * This assumes access to the heap is protected by the calling function
- * already.
- */
-static void
-plug_holes(struct mem *mem)
-{
-  struct mem *nmem;
-  struct mem *pmem;
-
-  LWIP_ASSERT("plug_holes: mem >= ram", (u8_t *)mem >= ram);
-  LWIP_ASSERT("plug_holes: mem < ram_end", (u8_t *)mem < (u8_t *)ram_end);
-  LWIP_ASSERT("plug_holes: mem->used == 0", mem->used == 0);
-
-  /* plug hole forward */
-  LWIP_ASSERT("plug_holes: mem->next <= MEM_SIZE_ALIGNED", mem->next <= MEM_SIZE_ALIGNED);
-
-  nmem = (struct mem *)(void *)&ram[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);
-  }
-
-  /* plug hole backward */
-  pmem = (struct mem *)(void *)&ram[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);
-  }
-}
-
-/**
- * Zero the heap and initialize start, end and lowest-free
- */
-void
-mem_init(void)
-{
-  struct mem *mem;
-
-  LWIP_ASSERT("Sanity check alignment",
-    (SIZEOF_STRUCT_MEM & (MEM_ALIGNMENT-1)) == 0);
-
-  /* align the heap */
-  ram = (u8_t *)LWIP_MEM_ALIGN(LWIP_RAM_HEAP_POINTER);
-  /* initialize the start of the heap */
-  mem = (struct mem *)(void *)ram;
-  mem->next = MEM_SIZE_ALIGNED;
-  mem->prev = 0;
-  mem->used = 0;
-  /* initialize the end of the heap */
-  ram_end = (struct mem *)(void *)&ram[MEM_SIZE_ALIGNED];
-  ram_end->used = 1;
-  ram_end->next = MEM_SIZE_ALIGNED;
-  ram_end->prev = MEM_SIZE_ALIGNED;
-
-  /* initialize the lowest-free pointer to the start of the heap */
-  lfree = (struct mem *)(void *)ram;
-
-  MEM_STATS_AVAIL(avail, MEM_SIZE_ALIGNED);
-
-  if (sys_mutex_new(&mem_mutex) != ERR_OK) {
-    LWIP_ASSERT("failed to create mem_mutex", 0);
-  }
-}
-
-/**
- * Put a struct mem back on the heap
- *
- * @param rmem is the data portion of a struct mem as returned by a previous
- *             call to mem_malloc()
- */
-void
-mem_free(void *rmem)
-{
-  struct mem *mem;
-  LWIP_MEM_FREE_DECL_PROTECT();
-
-  if (rmem == NULL) {
-    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"));
-    /* protect mem stats from concurrent access */
-    SYS_ARCH_PROTECT(lev);
-    MEM_STATS_INC(illegal);
-    SYS_ARCH_UNPROTECT(lev);
-    return;
-  }
-  /* protect the heap from concurrent access */
-  LWIP_MEM_FREE_PROTECT();
-  /* Get the corresponding struct mem ... */
-  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->used = 0;
-
-  if (mem < lfree) {
-    /* the newly freed struct is now the lowest */
-    lfree = mem;
-  }
-
-  MEM_STATS_DEC_USED(used, mem->next - (mem_size_t)(((u8_t *)mem - ram)));
-
-  /* finally, see if prev or next are free also */
-  plug_holes(mem);
-#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
-  mem_free_count = 1;
-#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
-  LWIP_MEM_FREE_UNPROTECT();
-}
-
-/**
- * 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
- *                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_size_t size;
-  mem_size_t ptr, ptr2;
-  struct mem *mem, *mem2;
-  /* use the FREE_PROTECT here: it protects with sem OR SYS_ARCH_PROTECT */
-  LWIP_MEM_FREE_DECL_PROTECT();
-
-  /* Expand the size of the allocated memory region so that we can
-     adjust for alignment. */
-  newsize = LWIP_MEM_ALIGN_SIZE(newsize);
-
-  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) {
-    return NULL;
-  }
-
-  LWIP_ASSERT("mem_trim: 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_trim: illegal memory\n"));
-    /* protect mem stats from concurrent access */
-    SYS_ARCH_PROTECT(lev);
-    MEM_STATS_INC(illegal);
-    SYS_ARCH_UNPROTECT(lev);
-    return rmem;
-  }
-  /* Get the corresponding struct mem ... */
-  mem = (struct mem *)(void *)((u8_t *)rmem - SIZEOF_STRUCT_MEM);
-  /* ... and its offset pointer */
-  ptr = (mem_size_t)((u8_t *)mem - ram);
-
-  size = mem->next - ptr - SIZEOF_STRUCT_MEM;
-  LWIP_ASSERT("mem_trim can only shrink memory", newsize <= size);
-  if (newsize > size) {
-    /* not supported */
-    return NULL;
-  }
-  if (newsize == size) {
-    /* No change in size, simply return */
-    return rmem;
-  }
-
-  /* protect the heap from concurrent access */
-  LWIP_MEM_FREE_PROTECT();
-
-  mem2 = (struct mem *)(void *)&ram[mem->next];
-  if (mem2->used == 0) {
-    /* The next struct is unused, we can simply move it at little */
-    mem_size_t next;
-    /* 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;
-    if (lfree == mem2) {
-      lfree = (struct mem *)(void *)&ram[ptr2];
-    }
-    mem2 = (struct mem *)(void *)&ram[ptr2];
-    mem2->used = 0;
-    /* restore the next pointer */
-    mem2->next = next;
-    /* link it back to mem */
-    mem2->prev = ptr;
-    /* link mem to it */
-    mem->next = ptr2;
-    /* last thing to restore linked list: as we have moved mem2,
-     * 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;
-    }
-    MEM_STATS_DEC_USED(used, (size - newsize));
-    /* no need to plug holes, we've already done that */
-  } else if (newsize + SIZEOF_STRUCT_MEM + MIN_SIZE_ALIGNED <= size) {
-    /* Next struct is used but there's room for another struct mem with
-     * at least MIN_SIZE_ALIGNED of data.
-     * Old size ('size') must be big enough to contain at least 'newsize' plus a struct mem
-     * ('SIZEOF_STRUCT_MEM') with some data ('MIN_SIZE_ALIGNED').
-     * @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];
-    if (mem2 < lfree) {
-      lfree = mem2;
-    }
-    mem2->used = 0;
-    mem2->next = mem->next;
-    mem2->prev = ptr;
-    mem->next = ptr2;
-    if (mem2->next != MEM_SIZE_ALIGNED) {
-      ((struct mem *)(void *)&ram[mem2->next])->prev = ptr2;
-    }
-    MEM_STATS_DEC_USED(used, (size - newsize));
-    /* the original mem->next is used, so no need to plug holes! */
-  }
-  /* else {
-    next struct mem is used but size between mem and mem2 is not big enough
-    to create another struct mem
-    -> don't do anyhting.
-    -> the remaining space stays unused since it is too small
-  } */
-#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
-  mem_free_count = 1;
-#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
-  LWIP_MEM_FREE_UNPROTECT();
-  return rmem;
-}
-
-/**
- * Adam's mem_malloc() plus solution for bug #17922
- * Allocate a block of memory with a minimum of 'size' bytes.
- *
- * @param size 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_size_t ptr, ptr2;
-  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) {
-    return NULL;
-  }
-
-  /* Expand the size of the allocated memory region so that we can
-     adjust for alignment. */
-  size = LWIP_MEM_ALIGN_SIZE(size);
-
-  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) {
-    return NULL;
-  }
-
-  /* protect the heap from concurrent access */
-  sys_mutex_lock(&mem_mutex);
-  LWIP_MEM_ALLOC_PROTECT();
-#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
-  /* run as long as a mem_free disturbed mem_malloc or mem_trim */
-  do {
-    local_mem_free_count = 0;
-#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
-
-    /* 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];
-#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
-      mem_free_count = 0;
-      LWIP_MEM_ALLOC_UNPROTECT();
-      /* allow mem_free or mem_trim to run */
-      LWIP_MEM_ALLOC_PROTECT();
-      if (mem_free_count != 0) {
-        /* If mem_free or mem_trim have run, we have to restart since they
-           could have altered our current struct mem. */
-        local_mem_free_count = 1;
-        break;
-      }
-#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
-
-      if ((!mem->used) &&
-          (mem->next - (ptr + SIZEOF_STRUCT_MEM)) >= size) {
-        /* mem is not used and at least perfect fit is possible:
-         * mem->next - (ptr + SIZEOF_STRUCT_MEM) gives us the 'user data size' of mem */
-
-        if (mem->next - (ptr + SIZEOF_STRUCT_MEM) >= (size + SIZEOF_STRUCT_MEM + MIN_SIZE_ALIGNED)) {
-          /* (in addition to the above, we test if another struct mem (SIZEOF_STRUCT_MEM) containing
-           * at least MIN_SIZE_ALIGNED of data also fits in the 'user data space' of 'mem')
-           * -> split large block, create empty remainder,
-           * remainder must be large enough to contain MIN_SIZE_ALIGNED data: if
-           * mem->next - (ptr + (2*SIZEOF_STRUCT_MEM)) == size,
-           * struct mem would fit in but no data between mem2 and mem2->next
-           * @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 + size;
-          /* create mem2 struct */
-          mem2 = (struct mem *)(void *)&ram[ptr2];
-          mem2->used = 0;
-          mem2->next = mem->next;
-          mem2->prev = ptr;
-          /* and insert it between mem and mem->next */
-          mem->next = ptr2;
-          mem->used = 1;
-
-          if (mem2->next != MEM_SIZE_ALIGNED) {
-            ((struct mem *)(void *)&ram[mem2->next])->prev = ptr2;
-          }
-          MEM_STATS_INC_USED(used, (size + SIZEOF_STRUCT_MEM));
-        } else {
-          /* (a mem2 struct does no fit into the user data space of mem and mem->next will always
-           * be used at this point: if not we have 2 unused structs in a row, plug_holes should have
-           * take care of this).
-           * -> near fit or exact fit: do not split, no mem2 creation
-           * also can't move mem->next directly behind mem, since mem->next
-           * will always be used at this point!
-           */
-          mem->used = 1;
-          MEM_STATS_INC_USED(used, mem->next - (mem_size_t)((u8_t *)mem - ram));
-        }
-#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
-mem_malloc_adjust_lfree:
-#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
-        if (mem == lfree) {
-          struct mem *cur = lfree;
-          /* Find next free block after mem and update lowest free pointer */
-          while (cur->used && cur != ram_end) {
-#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
-            mem_free_count = 0;
-            LWIP_MEM_ALLOC_UNPROTECT();
-            /* prevent high interrupt latency... */
-            LWIP_MEM_ALLOC_PROTECT();
-            if (mem_free_count != 0) {
-              /* If mem_free or mem_trim have run, we have to restart since they
-                 could have altered our current struct mem or lfree. */
-              goto mem_malloc_adjust_lfree;
-            }
-#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */
-            cur = (struct mem *)(void *)&ram[cur->next];
-          }
-          lfree = cur;
-          LWIP_ASSERT("mem_malloc: !lfree->used", ((lfree == ram_end) || (!lfree->used)));
-        }
-        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);
-        LWIP_ASSERT("mem_malloc: allocated memory properly aligned.",
-         ((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);
-
-        return (u8_t *)mem + SIZEOF_STRUCT_MEM;
-      }
-    }
-#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);
-  return NULL;
-}
-
-#endif /* MEM_USE_POOLS */
-/**
- * Contiguously allocates enough space for count objects that are size bytes
- * of memory each and returns a pointer to the allocated memory.
- *
- * The allocated memory is filled with bytes of value zero.
- *
- * @param count number of objects to allocate
- * @param size size of the objects to allocate
- * @return pointer to allocated memory / NULL pointer if there is an error
- */
-void *mem_calloc(mem_size_t count, mem_size_t size)
-{
-  void *p;
-
-  /* allocate 'count' objects of size 'size' */
-  p = mem_malloc(count * size);
-  if (p) {
-    /* zero the memory */
-    memset(p, 0, (size_t)count * (size_t)size);
-  }
-  return p;
-}
-
-#endif /* !MEM_LIBC_MALLOC */
diff --git a/components/lwip/core/memp.c b/components/lwip/core/memp.c
deleted file mode 100644 (file)
index 7895533..0000000
+++ /dev/null
@@ -1,432 +0,0 @@
-/**
- * @file
- * Dynamic pool memory manager
- *
- * lwIP has dedicated pools for many structures (netconn, protocol control blocks,
- * packet buffers, ...). All these pools are managed here.
- */
-
-/*
- * 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>
- *
- */
-
-#include "lwip/opt.h"
-
-#include "lwip/memp.h"
-#include "lwip/pbuf.h"
-#include "lwip/udp.h"
-#include "lwip/raw.h"
-#include "lwip/igmp.h"
-#include "lwip/api.h"
-#include "lwip/priv/api_msg.h"
-#include "lwip/sockets.h"
-#include "lwip/sys.h"
-#include "lwip/timers.h"
-#include "lwip/stats.h"
-#include "netif/etharp.h"
-#include "lwip/ip_frag.h"
-#include "lwip/dns.h"
-#include "lwip/netdb.h"
-#include "netif/ppp/ppp.h"
-#include "netif/ppp/pppos.h"
-#include "netif/ppp/pppoe.h"
-#include "netif/ppp/pppol2tp.h"
-#include "lwip/nd6.h"
-#include "lwip/ip6_frag.h"
-#include "lwip/mld6.h"
-#include "lwip/tcp.h"
-#include "lwip/tcpip.h"
-#include "lwip/priv/tcp_priv.h"
-#include "lwip/priv/tcpip_priv.h"
-#include "lwip/netifapi.h"
-
-#include <string.h>
-
-#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] = {
-#define LWIP_MEMPOOL(name,num,size,desc) &memp_ ## name,
-#include "lwip/priv/memp_std.h"
-};
-
-#if !MEMP_MEM_MALLOC /* don't build if not configured for use in lwipopts.h */
-
-#if MEMP_SANITY_CHECK
-/**
- * Check that memp-lists don't form a circle, using "Floyd's cycle-finding algorithm".
- */
-static int
-memp_sanity(const struct memp_desc *desc)
-{
-  struct memp *t, *h;
-
-  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)) {
-      if (t == h) {
-        return 0;
-      }
-    }
-  }
-
-  return 1;
-}
-#endif /* MEMP_SANITY_CHECK*/
-
-#if MEMP_OVERFLOW_CHECK
-
-/**
- * Check if a memp element was victim of an overflow
- * (e.g. the restricted area after it has been altered)
- *
- * @param p the memp element to check
- * @param memp_type the pool p comes from
- */
-static void
-memp_overflow_check_element_overflow(struct memp *p, const struct memp_desc *desc)
-{
-  u16_t k;
-  u8_t *m;
-#if MEMP_SANITY_REGION_AFTER_ALIGNED > 0
-  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);
-    }
-  }
-#endif
-}
-
-/**
- * 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 memp_type the pool p comes from
- */
-static void
-memp_overflow_check_element_underflow(struct memp *p, const struct memp_desc *desc)
-{
-  u16_t k;
-  u8_t *m;
-#if MEMP_SANITY_REGION_BEFORE_ALIGNED > 0
-  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);
-    }
-  }
-#endif
-}
-
-/**
- * Do an overflow check for all elements in every pool.
- *
- * @see memp_overflow_check_element for a description of the check
- */
-static void
-memp_overflow_check_all(void)
-{
-  u16_t i, j;
-  struct memp *p;
-
-  for (i = 0; i < MEMP_MAX; ++i) {
-    p = (struct memp *)(size_t)(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 = (struct memp*)(size_t)((u8_t*)p + MEMP_SIZE + memp_pools[i]->size + MEMP_SANITY_REGION_AFTER_ALIGNED);
-    }
-  }
-}
-
-/**
- * Initialize the restricted areas of all memp elements in every pool.
- */
-static void
-memp_overflow_init(const struct memp_desc *desc)
-{
-  u16_t i;
-  struct memp *p;
-  u8_t *m;
-
-  p = (struct memp *)(size_t)(desc->base);
-  for (i = 0; i < desc->num; ++i) {
-#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
-    p = (struct memp*)(size_t)((u8_t*)p + MEMP_SIZE + desc->size + MEMP_SANITY_REGION_AFTER_ALIGNED);
-  }
-}
-#endif /* MEMP_OVERFLOW_CHECK */
-
-
-void
-memp_init_pool(const struct memp_desc *desc)
-{
-  int i;
-  struct memp *memp;
-  
-  *desc->tab = NULL;
-  memp = (struct memp*)LWIP_MEM_ALIGN(desc->base);
-  /* create a linked list of memp elements */
-  for (i = 0; i < desc->num; ++i) {
-    memp->next = *desc->tab;
-    *desc->tab = memp;
-    memp = (struct memp *)(void *)((u8_t *)memp + MEMP_SIZE + desc->size
-#if MEMP_OVERFLOW_CHECK
-      + MEMP_SANITY_REGION_AFTER_ALIGNED
-#endif
-    );
-  }  
-
-#if MEMP_OVERFLOW_CHECK
-  memp_overflow_init(desc);
-#endif /* MEMP_OVERFLOW_CHECK */
-}
-
-/**
- * Initialize this module.
- *
- * Carves out memp_memory into linked lists for each pool-type.
- */
-void
-memp_init(void)
-{
-  u16_t i;
-
-  for (i = 0; i < MEMP_MAX; ++i) {
-    MEMP_STATS_AVAIL(used, i, 0);
-    MEMP_STATS_AVAIL(max, i, 0);
-    MEMP_STATS_AVAIL(err, i, 0);
-    MEMP_STATS_AVAIL(avail, i, memp_pools[i]->num);
-  }
-
-  /* for every pool: */
-  for (i = 0; i < MEMP_MAX; ++i) {
-    memp_init_pool(memp_pools[i]);
-  }
-
-#if MEMP_OVERFLOW_CHECK
-  /* check everything a first time to see if it worked */
-  memp_overflow_check_all();
-#endif /* MEMP_OVERFLOW_CHECK */
-}
-
-void *
-#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)
-#endif
-{
-  struct memp *memp;
-  SYS_ARCH_DECL_PROTECT(old_level);
-
-  SYS_ARCH_PROTECT(old_level);
-
-  memp = *desc->tab;
-
-#if MEMP_OVERFLOW_CHECK == 1
-  memp_overflow_check_element_overflow(memp, desc);
-  memp_overflow_check_element_underflow(memp, desc);
-#endif /* MEMP_OVERFLOW_CHECK */
-
-  if (memp != NULL) {
-    *desc->tab = memp->next;
-#if MEMP_OVERFLOW_CHECK
-    memp->next = NULL;
-    memp->file = file;
-    memp->line = line;
-#endif /* MEMP_OVERFLOW_CHECK */
-    LWIP_ASSERT("memp_malloc: memp properly aligned",
-                ((mem_ptr_t)memp % MEM_ALIGNMENT) == 0);
-    memp = (struct memp*)(void *)((u8_t*)memp + MEMP_SIZE);
-  }
-
-  SYS_ARCH_UNPROTECT(old_level);
-
-  return memp;
-}
-
-/**
- * Get an element from a specific pool.
- *
- * @param type the pool to get an element from
- *
- * the debug version has two more parameters:
- * @param file file name calling this function
- * @param line number of line where this function is called
- *
- * @return a pointer to the allocated memory or a NULL pointer on error
- */
-void *
-#if !MEMP_OVERFLOW_CHECK
-memp_malloc(memp_t type)
-#else
-memp_malloc_fn(memp_t type, const char* file, const int line)
-#endif
-{
-  void *memp;
-  SYS_ARCH_DECL_PROTECT(old_level);
-
-  LWIP_ERROR("memp_malloc: type < MEMP_MAX", (type < MEMP_MAX), return NULL;);
-
-  SYS_ARCH_PROTECT(old_level);
-
-#if MEMP_OVERFLOW_CHECK >= 2
-  memp_overflow_check_all();
-#endif /* MEMP_OVERFLOW_CHECK >= 2 */
-
-#if !MEMP_OVERFLOW_CHECK
-  memp = memp_malloc_pool(memp_pools[type]);
-#else
-  memp = memp_malloc_pool_fn(memp_pools[type], file, line);
-#endif
-
-  if (memp != NULL) {
-    MEMP_STATS_INC(used, type);
-    if(MEMP_STATS_GET(used, type) > MEMP_STATS_GET(max, type)) {
-      MEMP_STATS_AVAIL(max, type, MEMP_STATS_GET(used, type));
-    }
-  } else {
-    LWIP_DEBUGF(MEMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("memp_malloc: out of memory in pool %s\n", memp_pools[type]->desc));
-    MEMP_STATS_INC(err, type);
-  }
-
-  SYS_ARCH_UNPROTECT(old_level);
-
-  return memp;
-}
-
-static void
-#ifdef LWIP_HOOK_MEMP_AVAILABLE
-do_memp_free_pool(const struct memp_desc* desc, void *mem, struct memp **old_first)
-#else
-do_memp_free_pool(const struct memp_desc* desc, void *mem)
-#endif
-{
-  struct memp *memp;
-  SYS_ARCH_DECL_PROTECT(old_level);
-
-  LWIP_ASSERT("memp_free: mem properly aligned",
-                ((mem_ptr_t)mem % MEM_ALIGNMENT) == 0);
-
-  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);
-#endif /* MEMP_OVERFLOW_CHECK */
-
-  memp->next = *desc->tab;
-
-#ifdef LWIP_HOOK_MEMP_AVAILABLE
-  if (old_first)
-    *old_first = *desc->tab;
-#endif
-
-  *desc->tab = memp;
-
-#if MEMP_SANITY_CHECK
-  LWIP_ASSERT("memp sanity", memp_sanity(desc));
-#endif /* MEMP_SANITY_CHECK */
-
-  SYS_ARCH_UNPROTECT(old_level);
-}
-
-void
-memp_free_pool(const struct memp_desc* desc, void *mem)
-{
-  if ((desc == NULL) || (mem == NULL)) {
-    return;
-  }
-
-#ifdef LWIP_HOOK_MEMP_AVAILABLE
-  do_memp_free_pool(desc, mem, NULL);
-#else
-  do_memp_free_pool(desc, mem);
-#endif
-}
-
-/**
- * Put an element back into its pool.
- *
- * @param type the pool where to put mem
- * @param mem the memp element to free
- */
-void
-memp_free(memp_t type, void *mem)
-{
-#ifdef LWIP_HOOK_MEMP_AVAILABLE
-  struct memp *old_first;
-#endif
-  SYS_ARCH_DECL_PROTECT(old_level);
-
-  LWIP_ERROR("memp_free: type < MEMP_MAX", (type < MEMP_MAX), return;);
-
-  SYS_ARCH_PROTECT(old_level);
-
-#if MEMP_OVERFLOW_CHECK >= 2
-  memp_overflow_check_all();
-#endif /* MEMP_OVERFLOW_CHECK >= 2 */
-
-  MEMP_STATS_DEC(used, type);
-
-#ifdef LWIP_HOOK_MEMP_AVAILABLE
-  do_memp_free_pool(memp_pools[type], mem, &old_first);
-#else
-  do_memp_free_pool(memp_pools[type], mem);
-#endif
-
-  SYS_ARCH_UNPROTECT(old_level);
-
-#ifdef LWIP_HOOK_MEMP_AVAILABLE
-  if (old_first == NULL) {
-    LWIP_HOOK_MEMP_AVAILABLE(type);
-  }
-#endif
-}
-
-#endif /* MEMP_MEM_MALLOC */
diff --git a/components/lwip/core/netif.c b/components/lwip/core/netif.c
deleted file mode 100644 (file)
index b5995f2..0000000
+++ /dev/null
@@ -1,1051 +0,0 @@
-/**
- * @file
- * lwIP network interface abstraction
- *
- */
-
-/*
- * 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>
- *
- */
-
-#include "lwip/opt.h"
-
-#include "lwip/def.h"
-#include "lwip/ip_addr.h"
-#include "lwip/ip6_addr.h"
-#include "lwip/netif.h"
-#include "lwip/priv/tcp_priv.h"
-#include "lwip/udp.h"
-#include "lwip/snmp.h"
-#include "lwip/igmp.h"
-#include "netif/etharp.h"
-#include "lwip/stats.h"
-#include "lwip/sys.h"
-#if ENABLE_LOOPBACK
-#include "lwip/sys.h"
-#if LWIP_NETIF_LOOPBACK_MULTITHREADING
-#include "lwip/tcpip.h"
-#endif /* LWIP_NETIF_LOOPBACK_MULTITHREADING */
-#endif /* ENABLE_LOOPBACK */
-
-#if LWIP_AUTOIP
-#include "lwip/autoip.h"
-#endif /* LWIP_AUTOIP */
-#if LWIP_DHCP
-#include "lwip/dhcp.h"
-#endif /* LWIP_DHCP */
-#if LWIP_IPV6_DHCP6
-#include "lwip/dhcp6.h"
-#endif /* LWIP_IPV6_DHCP6 */
-#if LWIP_IPV6_MLD
-#include "lwip/mld6.h"
-#endif /* LWIP_IPV6_MLD */
-
-#if LWIP_NETIF_STATUS_CALLBACK
-#define NETIF_STATUS_CALLBACK(n) do{ if (n->status_callback) { (n->status_callback)(n); }}while(0)
-#else
-#define NETIF_STATUS_CALLBACK(n)
-#endif /* LWIP_NETIF_STATUS_CALLBACK */
-
-#if LWIP_NETIF_LINK_CALLBACK
-#define NETIF_LINK_CALLBACK(n) do{ if (n->link_callback) { (n->link_callback)(n); }}while(0)
-#else
-#define NETIF_LINK_CALLBACK(n)
-#endif /* LWIP_NETIF_LINK_CALLBACK */
-
-struct netif *netif_list;
-struct netif *netif_default;
-
-static u8_t netif_num;
-
-#define NETIF_REPORT_TYPE_IPV4  0x01
-#define NETIF_REPORT_TYPE_IPV6  0x02
-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_HAVE_LOOPIF
-#if LWIP_IPV4
-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);
-#endif
-
-
-static struct netif loop_netif;
-
-/**
- * Initialize a lwip network interface structure for a loopback interface
- *
- * @param netif the lwip network interface structure for this loopif
- * @return ERR_OK if the loopif is initialized
- *         ERR_MEM if private data couldn't be allocated
- */
-static err_t
-netif_loopif_init(struct netif *netif)
-{
-  /* initialize the snmp variables and counters inside the struct netif
-   * ifSpeed: no assumption can be made!
-   */
-  MIB2_INIT_NETIF(netif, snmp_ifType_softwareLoopback, 0);
-
-  netif->name[0] = 'l';
-  netif->name[1] = 'o';
-#if LWIP_IPV4
-  netif->output = netif_loop_output_ipv4;
-#endif
-#if LWIP_IPV6
-  netif->output_ip6 = netif_loop_output_ipv6;
-#endif
-#if LWIP_LOOPIF_MULTICAST
-  netif->flags |= NETIF_FLAG_IGMP;
-#endif
-  return ERR_OK;
-}
-#endif /* LWIP_HAVE_LOOPIF */
-
-void
-netif_init(void)
-{
-#if LWIP_HAVE_LOOPIF
-#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);
-#else /* LWIP_IPV4 */
-#define LOOPIF_ADDRINIT
-#endif /* LWIP_IPV4 */
-
-#if NO_SYS
-  netif_add(&loop_netif, LOOPIF_ADDRINIT NULL, netif_loopif_init, ip_input);
-#else  /* NO_SYS */
-  netif_add(&loop_netif, LOOPIF_ADDRINIT NULL, netif_loopif_init, tcpip_input);
-#endif /* NO_SYS */
-
-#if LWIP_IPV6
-  IP_ADDR6(loop_netif.ip6_addr, 0, 0, 0, PP_HTONL(0x00000001UL));
-  loop_netif.ip6_addr_state[0] = IP6_ADDR_VALID;
-#endif /* LWIP_IPV6 */
-
-  netif_set_link_up(&loop_netif);
-  netif_set_up(&loop_netif);
-
-#endif /* LWIP_HAVE_LOOPIF */
-}
-
-/**
- * Add a network interface to the list of lwIP netifs.
- *
- * @param netif a pre-allocated netif structure
- * @param ipaddr IP address for the new netif
- * @param netmask network mask for the new netif
- * @param gw default gateway IP address for the new netif
- * @param state opaque data passed to the new netif
- * @param init callback function that initializes the interface
- * @param input callback function that is called to pass
- * ingress packets up in the protocol layer stack.
- *
- * @return netif, or NULL if failed.
- */
-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_IPV6
-  u32_t i;
-#endif
-
-  LWIP_ASSERT("No init function given", init != NULL);
-
-  /* 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);
-#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_set_state(netif, i, IP6_ADDR_INVALID);
-  }
-  netif->output_ip6 = netif_null_output_ip6;
-#endif /* LWIP_IPV6 */
-
-
-  NETIF_SET_CHECKSUM_CTRL(netif, NETIF_CHECKSUM_ENABLE_ALL);
-  netif->flags = 0;
-  
-#if LWIP_DHCP
-  /* netif not under DHCP control by default */
-  netif->dhcp = NULL;
-
-#if ESP_DHCP
-  netif->dhcps_pcb = NULL;
-#endif
-
-#endif /* LWIP_DHCP */
-
-
-#if LWIP_AUTOIP
-  /* netif not under AutoIP control by default */
-  netif->autoip = NULL;
-#endif /* LWIP_AUTOIP */
-#if LWIP_IPV6_AUTOCONFIG
-
-#if ESP_IPV6_AUTOCONFIG
-  netif->ip6_autoconfig_enabled = 1;
-#else
-  /* IPv6 address autoconfiguration not enabled by default */
-  netif->ip6_autoconfig_enabled = 0;
-#endif
-
-#endif /* LWIP_IPV6_AUTOCONFIG */
-
-
-#if LWIP_IPV6_SEND_ROUTER_SOLICIT
-  netif->rs_count = LWIP_ND6_MAX_MULTICAST_SOLICIT;
-#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */
-#if LWIP_IPV6_DHCP6
-  /* netif not under DHCPv6 control by default */
-  netif->dhcp6 = NULL;
-#endif /* LWIP_IPV6_DHCP6 */
-#if LWIP_NETIF_STATUS_CALLBACK
-  netif->status_callback = NULL;
-#endif /* LWIP_NETIF_STATUS_CALLBACK */
-#if LWIP_NETIF_LINK_CALLBACK
-  netif->link_callback = NULL;
-#endif /* LWIP_NETIF_LINK_CALLBACK */
-#if LWIP_IGMP
-  netif->igmp_mac_filter = NULL;
-#endif /* LWIP_IGMP */
-#if LWIP_IPV6 && LWIP_IPV6_MLD
-  netif->mld_mac_filter = NULL;
-#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */
-#if ENABLE_LOOPBACK
-  netif->loop_first = NULL;
-  netif->loop_last = NULL;
-#endif /* ENABLE_LOOPBACK */
-
-
-  /* remember netif specific state information data */
-  netif->state = state;
-  netif->num = netif_num++;
-  netif->input = input;
-  NETIF_SET_HWADDRHINT(netif, NULL);
-#if ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS
-  netif->loop_cnt_current = 0;
-#endif /* ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS */
-
-#if LWIP_IPV4
-  netif_set_addr(netif, ipaddr, netmask, gw);
-#endif /* LWIP_IPV4 */
-
-
-  /* call user specified initialization function for netif */
-  if (init(netif) != ERR_OK) {
-    return NULL;
-  }
-
-  /* add this netif to the list */
-  netif->next = netif_list;
-  netif_list = netif;
-  mib2_netif_added(netif);
-
-#if LWIP_IGMP
-  /* start IGMP processing */
-  if (netif->flags & NETIF_FLAG_IGMP) {
-    igmp_start(netif);
-  }
-#endif /* LWIP_IGMP */
-
-  LWIP_DEBUGF(NETIF_DEBUG, ("netif: added interface %c%c IP",
-    netif->name[0], netif->name[1]));
-#if LWIP_IPV4
-  LWIP_DEBUGF(NETIF_DEBUG, (" addr "));
-  ip4_addr_debug_print(NETIF_DEBUG, ipaddr);
-  LWIP_DEBUGF(NETIF_DEBUG, (" netmask "));
-  ip4_addr_debug_print(NETIF_DEBUG, netmask);
-  LWIP_DEBUGF(NETIF_DEBUG, (" gw "));
-  ip4_addr_debug_print(NETIF_DEBUG, gw);
-#endif /* LWIP_IPV4 */
-  LWIP_DEBUGF(NETIF_DEBUG, ("\n"));
-
-  return netif;
-}
-
-#if LWIP_IPV4
-/**
- * Change IP address configuration for a network interface (including netmask
- * and default gateway).
- *
- * @param netif the network interface to change
- * @param ipaddr the new IP address
- * @param netmask the new netmask
- * @param gw the new default gateway
- */
-void
-netif_set_addr(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask,
-    const ip4_addr_t *gw)
-{
-  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);
-}
-
-#endif /* LWIP_IPV4*/
-
-/**
- * Remove a network interface from the list of lwIP netifs.
- *
- * @param netif the network interface to remove
- */
-void
-netif_remove(struct netif *netif)
-{
-  if (netif == NULL) {
-    return;
-  }
-
-#if LWIP_IPV4
-  if (!ip4_addr_isany_val(*netif_ip4_addr(netif))) {
-#if LWIP_TCP
-    tcp_netif_ipv4_addr_changed(netif_ip4_addr(netif), NULL);
-#endif /* LWIP_TCP */
-    /* cannot do this for UDP, as there is no 'err' callback in udp pcbs */
-  }
-
-#if LWIP_IGMP
-  /* stop IGMP processing */
-  if (netif->flags & NETIF_FLAG_IGMP) {
-    igmp_stop(netif);
-  }
-#endif /* LWIP_IGMP */
-#endif /* LWIP_IPV4*/
-
-#if LWIP_IPV6 && LWIP_IPV6_MLD
-  /* stop MLD processing */
-  mld6_stop(netif);
-#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */
-  if (netif_is_up(netif)) {
-    /* set netif down before removing (call callback function) */
-    netif_set_down(netif);
-  }
-
-#if LWIP_DHCP
-  /* netif not under DHCP control by default */
-  if (netif->dhcp) {
-      free(netif->dhcp);
-      netif->dhcp = NULL;
-  }
-#endif /* LWIP_DHCP */
-
-  mib2_remove_ip4(netif);
-
-  /* this netif is default? */
-  if (netif_default == netif) {
-    /* reset default netif */
-    netif_set_default(NULL);
-  }
-  /*  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) {
-      if (tmp_netif->next == netif) {
-        tmp_netif->next = netif->next;
-        break;
-      }
-    }
-    if (tmp_netif == NULL) {
-      return; /* netif is not on the list */
-    }
-  }
-  mib2_netif_removed(netif);
-#if LWIP_NETIF_REMOVE_CALLBACK
-  if (netif->remove_callback) {
-    netif->remove_callback(netif);
-  }
-#endif /* LWIP_NETIF_REMOVE_CALLBACK */
-  LWIP_DEBUGF( NETIF_DEBUG, ("netif_remove: removed netif\n") );
-}
-
-/**
- * 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 = 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
-/**
- * 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)
-{
-  ip4_addr_t new_addr = (ipaddr ? *ipaddr : *IP4_ADDR_ANY);
-#if ESP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES
-  ip4_addr_t *last_addr = ip_2_ip4(&netif->last_ip_addr);
-#else
-  ip4_addr_t *last_addr = ip_2_ip4(&(netif->ip_addr));
-#endif
-
-  /* address is actually being changed? */
-  if (ip4_addr_cmp(&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_ipv4_addr_changed(last_addr, ipaddr);
-#endif /* LWIP_TCP */
-#if LWIP_UDP
-    udp_netif_ipv4_addr_changed(last_addr, ipaddr);
-#endif /* LWIP_UDP */
-
-    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))));
-
-  if (ipaddr && !ip4_addr_isany(ipaddr)) {
-    ip4_addr_set(ip_2_ip4(&netif->last_ip_addr), ipaddr);
-  }
-}
-
-/**
- * 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))));
-}
-
-/**
- * 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 */
-
-/**
- * Set a network interface as the default network interface
- * (used to output all packets for which no specific route is found)
- *
- * @param netif the default network interface
- */
-void
-netif_set_default(struct netif *netif)
-{
-  if (netif == NULL) {
-    /* remove default route */
-    mib2_remove_route_ip4(1, netif);
-  } else {
-    /* install default route */
-    mib2_add_route_ip4(1, netif);
-  }
-  netif_default = netif;
-  LWIP_DEBUGF(NETIF_DEBUG, ("netif: setting default interface %c%c\n",
-           netif ? netif->name[0] : '\'', netif ? netif->name[1] : '\''));
-}
-
-/**
- * Bring an interface up, available for processing
- * traffic.
- */
-void
-netif_set_up(struct netif *netif)
-{
-  if (!(netif->flags & NETIF_FLAG_UP)) {
-    netif->flags |= 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);
-    }
-  }
-}
-
-/** 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)
-{
-#if LWIP_IPV4
-  if ((report_type & NETIF_REPORT_TYPE_IPV4) &&
-      !ip4_addr_isany_val(*netif_ip4_addr(netif))) {
-#if LWIP_ARP
-    /* For Ethernet network interfaces, we would like to send a "gratuitous ARP" */
-    if (netif->flags & (NETIF_FLAG_ETHARP)) {
-      etharp_gratuitous(netif);
-    }
-#endif /* LWIP_ARP */
-
-#if LWIP_IGMP
-    /* resend IGMP memberships */
-    if (netif->flags & NETIF_FLAG_IGMP) {
-      igmp_report_groups(netif);
-    }
-#endif /* LWIP_IGMP */
-  }
-#endif /* LWIP_IPV4 */
-
-#if LWIP_IPV6
-  if (report_type & NETIF_REPORT_TYPE_IPV6) {
-#if LWIP_IPV6_MLD
-    /* 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 */
-}
-
-/**
- * Bring an interface down, disabling any traffic processing.
- */
-void
-netif_set_down(struct netif *netif)
-{
-  if (netif->flags & NETIF_FLAG_UP) {
-    netif->flags &= ~NETIF_FLAG_UP;
-    MIB2_COPY_SYSUPTIME_TO(&netif->ts);
-
-#if LWIP_IPV4 && LWIP_ARP
-    if (netif->flags & NETIF_FLAG_ETHARP) {
-      etharp_cleanup_netif(netif);
-    }
-#endif /* LWIP_IPV4 && LWIP_ARP */
-    NETIF_STATUS_CALLBACK(netif);
-  }
-}
-
-#if LWIP_NETIF_STATUS_CALLBACK
-/**
- * Set callback to be called when interface is brought up/down or address is changed while up
- */
-void
-netif_set_status_callback(struct netif *netif, netif_status_callback_fn status_callback)
-{
-  if (netif) {
-    netif->status_callback = status_callback;
-  }
-}
-#endif /* LWIP_NETIF_STATUS_CALLBACK */
-
-#if LWIP_NETIF_REMOVE_CALLBACK
-/**
- * Set callback to be called when the interface has been removed
- */
-void
-netif_set_remove_callback(struct netif *netif, netif_status_callback_fn remove_callback)
-{
-  if (netif) {
-    netif->remove_callback = remove_callback;
-  }
-}
-#endif /* LWIP_NETIF_REMOVE_CALLBACK */
-
-/**
- * Called by a driver when its link goes up
- */
-void
-netif_set_link_up(struct netif *netif)
-{
-  if (!(netif->flags & NETIF_FLAG_LINK_UP)) {
-    netif->flags |= NETIF_FLAG_LINK_UP;
-
-#if LWIP_DHCP
-    if (netif->dhcp) {
-      dhcp_network_changed(netif);
-    }
-#endif /* LWIP_DHCP */
-
-#if LWIP_AUTOIP
-    if (netif->autoip) {
-      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_LINK_CALLBACK(netif);
-  }
-}
-
-/**
- * Called by a driver when its link goes down
- */
-void
-netif_set_link_down(struct netif *netif )
-{
-  if (netif->flags & NETIF_FLAG_LINK_UP) {
-    netif->flags &= ~NETIF_FLAG_LINK_UP;
-    NETIF_LINK_CALLBACK(netif);
-  }
-}
-
-#if LWIP_NETIF_LINK_CALLBACK
-/**
- * Set callback to be called when link is brought up/down
- */
-void
-netif_set_link_callback(struct netif *netif, netif_status_callback_fn link_callback)
-{
-  if (netif) {
-    netif->link_callback = link_callback;
-  }
-}
-#endif /* LWIP_NETIF_LINK_CALLBACK */
-
-#if ENABLE_LOOPBACK
-/**
- * Send an IP packet to be received on the same netif (loopif-like).
- * The pbuf is simply copied and handed back to netif->input.
- * In multithreaded mode, this is done directly since netif->input must put
- * the packet on a queue.
- * In callback mode, the packet is put on an internal queue and is fed to
- * netif->input by netif_poll().
- *
- * @param netif the lwip network interface structure
- * @param p the (IP) packet to 'send'
- * @return ERR_OK if the packet has been sent
- *         ERR_MEM if the pbuf used to copy the packet couldn't be allocated
- */
-err_t
-netif_loop_output(struct netif *netif, struct pbuf *p)
-{
-  struct pbuf *r;
-  err_t err;
-  struct pbuf *last;
-#if LWIP_LOOPBACK_MAX_PBUFS
-  u8_t clen = 0;
-#endif /* LWIP_LOOPBACK_MAX_PBUFS */
-  /* If we have a loopif, SNMP counters are adjusted for it,
-   * if not they are adjusted for 'netif'. */
-#if MIB2_STATS
-#if LWIP_HAVE_LOOPIF
-  struct netif *stats_if = &loop_netif;
-#else /* LWIP_HAVE_LOOPIF */
-  struct netif *stats_if = netif;
-#endif /* LWIP_HAVE_LOOPIF */
-#endif /* MIB2_STATS */
-  SYS_ARCH_DECL_PROTECT(lev);
-
-  /* Allocate a new pbuf */
-  r = pbuf_alloc(PBUF_LINK, p->tot_len, PBUF_RAM);
-  if (r == NULL) {
-    LINK_STATS_INC(link.memerr);
-    LINK_STATS_INC(link.drop);
-    MIB2_STATS_NETIF_INC(stats_if, ifoutdiscards);
-    return ERR_MEM;
-  }
-#if LWIP_LOOPBACK_MAX_PBUFS
-  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)) {
-    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;
-#endif /* LWIP_LOOPBACK_MAX_PBUFS */
-
-  /* Copy the whole pbuf queue p into the single pbuf r */
-  if ((err = pbuf_copy(r, p)) != ERR_OK) {
-    pbuf_free(r);
-    LINK_STATS_INC(link.memerr);
-    LINK_STATS_INC(link.drop);
-    MIB2_STATS_NETIF_INC(stats_if, ifoutdiscards);
-    return err;
-  }
-
-  /* Put the packet on a linked list which gets emptied through calling
-     netif_poll(). */
-
-  /* let last point to the last pbuf in chain r */
-  for (last = r; last->next != NULL; last = last->next);
-
-  SYS_ARCH_PROTECT(lev);
-  if (netif->loop_first != NULL) {
-    LWIP_ASSERT("if first != NULL, last must also be != NULL", netif->loop_last != NULL);
-    netif->loop_last->next = r;
-    netif->loop_last = last;
-  } else {
-    netif->loop_first = r;
-    netif->loop_last = last;
-  }
-  SYS_ARCH_UNPROTECT(lev);
-
-  LINK_STATS_INC(link.xmit);
-  MIB2_STATS_NETIF_ADD(stats_if, ifoutoctets, p->tot_len);
-  MIB2_STATS_NETIF_INC(stats_if, ifoutucastpkts);
-
-#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);
-#endif /* LWIP_NETIF_LOOPBACK_MULTITHREADING */
-
-  return ERR_OK;
-}
-
-#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)
-{
-  LWIP_UNUSED_ARG(addr);
-  return netif_loop_output(netif, p);
-}
-#endif /* LWIP_IPV4 */
-
-#if LWIP_IPV6
-static err_t
-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);
-}
-#endif /* LWIP_IPV6 */
-#endif /* LWIP_HAVE_LOOPIF */
-
-
-/**
- * Call netif_poll() in the main loop of your application. This is to prevent
- * reentering non-reentrant functions like tcp_input(). Packets passed to
- * netif_loop_output() are put on a list that is passed to netif->input() by
- * netif_poll().
- */
-void
-netif_poll(struct netif *netif)
-{
-  struct pbuf *in;
-  /* If we have a loopif, SNMP counters are adjusted for it,
-   * if not they are adjusted for 'netif'. */
-#if MIB2_STATS
-#if LWIP_HAVE_LOOPIF
-  struct netif *stats_if = &loop_netif;
-#else /* LWIP_HAVE_LOOPIF */
-  struct netif *stats_if = netif;
-#endif /* LWIP_HAVE_LOOPIF */
-#endif /* MIB2_STATS */
-  SYS_ARCH_DECL_PROTECT(lev);
-
-  do {
-    /* Get a packet from the list. With SYS_LIGHTWEIGHT_PROT=1, this is protected */
-    SYS_ARCH_PROTECT(lev);
-    in = netif->loop_first;
-    if (in != NULL) {
-      struct pbuf *in_end = in;
-#if LWIP_LOOPBACK_MAX_PBUFS
-      u8_t clen = 1;
-#endif /* LWIP_LOOPBACK_MAX_PBUFS */
-      while (in_end->len != in_end->tot_len) {
-        LWIP_ASSERT("bogus pbuf: len != tot_len but next == NULL!", in_end->next != NULL);
-        in_end = in_end->next;
-#if LWIP_LOOPBACK_MAX_PBUFS
-        clen++;
-#endif /* LWIP_LOOPBACK_MAX_PBUFS */
-      }
-#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;
-#endif /* LWIP_LOOPBACK_MAX_PBUFS */
-
-      /* 'in_end' now points to the last pbuf from 'in' */
-      if (in_end == netif->loop_last) {
-        /* this was the last pbuf in the list */
-        netif->loop_first = netif->loop_last = NULL;
-      } else {
-        /* pop the pbuf off the list */
-        netif->loop_first = in_end->next;
-        LWIP_ASSERT("should not be null since first != last!", netif->loop_first != NULL);
-      }
-      /* De-queue the pbuf from its successors on the 'loop_' list. */
-      in_end->next = NULL;
-    }
-    SYS_ARCH_UNPROTECT(lev);
-
-    if (in != NULL) {
-      LINK_STATS_INC(link.recv);
-      MIB2_STATS_NETIF_ADD(stats_if, ifinoctets, in->tot_len);
-      MIB2_STATS_NETIF_INC(stats_if, ifinucastpkts);
-      /* loopback packets are always IP packets! */
-      if (ip_input(in, netif) != ERR_OK) {
-        pbuf_free(in);
-      }
-      /* Don't reference the packet any more! */
-      in = NULL;
-    }
-  /* go on while there is a packet on the list */
-  } while (netif->loop_first != NULL);
-}
-
-#if !LWIP_NETIF_LOOPBACK_MULTITHREADING
-/**
- * Calls netif_poll() for every netif on the netif_list.
- */
-void
-netif_poll_all(void)
-{
-  struct netif *netif = netif_list;
-  /* loop through netifs */
-  while (netif != NULL) {
-    netif_poll(netif);
-    /* proceed to next network interface */
-    netif = netif->next;
-  }
-}
-#endif /* !LWIP_NETIF_LOOPBACK_MULTITHREADING */
-#endif /* ENABLE_LOOPBACK */
-
-#if LWIP_IPV6
-/** Checks if a specific address is assigned to the netif and returns its
- * index.
- *
- * @param netif the netif to check
- * @param ip6addr the IPv6 address to find
- * @return >= 0: address found, this is its index
- *         -1: address not found on this netif
- */
-s8_t
-netif_get_ip6_addr_match(struct netif *netif, const ip6_addr_t *ip6addr)
-{
-  s8_t i;
-  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)) {
-      return i;
-    }
-  }
-  return -1;
-}
-
-/** Create a link-local IPv6 address on a netif (stored in slot 0)
- *
- * @param netif the netif to create the address on
- * @param from_mac_48bit if != 0, assume hwadr is a 48-bit MAC address (std conversion)
- *                       if == 0, use hwaddr directly as interface ID
- */
-void
-netif_create_ip6_linklocal_address(struct netif *netif, u8_t from_mac_48bit)
-{
-  u8_t i, addr_index;
-
-  /* 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;
-
-  /* Generate interface ID. */
-  if (from_mac_48bit) {
-    /* Assume hwaddr is a 48-bit IEEE 802 MAC. Convert to EUI-64 address. Complement Group bit. */
-    ip_2_ip6(&netif->ip6_addr[0])->addr[2] = htonl((((u32_t)(netif->hwaddr[0] ^ 0x02)) << 24) |
-        ((u32_t)(netif->hwaddr[1]) << 16) |
-        ((u32_t)(netif->hwaddr[2]) << 8) |
-        (0xff));
-    ip_2_ip6(&netif->ip6_addr[0])->addr[3] = htonl((0xfeul << 24) |
-        ((u32_t)(netif->hwaddr[3]) << 16) |
-        ((u32_t)(netif->hwaddr[4]) << 8) |
-        (netif->hwaddr[5]));
-  } else {
-    /* Use hwaddr directly as interface ID. */
-    ip_2_ip6(&netif->ip6_addr[0])->addr[2] = 0;
-    ip_2_ip6(&netif->ip6_addr[0])->addr[3] = 0;
-
-    addr_index = 3;
-    for (i = 0; (i < 8) && (i < netif->hwaddr_len); i++) {
-      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));
-    }
-  }
-  
-
-  /* Set address state. */
-#if LWIP_IPV6_DUP_DETECT_ATTEMPTS
-  /* Will perform duplicate address detection (DAD). */
-  netif->ip6_addr_state[0] = IP6_ADDR_TENTATIVE;
-#else
-  /* Consider address valid. */
-  netif->ip6_addr_state[0] = IP6_ADDR_PREFERRED;
-#endif /* LWIP_IPV6_AUTOCONFIG */
-}
-
-/** 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).
- *
- * @param netif netif to add the address on
- * @param ip6addr address to add
- * @param chosen_idx if != NULL, the chosen IPv6 address index will be stored here
- */
-err_t
-netif_add_ip6_address(struct netif *netif, const ip6_addr_t *ip6addr, s8_t *chosen_idx)
-{
-  s8_t i;
-
-  i = netif_get_ip6_addr_match(netif, ip6addr);
-  if (i >= 0) {
-    /* Address already added */
-    if (chosen_idx != NULL) {
-      *chosen_idx = i;
-    }
-    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++) {
-    if (!ip6_addr_isvalid(netif->ip6_addr_state[i])) {
-      ip_addr_copy_from_ip6(netif->ip6_addr[i], *ip6addr);
-      netif_ip6_addr_set_state(netif, i, IP6_ADDR_TENTATIVE);
-      if (chosen_idx != NULL) {
-        *chosen_idx = i;
-      }
-      return ERR_OK;
-    }
-  }
-
-  if (chosen_idx != NULL) {
-    *chosen_idx = -1;
-  }
-  return ERR_VAL;
-}
-
-/** Dummy IPv6 output function for netifs not supporting IPv6
- */
-static err_t
-netif_null_output_ip6(struct netif *netif, struct pbuf *p, const ip6_addr_t *ipaddr)
-{
-  LWIP_UNUSED_ARG(netif);
-  LWIP_UNUSED_ARG(p);
-  LWIP_UNUSED_ARG(ipaddr);
-
-  return ERR_IF;
-}
-#endif /* LWIP_IPV6 */
diff --git a/components/lwip/core/pbuf.c b/components/lwip/core/pbuf.c
deleted file mode 100644 (file)
index a80a002..0000000
+++ /dev/null
@@ -1,1351 +0,0 @@
-/**
- * @file
- * Packet buffer management
- *
- * 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.
- *
- * A packet may span over multiple pbufs, chained as a singly linked
- * list. This is called a "pbuf chain".
- *
- * Multiple packets may be queued, also using this singly linked list.
- * This is called a "packet queue".
- *
- * 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.
- *
- * The differences between a pbuf chain and a packet queue are very
- * precise but subtle.
- *
- * The last pbuf of a packet has a ->tot_len field that equals the
- * ->len field. It can be found by traversing the list. If the last
- * pbuf of a packet has a ->next field other than NULL, more packets
- * are on the queue.
- *
- * Therefore, looping through a pbuf of a single packet, has an
- * loop end condition (tot_len == p->len), NOT (next == NULL).
- */
-
-/*
- * 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>
- *
- */
-
-#include "lwip/opt.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"
-#if LWIP_TCP && (TCP_QUEUE_OOSEQ || ESP_LWIP)
-#include "lwip/priv/tcp_priv.h"
-#endif
-#if LWIP_CHECKSUM_ON_COPY
-#include "lwip/inet_chksum.h"
-#endif
-
-#include <string.h>
-
-#define SIZEOF_STRUCT_PBUF        LWIP_MEM_ALIGN_SIZE(sizeof(struct pbuf))
-/* Since the pool is created in memp, PBUF_POOL_BUFSIZE will be automatically
-   aligned there. Therefore, PBUF_POOL_BUFSIZE_ALIGNED can be used here. */
-#define PBUF_POOL_BUFSIZE_ALIGNED LWIP_MEM_ALIGN_SIZE(PBUF_POOL_BUFSIZE)
-
-#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 */
-
-#if !NO_SYS
-#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) { \
-      SYS_ARCH_PROTECT(old_level); \
-      pbuf_free_ooseq_pending = 0; \
-      SYS_ARCH_UNPROTECT(old_level); \
-  } } while(0)
-#endif /* PBUF_POOL_FREE_OOSEQ_QUEUE_CALL */
-#endif /* !NO_SYS */
-
-volatile u8_t pbuf_free_ooseq_pending;
-#define PBUF_POOL_IS_EMPTY() pbuf_pool_is_empty()
-
-/**
- * Attempt to reclaim some memory from queued out-of-sequence TCP segments
- * if we run out of pool pbufs. It's better to give priority to new packets
- * if we're running out.
- *
- * This must be done in the correct thread context therefore this function
- * can only be used with NO_SYS=0 and through tcpip_callback.
- */
-#if !NO_SYS
-static
-#endif /* !NO_SYS */
-void
-pbuf_free_ooseq(void)
-{
-  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) {
-      /** 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;
-      return;
-    }
-  }
-}
-
-#if !NO_SYS
-/**
- * Just a callback function for tcpip_callback() that calls pbuf_free_ooseq().
- */
-static void
-pbuf_free_ooseq_callback(void *arg)
-{
-  LWIP_UNUSED_ARG(arg);
-  pbuf_free_ooseq();
-}
-#endif /* !NO_SYS */
-
-/** Queue a call to pbuf_free_ooseq if not already queued. */
-static void
-pbuf_pool_is_empty(void)
-{
-#ifndef PBUF_POOL_FREE_OOSEQ_QUEUE_CALL
-  SYS_ARCH_SET(pbuf_free_ooseq_pending, 1);
-#else /* PBUF_POOL_FREE_OOSEQ_QUEUE_CALL */
-  u8_t queued;
-  SYS_ARCH_DECL_PROTECT(old_level);
-  SYS_ARCH_PROTECT(old_level);
-  queued = pbuf_free_ooseq_pending;
-  pbuf_free_ooseq_pending = 1;
-  SYS_ARCH_UNPROTECT(old_level);
-
-  if (!queued) {
-    /* queue a call to pbuf_free_ooseq if not already queued */
-    PBUF_POOL_FREE_OOSEQ_QUEUE_CALL();
-  }
-#endif /* PBUF_POOL_FREE_OOSEQ_QUEUE_CALL */
-}
-#endif /* !LWIP_TCP || !TCP_QUEUE_OOSEQ || !PBUF_POOL_FREE_OOSEQ */
-
-/**
- * Allocates a pbuf of the given type (possibly a chain for PBUF_POOL type).
- *
- * 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 layer flag to define 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:
- *
- * - PBUF_RAM: buffer memory for pbuf is allocated as one large
- *             chunk. This includes protocol headers as well.
- * - 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.
- * - 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.
- * - PBUF_POOL: the pbuf is allocated as a pbuf chain, with pbufs from
- *              the pbuf pool that is allocated during pbuf_init().
- *
- * @return the allocated pbuf. If multiple pbufs where allocated, this
- * is the first pbuf of a pbuf chain.
- */
-struct pbuf *
-pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type)
-{
-  struct pbuf *p, *q, *r;
-  u16_t offset = 0;
-  
-  s32_t rem_len; /* remaining length */
-  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:
-    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;
-    }
-    p->type = type;
-    p->next = NULL;
-
-    /* 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:
-    /* If pbuf is to be allocated in RAM, allocate memory for it. */
-    p = (struct pbuf*)mem_malloc(LWIP_MEM_ALIGN_SIZE(SIZEOF_STRUCT_PBUF + offset) + LWIP_MEM_ALIGN_SIZE(length));
-    if (p == NULL) {
-      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;
-
-#if ESP_LWIP
-  p->l2_owner = NULL;
-  p->l2_buf = NULL;
-#endif
-
-  LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=%"U16_F") == %p\n", length, (void *)p));
-  return p;
-}
-
-#if LWIP_SUPPORT_CUSTOM_PBUF
-/** Initialize a custom pbuf (already allocated).
- *
- * @param layer flag to define 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)
- * @param p pointer to the custom pbuf to initialize (already allocated)
- * @param payload_mem 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!!
- * @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*
-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;
-  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);
-  } else {
-    p->pbuf.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;
-  return &p->pbuf;
-}
-#endif /* LWIP_SUPPORT_CUSTOM_PBUF */
-
-/**
- * Shrink a pbuf chain to a desired length.
- *
- * @param p pbuf to shrink.
- * @param new_len desired new length of pbuf chain
- *
- * 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.
- *
- * @note If the pbuf is ROM/REF, only the ->tot_len and ->len fields are adjusted.
- * @note May not be called on a packet queue.
- *
- * @note Despite its name, pbuf_realloc cannot grow the size of a pbuf (chain).
- */
-void
-pbuf_realloc(struct pbuf *p, u16_t new_len)
-{
-  struct pbuf *q;
-  u16_t rem_len; /* remaining length */
-  s32_t grow;
-
-  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) {
-    /* enlarging not yet supported */
-    return;
-  }
-
-  /* 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;
-
-  /* first, step over any pbufs that should remain in the chain */
-  rem_len = new_len;
-  q = p;
-  /* should this pbuf be kept? */
-  while (rem_len > q->len) {
-    /* decrease remaining length by pbuf length */
-    rem_len -= q->len;
-    /* decrease total length indicator */
-    LWIP_ASSERT("grow < max_u16_t", grow < 0xffff);
-    q->tot_len += (u16_t)grow;
-    /* proceed to next pbuf in chain */
-    q = q->next;
-    LWIP_ASSERT("pbuf_realloc: q != NULL", q != NULL);
-  }
-  /* we have now reached the new last pbuf (in q) */
-  /* rem_len == desired length for pbuf q */
-
-  /* shrink allocated memory for PBUF_RAM */
-  /* (other types merely adjust their length fields */
-  if ((q->type == PBUF_RAM) && (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);
-    LWIP_ASSERT("mem_trim returned q == NULL", q != NULL);
-  }
-  /* adjust length fields for new last pbuf */
-  q->len = rem_len;
-  q->tot_len = q->len;
-
-  /* any remaining pbufs in chain? */
-  if (q->next != NULL) {
-    /* free remaining pbufs in chain */
-    pbuf_free(q->next);
-  }
-  /* q is last packet in chain */
-  q->next = NULL;
-
-}
-
-/**
- * Adjusts the payload pointer to hide or reveal headers in the payload.
- * @see pbuf_header.
- *
- * @param p pbuf to change the header size.
- * @param header_size_increment Number of bytes to increment header size.
- * @param force Allow 'header_size_increment > 0' for PBUF_REF/PBUF_ROM types
- *
- * @return non-zero on failure, zero on success.
- *
- */
-static u8_t ESP_IRAM_ATTR
-pbuf_header_impl(struct pbuf *p, s16_t header_size_increment, u8_t force)
-{
-  u16_t type;
-  void *payload;
-  u16_t increment_magnitude;
-
-  LWIP_ASSERT("p != NULL", p != NULL);
-  if ((header_size_increment == 0) || (p == NULL)) {
-    return 0;
-  }
-
-  if (header_size_increment < 0) {
-    increment_magnitude = -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 = 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
-  }
-
-  type = p->type;
-  /* remember current payload pointer */
-  payload = p->payload;
-
-  /* pbuf types containing payloads? */
-  if (type == PBUF_RAM || type == PBUF_POOL) {
-    /* set new payload pointer */
-    p->payload = (u8_t *)p->payload - header_size_increment;
-    /* boundary check fails? */
-    if ((u8_t *)p->payload < (u8_t *)p + SIZEOF_STRUCT_PBUF) {
-      LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
-        ("pbuf_header: failed as %p < %p (not enough space for new header size)\n",
-        (void *)p->payload, (void *)(p + 1)));
-      /* restore old payload pointer */
-      p->payload = payload;
-      /* bail out unsuccessfully */
-      return 1;
-    }
-  /* pbuf types referring to external payloads? */
-  } else if (type == PBUF_REF || type == PBUF_ROM) {
-    /* 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;
-    } 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_header: old %p new %p (%"S16_F")\n",
-    (void *)payload, (void *)p->payload, header_size_increment));
-
-  return 0;
-}
-
-/**
- * Adjusts the payload pointer to hide or reveal headers in the payload.
- *
- * Adjusts the ->payload pointer so that space for a header
- * (dis)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.
- * (Using a negative value decreases the header size.)
- * If hdr_size_inc 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 ESP_IRAM_ATTR
-pbuf_header(struct pbuf *p, s16_t header_size_increment)
-{
-   return pbuf_header_impl(p, header_size_increment, 0);
-}
-
-/**
- * Same as pbuf_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_header_force(struct pbuf *p, s16_t header_size_increment)
-{
-   return pbuf_header_impl(p, header_size_increment, 1);
-}
-
-/**
- * Dereference a pbuf chain or queue and deallocate any no-longer-used
- * pbufs at the head of this chain or queue.
- *
- * Decrements the pbuf reference count. If it reaches zero, the pbuf is
- * deallocated.
- *
- * 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.
- *
- * @param p The pbuf (chain) to be dereferenced.
- *
- * @return the number of pbufs that were de-allocated
- * from the head of the chain.
- *
- * @note MUST NOT be called on a packet queue (Not verified to work yet).
- * @note the reference counter of a pbuf equals the number of pointers
- * that refer to the pbuf (or into the pbuf).
- *
- * @internal examples:
- *
- * Assuming existing chains a->b->c with the following reference
- * counts, calling pbuf_free(a) results in:
- *
- * 1->2->3 becomes ...1->3
- * 3->3->3 becomes 2->3->3
- * 1->1->2 becomes ......1
- * 2->1->1 becomes 1->1->1
- * 1->1->1 becomes .......
- *
- */
-u8_t
-pbuf_free(struct pbuf *p)
-{
-  u16_t type;
-  struct pbuf *q;
-  u8_t count;
-
-  if (p == NULL) {
-    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"));
-    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;
-    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
-     * further protection. */
-    SYS_ARCH_PROTECT(old_level);
-    /* all pbufs in a chain are referenced at least once */
-    LWIP_ASSERT("pbuf_free: p->ref > 0", p->ref > 0);
-    /* decrease reference count (number of pointers to pbuf) */
-    ref = --(p->ref);
-    SYS_ARCH_UNPROTECT(old_level);
-    /* this pbuf is no longer referenced to? */
-    if (ref == 0) {
-      /* 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;
-#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;
-        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) {
-          memp_free(MEMP_PBUF_POOL, p);
-        /* is this a ROM or RAM referencing pbuf? */
-        } else if (type == PBUF_ROM || type == PBUF_REF) {
-
-#if ESP_LWIP
-            if (p->l2_owner != NULL
-                && p->l2_buf != NULL
-                && p->l2_owner->l2_buffer_free_notify != NULL) {
-                p->l2_owner->l2_buffer_free_notify(p->l2_buf);
-            }
-#endif
-            memp_free(MEMP_PBUF, p);
-            /* type == PBUF_RAM */
-        } else {
-            mem_free(p);
-        }
-      }
-      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) */
-    } else {
-      LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free: %p has ref %"U16_F", ending here.\n", (void *)p, ref));
-      /* stop walking through the chain */
-      p = NULL;
-    }
-  }
-  PERF_STOP("pbuf_free");
-  /* return number of de-allocated pbufs */
-  return count;
-}
-
-/**
- * Count number of pbufs in a chain
- *
- * @param p first pbuf of chain
- * @return the number of pbufs in a chain
- */
-
-u8_t
-pbuf_clen(struct pbuf *p)
-{
-  u8_t len;
-
-  len = 0;
-  while (p != NULL) {
-    ++len;
-    p = p->next;
-  }
-  return len;
-}
-
-/**
- * Increment the reference count of the pbuf.
- *
- * @param p pbuf to increase reference counter of
- *
- */
-void
-pbuf_ref(struct pbuf *p)
-{
-  SYS_ARCH_DECL_PROTECT(old_level);
-  /* pbuf given? */
-  if (p != NULL) {
-    SYS_ARCH_PROTECT(old_level);
-    ++(p->ref);
-    SYS_ARCH_UNPROTECT(old_level);
-  }
-}
-
-/**
- * Concatenate two pbufs (each may be a pbuf chain) and take over
- * the caller's reference of the tail pbuf.
- *
- * @note The caller MAY NOT reference the tail pbuf afterwards.
- * Use pbuf_chain() for that purpose.
- *
- * @see pbuf_chain()
- */
-
-void
-pbuf_cat(struct pbuf *h, struct pbuf *t)
-{
-  struct pbuf *p;
-
-  LWIP_ERROR("(h != NULL) && (t != NULL) (programmer violates API)",
-             ((h != NULL) && (t != NULL)), return;);
-
-  /* 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 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;
-  /* 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,
-   * so netto there is no change to the reference count of t.
-   */
-}
-
-/**
- * Chain two pbufs (or pbuf chains) together.
- *
- * The caller MUST call pbuf_free(t) once it has stopped
- * using it. Use pbuf_cat() instead if you no longer use t.
- *
- * @param h head pbuf (chain)
- * @param t tail pbuf (chain)
- * @note The pbufs MUST belong to the same packet.
- * @note MAY NOT be called on a packet queue.
- *
- * The ->tot_len fields of all pbufs of the head chain are adjusted.
- * The ->next field of the last pbuf of the head chain is adjusted.
- * The ->ref field of the first pbuf of the tail chain is adjusted.
- *
- */
-void
-pbuf_chain(struct pbuf *h, struct pbuf *t)
-{
-  pbuf_cat(h, t);
-  /* t is now referenced by h */
-  pbuf_ref(t);
-  LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_chain: %p references %p\n", (void *)h, (void *)t));
-}
-
-/**
- * Dechains the first pbuf from its succeeding pbufs in the chain.
- *
- * Makes p->tot_len field equal to p->len.
- * @param p pbuf to dechain
- * @return remainder of the pbuf chain, or NULL if it was de-allocated.
- * @note May not be called on a packet queue.
- */
-struct pbuf *
-pbuf_dechain(struct pbuf *p)
-{
-  struct pbuf *q;
-  u8_t tail_gone = 1;
-  /* tail */
-  q = p->next;
-  /* pbuf has successor in chain? */
-  if (q != NULL) {
-    /* 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;
-    /* decouple pbuf from remainder */
-    p->next = NULL;
-    /* total length of pbuf p is its own length only */
-    p->tot_len = p->len;
-    /* q is no longer referenced by p, free it */
-    LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_dechain: unreferencing %p\n", (void *)q));
-    tail_gone = pbuf_free(q);
-    if (tail_gone > 0) {
-      LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE,
-                  ("pbuf_dechain: deallocated %p (as it is no longer referenced)\n", (void *)q));
-    }
-    /* return remaining tail or NULL if deallocated */
-  }
-  /* assert tot_len invariant: (p->tot_len == p->len + (p->next? p->next->tot_len: 0) */
-  LWIP_ASSERT("p->tot_len == p->len", p->tot_len == p->len);
-  return ((tail_gone > 0) ? NULL : q);
-}
-
-/**
- *
- * Create PBUF_RAM copies of pbufs.
- *
- * Used to queue packets on behalf of the lwIP stack, such as
- * ARP based queueing.
- *
- * @note You MUST explicitly use p = pbuf_take(p);
- *
- * @note Only one packet is copied, no packet queue!
- *
- * @param p_to pbuf destination of the copy
- * @param p_from pbuf source of the copy
- *
- * @return ERR_OK if pbuf was copied
- *         ERR_ARG if one of the pbufs is NULL or p_to is not big
- *                 enough to hold p_from
- */
-err_t
-pbuf_copy(struct pbuf *p_to, struct pbuf *p_from)
-{
-  u16_t offset_to=0, offset_from=0, len;
-
-  LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy(%p, %p)\n",
-    (void*)p_to, (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
-  {
-    /* copy one part of the original chain */
-    if ((p_to->len - offset_to) >= (p_from->len - offset_from)) {
-      /* complete current p_from fits into current p_to */
-      len = p_from->len - offset_from;
-    } else {
-      /* 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);
-    offset_to += len;
-    offset_from += len;
-    LWIP_ASSERT("offset_to <= p_to->len", offset_to <= p_to->len);
-    LWIP_ASSERT("offset_from <= p_from->len", offset_from <= p_from->len);
-    if (offset_from >= p_from->len) {
-      /* on to next p_from (if any) */
-      offset_from = 0;
-      p_from = p_from->next;
-    }
-    if (offset_to == p_to->len) {
-      /* 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;);
-    }
-
-    if ((p_from != NULL) && (p_from->len == p_from->tot_len)) {
-      /* don't copy more than one packet! */
-      LWIP_ERROR("pbuf_copy() does not allow packet queues!",
-                 (p_from->next == NULL), return ERR_VAL;);
-    }
-    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;);
-    }
-  } while (p_from);
-  LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy: end of chain reached.\n"));
-  return ERR_OK;
-}
-
-/**
- * Copy (part of) the contents of a packet buffer
- * to an application supplied buffer.
- *
- * @param buf the pbuf from which to copy data
- * @param dataptr 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
- */
-u16_t
-pbuf_copy_partial(struct pbuf *buf, void *dataptr, u16_t len, u16_t offset)
-{
-  struct pbuf *p;
-  u16_t left;
-  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;
-    } else {
-      /* copy from this buffer. maybe only partially. */
-      buf_copy_len = 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;
-      offset = 0;
-    }
-  }
-  return copied_total;
-}
-
-#if LWIP_TCP && TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
-/**
- * This method modifies a 'pbuf chain', so that its total length is
- * smaller than 64K. The remainder of the original pbuf chain is stored
- * in *rest.
- * This function never creates new pbufs, but splits an existing chain
- * in two parts. The tot_len of the modified packet queue will likely be
- * smaller than 64K.
- * 'packet queues' are not supported by this function.
- *
- * @param p the pbuf queue to be split
- * @param rest pointer to store the remainder (after the first 64K)
- */
-void pbuf_split_64k(struct pbuf *p, struct pbuf **rest)
-{
-  *rest = NULL;
-  if ((p != NULL) && (p->next != NULL)) {
-    u16_t tot_len_front = p->len;
-    struct pbuf *i = p;
-    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;
-      i = r;
-      r = r->next;
-    }
-    /* i now points to last packet of the first segment. Set next
-       pointer to NULL */
-    i->next = NULL;
-
-    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;
-        LWIP_ASSERT("tot_len/len mismatch in last pbuf",
-                    (i->next != NULL) || (i->tot_len == i->len));
-      }
-      if (p->flags & PBUF_FLAG_TCP_FIN) {
-        r->flags |= PBUF_FLAG_TCP_FIN;
-      }
-
-      /* tot_len field in rest does not need modifications */
-      /* reference counters do not need modifications */
-      *rest = r;
-    }
-  }
-}
-#endif /* LWIP_TCP && TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
-
-/**
- * Skip a number of bytes at the start of a pbuf
- *
- * @param in input pbuf
- * @param in_offset offset to skip
- * @param out_offset resulting offset in the returned pbuf
- * @return the pbuf in the queue where the offset is
- */
-struct pbuf*
-pbuf_skip(struct pbuf* in, u16_t in_offset, u16_t* out_offset)
-{
-  u16_t offset_left = in_offset;
-  struct pbuf* q = in;
-
-  /* get the correct pbuf */
-  while ((q != NULL) && (q->len <= offset_left)) {
-    offset_left -= q->len;
-    q = q->next;
-  }
-  if (out_offset != NULL) {
-    *out_offset = offset_left;
-  }
-  return q;
-}
-
-/**
- * Copy application supplied data into a pbuf.
- * This function can only be used to copy the equivalent of buf->tot_len data.
- *
- * @param buf pbuf to fill with data
- * @param dataptr application supplied data buffer
- * @param len length of the application supplied data buffer
- *
- * @return ERR_OK if successful, ERR_MEM if the pbuf is not big enough
- */
-err_t
-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;
-
-  LWIP_ERROR("pbuf_take: invalid buf", (buf != NULL), return ERR_ARG;);
-  LWIP_ERROR("pbuf_take: invalid dataptr", (dataptr != NULL), return ERR_ARG;);
-  LWIP_ERROR("pbuf_take: buf not large enough", (buf->tot_len >= len), return ERR_MEM;);
-
-  if ((buf == NULL) || (dataptr == NULL) || (buf->tot_len < len)) {
-    return ERR_ARG;
-  }
-
-  /* Note some systems use byte copy if dataptr or one of the pbuf payload pointers are unaligned. */
-  for (p = buf; total_copy_len != 0; p = p->next) {
-    LWIP_ASSERT("pbuf_take: invalid pbuf", p != NULL);
-    buf_copy_len = total_copy_len;
-    if (buf_copy_len > p->len) {
-      /* this pbuf cannot hold all remaining data */
-      buf_copy_len = p->len;
-    }
-    /* copy the necessary parts of the buffer */
-    MEMCPY(p->payload, &((const char*)dataptr)[copied_total], buf_copy_len);
-    total_copy_len -= buf_copy_len;
-    copied_total += buf_copy_len;
-  }
-  LWIP_ASSERT("did not copy all data", total_copy_len == 0 && copied_total == len);
-  return ERR_OK;
-}
-
-/**
- * Same as pbuf_take() but puts data at an offset
- *
- * @param buf pbuf to fill with data
- * @param dataptr application supplied data buffer
- * @param len length of the application supplied data buffer
- *
- * @return ERR_OK if successful, ERR_MEM if the pbuf is not big enough
- */
-err_t
-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);
-
-  /* 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;
-    /* 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;
-    src_ptr += first_copy_len;
-    if (remaining_len > 0) {
-      return pbuf_take(q->next, src_ptr, remaining_len);
-    }
-    return ERR_OK;
-  }
-  return ERR_MEM;
-}
-
-/**
- * Creates a single pbuf out of a queue of pbufs.
- *
- * @remark: 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!
- *
- * @param p the source pbuf
- * @param layer pbuf_layer of the new pbuf
- *
- * @return a new, single pbuf (p->next is NULL)
- *         or the old pbuf if allocation fails
- */
-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);
-  if (q == NULL) {
-    /* @todo: what do we do now? */
-    return p;
-  }
-  err = pbuf_copy(q, p);
-  LWIP_ASSERT("pbuf_copy failed", err == ERR_OK);
-  pbuf_free(p);
-  return q;
-}
-
-#if LWIP_CHECKSUM_ON_COPY
-/**
- * Copies data into a single pbuf (*not* into a pbuf queue!) and updates
- * the checksum while copying
- *
- * @param p the pbuf to copy data into
- * @param start_offset offset of p->payload where to copy the data to
- * @param dataptr data to copy into the pbuf
- * @param len length of data to copy into the pbuf
- * @param chksum pointer to the checksum which is updated
- * @return ERR_OK if successful, another error if the data does not fit
- *         within the (first) pbuf (no pbuf queues!)
- */
-err_t
-pbuf_fill_chksum(struct pbuf *p, u16_t start_offset, const void *dataptr,
-                 u16_t len, u16_t *chksum)
-{
-  u32_t acc;
-  u16_t copy_chksum;
-  char *dst_ptr;
-  LWIP_ASSERT("p != NULL", p != NULL);
-  LWIP_ASSERT("dataptr != NULL", dataptr != NULL);
-  LWIP_ASSERT("chksum != NULL", chksum != NULL);
-  LWIP_ASSERT("len != 0", len != 0);
-
-  if ((start_offset >= p->len) || (start_offset + len > p->len)) {
-    return ERR_ARG;
-  }
-
-  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);
-  }
-  acc = *chksum;
-  acc += copy_chksum;
-  *chksum = FOLD_U32T(acc);
-  return ERR_OK;
-}
-#endif /* LWIP_CHECKSUM_ON_COPY */
-
- /** Get one byte from the specified position in a pbuf
- * WARNING: returns zero for offset >= p->tot_len
- *
- * @param p pbuf to parse
- * @param offset offset into p of the byte to return
- * @return byte at an offset into p OR ZERO IF 'offset' >= p->tot_len
- */
-u8_t
-pbuf_get_at(struct pbuf* p, u16_t offset)
-{
-  u16_t q_idx;
-  struct pbuf* q = pbuf_skip(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 0;
-}
-
- /** Put one byte to the specified position in a pbuf
- * WARNING: silently ignores offset >= p->tot_len
- *
- * @param p pbuf to fill
- * @param offset offset into p of the byte to write
- * @param data byte to write at an offset into p
- */
-void
-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);
-
-  /* write requested data if pbuf is OK */
-  if ((q != NULL) && (q->len > q_idx)) {
-    ((u8_t*)q->payload)[q_idx] = data;
-  }
-}
-
-/** Compare pbuf contents at specified offset with memory s2, both of length n
- *
- * @param p pbuf to compare
- * @param offset offset into p at which to start comparing
- * @param s2 buffer to compare
- * @param n length of buffer to compare
- * @return zero if equal, nonzero otherwise
- *         (0xffff if p is too short, diffoffset+1 otherwise)
- */
-u16_t
-pbuf_memcmp(struct pbuf* p, u16_t offset, const void* s2, u16_t n)
-{
-  u16_t start = offset;
-  struct pbuf* q = p;
-
-  /* get the correct pbuf */
-  while ((q != NULL) && (q->len <= start)) {
-    start -= q->len;
-    q = q->next;
-  }
-  /* return requested data if pbuf is OK */
-  if ((q != NULL) && (q->len > start)) {
-    u16_t i;
-    for (i = 0; i < n; i++) {
-      u8_t a = pbuf_get_at(q, start + i);
-      u8_t b = ((const u8_t*)s2)[i];
-      if (a != b) {
-        return i+1;
-      }
-    }
-    return 0;
-  }
-  return 0xffff;
-}
-
-/** Find occurrence of mem (with length mem_len) in pbuf p, starting at offset
- * start_offset.
- *
- * @param p pbuf to search, maximum length is 0xFFFE since 0xFFFF is used as
- *        return value 'not found'
- * @param mem search for the contents of this buffer
- * @param mem_len length of 'mem'
- * @param start_offset offset into p at which to start searching
- * @return 0xFFFF if substr was not found in p or the index where it was found
- */
-u16_t
-pbuf_memfind(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;
-  if (p->tot_len >= mem_len + start_offset) {
-    for (i = start_offset; i <= max; i++) {
-      u16_t plus = pbuf_memcmp(p, i, mem, mem_len);
-      if (plus == 0) {
-        return i;
-      }
-    }
-  }
-  return 0xFFFF;
-}
-
-/** 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!
- *
- * @param p pbuf to search, maximum length is 0xFFFE since 0xFFFF is used as
- *        return value 'not found'
- * @param substr string to search for in p, maximum length is 0xFFFE
- * @return 0xFFFF if substr was not found in p or the index where it was found
- */
-u16_t
-pbuf_strstr(struct pbuf* p, const char* substr)
-{
-  size_t substr_len;
-  if ((substr == NULL) || (substr[0] == 0) || (p->tot_len == 0xFFFF)) {
-    return 0xFFFF;
-  }
-  substr_len = strlen(substr);
-  if (substr_len >= 0xFFFF) {
-    return 0xFFFF;
-  }
-  return pbuf_memfind(p, substr, (u16_t)substr_len, 0);
-}
diff --git a/components/lwip/core/raw.c b/components/lwip/core/raw.c
deleted file mode 100644 (file)
index 82ce4e3..0000000
+++ /dev/null
@@ -1,479 +0,0 @@
-/**
- * @file
- * Implementation of raw protocol PCBs for low-level handling of
- * different types of protocols besides (or overriding) those
- * already available in lwIP.
- *
- */
-
-/*
- * 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>
- *
- */
-
-#include "lwip/opt.h"
-
-#if LWIP_RAW /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/def.h"
-#include "lwip/memp.h"
-#include "lwip/ip_addr.h"
-#include "lwip/netif.h"
-#include "lwip/raw.h"
-#include "lwip/stats.h"
-#include "lwip/ip6.h"
-#include "lwip/ip6_addr.h"
-#include "lwip/inet_chksum.h"
-
-#include <string.h>
-
-/** The list of RAW PCBs */
-static struct raw_pcb *raw_pcbs;
-
-static u8_t
-raw_input_match(struct raw_pcb *pcb, u8_t broadcast)
-{
-  LWIP_UNUSED_ARG(broadcast); /* in IPv6 only case */
-
-  /* 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
-    if((broadcast != 0) && !ip_get_option(pcb, SOF_BROADCAST)) {
-      return 0;
-    }
-#endif /* LWIP_IPV4 && IP_SOF_BROADCAST_RECV */
-    return 1;
-  }
-  
-  /* Only need to check PCB if incoming IP version matches PCB IP version */
-  if(IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ip_current_dest_addr())) {
-#if LWIP_IPV4
-    /* Special case: IPv4 broadcast: receive all broadcasts
-     * Note: broadcast variable can only be 1 if it is an IPv4 broadcast */
-    if(broadcast != 0) {
-#if IP_SOF_BROADCAST_RECV
-      if(ip_get_option(pcb, SOF_BROADCAST))
-#endif /* IP_SOF_BROADCAST_RECV */
-      {
-        if(ip4_addr_isany(ip_2_ip4(&pcb->local_ip))) {
-          return 1;
-        }
-      }
-    } 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;
-    }
-  }
-  
-  return 0;
-}
-
-/**
- * Determine if in incoming IP packet is covered by a RAW PCB
- * and if so, pass it to a user-provided receive callback function.
- *
- * Given an incoming IP datagram (as a chain of pbufs) this function
- * finds a corresponding RAW PCB and calls the corresponding receive
- * callback function.
- *
- * @param p pbuf to be demultiplexed to a RAW PCB.
- * @param inp network interface on which the datagram was received.
- * @return - 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 pbuf_free().
- * @return - 0 if packet is not eaten (pbuf is still referenced by the
- *           caller).
- *
- */
-u8_t
-raw_input(struct pbuf *p, struct netif *inp)
-{
-  struct raw_pcb *pcb, *prev;
-  s16_t proto;
-  u8_t eaten = 0;
-  u8_t broadcast = ip_addr_isbroadcast(ip_current_dest_addr(), ip_current_netif());
-
-  LWIP_UNUSED_ARG(inp);
-
-#if LWIP_IPV6
-#if LWIP_IPV4
-  if (IP_HDR_GET_VERSION(p->payload) == 6)
-#endif /* LWIP_IPV4 */
-  {
-    struct ip6_hdr *ip6hdr = (struct ip6_hdr *)p->payload;
-    proto = IP6H_NEXTH(ip6hdr);
-  }
-#if LWIP_IPV4
-  else
-#endif /* LWIP_IPV4 */
-#endif /* LWIP_IPV6 */
-#if LWIP_IPV4
-  {
-    proto = IPH_PROTO((struct ip_hdr *)p->payload);
-  }
-#endif /* LWIP_IPV4 */
-
-  prev = NULL;
-  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)) {
-      /* receive callback function available? */
-      if (pcb->recv != NULL) {
-#ifndef LWIP_NOASSERT
-        void* old_payload = p->payload;
-#endif
-        /* 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 */
-            prev->next = pcb->next;
-            pcb->next = raw_pcbs;
-            raw_pcbs = pcb;
-          }
-        } 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);
-        }
-      }
-      /* no receive callback function was set for this raw PCB */
-    }
-    /* drop the packet */
-    prev = pcb;
-    pcb = pcb->next;
-  }
-  return eaten;
-}
-
-/**
- * Bind a RAW PCB.
- *
- * @param pcb RAW PCB to be bound with a local address ipaddr.
- * @param ipaddr local IP address to bind with. Use IP_ADDR_ANY to
- * bind to all local interfaces.
- *
- * @return lwIP error code.
- * - ERR_OK. Successful. No error occurred.
- * - ERR_USE. The specified IP address is already bound to by
- * another RAW PCB.
- *
- * @see raw_disconnect()
- */
-err_t
-raw_bind(struct raw_pcb *pcb, const ip_addr_t *ipaddr)
-{
-  if ((pcb == NULL) || (ipaddr == NULL) || !IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr)) {
-    return ERR_VAL;
-  }
-  ip_addr_set_ipaddr(&pcb->local_ip, ipaddr);
-  return ERR_OK;
-}
-
-/**
- * Connect an RAW PCB. This function is required by upper layers
- * of lwip. Using the raw api you could use raw_sendto() instead
- *
- * This will associate the RAW PCB with the remote address.
- *
- * @param pcb RAW PCB to be connected with remote address ipaddr and port.
- * @param ipaddr remote IP address to connect with.
- *
- * @return lwIP error code
- *
- * @see raw_disconnect() and raw_sendto()
- */
-err_t
-raw_connect(struct raw_pcb *pcb, const ip_addr_t *ipaddr)
-{
-  if ((pcb == NULL) || (ipaddr == NULL) || !IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr)) {
-    return ERR_VAL;
-  }
-  ip_addr_set_ipaddr(&pcb->remote_ip, ipaddr);
-  return ERR_OK;
-}
-
-/**
- * Set the callback function for received packets that match the
- * raw PCB's protocol and binding.
- *
- * The callback function MUST either
- * - eat the packet by calling pbuf_free() and returning non-zero. The
- *   packet will not be passed to other raw PCBs or other protocol layers.
- * - not free the packet, and return zero. The packet will be matched
- *   against further PCBs and/or forwarded to another protocol layers.
- *
- * @return non-zero if the packet was free()d, zero if the packet remains
- * available for others.
- */
-void
-raw_recv(struct raw_pcb *pcb, raw_recv_fn recv, void *recv_arg)
-{
-  /* remember recv() callback and user data */
-  pcb->recv = recv;
-  pcb->recv_arg = recv_arg;
-}
-
-/**
- * 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.)
- *
- * @param pcb the raw pcb which to send
- * @param p the IP payload to send
- * @param ipaddr the destination address of the IP packet
- *
- */
-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;
-  const ip_addr_t *dst_ip = ipaddr;
-
-  if ((pcb == NULL) || (ipaddr == NULL) || !IP_ADDR_PCB_VERSION_MATCH(pcb, ipaddr)) {
-    return ERR_VAL;
-  }
-
-  LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_TRACE, ("raw_sendto\n"));
-
-  header_size = (
-#if LWIP_IPV4 && LWIP_IPV6
-    IP_IS_V6(ipaddr) ? IP6_HLEN : IP_HLEN);
-#elif LWIP_IPV4
-    IP_HLEN);
-#else
-    IP6_HLEN);
-#endif
-
-  /* not enough space to add an IP header to first pbuf in given p chain? */
-  if (pbuf_header(p, header_size)) {
-    /* allocate header in new pbuf */
-    q = pbuf_alloc(PBUF_IP, 0, PBUF_RAM);
-    /* new header pbuf could not be allocated? */
-    if (q == NULL) {
-      LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("raw_sendto: could not allocate header\n"));
-      return ERR_MEM;
-    }
-    if (p->tot_len != 0) {
-      /* chain header q in front of given pbuf p */
-      pbuf_chain(q, p);
-    }
-    /* { first pbuf q points to header pbuf } */
-    LWIP_DEBUGF(RAW_DEBUG, ("raw_sendto: added header pbuf %p before given pbuf %p\n", (void *)q, (void *)p));
-  } else {
-    /* first pbuf q equals given pbuf */
-    q = p;
-    if (pbuf_header(q, -header_size)) {
-      LWIP_ASSERT("Can't restore header we just removed!", 0);
-      return ERR_MEM;
-    }
-  }
-
-  netif = ip_route(&pcb->local_ip, dst_ip);
-  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, dst_ip);
-    /* 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_V6(ipaddr))
-  {
-    /* broadcast filter? */
-    if (!ip_get_option(pcb, SOF_BROADCAST) && ip_addr_isbroadcast(ipaddr, 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) {
-        pbuf_free(q);
-      }
-      return ERR_VAL;
-    }
-  }
-#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, dst_ip);
-#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;
-  }
-
-#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(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, dst_ip, pcb->ttl, pcb->tos, pcb->protocol, netif);
-  NETIF_SET_HWADDRHINT(netif, NULL);
-
-  /* did we chain a header earlier? */
-  if (q != p) {
-    /* free the header */
-    pbuf_free(q);
-  }
-  return err;
-}
-
-/**
- * Send the raw IP packet to the address given by raw_connect()
- *
- * @param pcb the raw pcb which to send
- * @param p the IP payload to send
- *
- */
-err_t
-raw_send(struct raw_pcb *pcb, struct pbuf *p)
-{
-  return raw_sendto(pcb, p, &pcb->remote_ip);
-}
-
-/**
- * Remove an RAW PCB.
- *
- * @param pcb RAW PCB to be removed. The PCB is removed from the list of
- * RAW PCB's and the data structure is freed from memory.
- *
- * @see raw_new()
- */
-void
-raw_remove(struct raw_pcb *pcb)
-{
-  struct raw_pcb *pcb2;
-  /* pcb to be removed is first in list? */
-  if (raw_pcbs == pcb) {
-    /* make list start at 2nd pcb */
-    raw_pcbs = raw_pcbs->next;
-    /* pcb not 1st in list */
-  } else {
-    for (pcb2 = raw_pcbs; pcb2 != NULL; pcb2 = pcb2->next) {
-      /* find pcb in raw_pcbs list */
-      if (pcb2->next != NULL && pcb2->next == pcb) {
-        /* remove pcb from list */
-        pcb2->next = pcb->next;
-        break;
-      }
-    }
-  }
-  memp_free(MEMP_RAW_PCB, pcb);
-}
-
-/**
- * Create a RAW PCB.
- *
- * @return The RAW PCB which was created. NULL if the PCB data structure
- * could not be allocated.
- *
- * @param proto the protocol number of the IPs payload (e.g. IP_PROTO_ICMP)
- *
- * @see raw_remove()
- */
-struct raw_pcb *
-raw_new(u8_t proto)
-{
-  struct raw_pcb *pcb;
-
-  LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_TRACE, ("raw_new\n"));
-
-  pcb = (struct raw_pcb *)memp_malloc(MEMP_RAW_PCB);
-  /* could allocate RAW PCB? */
-  if (pcb != NULL) {
-    /* initialize PCB to all zeroes */
-    memset(pcb, 0, sizeof(struct raw_pcb));
-    pcb->protocol = proto;
-    pcb->ttl = RAW_TTL;
-    pcb->next = raw_pcbs;
-    raw_pcbs = pcb;
-  }
-  return pcb;
-}
-
-/**
- * Create a RAW PCB for IPv6.
- *
- * @return The RAW PCB which was created. NULL if the PCB data structure
- * could not be allocated.
- *
- * @param type IP address type, see IPADDR_TYPE_XX definitions.
- * @param proto the protocol number (next header) of the IPv6 packet payload
- *              (e.g. IP6_NEXTH_ICMP6)
- *
- * @see raw_remove()
- */
-struct raw_pcb *
-raw_new_ip_type(u8_t type, u8_t proto)
-{
-  struct raw_pcb *pcb;
-  pcb = raw_new(proto);
-#if LWIP_IPV4 && LWIP_IPV6
-  if(pcb != NULL) {
-    IP_SET_TYPE_VAL(pcb->local_ip,  type);
-    IP_SET_TYPE_VAL(pcb->remote_ip, type);
-  }
-#else /* LWIP_IPV4 && LWIP_IPV6 */
-  LWIP_UNUSED_ARG(type);
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-  return pcb;
-}
-
-#endif /* LWIP_RAW */
diff --git a/components/lwip/core/stats.c b/components/lwip/core/stats.c
deleted file mode 100644 (file)
index c92ef6d..0000000
+++ /dev/null
@@ -1,202 +0,0 @@
-/**
- * @file
- * Statistics module
- *
- */
-
-/*
- * 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>
- *
- */
-
-#include "lwip/opt.h"
-
-#if LWIP_STATS /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/def.h"
-#include "lwip/stats.h"
-#include "lwip/mem.h"
-#include "lwip/debug.h"
-
-#include <string.h>
-
-struct stats_ lwip_stats;
-
-#if defined(LWIP_DEBUG) || LWIP_STATS_DISPLAY
-#if MEMP_STATS
-static const char * memp_names[] = {
-#define LWIP_MEMPOOL(name,num,size,desc) desc,
-#include "lwip/priv/memp_std.h"
-};
-#endif /* MEMP_STATS */
-#endif /* LWIP_DEBUG || LWIP_STATS_DISPLAY */
-
-void
-stats_init(void)
-{
-#ifdef LWIP_DEBUG
-#if MEMP_STATS
-  int i;
-  for (i = 0; i < MEMP_MAX; i++) {
-    lwip_stats.memp[i].name = memp_names[i];
-  }
-#endif /* MEMP_STATS */
-#if MEM_STATS
-  lwip_stats.mem.name = "MEM";
-#endif /* MEM_STATS */
-#endif /* LWIP_DEBUG */
-}
-
-#if LWIP_STATS_DISPLAY
-void
-stats_display_proto(struct stats_proto *proto, const char *name)
-{
-  LWIP_PLATFORM_DIAG(("\n%s\n\t", name));
-  LWIP_PLATFORM_DIAG(("xmit: %"STAT_COUNTER_F"\n\t", proto->xmit));
-  LWIP_PLATFORM_DIAG(("recv: %"STAT_COUNTER_F"\n\t", proto->recv));
-  LWIP_PLATFORM_DIAG(("fw: %"STAT_COUNTER_F"\n\t", proto->fw));
-  LWIP_PLATFORM_DIAG(("drop: %"STAT_COUNTER_F"\n\t", proto->drop));
-  LWIP_PLATFORM_DIAG(("chkerr: %"STAT_COUNTER_F"\n\t", proto->chkerr));
-  LWIP_PLATFORM_DIAG(("lenerr: %"STAT_COUNTER_F"\n\t", proto->lenerr));
-  LWIP_PLATFORM_DIAG(("memerr: %"STAT_COUNTER_F"\n\t", proto->memerr));
-  LWIP_PLATFORM_DIAG(("rterr: %"STAT_COUNTER_F"\n\t", proto->rterr));
-  LWIP_PLATFORM_DIAG(("proterr: %"STAT_COUNTER_F"\n\t", proto->proterr));
-  LWIP_PLATFORM_DIAG(("opterr: %"STAT_COUNTER_F"\n\t", proto->opterr));
-  LWIP_PLATFORM_DIAG(("err: %"STAT_COUNTER_F"\n\t", proto->err));
-  LWIP_PLATFORM_DIAG(("cachehit: %"STAT_COUNTER_F"\n", proto->cachehit));
-}
-
-#if IGMP_STATS || MLD6_STATS
-void
-stats_display_igmp(struct stats_igmp *igmp, const char *name)
-{
-  LWIP_PLATFORM_DIAG(("\n%s\n\t", name));
-  LWIP_PLATFORM_DIAG(("xmit: %"STAT_COUNTER_F"\n\t", igmp->xmit));
-  LWIP_PLATFORM_DIAG(("recv: %"STAT_COUNTER_F"\n\t", igmp->recv));
-  LWIP_PLATFORM_DIAG(("drop: %"STAT_COUNTER_F"\n\t", igmp->drop));
-  LWIP_PLATFORM_DIAG(("chkerr: %"STAT_COUNTER_F"\n\t", igmp->chkerr));
-  LWIP_PLATFORM_DIAG(("lenerr: %"STAT_COUNTER_F"\n\t", igmp->lenerr));
-  LWIP_PLATFORM_DIAG(("memerr: %"STAT_COUNTER_F"\n\t", igmp->memerr));
-  LWIP_PLATFORM_DIAG(("proterr: %"STAT_COUNTER_F"\n\t", igmp->proterr));
-  LWIP_PLATFORM_DIAG(("rx_v1: %"STAT_COUNTER_F"\n\t", igmp->rx_v1));
-  LWIP_PLATFORM_DIAG(("rx_group: %"STAT_COUNTER_F"\n\t", igmp->rx_group));
-  LWIP_PLATFORM_DIAG(("rx_general: %"STAT_COUNTER_F"\n\t", igmp->rx_general));
-  LWIP_PLATFORM_DIAG(("rx_report: %"STAT_COUNTER_F"\n\t", igmp->rx_report));
-  LWIP_PLATFORM_DIAG(("tx_join: %"STAT_COUNTER_F"\n\t", igmp->tx_join));
-  LWIP_PLATFORM_DIAG(("tx_leave: %"STAT_COUNTER_F"\n\t", igmp->tx_leave));
-  LWIP_PLATFORM_DIAG(("tx_report: %"STAT_COUNTER_F"\n\t", igmp->tx_report));
-}
-#endif /* IGMP_STATS || MLD6_STATS */
-
-#if MEM_STATS || MEMP_STATS
-void
-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));
-}
-
-#if MEMP_STATS
-void
-stats_display_memp(struct stats_mem *mem, int index)
-{
-  if (index < MEMP_MAX) {
-    stats_display_mem(mem, memp_names[index]);
-  }
-}
-#endif /* MEMP_STATS */
-#endif /* MEM_STATS || MEMP_STATS */
-
-#if SYS_STATS
-void
-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\t", (u32_t)sys->mbox.err));
-}
-#endif /* SYS_STATS */
-
-void
-stats_display(void)
-{
-  s16_t i;
-
-  LINK_STATS_DISPLAY();
-  ETHARP_STATS_DISPLAY();
-  IPFRAG_STATS_DISPLAY();
-  IP6_FRAG_STATS_DISPLAY();
-  IP_STATS_DISPLAY();
-  ND6_STATS_DISPLAY();
-  IP6_STATS_DISPLAY();
-  IGMP_STATS_DISPLAY();
-  MLD6_STATS_DISPLAY();
-  ICMP_STATS_DISPLAY();
-  ICMP6_STATS_DISPLAY();
-  UDP_STATS_DISPLAY();
-  TCP_STATS_DISPLAY();
-  MEM_STATS_DISPLAY();
-  for (i = 0; i < MEMP_MAX; i++) {
-    MEMP_STATS_DISPLAY(i);
-  }
-  SYS_STATS_DISPLAY();
-}
-#endif /* LWIP_STATS_DISPLAY */
-
-#if ESP_STATS_DROP
-void stats_display_esp(struct stats_esp *esp)
-{
-  LWIP_PLATFORM_DIAG(("\nESP\n\t"));
-  LWIP_PLATFORM_DIAG(("esp.rx_rawmbox_post_fail:  %"U32_F"\n\t", (u32_t)esp->rx_rawmbox_post_fail));
-  LWIP_PLATFORM_DIAG(("esp.rx_udpmbox_post_fail:  %"U32_F"\n\t", (u32_t)esp->rx_udpmbox_post_fail));
-  LWIP_PLATFORM_DIAG(("esp.rx_tcpmbox_post_fail:  %"U32_F"\n\t", (u32_t)esp->rx_tcpmbox_post_fail));
-  LWIP_PLATFORM_DIAG(("esp.err_tcp_rxmbox_post_fail:  %"U32_F"\n\t", (u32_t)esp->err_tcp_rxmbox_post_fail));
-  LWIP_PLATFORM_DIAG(("esp.err_tcp_acceptmbox_post_fail:  %"U32_F"\n\t", (u32_t)esp->err_tcp_acceptmbox_post_fail));
-  LWIP_PLATFORM_DIAG(("esp.acceptmbox_post_fail:  %"U32_F"\n\t", (u32_t)esp->acceptmbox_post_fail));
-  LWIP_PLATFORM_DIAG(("esp.free_mbox_post_fail:  %"U32_F"\n\t", (u32_t)esp->free_mbox_post_fail));
-  LWIP_PLATFORM_DIAG(("esp.tcpip_inpkt_post_fail:  %"U32_F"\n\t", (u32_t)esp->tcpip_inpkt_post_fail));
-  LWIP_PLATFORM_DIAG(("esp.tcpip_cb_post_fail:  %"U32_F"\n\t", (u32_t)esp->tcpip_cb_post_fail));
-  LWIP_PLATFORM_DIAG(("esp.wlanif_input_pbuf_fail:  %"U32_F"\n\t", (u32_t)esp->wlanif_input_pbuf_fail));
-  LWIP_PLATFORM_DIAG(("esp.wlanif_outut_pbuf_fail:  %"U32_F"\n\t", (u32_t)esp->wlanif_outut_pbuf_fail));
-}
-#endif
-
-#endif /* LWIP_STATS */
-
diff --git a/components/lwip/core/sys.c b/components/lwip/core/sys.c
deleted file mode 100644 (file)
index f177737..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- * @file
- * lwIP Operating System abstraction
- *
- */
-
-/*
- * 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>
- *
- */
-
-#include "lwip/opt.h"
-
-#include "lwip/sys.h"
-
-/* Most of the functions defined in sys.h must be implemented in the
- * architecture-dependent file sys_arch.c */
-
-#if !NO_SYS
-
-#ifndef sys_msleep
-/**
- * Sleep for some ms. Timeouts are NOT processed while sleeping.
- *
- * @param ms number of milliseconds to sleep
- */
-void
-sys_msleep(u32_t ms)
-{
-  if (ms > 0) {
-    sys_sem_t delaysem;
-    err_t err = sys_sem_new(&delaysem, 0);
-    if (err == ERR_OK) {
-      sys_arch_sem_wait(&delaysem, ms);
-      sys_sem_free(&delaysem);
-    }
-  }
-}
-#endif /* sys_msleep */
-
-#endif /* !NO_SYS */
diff --git a/components/lwip/core/tcp.c b/components/lwip/core/tcp.c
deleted file mode 100644 (file)
index 596f3d4..0000000
+++ /dev/null
@@ -1,2186 +0,0 @@
-/**
- * @file
- * Transmission Control Protocol for IP
- *
- * This file contains common functions for the TCP implementation, such as functinos
- * 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.
- *
- */
-
-/*
- * 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>
- *
- */
-
-#include "lwip/opt.h"
-
-#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/def.h"
-#include "lwip/mem.h"
-#include "lwip/memp.h"
-#include "lwip/tcp.h"
-#include "lwip/priv/tcp_priv.h"
-#include "lwip/debug.h"
-#include "lwip/stats.h"
-#include "lwip/ip6.h"
-#include "lwip/ip6_addr.h"
-#include "lwip/nd6.h"
-
-#include <string.h>
-
-#ifndef TCP_LOCAL_PORT_RANGE_START
-/* From http://www.iana.org/assignments/port-numbers:
-   "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))
-#endif
-
-#if LWIP_TCP_KEEPALIVE
-#define TCP_KEEP_DUR(pcb)   ((pcb)->keep_cnt * (pcb)->keep_intvl)
-#define TCP_KEEP_INTVL(pcb) ((pcb)->keep_intvl)
-#else /* LWIP_TCP_KEEPALIVE */
-#define TCP_KEEP_DUR(pcb)   TCP_MAXIDLE
-#define TCP_KEEP_INTVL(pcb) TCP_KEEPINTVL_DEFAULT
-#endif /* LWIP_TCP_KEEPALIVE */
-
-const char * const tcp_state_str[] = {
-  "CLOSED",
-  "LISTEN",
-  "SYN_SENT",
-  "SYN_RCVD",
-  "ESTABLISHED",
-  "FIN_WAIT_1",
-  "FIN_WAIT_2",
-  "CLOSE_WAIT",
-  "CLOSING",
-  "LAST_ACK",
-  "TIME_WAIT"
-};
-
-
-/* last local TCP port */
-static s16_t tcp_port = TCP_LOCAL_PORT_RANGE_START;
-
-/* Incremented every coarse grained timer shot (typically every 500 ms). */
-u32_t tcp_ticks;
-
-const u8_t tcp_backoff[13] = { 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7};
- /* Times per slowtmr hits */
-const u8_t tcp_persist_backoff[7] = { 3, 6, 12, 24, 48, 96, 120 };
-
-
-/* The TCP PCB lists. */
-
-/** List of all TCP PCBs bound but not yet (connected || listening) */
-struct tcp_pcb *tcp_bound_pcbs;
-/** List of all TCP PCBs in LISTEN state */
-union tcp_listen_pcbs_t tcp_listen_pcbs;
-/** List of all TCP PCBs that are in a state in which
- * they accept or send data. */
-struct tcp_pcb *tcp_active_pcbs;
-/** List of all TCP PCBs in TIME-WAIT state */
-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};
-
-u8_t tcp_active_pcbs_changed;
-
-/** Timer counter to handle calling slow-timer from tcp_tmr() */
-static u8_t tcp_timer;
-static u8_t tcp_timer_ctr;
-static u16_t tcp_new_port(void);
-
-/**
- * Initialize this module.
- */
-void
-tcp_init(void)
-{
-#if LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS && defined(LWIP_RAND)
-  tcp_port = TCP_ENSURE_LOCAL_PORT_RANGE(LWIP_RAND());
-#endif /* LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS && defined(LWIP_RAND) */
-}
-
-/**
- * Called periodically to dispatch TCP timers.
- */
-void
-tcp_tmr(void)
-{
-  /* Call tcp_fasttmr() every 250 ms */
-  tcp_fasttmr();
-
-  if (++tcp_timer & 1) {
-    /* Call tcp_slowtmr() every 500 ms, i.e., every other timer
-       tcp_tmr() is called. */
-    tcp_slowtmr();
-  }
-}
-
-#if LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG
-/** Called when a listen pcb is closed. Iterates one pcb list and removes the
- * closed listener pcb from pcb->listener if matching.
- */
-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;
-    }
-  }
-}
-#endif
-
-void
-tcp_set_fin_wait_1(struct tcp_pcb *pcb)
-{
-  pcb->state = FIN_WAIT_1;
-#if ESP_LWIP
-  pcb->tmr = tcp_ticks;
-#endif
-}
-
-/** Called when a listen pcb is closed. Iterates all pcb lists and removes the
- * closed listener pcb from pcb->listener if matching.
- */
-static void
-tcp_listen_closed(struct tcp_pcb *pcb)
-{
-#if LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG
-  size_t i;
-  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);
-  }
-#endif
-  LWIP_UNUSED_ARG(pcb);
-}
-
-#if TCP_LISTEN_BACKLOG
-/** @ingroup tcp_raw
- * Delay accepting a connection in respect to the listen backlog:
- * the number of outstanding connections is increased until
- * tcp_backlog_accepted() is called.
- *
- * ATTENTION: the caller is responsible for calling tcp_backlog_accepted()
- * or else the backlog feature will get out of sync!
- *
- * @param pcb the connection pcb which is not fully accepted yet
- */
-void
-tcp_backlog_delayed(struct tcp_pcb *pcb)
-{
-  LWIP_ASSERT("pcb != NULL", pcb != NULL);
-  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;
-    }    
-  }
-}
-
-/** @ingroup tcp_raw
- * A delayed-accept a connection is accepted (or closed/aborted): decreases
- * the number of outstanding connections after calling tcp_backlog_delayed().
- *
- * ATTENTION: the caller is responsible for calling tcp_backlog_accepted()
- * or else the backlog feature will get out of sync!
- *
- * @param pcb the connection pcb which is now fully accepted (or closed/aborted)
- */
-void
-tcp_backlog_accepted(struct tcp_pcb *pcb)
-{
-  LWIP_ASSERT("pcb != NULL", pcb != NULL);
-  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;
-    }
-  }
-}
-#endif /* TCP_LISTEN_BACKLOG */
-
-/**
- * Closes the TX side of a connection held by the PCB.
- * For tcp_close(), a RST is sent if the application didn't receive all data
- * (tcp_recved() not called for all data passed to recv callback).
- *
- * 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 tcp_slowtmr(). It is therefore
- * unsafe to reference it.
- *
- * @param pcb the tcp_pcb to close
- * @return ERR_OK if connection has been closed
- *         another err_t if closing failed and pcb is not freed
- */
-static err_t
-tcp_close_shutdown(struct tcp_pcb *pcb, u8_t rst_on_unacked_data)
-{
-  err_t err;
-
-  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
-         side about this. */
-      LWIP_ASSERT("pcb->flags & TF_RXCLOSED", pcb->flags & TF_RXCLOSED);
-
-      /* 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_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);
-      } 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);
-        }
-      }
-      return ERR_OK;
-    }
-  }
-
-  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. */
-    err = ERR_OK;
-    if (pcb->local_port != 0) {
-      TCP_RMV(&tcp_bound_pcbs, pcb);
-    }
-    memp_free(MEMP_TCP_PCB, pcb);
-    pcb = NULL;
-    break;
-  case LISTEN:
-    err = ERR_OK;
-    tcp_listen_closed(pcb);
-    tcp_pcb_remove(&tcp_listen_pcbs.pcbs, pcb);
-    memp_free(MEMP_TCP_PCB_LISTEN, pcb);
-    pcb = NULL;
-    break;
-  case SYN_SENT:
-    err = ERR_OK;
-    TCP_PCB_REMOVE_ACTIVE(pcb);
-    memp_free(MEMP_TCP_PCB, pcb);
-    pcb = NULL;
-    MIB2_STATS_INC(mib2.tcpattemptfails);
-    break;
-  case SYN_RCVD:
-    err = tcp_send_fin(pcb);
-    if (err == ERR_OK) {
-      tcp_backlog_accepted(pcb);
-      MIB2_STATS_INC(mib2.tcpattemptfails);
-      tcp_set_fin_wait_1(pcb);
-    }
-    break;
-  case ESTABLISHED:
-    err = tcp_send_fin(pcb);
-    if (err == ERR_OK) {
-      MIB2_STATS_INC(mib2.tcpestabresets);
-      tcp_set_fin_wait_1(pcb);
-    }
-    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. */
-    err = ERR_OK;
-    pcb = NULL;
-    break;
-  }
-
-  if (pcb != NULL && err == ERR_OK) {
-    /* To ensure all data has been sent when tcp_close returns, we have
-       to make sure tcp_output doesn't fail.
-       Since we don't really have to ensure all data has been sent when tcp_close
-       returns (unsent data is sent from tcp timer functions, also), we don't care
-       for the return value of tcp_output for now. */
-    tcp_output(pcb);
-  }
-  return err;
-}
-
-/**
- * Closes the connection held by the PCB.
- *
- * 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 tcp_slowtmr(). It is therefore
- * unsafe to reference it (unless an error is returned).
- *
- * @param pcb the tcp_pcb to close
- * @return ERR_OK if connection has been closed
- *         another err_t if closing failed and pcb is not freed
- */
-err_t
-tcp_close(struct tcp_pcb *pcb)
-{
-  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;
-  }
-  /* ... and close */
-  return tcp_close_shutdown(pcb, 1);
-}
-
-/**
- * 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,
- * the PCB should not be referenced any more.
- *
- * @param pcb PCB to shutdown
- * @param shut_rx shut down receive side if this is != 0
- * @param shut_tx shut down send side if this is != 0
- * @return ERR_OK if shutdown succeeded (or the PCB has already been shut down)
- *         another err_t on error.
- */
-err_t
-tcp_shutdown(struct tcp_pcb *pcb, int shut_rx, int shut_tx)
-{
-  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;
-    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);
-    }
-    /* ... and free buffered data */
-    if (pcb->refused_data != NULL) {
-      pbuf_free(pcb->refused_data);
-      pcb->refused_data = NULL;
-    }
-  }
-  if (shut_tx) {
-    /* 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;
-    }
-  }
-  return ERR_OK;
-}
-
-/**
- * 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.
- *
- * @param pcb the tcp_pcb to abort
- * @param reset boolean to indicate whether a reset should be sent
- */
-void
-tcp_abandon(struct tcp_pcb *pcb, int reset)
-{
-  u32_t seqno, ackno;
-#if LWIP_CALLBACK_API
-  tcp_err_fn errf;
-#endif /* LWIP_CALLBACK_API */
-  void *errf_arg;
-
-  /* pcb->state LISTEN not allowed here */
-  LWIP_ASSERT("don't call tcp_abort/tcp_abandon for listen-pcbs",
-    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);
-  } else {
-    int send_rst = 0;
-    u16_t local_port = 0;
-    seqno = pcb->snd_nxt;
-    ackno = pcb->rcv_nxt;
-#if LWIP_CALLBACK_API
-    errf = pcb->errf;
-#endif /* LWIP_CALLBACK_API */
-    errf_arg = pcb->callback_arg;
-    if ((pcb->state == CLOSED) && (pcb->local_port != 0)) {
-      /* bound, not yet opened */
-      TCP_RMV(&tcp_bound_pcbs, pcb);
-    } else {
-      send_rst = reset;
-      local_port = pcb->local_port;
-      TCP_PCB_REMOVE_ACTIVE(pcb);
-    }
-    if (pcb->unacked != NULL) {
-      tcp_segs_free(pcb->unacked);
-    }
-    if (pcb->unsent != NULL) {
-      tcp_segs_free(pcb->unsent);
-    }
-#if TCP_QUEUE_OOSEQ
-    if (pcb->ooseq != NULL) {
-      tcp_segs_free(pcb->ooseq);
-      pcb->ooseq = NULL;
-    }
-#endif /* TCP_QUEUE_OOSEQ */
-    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);
-    }
-    memp_free(MEMP_TCP_PCB, pcb);
-    TCP_EVENT_ERR(errf, errf_arg, ERR_ABRT);
-  }
-}
-
-/**
- * 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!
- *
- * @param pcb the tcp pcb to abort
- */
-void
-tcp_abort(struct tcp_pcb *pcb)
-{
-  tcp_abandon(pcb, 1);
-}
-
-/**
- * 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.
- *
- * @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 IP_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
- *         ERR_VAL if bind failed because the PCB is not in a valid state
- *         ERR_OK if bound
- */
-err_t
-tcp_bind(struct tcp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port)
-{
-  int i;
-  int max_pcb_list = NUM_TCP_PCB_LISTS;
-  struct tcp_pcb *cpcb;
-
-#if LWIP_IPV4
-  /* Don't propagate NULL pointer (IPv4 ANY) to subsequent functions */
-  if (ipaddr == NULL) {
-    ipaddr = IP_ADDR_ANY;
-  }
-#endif /* LWIP_IPV4 */
-
-  /* still need to check for ipaddr == NULL in IPv6 only case */
-  if ((pcb == NULL) || (ipaddr == NULL) || !IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr)) {
-    return ERR_VAL;
-  }
-
-  LWIP_ERROR("tcp_bind: can only bind in state CLOSED", pcb->state == CLOSED, return ERR_VAL);
-
-#if SO_REUSE
-  /* Unless the REUSEADDR flag is set,
-     we have to check the pcbs in TIME-WAIT state, also.
-     We do not dump TIME_WAIT pcb's; they can still be matched by incoming
-     packets using both local and remote IP addresses and ports to distinguish.
-   */
-  if (ip_get_option(pcb, SOF_REUSEADDR)) {
-    max_pcb_list = NUM_TCP_PCB_LISTS_NO_TIME_WAIT;
-  }
-#endif /* SO_REUSE */
-
-  if (port == 0) {
-    port = tcp_new_port();
-    if (port == 0) {
-      return ERR_BUF;
-    }
-  } else {
-    /* Check if the address already is in use (on all lists) */
-    for (i = 0; i < max_pcb_list; i++) {
-      for (cpcb = *tcp_pcb_lists[i]; cpcb != NULL; cpcb = cpcb->next) {
-        if (cpcb->local_port == port) {
-#if SO_REUSE
-          /* Omit checking for the same port if both pcbs have REUSEADDR set.
-             For SO_REUSEADDR, the duplicate-check for a 5-tuple is done in
-             tcp_connect. */
-          if (!ip_get_option(pcb, SOF_REUSEADDR) ||
-              !ip_get_option(cpcb, SOF_REUSEADDR))
-#endif /* SO_REUSE */
-          {
-            /* @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))) {
-              return ERR_USE;
-            }
-          }
-        }
-      }
-    }
-  }
-
-  if (!ip_addr_isany(ipaddr)) {
-    ip_addr_set(&pcb->local_ip, ipaddr);
-  }
-  pcb->local_port = port;
-  TCP_REG(&tcp_bound_pcbs, pcb);
-  LWIP_DEBUGF(TCP_DEBUG, ("tcp_bind: bind to port %"U16_F"\n", port));
-  return ERR_OK;
-}
-#if LWIP_CALLBACK_API
-/**
- * Default accept callback if no accept callback is specified by the user.
- */
-static err_t
-tcp_accept_null(void *arg, struct tcp_pcb *pcb, err_t err)
-{
-  LWIP_UNUSED_ARG(arg);
-  LWIP_UNUSED_ARG(err);
-
-  tcp_abort(pcb);
-
-  return ERR_ABRT;
-}
-#endif /* LWIP_CALLBACK_API */
-
-/**
- * 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.
- *
- * @param pcb the original tcp_pcb
- * @param backlog the incoming connections queue limit
- * @return tcp_pcb used for listening, consumes less memory.
- *
- * @note The original tcp_pcb is freed. This function therefore has to be
- *       called like this:
- *             tpcb = tcp_listen(tpcb);
- */
-struct tcp_pcb *
-tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog)
-{
-  struct tcp_pcb_listen *lpcb;
-
-  LWIP_UNUSED_ARG(backlog);
-  LWIP_ERROR("tcp_listen: pcb already connected", pcb->state == CLOSED, return NULL);
-
-  /* already listening? */
-  if (pcb->state == LISTEN) {
-    return pcb;
-  }
-#if SO_REUSE
-  if (ip_get_option(pcb, SOF_REUSEADDR)) {
-    /* Since SOF_REUSEADDR allows reusing a local address before the pcb's usage
-       is declared (listen-/connection-pcb), we have to make sure now that
-       this port is only used once for every local IP. */
-    for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
-      if ((lpcb->local_port == pcb->local_port) &&
-          ip_addr_cmp(&lpcb->local_ip, &pcb->local_ip)) {
-        /* this address/port is already used */
-        return NULL;
-      }
-    }
-  }
-#endif /* SO_REUSE */
-  lpcb = (struct tcp_pcb_listen *)memp_malloc(MEMP_TCP_PCB_LISTEN);
-  if (lpcb == NULL) {
-    return NULL;
-  }
-  lpcb->callback_arg = pcb->callback_arg;
-  lpcb->local_port = pcb->local_port;
-  lpcb->state = LISTEN;
-  lpcb->prio = pcb->prio;
-  lpcb->so_options = pcb->so_options;
-  lpcb->ttl = pcb->ttl;
-  lpcb->tos = pcb->tos;
-#if LWIP_IPV4 && LWIP_IPV6
-  IP_SET_TYPE_VAL(lpcb->remote_ip, pcb->local_ip.type);
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-  ip_addr_copy(lpcb->local_ip, pcb->local_ip);
-  if (pcb->local_port != 0) {
-    TCP_RMV(&tcp_bound_pcbs, pcb);
-  }
-  memp_free(MEMP_TCP_PCB, pcb);
-#if LWIP_CALLBACK_API
-  lpcb->accept = tcp_accept_null;
-#endif /* LWIP_CALLBACK_API */
-#if TCP_LISTEN_BACKLOG
-  lpcb->accepts_pending = 0;
-  tcp_backlog_set(lpcb, backlog);
-#endif /* TCP_LISTEN_BACKLOG */
-  TCP_REG(&tcp_listen_pcbs.pcbs, (struct tcp_pcb *)lpcb);
-  return (struct tcp_pcb *)lpcb;
-}
-
-/**
- * Update the state that tracks the available window space to advertise.
- *
- * Returns how much extra window would be advertised if we sent an
- * update now.
- */
-u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb)
-{
-  u32_t 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(pcb) / 2), pcb->mss))) {
-    /* we can advertise more window */
-    pcb->rcv_ann_wnd = pcb->rcv_wnd;
-    return new_right_edge - pcb->rcv_ann_right_edge;
-  } else {
-    if (TCP_SEQ_GT(pcb->rcv_nxt, pcb->rcv_ann_right_edge)) {
-      /* Can happen due to other end sending out of advertised window,
-       * but within actual available (but not yet advertised) window */
-      pcb->rcv_ann_wnd = 0;
-    } else {
-      /* keep the right edge of window constant */
-      u32_t new_rcv_ann_wnd = pcb->rcv_ann_right_edge - pcb->rcv_nxt;
-#if !LWIP_WND_SCALE
-      LWIP_ASSERT("new_rcv_ann_wnd <= 0xffff", new_rcv_ann_wnd <= 0xffff);
-#endif
-      pcb->rcv_ann_wnd = (tcpwnd_size_t)new_rcv_ann_wnd;
-    }
-    return 0;
-  }
-}
-
-/**
- * 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.
- *
- * @param pcb the tcp_pcb for which data is read
- * @param len the amount of bytes that have been read by the application
- */
-void
-tcp_recved(struct tcp_pcb *pcb, u16_t len)
-{
-  int wnd_inflation;
-
-  /* pcb->state LISTEN not allowed here */
-  LWIP_ASSERT("don't call tcp_recved for listen-pcbs",
-    pcb->state != LISTEN);
-
-  pcb->rcv_wnd += len;
-  if (pcb->rcv_wnd > TCP_WND_MAX(pcb)) {
-    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);
-    }
-  }
-
-  wnd_inflation = tcp_update_rcv_ann_wnd(pcb);
-
-  /* If the change in the right edge of window is significant (default
-   * watermark is TCP_WND(pcb)/4), then send an explicit update now.
-   * Otherwise wait for a packet to be sent in the normal course of
-   * events (or more window to be available later) */
-  if (wnd_inflation >= TCP_WND_UPDATE_THRESHOLD(pcb)) {
-    tcp_ack_now(pcb);
-    tcp_output(pcb);
-  }
-
-  LWIP_DEBUGF(TCP_DEBUG, ("tcp_recved: received %"U16_F" bytes, wnd %"TCPWNDSIZE_F" (%"TCPWNDSIZE_F").\n",
-         len, pcb->rcv_wnd, TCP_WND_MAX(pcb) - pcb->rcv_wnd));
-}
-
-/**
- * Allocate a new local TCP port.
- *
- * @return a new (free) local TCP port number
- */
-static u16_t
-tcp_new_port(void)
-{
-  u8_t i;
-  u16_t n = 0;
-  struct tcp_pcb *pcb;
-
-again:
-
-#if ESP_RANDOM_TCP_PORT
-  tcp_port = abs(LWIP_RAND()) % (TCP_LOCAL_PORT_RANGE_END - TCP_LOCAL_PORT_RANGE_START);
-  tcp_port += TCP_LOCAL_PORT_RANGE_START;
-#else
-  if (tcp_port++ == TCP_LOCAL_PORT_RANGE_END) {
-    tcp_port = TCP_LOCAL_PORT_RANGE_START;
-  }
-#endif
-
-  /* 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)) {
-          return 0;
-        }
-        goto again;
-      }
-    }
-  }
-  return tcp_port;
-}
-
-/**
- * Connects to another host. The function given as the "connected"
- * argument will be called when the connection has been established.
- *
- * @param pcb the tcp_pcb used to establish the connection
- * @param ipaddr the remote ip address to connect to
- * @param port the remote tcp port to connect to
- * @param connected callback function to call when connected (on error,
-                    the err calback will be called)
- * @return ERR_VAL if invalid arguments are given
- *         ERR_OK if connect request has been sent
- *         other err_t values if connect request couldn't be sent
- */
-err_t
-tcp_connect(struct tcp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port,
-      tcp_connected_fn connected)
-{
-  err_t ret;
-  u32_t iss;
-  u16_t old_local_port;
-
-  if ((pcb == NULL) || (ipaddr == NULL) || !IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr)) {
-    return ERR_VAL;
-  }
-
-  LWIP_ERROR("tcp_connect: can only connect from state CLOSED", pcb->state == CLOSED, return ERR_ISCONN);
-
-  LWIP_DEBUGF(TCP_DEBUG, ("tcp_connect to port %"U16_F"\n", port));
-  ip_addr_set(&pcb->remote_ip, ipaddr);
-  pcb->remote_port = port;
-
-  /* check if we have a route to the remote host */
-  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. */
-      return ERR_RTE;
-    }
-    /* Use the address as local address of the pcb. */
-    ip_addr_copy(pcb->local_ip, *local_ip);
-  }
-
-  old_local_port = pcb->local_port;
-  if (pcb->local_port == 0) {
-    pcb->local_port = tcp_new_port();
-    if (pcb->local_port == 0) {
-      return ERR_BUF;
-    }
-  } else {
-#if SO_REUSE
-    if (ip_get_option(pcb, SOF_REUSEADDR)) {
-      /* Since SOF_REUSEADDR allows reusing a local address, we have to make sure
-         now that the 5-tuple is unique. */
-      struct tcp_pcb *cpcb;
-      int i;
-      /* Don't check listen- and bound-PCBs, check active- and TIME-WAIT PCBs. */
-      for (i = 2; i < NUM_TCP_PCB_LISTS; i++) {
-        for (cpcb = *tcp_pcb_lists[i]; cpcb != NULL; cpcb = cpcb->next) {
-          if ((cpcb->local_port == pcb->local_port) &&
-              (cpcb->remote_port == port) &&
-              ip_addr_cmp(&cpcb->local_ip, &pcb->local_ip) &&
-              ip_addr_cmp(&cpcb->remote_ip, ipaddr)) {
-            /* linux returns EISCONN here, but ERR_USE should be OK for us */
-            return ERR_USE;
-          }
-        }
-      }
-    }
-#endif /* SO_REUSE */
-  }
-
-  iss = tcp_next_iss();
-  pcb->rcv_nxt = 0;
-  pcb->snd_nxt = iss;
-  pcb->lastack = iss - 1;
-  pcb->snd_lbb = iss - 1;
-  /* Start with a window that does not need scaling. When window scaling is
-     enabled and used, the window is enlarged when both sides agree on scaling. */
-  pcb->rcv_wnd = pcb->rcv_ann_wnd = TCPWND_MIN16(TCP_WND(pcb));
-  pcb->rcv_ann_right_edge = pcb->rcv_nxt;
-  pcb->snd_wnd = TCP_WND(pcb);
-  /* As initial send MSS, we use TCP_MSS but limit it to 536.
-     The send MSS is updated when an MSS option is received. */
-  pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS;
-#if TCP_CALCULATE_EFF_SEND_MSS
-  pcb->mss = tcp_eff_send_mss(pcb->mss, &pcb->local_ip, &pcb->remote_ip);
-#endif /* TCP_CALCULATE_EFF_SEND_MSS */
-  pcb->cwnd = 1;
-  pcb->ssthresh = TCP_WND(pcb);
-#if LWIP_CALLBACK_API
-  pcb->connected = connected;
-#else /* LWIP_CALLBACK_API */
-  LWIP_UNUSED_ARG(connected);
-#endif /* LWIP_CALLBACK_API */
-
-  /* Send a SYN together with the MSS option. */
-  ret = tcp_enqueue_flags(pcb, TCP_SYN);
-  if (ret == ERR_OK) {
-    /* SYN segment was enqueued, changed the pcbs state now */
-    pcb->state = SYN_SENT;
-    if (old_local_port != 0) {
-      TCP_RMV(&tcp_bound_pcbs, pcb);
-    }
-    TCP_REG_ACTIVE(pcb);
-    MIB2_STATS_INC(mib2.tcpactiveopens);
-
-    tcp_output(pcb);
-  }
-  return ret;
-}
-
-/**
- * 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.
- *
- * Automatically called from tcp_tmr().
- */
-void
-tcp_slowtmr(void)
-{
-  struct tcp_pcb *pcb, *prev;
-  tcpwnd_size_t eff_wnd;
-  u8_t pcb_remove;      /* flag if a PCB should be removed */
-  u8_t pcb_reset;       /* flag if a RST should be sent when removing */
-  err_t err;
-
-  err = ERR_OK;
-
-  ++tcp_ticks;
-  ++tcp_timer_ctr;
-
-tcp_slowtmr_start:
-  /* Steps through all of the active PCBs. */
-  prev = NULL;
-  pcb = tcp_active_pcbs;
-  if (pcb == NULL) {
-    LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: no active pcbs\n"));
-  }
-  while (pcb != NULL) {
-    LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: processing active pcb\n"));
-    LWIP_ASSERT("tcp_slowtmr: active pcb->state != CLOSED\n", pcb->state != CLOSED);
-    LWIP_ASSERT("tcp_slowtmr: active pcb->state != LISTEN\n", pcb->state != LISTEN);
-    LWIP_ASSERT("tcp_slowtmr: active pcb->state != TIME-WAIT\n", pcb->state != TIME_WAIT);
-    if (pcb->last_timer == tcp_timer_ctr) {
-      /* skip this pcb, we have already processed it */
-      pcb = pcb->next;
-      continue;
-    }
-    pcb->last_timer = tcp_timer_ctr;
-
-    pcb_remove = 0;
-    pcb_reset = 0;
-
-    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) {
-      ++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++;
-            }
-          }
-        }
-      } else {
-        /* Increase the retransmission timer if it is running */
-        if (pcb->rtime >= 0) {
-          ++pcb->rtime;
-        }
-
-        if (pcb->unacked != NULL && 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));
-
-          ESP_STATS_TCP_PCB(pcb);
-
-          /* Double retransmission time-out unless we are trying to
-           * connect to somebody (i.e., we are in SYN_SENT). */
-          if (pcb->state != SYN_SENT) {
-              pcb->rto = ((pcb->sa >> 3) + pcb->sv) << tcp_backoff[pcb->nrtx];
-          }
-
-          /* 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);
-        }
-      }
-    }
-    /* Check if this PCB has stayed too long in FIN-WAIT-2 */
-#if ESP_LWIP
-    if ((pcb->state == FIN_WAIT_2) || (pcb->state == FIN_WAIT_1)) {
-#else
-    if (pcb->state == FIN_WAIT_2) {
-#endif
-      /* If this PCB is in FIN_WAIT_2 because of SHUT_WR don't let it time out. */
-      if (pcb->flags & TF_RXCLOSED) {
-        /* PCB was fully closed (either through close() or SHUT_RDWR):
-           normal FIN-WAIT timeout handling. */
-        if ((u32_t)(tcp_ticks - pcb->tmr) >
-            TCP_FIN_WAIT_TIMEOUT / TCP_SLOW_INTERVAL) {
-          ++pcb_remove;
-          LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in FIN-WAIT-2\n"));
-        }
-      }
-    }
-
-    /* Check if KEEPALIVE should be sent */
-    if (ip_get_option(pcb, SOF_KEEPALIVE) &&
-       ((pcb->state == ESTABLISHED) ||
-        (pcb->state == CLOSE_WAIT))) {
-      if ((u32_t)(tcp_ticks - pcb->tmr) >
-         (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);
-        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)
-      {
-        err = tcp_keepalive(pcb);
-        if (err == ERR_OK) {
-          pcb->keep_cnt_sent++;
-        }
-      }
-    }
-
-    /* If this PCB has queued out of sequence data, but has been
-       inactive for too long, will drop the data (it will eventually
-       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;
-      LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: dropping OOSEQ queued data\n"));
-    }
-#endif /* TCP_QUEUE_OOSEQ */
-
-    /* Check if this PCB has stayed too long in SYN-RCVD */
-    if (pcb->state == SYN_RCVD) {
-      if ((u32_t)(tcp_ticks - pcb->tmr) >
-          TCP_SYN_RCVD_TIMEOUT / TCP_SLOW_INTERVAL) {
-        ++pcb_remove;
-        LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in SYN-RCVD\n"));
-      }
-    }
-
-    /* Check if this PCB has stayed too long in LAST-ACK */
-    if (pcb->state == LAST_ACK) {
-      if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) {
-        ++pcb_remove;
-        LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in LAST-ACK\n"));
-      }
-    }
-
-    /* If the PCB should be removed, do it. */
-    if (pcb_remove) {
-      struct tcp_pcb *pcb2;
-      tcp_err_fn err_fn;
-      void *err_arg;
-      tcp_pcb_purge(pcb);
-      /* Remove PCB from tcp_active_pcbs list. */
-      if (prev != NULL) {
-        LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_active_pcbs", pcb != tcp_active_pcbs);
-        prev->next = pcb->next;
-      } else {
-        /* This PCB was the first. */
-        LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_active_pcbs", tcp_active_pcbs == pcb);
-        tcp_active_pcbs = pcb->next;
-      }
-
-      if (pcb_reset) {
-        tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,
-                 pcb->local_port, pcb->remote_port);
-      }
-
-      err_fn = pcb->errf;
-      err_arg = pcb->callback_arg;
-      pcb2 = pcb;
-      pcb = pcb->next;
-      memp_free(MEMP_TCP_PCB, pcb2);
-
-      tcp_active_pcbs_changed = 0;
-      TCP_EVENT_ERR(err_fn, err_arg, ERR_ABRT);
-      if (tcp_active_pcbs_changed) {
-        goto tcp_slowtmr_start;
-      }
-    } else {
-      /* get the 'next' element now and work with 'prev' below (in case of abort) */
-      prev = pcb;
-      pcb = pcb->next;
-
-      /* We check if we should poll the connection. */
-      ++prev->polltmr;
-      if (prev->polltmr >= prev->pollinterval) {
-        prev->polltmr = 0;
-        LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: polling application\n"));
-        tcp_active_pcbs_changed = 0;
-        TCP_EVENT_POLL(prev, err);
-        if (tcp_active_pcbs_changed) {
-          goto tcp_slowtmr_start;
-        }
-        /* if err == ERR_ABRT, 'prev' is already deallocated */
-        if (err == ERR_OK) {
-          tcp_output(prev);
-        }
-      }
-    }
-  }
-
-
-  /* Steps through all of the TIME-WAIT PCBs. */
-  prev = NULL;
-  pcb = tcp_tw_pcbs;
-  while (pcb != NULL) {
-    LWIP_ASSERT("tcp_slowtmr: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
-    pcb_remove = 0;
-
-    /* Check if this PCB has stayed long enough in TIME-WAIT */
-    if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) {
-      ++pcb_remove;
-    }
-
-    /* If the PCB should be removed, do it. */
-    if (pcb_remove) {
-      struct tcp_pcb *pcb2;
-      tcp_pcb_purge(pcb);
-      /* Remove PCB from tcp_tw_pcbs list. */
-      if (prev != NULL) {
-        LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_tw_pcbs", pcb != tcp_tw_pcbs);
-        prev->next = pcb->next;
-      } else {
-        /* This PCB was the first. */
-        LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb);
-        tcp_tw_pcbs = pcb->next;
-      }
-      pcb2 = pcb;
-      pcb = pcb->next;
-      memp_free(MEMP_TCP_PCB, pcb2);
-    } else {
-      prev = pcb;
-      pcb = pcb->next;
-    }
-  }
-}
-
-/**
- * Is called every TCP_FAST_INTERVAL (250 ms) and process data previously
- * "refused" by upper layer (application) and sends delayed ACKs.
- *
- * Automatically called from tcp_tmr().
- */
-void
-tcp_fasttmr(void)
-{
-  struct tcp_pcb *pcb;
-
-  ++tcp_timer_ctr;
-
-tcp_fasttmr_start:
-  pcb = tcp_active_pcbs;
-
-  while (pcb != NULL) {
-    if (pcb->last_timer != tcp_timer_ctr) {
-      struct tcp_pcb *next;
-      pcb->last_timer = tcp_timer_ctr;
-      /* send delayed ACKs */
-      if (pcb->flags & TF_ACK_DELAY) {
-        LWIP_DEBUGF(TCP_DEBUG, ("tcp_fasttmr: delayed ACK\n"));
-        tcp_ack_now(pcb);
-        tcp_output(pcb);
-        pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
-      }
-
-      next = pcb->next;
-
-      /* If there is data which was previously "refused" by upper layer */
-      if (pcb->refused_data != NULL) {
-        tcp_active_pcbs_changed = 0;
-        tcp_process_refused_data(pcb);
-        if (tcp_active_pcbs_changed) {
-          /* application callback has changed the pcb list: restart the loop */
-          goto tcp_fasttmr_start;
-        }
-      }
-      pcb = next;
-    } else {
-      pcb = pcb->next;
-    }
-  }
-}
-
-/** Call tcp_output for all active pcbs that have TF_NAGLEMEMERR set */
-void
-tcp_txnow(void)
-{
-  struct tcp_pcb *pcb;
-
-  for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
-    if (pcb->flags & TF_NAGLEMEMERR) {
-      tcp_output(pcb);
-    }
-  }
-}
-
-/** Pass pcb->refused_data to the recv callback */
-err_t
-tcp_process_refused_data(struct tcp_pcb *pcb)
-{
-#if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
-  struct pbuf *rest;
-  while (pcb->refused_data != NULL)
-#endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
-  {
-    err_t err;
-    u8_t refused_flags = pcb->refused_data->flags;
-    /* set pcb->refused_data to NULL in case the callback frees it and then
-       closes the pcb */
-    struct pbuf *refused_data = pcb->refused_data;
-#if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
-    pbuf_split_64k(refused_data, &rest);
-    pcb->refused_data = rest;
-#else /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
-    pcb->refused_data = NULL;
-#endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
-    /* Notify again application with data previously received. */
-    LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: notify kept packet\n"));
-    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 TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
-          && (rest == NULL)
-#endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
-         ) {
-        /* correct rcv_wnd as the application won't call tcp_recved()
-           for the FIN's seqno */
-        if (pcb->rcv_wnd != TCP_WND_MAX(pcb)) {
-          pcb->rcv_wnd++;
-        }
-        TCP_EVENT_CLOSED(pcb, err);
-        if (err == ERR_ABRT) {
-          return ERR_ABRT;
-        }
-      }
-    } else if (err == ERR_ABRT) {
-      /* if err == ERR_ABRT, 'pcb' is already deallocated */
-      /* Drop incoming packets because pcb is "full" (only if the incoming
-         segment contains data). */
-      LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: drop incoming packets, because pcb is \"full\"\n"));
-      return ERR_ABRT;
-    } else {
-      /* data is still refused, pbuf is still valid (go on for ACK-only packets) */
-#if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
-      if (rest != NULL) {
-        pbuf_cat(refused_data, rest);
-      }
-#endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
-      pcb->refused_data = refused_data;
-      return ERR_INPROGRESS;
-    }
-  }
-  return ERR_OK;
-}
-
-/**
- * Deallocates a list of TCP segments (tcp_seg structures).
- *
- * @param seg tcp_seg list of TCP segments to free
- */
-void
-tcp_segs_free(struct tcp_seg *seg)
-{
-  while (seg != NULL) {
-    struct tcp_seg *next = seg->next;
-    tcp_seg_free(seg);
-    seg = next;
-  }
-}
-
-/**
- * Frees a TCP segment (tcp_seg structure).
- *
- * @param seg single tcp_seg to free
- */
-void
-tcp_seg_free(struct tcp_seg *seg)
-{
-  if (seg != NULL) {
-    if (seg->p != NULL) {
-      pbuf_free(seg->p);
-      seg->p = NULL;
-    }
-    memp_free(MEMP_TCP_SEG, seg);
-  }
-}
-
-/**
- * Sets the priority of a connection.
- *
- * @param pcb the tcp_pcb to manipulate
- * @param prio new priority
- */
-void
-tcp_setprio(struct tcp_pcb *pcb, u8_t prio)
-{
-  pcb->prio = prio;
-}
-
-#if TCP_QUEUE_OOSEQ
-/**
- * Returns a copy of the given TCP segment.
- * The pbuf and data are not copied, only the pointers
- *
- * @param seg the old tcp_seg
- * @return a copy of seg
- */
-struct tcp_seg *
-tcp_seg_copy(struct tcp_seg *seg)
-{
-  struct tcp_seg *cseg;
-
-  cseg = (struct tcp_seg *)memp_malloc(MEMP_TCP_SEG);
-  if (cseg == NULL) {
-    return NULL;
-  }
-  SMEMCPY((u8_t *)cseg, (const u8_t *)seg, sizeof(struct tcp_seg));
-  pbuf_ref(cseg->p);
-  return cseg;
-}
-#endif /* TCP_QUEUE_OOSEQ */
-
-#if LWIP_CALLBACK_API
-/**
- * Default receive callback that is called if the user didn't register
- * a recv callback for the pcb.
- */
-err_t
-tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
-{
-  LWIP_UNUSED_ARG(arg);
-  if (p != NULL) {
-    tcp_recved(pcb, p->tot_len);
-    pbuf_free(p);
-  } else if (err == ERR_OK) {
-    return tcp_close(pcb);
-  }
-  return ERR_OK;
-}
-#endif /* LWIP_CALLBACK_API */
-
-/**
- * Kills the oldest active connection that has the same or lower priority than
- * 'prio'.
- *
- * @param prio minimum priority
- */
-static void
-tcp_kill_prio(u8_t prio)
-{
-  struct tcp_pcb *pcb, *inactive;
-  u32_t inactivity;
-  u8_t mprio;
-
-  mprio = LWIP_MIN(TCP_PRIO_MAX, prio);
-
-  /* We kill the oldest active connection that has lower priority than prio. */
-  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) {
-      inactivity = tcp_ticks - pcb->tmr;
-      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));
-    tcp_abort(inactive);
-  }
-}
-
-/**
- * Kills the oldest connection that is in specific state.
- * Called from tcp_alloc() for LAST_ACK and CLOSING if no more connections are available.
- */
-static void
-tcp_kill_state(enum tcp_state state)
-{
-  struct tcp_pcb *pcb, *inactive;
-  u32_t inactivity;
-
-  inactivity = 0;
-  inactive = NULL;
-  /* Go through the list of active pcbs and get the oldest pcb that is in state
-     CLOSING/LAST_ACK. */
-  for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
-    if (pcb->state == state) {
-      if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
-        inactivity = tcp_ticks - pcb->tmr;
-        inactive = pcb;
-      }
-    }
-  }
-  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));
-    /* Don't send a RST, since no data is lost. */
-    tcp_abandon(inactive, 0);
-  }
-}
-
-/**
- * Kills the oldest connection that is in TIME_WAIT state.
- * Called from tcp_alloc() if no more connections are available.
- */
-static void
-tcp_kill_timewait(void)
-{
-  struct tcp_pcb *pcb, *inactive;
-  u32_t inactivity;
-
-  inactivity = 0;
-  inactive = NULL;
-  /* Go through the list of TIME_WAIT pcbs and get the oldest pcb. */
-  for (pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
-    if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
-      inactivity = tcp_ticks - pcb->tmr;
-      inactive = pcb;
-    }
-  }
-  if (inactive != NULL) {
-    LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_timewait: killing oldest TIME-WAIT PCB %p (%"S32_F")\n",
-           (void *)inactive, inactivity));
-    tcp_abort(inactive);
-  }
-}
-
-#if ESP_LWIP
-typedef struct {
-    u8_t time_wait;
-    u8_t closing;
-    u8_t fin_wait2;
-    u8_t last_ack;
-    u8_t fin_wait1;
-    u8_t listen;
-    u8_t bound;
-    u8_t total;
-}tcp_pcb_num_t;
-
-void tcp_pcb_num_cal(tcp_pcb_num_t *tcp_pcb_num)
-{
-    struct tcp_pcb_listen *listen;
-    struct tcp_pcb *pcb;
-
-    if (!tcp_pcb_num){
-        return;
-    }
-
-    memset(tcp_pcb_num, 0, sizeof(*tcp_pcb_num));
-    for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
-        tcp_pcb_num->total ++;
-        tcp_pcb_num->time_wait ++;
-    }
-
-    for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next){
-        tcp_pcb_num->total ++;
-        if (pcb->state == FIN_WAIT_2){
-            tcp_pcb_num->fin_wait2 ++;
-        } else if (pcb->state == LAST_ACK) {
-            tcp_pcb_num->last_ack ++;
-        } else if (pcb->state == CLOSING) {
-            tcp_pcb_num->closing ++;
-        } else if (pcb->state == FIN_WAIT_1){
-            tcp_pcb_num->fin_wait1 ++;
-        }
-    }
-
-    for (listen = tcp_listen_pcbs.listen_pcbs; listen != NULL; listen = listen->next){
-        tcp_pcb_num->total ++;
-        tcp_pcb_num->listen ++;
-    }
-
-    for (pcb = tcp_bound_pcbs; pcb != NULL; pcb = pcb->next){
-        tcp_pcb_num->total ++;
-        tcp_pcb_num->bound ++;
-    }
-}
-#endif
-
-
-/**
- * Allocate a new tcp_pcb structure.
- *
- * @param prio priority for the new pcb
- * @return a new tcp_pcb that initially is in state CLOSED
- */
-struct tcp_pcb *
-tcp_alloc(u8_t prio)
-{
-  struct tcp_pcb *pcb;
-  u32_t iss;
-
-#if ESP_LWIP
-    tcp_pcb_num_t tcp_pcb_num;
-
-    tcp_pcb_num_cal(&tcp_pcb_num);
-
-    if (tcp_pcb_num.total >= MEMP_NUM_TCP_PCB){
-        if (tcp_pcb_num.time_wait > 0){
-            tcp_kill_timewait();
-        } else if (tcp_pcb_num.last_ack > 0){
-            tcp_kill_state(LAST_ACK);
-        } else if (tcp_pcb_num.closing > 0){
-            tcp_kill_state(CLOSING);
-        } else if (tcp_pcb_num.fin_wait2 > 0){
-            tcp_kill_state(FIN_WAIT_2);
-        } else if (tcp_pcb_num.fin_wait1 > 0){
-            tcp_kill_state(FIN_WAIT_1);
-        } else {
-            tcp_kill_prio(prio);
-        }
-    }
-
-    tcp_pcb_num_cal(&tcp_pcb_num);
-    if (tcp_pcb_num.total >= MEMP_NUM_TCP_PCB){
-        LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: no available tcp pcb %d %d %d %d %d %d %d %d\n",
-           tcp_pcb_num.total, tcp_pcb_num.time_wait, tcp_pcb_num.last_ack, tcp_pcb_num.closing,
-           tcp_pcb_num.fin_wait2, tcp_pcb_num.fin_wait1, tcp_pcb_num.listen, tcp_pcb_num.bound));
-        return NULL;
-    }
-
-#endif
-
-  pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);
-  if (pcb == NULL) {
-    /* Try killing oldest connection in TIME-WAIT. */
-    LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing off oldest TIME-WAIT connection\n"));
-    tcp_kill_timewait();
-    /* Try to allocate a tcp_pcb again. */
-    pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);
-    if (pcb == NULL) {
-      /* Try killing oldest connection in LAST-ACK (these wouldn't go to TIME-WAIT). */
-      LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing off oldest LAST-ACK connection\n"));
-      tcp_kill_state(LAST_ACK);
-      /* Try to allocate a tcp_pcb again. */
-      pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);
-      if (pcb == NULL) {
-        /* Try killing oldest connection in CLOSING. */
-        LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing off oldest CLOSING connection\n"));
-        tcp_kill_state(CLOSING);
-        /* 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));
-          tcp_kill_prio(prio);
-          /* Try to allocate a tcp_pcb again. */
-          pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);
-          if (pcb != NULL) {
-            /* adjust err stats: memp_malloc failed multiple times before */
-            MEMP_STATS_DEC(err, MEMP_TCP_PCB);
-          }
-        }
-        if (pcb != NULL) {
-          /* adjust err stats: memp_malloc failed multiple times before */
-          MEMP_STATS_DEC(err, MEMP_TCP_PCB);
-        }
-      }
-      if (pcb != NULL) {
-        /* adjust err stats: memp_malloc failed multiple times before */
-        MEMP_STATS_DEC(err, MEMP_TCP_PCB);
-      }
-    }
-    if (pcb != NULL) {
-      /* adjust err stats: memp_malloc failed above */
-      MEMP_STATS_DEC(err, MEMP_TCP_PCB);
-    }
-  }
-  if (pcb != NULL) {
-    memset(pcb, 0, sizeof(struct tcp_pcb));
-
-#if ESP_PER_SOC_TCP_WND
-    pcb->per_soc_tcp_wnd = TCP_WND_DEFAULT;
-    pcb->per_soc_tcp_snd_buf = TCP_SND_BUF_DEFAULT;
-#endif
-
-    pcb->prio = prio;
-    pcb->snd_buf = TCP_SND_BUF_DEFAULT;
-    pcb->snd_queuelen = 0;
-    /* Start with a window that does not need scaling. When window scaling is
-       enabled and used, the window is enlarged when both sides agree on scaling. */
-    pcb->rcv_wnd = pcb->rcv_ann_wnd = TCPWND_MIN16(TCP_WND(pcb));
-#if LWIP_WND_SCALE
-    /* snd_scale and rcv_scale are zero unless both sides agree to use scaling */
-    pcb->snd_scale = 0;
-    pcb->rcv_scale = 0;
-#endif
-    pcb->tos = 0;
-    pcb->ttl = TCP_TTL;
-    /* As initial send MSS, we use TCP_MSS but limit it to 536.
-       The send MSS is updated when an MSS option is received. */
-    pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS;
-    pcb->rto = 3000 / TCP_SLOW_INTERVAL;
-    pcb->sa = 0;
-    pcb->sv = 3000 / TCP_SLOW_INTERVAL;
-    pcb->rtime = -1;
-    pcb->cwnd = 1;
-    iss = tcp_next_iss();
-    pcb->snd_wl2 = iss;
-    pcb->snd_nxt = iss;
-    pcb->lastack = iss;
-    pcb->snd_lbb = iss;
-    pcb->tmr = tcp_ticks;
-    pcb->last_timer = tcp_timer_ctr;
-    pcb->polltmr = 0;
-
-#if LWIP_CALLBACK_API
-    pcb->recv = tcp_recv_null;
-#endif /* LWIP_CALLBACK_API */
-
-    /* Init KEEPALIVE timer */
-    pcb->keep_idle  = TCP_KEEPIDLE_DEFAULT;
-
-#if LWIP_TCP_KEEPALIVE
-    pcb->keep_intvl = TCP_KEEPINTVL_DEFAULT;
-    pcb->keep_cnt   = TCP_KEEPCNT_DEFAULT;
-#endif /* LWIP_TCP_KEEPALIVE */
-
-    pcb->keep_cnt_sent = 0;
-  }
-
-  return pcb;
-}
-
-/**
- * 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().
- *
- * @internal: Maybe there should be a idle TCP PCB list where these
- * PCBs are put on. Port reservation using tcp_bind() is implemented but
- * allocated pcbs that are not bound can't be killed automatically if wanting
- * to allocate a pcb with higher prio (@see tcp_kill_prio())
- *
- * @return a new tcp_pcb that initially is in state CLOSED
- */
-struct tcp_pcb *
-tcp_new(void)
-{
-  return tcp_alloc(TCP_PRIO_NORMAL);
-}
-
-/**
- * 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().
- *
- * @param type IP address type, see IPADDR_TYPE_XX definitions.
- * @return a new tcp_pcb that initially is in state CLOSED
- */
-struct tcp_pcb *
-tcp_new_ip_type(u8_t type)
-{
-  struct tcp_pcb * pcb;
-  pcb = tcp_alloc(TCP_PRIO_NORMAL);
-#if LWIP_IPV4 && LWIP_IPV6
-  if(pcb != NULL) {
-    IP_SET_TYPE_VAL(pcb->local_ip, type);
-    IP_SET_TYPE_VAL(pcb->remote_ip, type);
-  }
-#else
-  LWIP_UNUSED_ARG(type);
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-  return pcb;
-}
-
-/**
- * Used to specify the argument that should be passed callback
- * functions.
- *
- * @param pcb tcp_pcb to set the callback argument
- * @param arg void pointer argument to pass to callback functions
- */
-void
-tcp_arg(struct tcp_pcb *pcb, void *arg)
-{
-  /* This function is allowed to be called for both listen pcbs and
-     connection pcbs. */
-  pcb->callback_arg = arg;
-}
-#if LWIP_CALLBACK_API
-
-/**
- * Used to specify the function that should be called when a TCP
- * connection receives data.
- *
- * @param pcb tcp_pcb to set the recv callback
- * @param recv callback function to call for this pcb when data is received
- */
-void
-tcp_recv(struct tcp_pcb *pcb, tcp_recv_fn recv)
-{
-  LWIP_ASSERT("invalid socket state for recv callback", pcb->state != LISTEN);
-  pcb->recv = recv;
-}
-
-/**
- * Used to specify the function that should be called when TCP data
- * has been successfully delivered to the remote host.
- *
- * @param pcb tcp_pcb to set the sent callback
- * @param sent callback function to call for this pcb when data is successfully sent
- */
-void
-tcp_sent(struct tcp_pcb *pcb, tcp_sent_fn sent)
-{
-  LWIP_ASSERT("invalid socket state for sent callback", pcb->state != LISTEN);
-  pcb->sent = sent;
-}
-
-/**
- * Used to specify the function that should be called when a fatal error
- * has occurred on the connection.
- *
- * @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
- */
-void
-tcp_err(struct tcp_pcb *pcb, tcp_err_fn err)
-{
-  LWIP_ASSERT("invalid socket state for err callback", pcb->state != LISTEN);
-  pcb->errf = err;
-}
-
-/**
- * Used for specifying the function that should be called when a
- * LISTENing connection has been connected to another host.
- *
- * @param pcb tcp_pcb to set the accept callback
- * @param accept callback function to call for this pcb when LISTENing
- *        connection has been connected to another host
- */
-void
-tcp_accept(struct tcp_pcb *pcb, tcp_accept_fn accept)
-{
-  /* This function is allowed to be called for both listen pcbs and
-     connection pcbs. */
-  pcb->accept = accept;
-}
-#endif /* LWIP_CALLBACK_API */
-
-
-/**
- * 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.
- *
- */
-void
-tcp_poll(struct tcp_pcb *pcb, tcp_poll_fn poll, u8_t interval)
-{
-  LWIP_ASSERT("invalid socket state for poll", pcb->state != LISTEN);
-#if LWIP_CALLBACK_API
-  pcb->poll = poll;
-#else /* LWIP_CALLBACK_API */
-  LWIP_UNUSED_ARG(poll);
-#endif /* LWIP_CALLBACK_API */
-  pcb->pollinterval = interval;
-}
-
-/**
- * Purges a TCP PCB. Removes any buffered data and frees the buffer memory
- * (pcb->ooseq, pcb->unsent and pcb->unacked are freed).
- *
- * @param pcb tcp_pcb to purge. The pcb itself is not deallocated!
- */
-void
-tcp_pcb_purge(struct tcp_pcb *pcb)
-{
-  if (pcb->state != CLOSED &&
-     pcb->state != TIME_WAIT &&
-     pcb->state != LISTEN) {
-
-    LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge\n"));
-
-    tcp_backlog_accepted(pcb);
-
-    if (pcb->refused_data != NULL) {
-      LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->refused_data\n"));
-      pbuf_free(pcb->refused_data);
-      pcb->refused_data = NULL;
-    }
-    if (pcb->unsent != NULL) {
-      LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: not all data sent\n"));
-    }
-    if (pcb->unacked != NULL) {
-      LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->unacked\n"));
-    }
-#if TCP_QUEUE_OOSEQ
-    if (pcb->ooseq != NULL) {
-      LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->ooseq\n"));
-    }
-    tcp_segs_free(pcb->ooseq);
-    pcb->ooseq = NULL;
-#endif /* TCP_QUEUE_OOSEQ */
-
-    /* Stop the retransmission timer as it will expect data on unacked
-       queue if it fires */
-    pcb->rtime = -1;
-
-    tcp_segs_free(pcb->unsent);
-    tcp_segs_free(pcb->unacked);
-    pcb->unacked = pcb->unsent = NULL;
-#if TCP_OVERSIZE
-    pcb->unsent_oversize = 0;
-#endif /* TCP_OVERSIZE */
-  }
-}
-
-/**
- * Purges the PCB and removes it from a PCB list. Any delayed ACKs are sent first.
- *
- * @param pcblist PCB list to purge.
- * @param pcb tcp_pcb to purge. The pcb itself is NOT deallocated!
- */
-void
-tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb)
-{
-  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;
-    tcp_output(pcb);
-  }
-
-  if (pcb->state != LISTEN) {
-    LWIP_ASSERT("unsent segments leaking", pcb->unsent == NULL);
-    LWIP_ASSERT("unacked segments leaking", pcb->unacked == NULL);
-#if TCP_QUEUE_OOSEQ
-    LWIP_ASSERT("ooseq segments leaking", pcb->ooseq == NULL);
-#endif /* TCP_QUEUE_OOSEQ */
-  }
-
-  pcb->state = CLOSED;
-  /* reset the local port to prevent the pcb from being 'bound' */
-  pcb->local_port = 0;
-
-  LWIP_ASSERT("tcp_pcb_remove: tcp_pcbs_sane()", tcp_pcbs_sane());
-}
-
-/**
- * Calculates a new initial sequence number for new connections.
- *
- * @return u32_t pseudo random sequence number
- */
-u32_t
-tcp_next_iss(void)
-{
-  static u32_t iss = 6510;
-
-  iss += tcp_ticks;       /* XXX */
-  return iss;
-}
-
-#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).
- */
-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 */
-                     )
-{
-  u16_t mss_s;
-  struct netif *outif;
-  s16_t mtu;
-
-  outif = ip_route(src, dest);
-#if LWIP_IPV6
-#if LWIP_IPV4
-  if (IP_IS_V6(dest))
-#endif /* LWIP_IPV4 */
-  {
-    /* First look in destination cache, to see if there is a Path MTU. */
-    mtu = nd6_get_destination_mtu(ip_2_ip6(dest), outif);
-  }
-#if LWIP_IPV4
-  else
-#endif /* LWIP_IPV4 */
-#endif /* LWIP_IPV6 */
-#if LWIP_IPV4
-  {
-    if (outif == NULL) {
-      return sendmss;
-    }
-    mtu = outif->mtu;
-  }
-#endif /* LWIP_IPV4 */
-
-  if (mtu != 0) {
-#if LWIP_IPV6
-#if LWIP_IPV4
-    if (IP_IS_V6(dest))
-#endif /* LWIP_IPV4 */
-    {
-      mss_s = mtu - IP6_HLEN - TCP_HLEN;
-    }
-#if LWIP_IPV4
-    else
-#endif /* LWIP_IPV4 */
-#endif /* LWIP_IPV6 */
-#if LWIP_IPV4
-    {
-      mss_s = mtu - IP_HLEN - TCP_HLEN;
-    }
-#endif /* LWIP_IPV4 */
-    /* 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.
-     */
-    sendmss = LWIP_MIN(sendmss, mss_s);
-  }
-  return sendmss;
-}
-#endif /* TCP_CALCULATE_EFF_SEND_MSS */
-
-/** Helper function for tcp_netif_ip4_addr_changed() that iterates a pcb list */
-static void
-tcp_netif_ip_addr_changed_pcblist(const ip4_addr_t* old_addr, struct tcp_pcb* pcb_list)
-{
-  struct tcp_pcb *pcb;
-  pcb = pcb_list;
-  while (pcb != NULL) {
-    /* PCB bound to current local interface address? */
-    if (ip4_addr_cmp(ip_2_ip4(&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)))
-#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));
-        tcp_abort(pcb);
-        pcb = next;
-    } else {
-      pcb = pcb->next;
-    }
-  }
-}
-
-#if LWIP_IPV4
-/** This function is called from netif.c when address is changed or netif is removed
- *
- * @param old_addr IPv4 address of the netif before change
- * @param new_addr IPv4 address of the netif after change or NULL if netif has been removed
- */
-void tcp_netif_ipv4_addr_changed(const ip4_addr_t* old_addr, const ip4_addr_t* new_addr)
-{
-  struct tcp_pcb_listen *lpcb, *next;
-
-  if (!ip4_addr_isany(old_addr)) {
-#if ESP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES
-    if ((new_addr == NULL) || ((!ip4_addr_isany_val(*new_addr)) && (!ip4_addr_cmp(old_addr, new_addr)))) {
-#endif
-      tcp_netif_ip_addr_changed_pcblist(old_addr, tcp_active_pcbs);
-      tcp_netif_ip_addr_changed_pcblist(old_addr, tcp_bound_pcbs);
-#if ESP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES
-    }
-#endif
-
-    if (!ip4_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;
-        /* Is this an IPv4 pcb? */
-        if (!IP_IS_V6_VAL(lpcb->local_ip)) {
-          /* PCB bound to current local interface address? */
-          if ((!(ip4_addr_isany(ip_2_ip4(&lpcb->local_ip)))) &&
-              (ip4_addr_cmp(ip_2_ip4(&lpcb->local_ip), old_addr))) {
-            /* The PCB is listening to the old ipaddr and
-             * is set to listen to the new one instead */
-            ip_addr_copy_from_ip4(lpcb->local_ip, *new_addr);
-          }
-        }
-      }
-    }
-  }
-}
-#endif /* LWIP_IPV4 */
-
-const char*
-tcp_debug_state_str(enum tcp_state s)
-{
-      return tcp_state_str[s];
-}
-
-#if TCP_DEBUG || TCP_INPUT_DEBUG || TCP_OUTPUT_DEBUG
-/**
- * Print a tcp header for debugging purposes.
- *
- * @param tcphdr pointer to a struct tcp_hdr
- */
-void
-tcp_debug_print(struct tcp_hdr *tcphdr)
-{
-  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",
-         ntohs(tcphdr->src), ntohs(tcphdr->dest)));
-  LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));
-  LWIP_DEBUGF(TCP_DEBUG, ("|           %010"U32_F"          | (seq no)\n",
-          ntohl(tcphdr->seqno)));
-  LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));
-  LWIP_DEBUGF(TCP_DEBUG, ("|           %010"U32_F"          | (ack no)\n",
-         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),
-         TCPH_FLAGS(tcphdr) >> 5 & 1,
-         TCPH_FLAGS(tcphdr) >> 4 & 1,
-         TCPH_FLAGS(tcphdr) >> 3 & 1,
-         TCPH_FLAGS(tcphdr) >> 2 & 1,
-         TCPH_FLAGS(tcphdr) >> 1 & 1,
-         TCPH_FLAGS(tcphdr) & 1,
-         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",
-         ntohs(tcphdr->chksum), ntohs(tcphdr->urgp)));
-  LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));
-}
-
-/**
- * Print a tcp state for debugging purposes.
- *
- * @param s enum tcp_state to print
- */
-void
-tcp_debug_print_state(enum tcp_state s)
-{
-  LWIP_DEBUGF(TCP_DEBUG, ("State: %s\n", tcp_state_str[s]));
-}
-
-/**
- * Print tcp flags for debugging purposes.
- *
- * @param flags tcp flags, all active flags are printed
- */
-void
-tcp_debug_print_flags(u8_t flags)
-{
-  if (flags & TCP_FIN) {
-    LWIP_DEBUGF(TCP_DEBUG, ("FIN "));
-  }
-  if (flags & TCP_SYN) {
-    LWIP_DEBUGF(TCP_DEBUG, ("SYN "));
-  }
-  if (flags & TCP_RST) {
-    LWIP_DEBUGF(TCP_DEBUG, ("RST "));
-  }
-  if (flags & TCP_PSH) {
-    LWIP_DEBUGF(TCP_DEBUG, ("PSH "));
-  }
-  if (flags & TCP_ACK) {
-    LWIP_DEBUGF(TCP_DEBUG, ("ACK "));
-  }
-  if (flags & TCP_URG) {
-    LWIP_DEBUGF(TCP_DEBUG, ("URG "));
-  }
-  if (flags & TCP_ECE) {
-    LWIP_DEBUGF(TCP_DEBUG, ("ECE "));
-  }
-  if (flags & TCP_CWR) {
-    LWIP_DEBUGF(TCP_DEBUG, ("CWR "));
-  }
-  LWIP_DEBUGF(TCP_DEBUG, ("\n"));
-}
-
-/**
- * Print all tcp_pcbs in every list for debugging purposes.
- */
-void
-tcp_debug_print_pcbs(void)
-{
-  struct tcp_pcb *pcb;
-  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));
-    tcp_debug_print_state(pcb->state);
-  }
-  LWIP_DEBUGF(TCP_DEBUG, ("Listen PCB states:\n"));
-  for (pcb = (struct tcp_pcb *)tcp_listen_pcbs.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));
-    tcp_debug_print_state(pcb->state);
-  }
-  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));
-    tcp_debug_print_state(pcb->state);
-  }
-}
-
-/**
- * Check state consistency of the tcp_pcb lists.
- */
-s16_t
-tcp_pcbs_sane(void)
-{
-  struct tcp_pcb *pcb;
-  for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
-    LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != CLOSED", pcb->state != CLOSED);
-    LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != LISTEN", pcb->state != LISTEN);
-    LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
-  }
-  for (pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
-    LWIP_ASSERT("tcp_pcbs_sane: tw pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
-  }
-  return 1;
-}
-#endif /* TCP_DEBUG */
-
-#endif /* LWIP_TCP */
diff --git a/components/lwip/core/tcp_in.c b/components/lwip/core/tcp_in.c
deleted file mode 100644 (file)
index a6f2946..0000000
+++ /dev/null
@@ -1,1798 +0,0 @@
-/**
- * @file
- * Transmission Control Protocol, incoming traffic
- *
- * The input processing functions of the TCP layer.
- *
- * These functions are generally called in the order (ip_input() ->)
- * tcp_input() -> * tcp_process() -> tcp_receive() (-> application).
- *
- */
-
-/*
- * 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>
- *
- */
-
-#include "lwip/opt.h"
-
-#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/priv/tcp_priv.h"
-#include "lwip/def.h"
-#include "lwip/ip_addr.h"
-#include "lwip/netif.h"
-#include "lwip/mem.h"
-#include "lwip/memp.h"
-#include "lwip/inet_chksum.h"
-#include "lwip/stats.h"
-#include "lwip/ip6.h"
-#include "lwip/ip6_addr.h"
-#include "lwip/inet_chksum.h"
-#if LWIP_ND6_TCP_REACHABILITY_HINTS
-#include "lwip/nd6.h"
-#endif /* LWIP_ND6_TCP_REACHABILITY_HINTS */
-
-/** Initial CWND calculation as defined RFC 2581 */
-#define LWIP_TCP_CALC_INITIAL_CWND(mss) LWIP_MIN((4U * (mss)), LWIP_MAX((2U * (mss)), 4380U));
-/** Initial slow start threshold value: we use the full window */
-#define LWIP_TCP_INITIAL_SSTHRESH(pcb)  ((pcb)->snd_wnd)
-
-/* These variables are global to all functions involved in the input
-   processing of TCP segments. They are set by the tcp_input()
-   function. */
-static struct tcp_seg inseg;
-static struct tcp_hdr *tcphdr;
-static u16_t tcphdr_optlen;
-static u16_t tcphdr_opt1len;
-static u8_t* tcphdr_opt2;
-static u16_t tcp_optidx;
-static u32_t seqno, ackno;
-static u8_t flags;
-static u16_t tcplen;
-
-static u8_t recv_flags;
-static struct pbuf *recv_data;
-
-struct tcp_pcb *tcp_input_pcb;
-
-/* Forward declarations. */
-static err_t tcp_process(struct tcp_pcb *pcb);
-static void tcp_receive(struct tcp_pcb *pcb);
-static void tcp_parseopt(struct tcp_pcb *pcb);
-
-static err_t tcp_listen_input(struct tcp_pcb_listen *pcb);
-static err_t tcp_timewait_input(struct tcp_pcb *pcb);
-
-/**
- * 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
- * ip_input()).
- *
- * @param p received TCP segment to process (p->payload pointing to the TCP header)
- * @param inp network interface on which this segment was received
- */
-void
-tcp_input(struct pbuf *p, struct netif *inp)
-{
-  struct tcp_pcb *pcb, *prev;
-  struct tcp_pcb_listen *lpcb;
-#if SO_REUSE
-  struct tcp_pcb *lpcb_prev = NULL;
-  struct tcp_pcb_listen *lpcb_any = NULL;
-#endif /* SO_REUSE */
-  u8_t hdrlen;
-  err_t err;
-
-  LWIP_UNUSED_ARG(inp);
-
-  PERF_START;
-
-  TCP_STATS_INC(tcp.recv);
-  MIB2_STATS_INC(mib2.tcpinsegs);
-
-  tcphdr = (struct tcp_hdr *)p->payload;
-
-#if TCP_INPUT_DEBUG
-  tcp_debug_print(tcphdr);
-#endif
-
-  /* Check that TCP header fits in payload */
-  if (p->len < sizeof(struct tcp_hdr)) {
-    /* drop short packets */
-    LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: short packet (%"U16_F" bytes) discarded\n", p->tot_len));
-    TCP_STATS_INC(tcp.lenerr);
-    goto dropped;
-  }
-
-  /* Don't even process incoming broadcasts/multicasts. */
-  if (ip_addr_isbroadcast(ip_current_dest_addr(), ip_current_netif()) ||
-      ip_addr_ismulticast(ip_current_dest_addr())) {
-    TCP_STATS_INC(tcp.proterr);
-    goto dropped;
-  }
-
-#if CHECKSUM_CHECK_TCP
-  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());
-    if (chksum != 0) {
-        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;
-    }
-  }
-#endif /* CHECKSUM_CHECK_TCP */
-
-  /* Move the payload pointer in the pbuf so that it points to the
-     TCP data instead of the TCP header. */
-  hdrlen = TCPH_HDRLEN(tcphdr);
-  tcphdr_optlen = tcphdr_opt1len = (hdrlen * 4) - TCP_HLEN;
-  tcphdr_opt2 = NULL;
-  if (p->len < hdrlen * 4) {
-    if (p->len >= TCP_HLEN) {
-      /* TCP header fits into first pbuf, options don't - data is in the next pbuf */
-      u16_t optlen = tcphdr_opt1len;
-      pbuf_header(p, -TCP_HLEN); /* cannot fail */
-      LWIP_ASSERT("tcphdr_opt1len >= p->len", tcphdr_opt1len >= p->len);
-      LWIP_ASSERT("p->next != NULL", p->next != NULL);
-      tcphdr_opt1len = p->len;
-      if (optlen > tcphdr_opt1len) {
-        s16_t opt2len;
-        /* options continue in the next pbuf: set p to zero length and hide the
-           options in the next pbuf (adjusting p->tot_len) */
-        u8_t phret = pbuf_header(p, -(s16_t)tcphdr_opt1len);
-        LWIP_ASSERT("phret == 0", phret == 0);
-        if(tcphdr_optlen - tcphdr_opt1len > p->tot_len) {
-          /* drop short packets */
-          LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: short packet (%"U16_F" bytes) discarded\n", p->tot_len));
-          TCP_STATS_INC(tcp.lenerr);
-          goto dropped;
-        }
-        tcphdr_opt2 = (u8_t*)p->next->payload;
-        opt2len = optlen - tcphdr_opt1len;
-        phret = pbuf_header(p->next, -opt2len);
-        LWIP_ASSERT("phret == 0", phret == 0);
-        /* p->next->payload now points to the TCP data */
-        /* manually adjust p->tot_len to changed p->next->tot_len change */
-        p->tot_len -= opt2len;
-      }
-      LWIP_ASSERT("p->len == 0", p->len == 0);
-    } else {
-      /* drop short packets */
-      LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: short packet\n"));
-      TCP_STATS_INC(tcp.lenerr);
-      goto dropped;
-    }
-  } else {
-    pbuf_header(p, -(hdrlen * 4)); /* cannot fail */
-  }
-
-  /* Convert fields in TCP header to host byte order. */
-  tcphdr->src = ntohs(tcphdr->src);
-  tcphdr->dest = ntohs(tcphdr->dest);
-  seqno = tcphdr->seqno = ntohl(tcphdr->seqno);
-  ackno = tcphdr->ackno = ntohl(tcphdr->ackno);
-  tcphdr->wnd = ntohs(tcphdr->wnd);
-
-  flags = TCPH_FLAGS(tcphdr);
-  tcplen = p->tot_len + ((flags & (TCP_FIN | TCP_SYN)) ? 1 : 0);
-
-  /* Demultiplex an incoming segment. First, we check if it is destined
-     for an active connection. */
-  prev = NULL;
-
-  for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
-    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);
-    if (pcb->remote_port == tcphdr->src &&
-        pcb->local_port == tcphdr->dest &&
-        ip_addr_cmp(&pcb->remote_ip, ip_current_src_addr()) &&
-        ip_addr_cmp(&pcb->local_ip, ip_current_dest_addr())) {
-      /* Move this PCB to the front of the list so that subsequent
-         lookups will be faster (we exploit locality in TCP segment
-         arrivals). */
-      LWIP_ASSERT("tcp_input: pcb->next != pcb (before cache)", pcb->next != pcb);
-      if (prev != NULL) {
-        prev->next = pcb->next;
-        pcb->next = tcp_active_pcbs;
-        tcp_active_pcbs = pcb;
-      } else {
-        TCP_STATS_INC(tcp.cachehit);
-      }
-      LWIP_ASSERT("tcp_input: pcb->next != pcb (after cache)", pcb->next != pcb);
-      break;
-    }
-    prev = pcb;
-  }
-
-  if (pcb == NULL) {
-    /* If it did not go to an active connection, we check the connections
-       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);
-      if (pcb->remote_port == tcphdr->src &&
-          pcb->local_port == tcphdr->dest &&
-          ip_addr_cmp(&pcb->remote_ip, ip_current_src_addr()) &&
-          ip_addr_cmp(&pcb->local_ip, ip_current_dest_addr())) {
-        /* We don't really care enough to move this PCB to the front
-           of the list since we are not very likely to receive that
-           many segments for connections in TIME-WAIT. */
-        LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: packed for TIME_WAITing connection.\n"));
-        tcp_timewait_input(pcb);
-        pbuf_free(p);
-        return;
-      }
-    }
-
-    /* Finally, if we still did not get a match, we check all PCBs that
-       are LISTENing for incoming connections. */
-    prev = NULL;
-    for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
-      if (lpcb->local_port == tcphdr->dest) {
-        if (IP_IS_ANY_TYPE_VAL(lpcb->local_ip)) {
-          /* found an ANY TYPE (IPv4/IPv6) match */
-#if SO_REUSE
-          lpcb_any = lpcb;
-          lpcb_prev = prev;
-#else /* SO_REUSE */
-          break;
-#endif /* SO_REUSE */
-        } else if (IP_ADDR_PCB_VERSION_MATCH_EXACT(lpcb, ip_current_dest_addr())) {
-          if (ip_addr_cmp(&lpcb->local_ip, ip_current_dest_addr())) {
-            /* found an exact match */
-            break;
-          } else if (ip_addr_isany(&lpcb->local_ip)) {
-            /* found an ANY-match */
-#if SO_REUSE
-            lpcb_any = lpcb;
-            lpcb_prev = prev;
-#else /* SO_REUSE */
-            break;
- #endif /* SO_REUSE */
-          }
-        }
-      }
-      prev = (struct tcp_pcb *)lpcb;
-    }
-#if SO_REUSE
-    /* first try specific local IP */
-    if (lpcb == NULL) {
-      /* only pass to ANY if no specific local IP has been found */
-      lpcb = lpcb_any;
-      prev = lpcb_prev;
-    }
-#endif /* SO_REUSE */
-    if (lpcb != NULL) {
-      /* Move this PCB to the front of the list so that subsequent
-         lookups will be faster (we exploit locality in TCP segment
-         arrivals). */
-      if (prev != NULL) {
-        ((struct tcp_pcb_listen *)prev)->next = lpcb->next;
-              /* 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 */
-        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);
-      pbuf_free(p);
-      return;
-    }
-  }
-
-#if TCP_INPUT_DEBUG
-  LWIP_DEBUGF(TCP_INPUT_DEBUG, ("+-+-+-+-+-+-+-+-+-+-+-+-+-+- tcp_input: flags "));
-  tcp_debug_print_flags(TCPH_FLAGS(tcphdr));
-  LWIP_DEBUGF(TCP_INPUT_DEBUG, ("-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n"));
-#endif /* TCP_INPUT_DEBUG */
-
-
-  if (pcb != NULL) {
-    /* The incoming segment belongs to a connection. */
-#if TCP_INPUT_DEBUG
-    tcp_debug_print_state(pcb->state);
-#endif /* TCP_INPUT_DEBUG */
-
-    /* Set up a tcp_seg structure. */
-    inseg.next = NULL;
-    inseg.len = p->tot_len;
-    inseg.p = p;
-    inseg.tcphdr = tcphdr;
-
-    recv_data = NULL;
-    recv_flags = 0;
-
-    if (flags & TCP_PSH) {
-      p->flags |= PBUF_FLAG_PUSH;
-    }
-
-    /* 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 has been aborted or refused data is still refused and the new
-           segment contains data */
-        TCP_STATS_INC(tcp.drop);
-        MIB2_STATS_INC(mib2.tcpinerrs);
-        goto aborted;
-      }
-    }
-    tcp_input_pcb = pcb;
-    err = tcp_process(pcb);
-    /* A return value of ERR_ABRT means that tcp_abort() was called
-       and that the pcb has been freed. If so, we don't do anything. */
-    if (err != ERR_ABRT) {
-      if (recv_flags & TF_RESET) {
-        /* TF_RESET means that the connection was reset by the other
-           end. We then call the error callback to inform the
-           application that the connection is dead before we
-           deallocate the PCB. */
-        TCP_EVENT_ERR(pcb->errf, pcb->callback_arg, ERR_RST);
-        tcp_pcb_remove(&tcp_active_pcbs, pcb);
-        memp_free(MEMP_TCP_PCB, pcb);
-      } else {
-        err = ERR_OK;
-        /* If the application has registered a "sent" function to be
-           called when new send buffer space is available, we call it
-           now. */
-        if (pcb->acked > 0) {
-          u16_t acked;
-#if LWIP_WND_SCALE
-          /* pcb->acked is u32_t but the sent callback only takes a u16_t,
-             so we might have to call it multiple times. */
-          u32_t pcb_acked = pcb->acked;
-          while (pcb_acked > 0) {
-            acked = (u16_t)LWIP_MIN(pcb_acked, 0xffffu);
-            pcb_acked -= acked;
-#else
-          {
-            acked = pcb->acked;
-#endif
-            TCP_EVENT_SENT(pcb, (u16_t)acked, err);
-            if (err == ERR_ABRT) {
-              goto aborted;
-            }
-          }
-        }
-        if (recv_flags & TF_CLOSED) {
-          /* The connection has been closed and we will deallocate the
-             PCB. */
-          if (!(pcb->flags & TF_RXCLOSED)) {
-            /* Connection closed although the application has only shut down the
-               tx side: call the PCB's err callback and indicate the closure to
-               ensure the application doesn't continue using the PCB. */
-            TCP_EVENT_ERR(pcb->errf, pcb->callback_arg, ERR_CLSD);
-          }
-          tcp_pcb_remove(&tcp_active_pcbs, pcb);
-          memp_free(MEMP_TCP_PCB, pcb);
-          goto aborted;
-        }
-#if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
-        while (recv_data != NULL) {
-          struct pbuf *rest = NULL;
-          pbuf_split_64k(recv_data, &rest);
-#else /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
-        if (recv_data != NULL) {
-#endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
-
-          LWIP_ASSERT("pcb->refused_data == NULL", pcb->refused_data == NULL);
-          if (pcb->flags & TF_RXCLOSED) {
-            /* received data although already closed -> abort (send RST) to
-               notify the remote host that not all data has been processed */
-            pbuf_free(recv_data);
-#if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
-            if (rest != NULL) {
-              pbuf_free(rest);
-            }
-#endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
-            tcp_abort(pcb);
-            goto aborted;
-          }
-
-          /* Notify application that data has been received. */
-          TCP_EVENT_RECV(pcb, recv_data, ERR_OK, err);
-          if (err == ERR_ABRT) {
-#if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
-            if (rest != NULL) {
-              pbuf_free(rest);
-            }
-#endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
-            goto aborted;
-          }
-
-          /* If the upper layer can't receive this data, store it */
-          if (err != ERR_OK) {
-#if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
-            if (rest != NULL) {
-              pbuf_cat(recv_data, rest);
-            }
-#endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
-            pcb->refused_data = recv_data;
-            LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: keep incoming packet, because pcb is \"full\"\n"));
-#if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
-            break;
-          } else {
-            /* Upper layer received the data, go on with the rest if > 64K */
-            recv_data = rest;
-#endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
-          }
-        }
-
-        /* If a FIN segment was received, we call the callback
-           function with a NULL buffer to indicate EOF. */
-        if (recv_flags & TF_GOT_FIN) {
-          if (pcb->refused_data != NULL) {
-            /* Delay this if we have refused data. */
-            pcb->refused_data->flags |= PBUF_FLAG_TCP_FIN;
-          } else {
-            /* correct rcv_wnd as the application won't call tcp_recved()
-               for the FIN's seqno */
-            if (pcb->rcv_wnd != TCP_WND_MAX(pcb)) {
-              pcb->rcv_wnd++;
-            }
-            TCP_EVENT_CLOSED(pcb, err);
-            if (err == ERR_ABRT) {
-              goto aborted;
-            }
-          }
-        }
-
-        tcp_input_pcb = NULL;
-        /* Try to send something out. */
-        tcp_output(pcb);
-#if TCP_INPUT_DEBUG
-#if TCP_DEBUG
-        tcp_debug_print_state(pcb->state);
-#endif /* TCP_DEBUG */
-#endif /* TCP_INPUT_DEBUG */
-      }
-    }
-    /* Jump target if pcb has been aborted in a callback (by calling tcp_abort()).
-       Below this line, 'pcb' may not be dereferenced! */
-aborted:
-    tcp_input_pcb = NULL;
-    recv_data = NULL;
-
-    /* give up our reference to inseg.p */
-    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);
-    }
-    pbuf_free(p);
-  }
-
-  LWIP_ASSERT("tcp_input: tcp_pcbs_sane()", tcp_pcbs_sane());
-  PERF_STOP("tcp_input");
-  return;
-dropped:
-  TCP_STATS_INC(tcp.drop);
-  MIB2_STATS_INC(mib2.tcpinerrs);
-  pbuf_free(p);
-}
-
-/**
- * Called by tcp_input() when a segment arrives for a listening
- * connection (from tcp_input()).
- *
- * @param pcb the tcp_pcb_listen for which a segment arrived
- * @return ERR_OK if the segment was processed
- *         another err_t on error
- *
- * @note the return value is not (yet?) used in tcp_input()
- * @note the segment which arrived is saved in global variables, therefore only the pcb
- *       involved is passed as a parameter to this function
- */
-static err_t
-tcp_listen_input(struct tcp_pcb_listen *pcb)
-{
-  struct tcp_pcb *npcb;
-  err_t rc;
-
-  if (flags & TCP_RST) {
-    /* An incoming RST should be ignored. Return. */
-    return ERR_OK;
-  }
-
-  /* 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);
-  } 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
-    if (pcb->accepts_pending >= pcb->backlog) {
-      LWIP_DEBUGF(TCP_DEBUG, ("tcp_listen_input: listen backlog exceeded for port %"U16_F"\n", tcphdr->dest));
-      return ERR_ABRT;
-    }
-#endif /* TCP_LISTEN_BACKLOG */
-    npcb = tcp_alloc(pcb->prio);
-    /* If a new PCB could not be created (probably due to lack of memory),
-       we don't do anything, but rely on the sender will retransmit the
-       SYN at a time when we have more memory available. */
-    if (npcb == NULL) {
-      LWIP_DEBUGF(TCP_DEBUG, ("tcp_listen_input: could not allocate PCB\n"));
-      TCP_STATS_INC(tcp.memerr);
-      return ERR_MEM;
-    }
-#if TCP_LISTEN_BACKLOG
-    pcb->accepts_pending++;
-    npcb->flags |= TF_BACKLOGPEND;
-#endif /* TCP_LISTEN_BACKLOG */
-    /* Set up the new PCB. */
-    ip_addr_copy(npcb->local_ip, *ip_current_dest_addr());
-    ip_addr_copy(npcb->remote_ip, *ip_current_src_addr());
-    npcb->local_port = pcb->local_port;
-    npcb->remote_port = tcphdr->src;
-    npcb->state = SYN_RCVD;
-    npcb->rcv_nxt = seqno + 1;
-    npcb->rcv_ann_right_edge = npcb->rcv_nxt;
-    npcb->snd_wl1 = seqno - 1;/* initialise to seqno-1 to force window update */
-    npcb->callback_arg = pcb->callback_arg;
-#if LWIP_CALLBACK_API
-    npcb->accept = pcb->accept;
-#endif /* LWIP_CALLBACK_API */
-
-#if LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG
-    npcb->listener = pcb;
-#endif
-    /* inherit socket options */
-    npcb->so_options = pcb->so_options & SOF_INHERITED;
-    /* Register the new PCB so that we can begin receiving segments
-       for it. */
-    TCP_REG_ACTIVE(npcb);
-
-    /* Parse any options in the SYN. */
-    tcp_parseopt(npcb);
-    npcb->snd_wnd = SND_WND_SCALE(npcb, tcphdr->wnd);
-    npcb->snd_wnd_max = npcb->snd_wnd;
-    npcb->ssthresh = LWIP_TCP_INITIAL_SSTHRESH(npcb);
-
-#if TCP_CALCULATE_EFF_SEND_MSS
-    npcb->mss = tcp_eff_send_mss(npcb->mss, &npcb->local_ip, &npcb->remote_ip);
-#endif /* TCP_CALCULATE_EFF_SEND_MSS */
-
-    MIB2_STATS_INC(mib2.tcppassiveopens);
-
-    /* Send a SYN|ACK together with the MSS option. */
-    rc = tcp_enqueue_flags(npcb, TCP_SYN | TCP_ACK);
-    if (rc != ERR_OK) {
-      tcp_abandon(npcb, 0);
-      return rc;
-    }
-    return tcp_output(npcb);
-  }
-  return ERR_OK;
-}
-
-/**
- * Called by tcp_input() when a segment arrives for a connection in
- * TIME_WAIT.
- *
- * @param pcb the tcp_pcb for which a segment arrived
- *
- * @note the segment which arrived is saved in global variables, therefore only the pcb
- *       involved is passed as a parameter to this function
- */
-static err_t
-tcp_timewait_input(struct tcp_pcb *pcb)
-{
-  /* RFC 1337: in TIME_WAIT, ignore RST and ACK FINs + any 'acceptable' segments */
-  /* RFC 793 3.9 Event Processing - Segment Arrives:
-   * - first check sequence number - we skip that one in TIME_WAIT (always
-   *   acceptable since we only send ACKs)
-   * - second check the RST bit (... return) */
-  if (flags & TCP_RST) {
-    return ERR_OK;
-  }
-  /* - 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);
-      return ERR_OK;
-    }
-  } else if (flags & TCP_FIN) {
-    /* - eighth, check the FIN bit: Remain in the TIME-WAIT state.
-         Restart the 2 MSL time-wait timeout.*/
-    pcb->tmr = tcp_ticks;
-  }
-
-  if ((tcplen > 0)) {
-    /* Acknowledge data, FIN or out-of-window SYN */
-    pcb->flags |= TF_ACK_NOW;
-    return tcp_output(pcb);
-  }
-  return ERR_OK;
-}
-
-/**
- * Implements the TCP state machine. Called by tcp_input. In some
- * states tcp_receive() is called to receive data. The tcp_seg
- * argument will be freed by the caller (tcp_input()) unless the
- * recv_data pointer in the pcb is set.
- *
- * @param pcb the tcp_pcb for which a segment arrived
- *
- * @note the segment which arrived is saved in global variables, therefore only the pcb
- *       involved is passed as a parameter to this function
- */
-static err_t
-tcp_process(struct tcp_pcb *pcb)
-{
-  struct tcp_seg *rseg;
-  u8_t acceptable = 0;
-  err_t err;
-
-  err = ERR_OK;
-
-  /* Process incoming RST segments. */
-  if (flags & TCP_RST) {
-    /* First, determine if the reset is acceptable. */
-    if (pcb->state == SYN_SENT) {
-      if (ackno == pcb->snd_nxt) {
-        acceptable = 1;
-      }
-    } else {
-      if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt,
-                          pcb->rcv_nxt + pcb->rcv_wnd)) {
-        acceptable = 1;
-      }
-    }
-
-    if (acceptable) {
-      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;
-      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));
-      LWIP_DEBUGF(TCP_DEBUG, ("tcp_process: unacceptable reset seqno %"U32_F" rcv_nxt %"U32_F"\n",
-       seqno, pcb->rcv_nxt));
-      return ERR_OK;
-    }
-  }
-
-  if ((flags & TCP_SYN) && (pcb->state != SYN_SENT && pcb->state != SYN_RCVD)) {
-    /* Cope with new connection attempt after remote end crashed */
-    tcp_ack_now(pcb);
-    return ERR_OK;
-  }
-
-  if ((pcb->flags & TF_RXCLOSED) == 0) {
-    /* Update the PCB (in)activity timer unless rx is closed (see tcp_shutdown) */
-    pcb->tmr = tcp_ticks;
-  }
-  pcb->keep_cnt_sent = 0;
-
-  tcp_parseopt(pcb);
-
-  /* Do different things depending on the TCP state. */
-  switch (pcb->state) {
-  case SYN_SENT:
-    if (pcb->unacked) {
-      LWIP_DEBUGF(TCP_INPUT_DEBUG, ("SYN-SENT: ackno %"U32_F" pcb->snd_nxt %"U32_F" unacked %"U32_F"\n", ackno,
-        pcb->snd_nxt, ntohl(pcb->unacked->tcphdr->seqno)));
-      /* received SYN ACK with expected sequence number? */
-      if ((flags & TCP_ACK) && (flags & TCP_SYN)
-        && ackno == ntohl(pcb->unacked->tcphdr->seqno) + 1) {
-        pcb->snd_buf++;
-        pcb->rcv_nxt = seqno + 1;
-        pcb->rcv_ann_right_edge = pcb->rcv_nxt;
-        pcb->lastack = ackno;
-        pcb->snd_wnd = SND_WND_SCALE(pcb, 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);
-#endif  /* TCP_CALCULATE_EFF_SEND_MSS */
-
-        /* Set ssthresh again after changing 'mss' and 'snd_wnd' */
-        pcb->ssthresh = LWIP_TCP_INITIAL_SSTHRESH(pcb);
-
-        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;
-        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);
-    }
-    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->accept != NULL", pcb->accept != NULL);
-#endif
-
-        if (pcb->listener == NULL) {
-          err = ERR_VAL;
-        } else {
-#endif
-          tcp_backlog_accepted(pcb);
-          /* Call the accept function. */
-          TCP_EVENT_ACCEPT(pcb, 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);
-
-        /* passive open: update initial ssthresh now that the correct window is
-           known: if the remote side supports window scaling, the window sent
-           with the initial SYN can be smaller than the one used later */
-        pcb->ssthresh = LWIP_TCP_INITIAL_SSTHRESH(pcb);
-
-        /* Prevent ACK for SYN to generate a sent event */
-        if (pcb->acked != 0) {
-          pcb->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(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)) {
-        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->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) {
-      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) {
-      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;
-}
-
-#if TCP_QUEUE_OOSEQ
-/**
- * Insert segment into the list (segments covered with new one will be deleted)
- *
- * Called from tcp_receive()
- */
-static void
-tcp_oos_insert_segment(struct tcp_seg *cseg, struct tcp_seg *next)
-{
-  struct tcp_seg *old_seg;
-
-  if (TCPH_FLAGS(cseg->tcphdr) & TCP_FIN) {
-    /* received segment overlaps all following segments */
-    tcp_segs_free(next);
-    next = NULL;
-  } else {
-    /* delete some following segments
-       oos queue may have segments with FIN flag */
-    while (next &&
-           TCP_SEQ_GEQ((seqno + cseg->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);
-      }
-      old_seg = next;
-      next = next->next;
-      tcp_seg_free(old_seg);
-    }
-    if (next &&
-        TCP_SEQ_GT(seqno + cseg->len, next->tcphdr->seqno)) {
-      /* We need to trim the incoming segment. */
-      cseg->len = (u16_t)(next->tcphdr->seqno - seqno);
-      pbuf_realloc(cseg->p, cseg->len);
-    }
-  }
-  cseg->next = next;
-}
-#endif /* TCP_QUEUE_OOSEQ */
-
-/**
- * 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
- * segment on any of the receive queues (pcb->recved or pcb->ooseq). If the segment
- * is buffered, the pbuf is referenced by pbuf_ref so that it will not be freed until
- * it has been removed from the buffer.
- *
- * If the incoming segment constitutes an ACK for a segment that was used for RTT
- * estimation, the RTT is estimated here as well.
- *
- * Called from tcp_process().
- */
-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 */
-  struct pbuf *p;
-  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: wrong state", pcb->state >= ESTABLISHED);
-
-  if (flags & TCP_ACK) {
-    right_wnd_edge = pcb->snd_wnd + pcb->snd_wl2;
-
-    /* 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_wnd = SND_WND_SCALE(pcb, tcphdr->wnd);
-      /* keep track of the biggest window announced by the remote host to calculate
-         the maximum segment size */
-      if (pcb->snd_wnd_max < pcb->snd_wnd) {
-        pcb->snd_wnd_max = pcb->snd_wnd;
-      }
-      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 {
-      if (pcb->snd_wnd != (tcpwnd_size_t)SND_WND_SCALE(pcb, tcphdr->wnd)) {
-        LWIP_DEBUGF(TCP_WND_DEBUG,
-                    ("tcp_receive: no window update lastack %"U32_F" ackno %"
-                     U32_F" wl1 %"U32_F" seqno %"U32_F" wl2 %"U32_F"\n",
-                     pcb->lastack, ackno, pcb->snd_wl1, seqno, pcb->snd_wl2));
-      }
-#endif /* TCP_WND_DEBUG */
-    }
-
-    /* (From Stevens TCP/IP Illustrated Vol II, p970.) Its only a
-     * duplicate ack if:
-     * 1) It doesn't ACK new data
-     * 2) length of received packet is zero (i.e. no payload)
-     * 3) the advertised window hasn't changed
-     * 4) There is outstanding unacknowledged data (retransmission timer running)
-     * 5) The ACK is == biggest ACK sequence number so far seen (snd_una)
-     *
-     * If it passes all five, should process as a dupack:
-     * a) dupacks < 3: do nothing
-     * b) dupacks == 3: fast retransmit
-     * c) dupacks > 3: increase cwnd
-     *
-     * If it only passes 1-3, should reset dupack counter (and add to
-     * stats, which we don't do in lwIP)
-     *
-     * If it only passes 1, should reset dupack counter
-     *
-     */
-
-    /* Clause 1 */
-    if (TCP_SEQ_LEQ(ackno, pcb->lastack)) {
-      pcb->acked = 0;
-      /* Clause 2 */
-      if (tcplen == 0) {
-        /* Clause 3 */
-        if (pcb->snd_wl2 + pcb->snd_wnd == right_wnd_edge) {
-          /* Clause 4 */
-          if (pcb->rtime >= 0) {
-            /* Clause 5 */
-            if (pcb->lastack == ackno) {
-              found_dupack = 1;
-              if ((u8_t)(pcb->dupacks + 1) > pcb->dupacks) {
-                ++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 */
-                tcp_rexmit_fast(pcb);
-              }
-            }
-          }
-        }
-      }
-      /* If Clause (1) or more is true, but not a duplicate ack, reset
-       * count of consecutive duplicate acks */
-      if (!found_dupack) {
-        pcb->dupacks = 0;
-      }
-    } else if (TCP_SEQ_BETWEEN(ackno, pcb->lastack+1, pcb->snd_nxt)) {
-      /* We come here when the ACK acknowledges new data. */
-
-      /* 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;
-        pcb->cwnd = pcb->ssthresh;
-      }
-
-      /* Reset the number of retransmissions. */
-      pcb->nrtx = 0;
-
-      /* Reset the retransmission time-out. */
-      pcb->rto = (pcb->sa >> 3) + pcb->sv;
-
-      /* Update the send buffer space. Diff between the two can never exceed 64K
-         unless window scaling is used. */
-      pcb->acked = (tcpwnd_size_t)(ackno - pcb->lastack);
-
-      pcb->snd_buf += pcb->acked;
-
-      /* Reset the fast retransmit variables. */
-      pcb->dupacks = 0;
-      pcb->lastack = ackno;
-
-      /* Update the congestion control variables (cwnd and
-         ssthresh). */
-      if (pcb->state >= ESTABLISHED) {
-        if (pcb->cwnd < pcb->ssthresh) {
-          if ((tcpwnd_size_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) {
-            pcb->cwnd += pcb->mss;
-          }
-          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;
-          }
-          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?
-                                    ntohl(pcb->unacked->tcphdr->seqno): 0,
-                                    pcb->unacked != NULL?
-                                    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(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",
-                                      ntohl(pcb->unacked->tcphdr->seqno),
-                                      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)));
-        /* Prevent ACK for FIN to generate a sent event */
-        if ((pcb->acked != 0) && ((TCPH_FLAGS(next->tcphdr) & TCP_FIN) != 0)) {
-          pcb->acked--;
-        }
-
-        pcb->snd_queuelen -= pbuf_clen(next->p);
-        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);
-        }
-      }
-
-      /* 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->polltmr = 0;
-
-#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*/
-    } else {
-      /* Out of sequence ACK, didn't really ack anything */
-      pcb->acked = 0;
-      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, 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",
-                                    ntohl(pcb->unsent->tcphdr->seqno), 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 */
-      if ((pcb->acked != 0) && ((TCPH_FLAGS(next->tcphdr) & TCP_FIN) != 0)) {
-        pcb->acked--;
-      }
-      pcb->snd_queuelen -= pbuf_clen(next->p);
-      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);
-      }
-    }
-    /* 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));
-
-    /* RTT estimation calculations. This is done by checking if the
-       incoming segment acknowledges the segment we use to take a
-       round-trip time measurement. */
-    if (pcb->rttest && TCP_SEQ_LT(pcb->rtseq, ackno)) {
-      /* diff between this shouldn't exceed 32K since this are tcp timer ticks
-         and a round-trip shouldn't be that long... */
-      m = (s16_t)(tcp_ticks - pcb->rttest);
-
-      LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: experienced rtt %"U16_F" ticks (%"U16_F" msec).\n",
-                                  m, m * TCP_SLOW_INTERVAL));
-
-      /* This is taken directly from VJs original code in his paper */
-      m = m - (pcb->sa >> 3);
-      pcb->sa += m;
-      if (m < 0) {
-        m = -m;
-      }
-      m = m - (pcb->sv >> 2);
-      pcb->sv += m;
-      pcb->rto = (pcb->sa >> 3) + pcb->sv;
-
-      LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: RTO %"U16_F" (%"U16_F" milliseconds)\n",
-                                  pcb->rto, pcb->rto * TCP_SLOW_INTERVAL));
-
-      pcb->rttest = 0;
-    }
-  }
-
-  /* If the incoming segment contains data, we must process it
-     further unless the pcb already received a FIN.
-     (RFC 793, chapter 3.9, "SEGMENT ARRIVES" in states CLOSE-WAIT, CLOSING,
-     LAST-ACK and TIME-WAIT: "Ignore the segment text.") */
-  if ((tcplen > 0) && (pcb->state < CLOSE_WAIT)) {
-    /* This code basically does three things:
-
-    +) If the incoming segment contains data that is the next
-    in-sequence data, this data is passed to the application. This
-    might involve trimming the first edge of the data. The rcv_nxt
-    variable and the advertised window are adjusted.
-
-    +) If the incoming segment has data that is above the next
-    sequence number expected (->rcv_nxt), the segment is placed on
-    the ->ooseq queue. This is done by finding the appropriate
-    place in the ->ooseq queue (which is ordered by sequence
-    number) and trim the segment in both ends if needed. An
-    immediate ACK is sent to indicate that we received an
-    out-of-sequence segment.
-
-    +) Finally, we check if the first segment on the ->ooseq queue
-    now is in sequence (i.e., if rcv_nxt >= ooseq->seqno). If
-    rcv_nxt > ooseq->seqno, we must trim the first edge of the
-    segment on ->ooseq before we adjust rcv_nxt. The data in the
-    segments that are now on sequence are chained onto the
-    incoming segment so that we only need to call the application
-    once.
-    */
-
-    /* First, we check if we must trim the first edge. We have to do
-       this if the sequence number of the incoming segment is less
-       than rcv_nxt, and the sequence number plus the length of the
-       segment is larger than rcv_nxt. */
-    /*    if (TCP_SEQ_LT(seqno, pcb->rcv_nxt)) {
-          if (TCP_SEQ_LT(pcb->rcv_nxt, seqno + tcplen)) {*/
-    if (TCP_SEQ_BETWEEN(pcb->rcv_nxt, seqno + 1, seqno + tcplen - 1)) {
-      /* Trimming the first edge is done by pushing the payload
-         pointer in the pbuf downwards. This is somewhat tricky since
-         we do not want to discard the full contents of the pbuf up to
-         the new starting point of the data since we have to keep the
-         TCP header which is present in the first pbuf in the chain.
-
-         What is done is really quite a nasty hack: the first pbuf in
-         the pbuf chain is pointed to by inseg.p. Since we need to be
-         able to deallocate the whole pbuf, we cannot change this
-         inseg.p pointer to point to any of the later pbufs in the
-         chain. Instead, we point the ->payload pointer in the first
-         pbuf to data in one of the later pbufs. We also set the
-         inseg.data pointer to point to the right place. This way, the
-         ->p pointer will still point to the first pbuf, but the
-         ->p->payload pointer will point to data in another pbuf.
-
-         After we are done with adjusting the pbuf pointers we must
-         adjust the ->data pointer in the seg and the segment
-         length.*/
-
-      off = pcb->rcv_nxt - seqno;
-      p = inseg.p;
-      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);
-        }
-      }
-      inseg.len -= (u16_t)(pcb->rcv_nxt - seqno);
-      inseg.tcphdr->seqno = seqno = pcb->rcv_nxt;
-    }
-    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 */
-
-        LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: duplicate seqno %"U32_F"\n", seqno));
-        tcp_ack_now(pcb);
-      }
-    }
-
-    /* The sequence number must be within the window (above rcv_nxt
-       and below rcv_nxt + rcv_wnd) in order to be further
-       processed. */
-    if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt,
-                        pcb->rcv_nxt + pcb->rcv_wnd - 1)) {
-      if (pcb->rcv_nxt == seqno) {
-        /* The incoming segment is the next in sequence. We check if
-           we have to trim the end of the segment and update rcv_nxt
-           and pass the data to the application. */
-        tcplen = TCP_TCPLEN(&inseg);
-
-        if (tcplen > pcb->rcv_wnd) {
-          LWIP_DEBUGF(TCP_INPUT_DEBUG,
-                      ("tcp_receive: other end overran receive window"
-                       "seqno %"U32_F" len %"U16_F" right edge %"U32_F"\n",
-                       seqno, tcplen, pcb->rcv_nxt + pcb->rcv_wnd));
-          if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) {
-            /* Must remove the FIN from the header as we're trimming
-             * that byte of sequence-space from the packet */
-            TCPH_FLAGS_SET(inseg.tcphdr, TCPH_FLAGS(inseg.tcphdr) & ~(unsigned int)TCP_FIN);
-          }
-          /* Adjust length of segment to fit in the window. */
-          TCPWND_CHECK16(pcb->rcv_wnd);
-          inseg.len = (u16_t)pcb->rcv_wnd;
-          if (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) {
-            inseg.len -= 1;
-          }
-          pbuf_realloc(inseg.p, inseg.len);
-          tcplen = TCP_TCPLEN(&inseg);
-          LWIP_ASSERT("tcp_receive: segment not trimmed correctly to rcv_wnd\n",
-                      (seqno + tcplen) == (pcb->rcv_nxt + pcb->rcv_wnd));
-        }
-#if TCP_QUEUE_OOSEQ
-        /* Received in-sequence data, adjust ooseq data if:
-           - FIN has been received or
-           - inseq overlaps with ooseq */
-        if (pcb->ooseq != NULL) {
-          if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) {
-            LWIP_DEBUGF(TCP_INPUT_DEBUG,
-                        ("tcp_receive: received in-order FIN, binning ooseq queue\n"));
-            /* Received in-order FIN means anything that was received
-             * out of order must now have been received in-order, so
-             * bin the ooseq queue */
-            while (pcb->ooseq != NULL) {
-              struct tcp_seg *old_ooseq = pcb->ooseq;
-              pcb->ooseq = pcb->ooseq->next;
-              tcp_seg_free(old_ooseq);
-            }
-          } else {
-            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)) {
-              /* inseg cannot have FIN here (already processed above) */
-              if (TCPH_FLAGS(next->tcphdr) & TCP_FIN &&
-                  (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) == 0) {
-                TCPH_SET_FLAG(inseg.tcphdr, TCP_FIN);
-                tcplen = TCP_TCPLEN(&inseg);
-              }
-              prev = next;
-              next = next->next;
-              tcp_seg_free(prev);
-            }
-            /* Now trim right side of inseg if it overlaps with the first
-             * segment on ooseq */
-            if (next &&
-                TCP_SEQ_GT(seqno + tcplen,
-                           next->tcphdr->seqno)) {
-              /* inseg cannot have FIN here (already processed above) */
-              inseg.len = (u16_t)(next->tcphdr->seqno - seqno);
-              if (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) {
-                inseg.len -= 1;
-              }
-              pbuf_realloc(inseg.p, inseg.len);
-              tcplen = TCP_TCPLEN(&inseg);
-              LWIP_ASSERT("tcp_receive: segment not trimmed correctly to ooseq queue\n",
-                          (seqno + tcplen) == next->tcphdr->seqno);
-            }
-            pcb->ooseq = next;
-          }
-        }
-#endif /* TCP_QUEUE_OOSEQ */
-
-        pcb->rcv_nxt = seqno + tcplen;
-
-        /* Update the receiver's (our) window. */
-        LWIP_ASSERT("tcp_receive: tcplen > rcv_wnd\n", pcb->rcv_wnd >= tcplen);
-        pcb->rcv_wnd -= tcplen;
-
-        tcp_update_rcv_ann_wnd(pcb);
-
-        /* If there is data in the segment, we make preparations to
-           pass this up to the application. The ->recv_data variable
-           is used for holding the pbuf that goes to the
-           application. The code for reassembling out-of-sequence data
-           chains its data on this pbuf as well.
-
-           If the segment was a FIN, we set the TF_GOT_FIN flag that will
-           be used to indicate to the application that the remote side has
-           closed its end of the connection. */
-        if (inseg.p->tot_len > 0) {
-          recv_data = inseg.p;
-          /* Since this pbuf now is the responsibility of the
-             application, we delete our reference to it so that we won't
-             (mistakingly) deallocate it. */
-          inseg.p = NULL;
-        }
-        if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) {
-          LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: received FIN.\n"));
-          recv_flags |= TF_GOT_FIN;
-        }
-
-#if TCP_QUEUE_OOSEQ
-        /* We now check if we have segments on the ->ooseq queue that
-           are now in sequence. */
-        while (pcb->ooseq != NULL &&
-               pcb->ooseq->tcphdr->seqno == pcb->rcv_nxt) {
-
-          cseg = pcb->ooseq;
-          seqno = pcb->ooseq->tcphdr->seqno;
-
-          pcb->rcv_nxt += TCP_TCPLEN(cseg);
-          LWIP_ASSERT("tcp_receive: ooseq tcplen > rcv_wnd\n",
-                      pcb->rcv_wnd >= TCP_TCPLEN(cseg));
-          pcb->rcv_wnd -= TCP_TCPLEN(cseg);
-
-          tcp_update_rcv_ann_wnd(pcb);
-
-          if (cseg->p->tot_len > 0) {
-            /* Chain this pbuf onto the pbuf that we will pass to
-               the application. */
-            /* With window scaling, this can overflow recv_data->tot_len, but
-               that's not a problem since we explicitly fix that before passing
-               recv_data to the application. */
-            if (recv_data) {
-              pbuf_cat(recv_data, cseg->p);
-            } else {
-              recv_data = cseg->p;
-            }
-            cseg->p = NULL;
-          }
-          if (TCPH_FLAGS(cseg->tcphdr) & TCP_FIN) {
-            LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: dequeued FIN.\n"));
-            recv_flags |= TF_GOT_FIN;
-            if (pcb->state == ESTABLISHED) { /* force passive close or we can move to active close */
-              pcb->state = CLOSE_WAIT;
-            }
-          }
-
-          pcb->ooseq = cseg->next;
-          tcp_seg_free(cseg);
-        }
-#endif /* TCP_QUEUE_OOSEQ */
-
-
-        /* Acknowledge the segment(s). */
-        tcp_ack(pcb);
-
-#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*/
-
-      } 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);
-        } else {
-          /* If the queue is not empty, we walk through the queue and
-             try to find a place where the sequence number of the
-             incoming segment is between the sequence numbers of the
-             previous and the next segment on the ->ooseq queue. That is
-             the place where we put the incoming segment. If needed, we
-             trim the second edges of the previous and the incoming
-             segment so that it will fit into the sequence.
-
-             If the incoming segment has the same sequence number as a
-             segment on the ->ooseq queue, we discard the segment that
-             contains less data. */
-
-          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
-                 same as the sequence number of the segment on
-                 ->ooseq. We check the lengths to see which one to
-                 discard. */
-              if (inseg.len > next->len) {
-                /* The incoming segment is larger than the old
-                   segment. We replace some segments with the new
-                   one. */
-                cseg = tcp_seg_copy(&inseg);
-                if (cseg != NULL) {
-                  if (prev != NULL) {
-                    prev->next = cseg;
-                  } else {
-                    pcb->ooseq = cseg;
-                  }
-                  tcp_oos_insert_segment(cseg, next);
-                }
-                break;
-              } else {
-                /* Either the lengths are the same or the incoming
-                   segment was smaller than the old one; in either
-                   case, we ditch the incoming segment. */
-                break;
-              }
-            } else {
-              if (prev == NULL) {
-                if (TCP_SEQ_LT(seqno, next->tcphdr->seqno)) {
-                  /* The sequence number of the incoming segment is lower
-                     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);
-                  if (cseg != NULL) {
-                    pcb->ooseq = cseg;
-                    tcp_oos_insert_segment(cseg, next);
-                  }
-                  break;
-                }
-              } 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)) {
-                  /* 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);
-                  if (cseg != NULL) {
-                    if (TCP_SEQ_GT(prev->tcphdr->seqno + prev->len, seqno)) {
-                      /* We need to trim the prev segment. */
-                      prev->len = (u16_t)(seqno - prev->tcphdr->seqno);
-                      pbuf_realloc(prev->p, prev->len);
-                    }
-                    prev->next = cseg;
-                    tcp_oos_insert_segment(cseg, next);
-                  }
-                  break;
-                }
-              }
-              /* If the "next" segment is the last segment on the
-                 ooseq queue, we add the incoming segment to the end
-                 of the list. */
-              if (next->next == NULL &&
-                  TCP_SEQ_GT(seqno, next->tcphdr->seqno)) {
-                if (TCPH_FLAGS(next->tcphdr) & TCP_FIN) {
-                  /* segment "next" already contains all data */
-                  break;
-                }
-                next->next = tcp_seg_copy(&inseg);
-                if (next->next != NULL) {
-                  if (TCP_SEQ_GT(next->tcphdr->seqno + next->len, seqno)) {
-                    /* We need to trim the last segment. */
-                    next->len = (u16_t)(seqno - next->tcphdr->seqno);
-                    pbuf_realloc(next->p, next->len);
-                  }
-                  /* check if the remote side overruns our receive window */
-                  if (TCP_SEQ_GT((u32_t)tcplen + seqno, pcb->rcv_nxt + (u32_t)pcb->rcv_wnd)) {
-                    LWIP_DEBUGF(TCP_INPUT_DEBUG,
-                                ("tcp_receive: other end overran receive window"
-                                 "seqno %"U32_F" len %"U16_F" right edge %"U32_F"\n",
-                                 seqno, tcplen, pcb->rcv_nxt + pcb->rcv_wnd));
-                    if (TCPH_FLAGS(next->next->tcphdr) & TCP_FIN) {
-                      /* Must remove the FIN from the header as we're trimming
-                       * that byte of sequence-space from the packet */
-                      TCPH_FLAGS_SET(next->next->tcphdr, TCPH_FLAGS(next->next->tcphdr) & ~TCP_FIN);
-                    }
-                    /* Adjust length of segment to fit in the window. */
-                    next->next->len = (u16_t)(pcb->rcv_nxt + pcb->rcv_wnd - seqno);
-                    pbuf_realloc(next->next->p, next->next->len);
-                    tcplen = TCP_TCPLEN(next->next);
-                    LWIP_ASSERT("tcp_receive: segment not trimmed correctly to rcv_wnd\n",
-                                (seqno + tcplen) == (pcb->rcv_nxt + pcb->rcv_wnd));
-                  }
-                }
-                break;
-              }
-            }
-            prev = next;
-          }
-        }
-#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_QUEUE_OOSEQ */
-      }
-    } else {
-      /* The incoming segment is not within the window. */
-      tcp_send_empty_ack(pcb);
-    }
-  } else {
-    /* Segments with length 0 is taken care of here. Segments that
-       fall out of the window are ACKed. */
-    if (!TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt + pcb->rcv_wnd - 1)) {
-      tcp_ack_now(pcb);
-    }
-  }
-}
-
-static u8_t
-tcp_getoptbyte(void)
-{
-  if ((tcphdr_opt2 == NULL) || (tcp_optidx < tcphdr_opt1len)) {
-    u8_t* opts = (u8_t *)tcphdr + TCP_HLEN;
-    return opts[tcp_optidx++];
-  } else {
-    u8_t idx = (u8_t)(tcp_optidx++ - tcphdr_opt1len);
-    return tcphdr_opt2[idx];
-  }
-}
-
-/**
- * Parses the options contained in the incoming segment.
- *
- * Called from tcp_listen_input() and tcp_process().
- * Currently, only the MSS option is supported!
- *
- * @param pcb the tcp_pcb for which a segment arrived
- */
-static void
-tcp_parseopt(struct tcp_pcb *pcb)
-{
-  u8_t data;
-  u16_t mss;
-#if LWIP_TCP_TIMESTAMPS
-  u32_t tsval;
-#endif
-
-  /* Parse the TCP MSS option, if present. */
-  if (tcphdr_optlen != 0) {
-    for (tcp_optidx = 0; tcp_optidx < tcphdr_optlen; ) {
-      u8_t opt = tcp_getoptbyte();
-      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"));
-          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;
-        }
-        /* 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)) {
-          /* An WND_SCALE option with the right option length. */
-          data = tcp_getoptbyte();
-          pcb->snd_scale = data;
-          if (pcb->snd_scale > 14U) {
-            pcb->snd_scale = 14U;
-          }
-          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(pcb)));
-          LWIP_ASSERT("window not at default value", pcb->rcv_ann_wnd == TCPWND_MIN16(TCP_WND(pcb)));
-          pcb->rcv_wnd = pcb->rcv_ann_wnd = TCP_WND(pcb);
-        }
-        break;
-#endif
-#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 = 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 = 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;
-      }
-    }
-  }
-}
-
-void
-tcp_trigger_input_pcb_close(void)
-{
-  recv_flags |= TF_CLOSED;
-}
-
-#endif /* LWIP_TCP */
diff --git a/components/lwip/core/tcp_out.c b/components/lwip/core/tcp_out.c
deleted file mode 100644 (file)
index 8eee0fe..0000000
+++ /dev/null
@@ -1,1626 +0,0 @@
-/**
- * @file
- * Transmission Control Protocol, outgoing traffic
- *
- * The output functions of TCP.
- *
- */
-
-/*
- * 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>
- *
- */
-
-#include "lwip/opt.h"
-
-#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/priv/tcp_priv.h"
-#include "lwip/def.h"
-#include "lwip/mem.h"
-#include "lwip/memp.h"
-#include "lwip/ip_addr.h"
-#include "lwip/netif.h"
-#include "lwip/inet_chksum.h"
-#include "lwip/stats.h"
-#include "lwip/ip6.h"
-#include "lwip/ip6_addr.h"
-#include "lwip/inet_chksum.h"
-#if LWIP_TCP_TIMESTAMPS
-#include "lwip/sys.h"
-#endif
-
-#include <string.h>
-
-/* 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
-#define TCP_DATA_COPY(dst, src, len, seg) do { \
-  tcp_seg_add_chksum(LWIP_CHKSUM_COPY(dst, src, len), \
-                     len, &seg->chksum, &seg->chksum_swapped); \
-  seg->flags |= TF_SEG_DATA_CHECKSUMMED; } while(0)
-#define TCP_DATA_COPY2(dst, src, len, chksum, chksum_swapped)  \
-  tcp_seg_add_chksum(LWIP_CHKSUM_COPY(dst, src, len), len, chksum, chksum_swapped);
-#else /* TCP_CHECKSUM_ON_COPY*/
-#define TCP_DATA_COPY(dst, src, len, seg)                     MEMCPY(dst, src, len)
-#define TCP_DATA_COPY2(dst, src, len, chksum, chksum_swapped) MEMCPY(dst, src, len)
-#endif /* TCP_CHECKSUM_ON_COPY*/
-
-/** Define this to 1 for an extra check that the output checksum is valid
- * (usefule when the checksum is generated by the application, not the stack) */
-#ifndef TCP_CHECKSUM_ON_COPY_SANITY_CHECK
-#define TCP_CHECKSUM_ON_COPY_SANITY_CHECK   0
-#endif
-/* Allow to override the failure of sanity check from warning to e.g. hard failure */
-#if TCP_CHECKSUM_ON_COPY_SANITY_CHECK
-#ifndef TCP_CHECKSUM_ON_COPY_SANITY_CHECK_FAIL
-#define TCP_CHECKSUM_ON_COPY_SANITY_CHECK_FAIL(msg) LWIP_DEBUGF(TCP_DEBUG | LWIP_DBG_LEVEL_WARNING, msg)
-#endif
-#endif
-
-#if TCP_OVERSIZE
-/** The size of segment pbufs created when TCP_OVERSIZE is enabled */
-#ifndef TCP_OVERSIZE_CALC_LENGTH
-#define TCP_OVERSIZE_CALC_LENGTH(length) ((length) + TCP_OVERSIZE)
-#endif
-#endif
-
-/* Forward declarations.*/
-static err_t tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb);
-
-/** 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 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 = htons(pcb->local_port);
-    tcphdr->dest = htons(pcb->remote_port);
-    tcphdr->seqno = seqno_be;
-    tcphdr->ackno = htonl(pcb->rcv_nxt);
-    TCPH_HDRLEN_FLAGS_SET(tcphdr, (5 + optlen / 4), TCP_ACK);
-    tcphdr->wnd = htons(TCPWND_MIN16(RCV_WND_SCALE(pcb, pcb->rcv_ann_wnd)));
-    tcphdr->chksum = 0;
-    tcphdr->urgp = 0;
-
-    /* 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;
-}
-
-/**
- * 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.
- *
- * @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 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.
- * The TCP header is filled in except ackno and wnd.
- * 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)
-{
-  struct tcp_seg *seg;
-  u8_t optlen = LWIP_TCP_OPT_LENGTH(optflags);
-
-  seg = (struct tcp_seg *)memp_malloc(MEMP_TCP_SEG);
-  if (seg == NULL) {
-    LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("tcp_create_segment: no memory.\n"));
-    pbuf_free(p);
-    return NULL;
-  }
-  seg->flags = optflags;
-  seg->next = NULL;
-  seg->p = p;
-  LWIP_ASSERT("p->tot_len >= optlen", p->tot_len >= optlen);
-  seg->len = p->tot_len - optlen;
-#if TCP_OVERSIZE_DBGCHECK
-  seg->oversize_left = 0;
-#endif /* TCP_OVERSIZE_DBGCHECK */
-#if TCP_CHECKSUM_ON_COPY
-  seg->chksum = 0;
-  seg->chksum_swapped = 0;
-  /* check optflags */
-  LWIP_ASSERT("invalid optflags passed: TF_SEG_DATA_CHECKSUMMED",
-              (optflags & TF_SEG_DATA_CHECKSUMMED) == 0);
-#endif /* TCP_CHECKSUM_ON_COPY */
-
-  /* build TCP header */
-  if (pbuf_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);
-    return NULL;
-  }
-  seg->tcphdr = (struct tcp_hdr *)seg->p->payload;
-  seg->tcphdr->src = htons(pcb->local_port);
-  seg->tcphdr->dest = htons(pcb->remote_port);
-  seg->tcphdr->seqno = htonl(seqno);
-  /* ackno is set in tcp_output */
-  TCPH_HDRLEN_FLAGS_SET(seg->tcphdr, (5 + optlen / 4), flags);
-  /* wnd and chksum are set in tcp_output */
-  seg->tcphdr->urgp = 0;
-
-  return seg;
-}
-
-/**
- * Allocate a PBUF_RAM pbuf, perhaps with extra space at the end.
- *
- * This function is like pbuf_alloc(layer, length, PBUF_RAM) except
- * there may be extra bytes available at the end.
- *
- * @param layer flag to define header size.
- * @param length size of the pbuf's payload.
- * @param max_length maximum usable size of payload+oversize.
- * @param oversize pointer to a u16_t that will receive the number of usable tail bytes.
- * @param pcb The TCP connection that willo enqueue the pbuf.
- * @param apiflags API flags given to tcp_write.
- * @param first_seg true when this pbuf will be used in the first enqueued segment.
- */
-#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,
-                  u8_t first_seg)
-{
-  struct pbuf *p;
-  u16_t alloc = length;
-
-#if LWIP_NETIF_TX_SINGLE_PBUF
-  LWIP_UNUSED_ARG(max_length);
-  LWIP_UNUSED_ARG(pcb);
-  LWIP_UNUSED_ARG(apiflags);
-  LWIP_UNUSED_ARG(first_seg);
-  /* always create MSS-sized pbufs */
-  alloc = max_length;
-#else /* LWIP_NETIF_TX_SINGLE_PBUF */
-  if (length < max_length) {
-    /* Should we allocate an oversized pbuf, or just the minimum
-     * length required? If tcp_write is going to be called again
-     * before this segment is transmitted, we want the oversized
-     * buffer. If the segment will be transmitted immediately, we can
-     * save memory by allocating only length. We use a simple
-     * heuristic based on the following information:
-     *
-     * Did the user set TCP_WRITE_FLAG_MORE?
-     *
-     * Will the Nagle algorithm defer transmission of this segment?
-     */
-    if ((apiflags & TCP_WRITE_FLAG_MORE) ||
-        (!(pcb->flags & TF_NODELAY) &&
-         (!first_seg ||
-          pcb->unsent != NULL ||
-          pcb->unacked != NULL))) {
-      alloc = LWIP_MIN(max_length, LWIP_MEM_ALIGN_SIZE(TCP_OVERSIZE_CALC_LENGTH(length)));
-    }
-  }
-#endif /* LWIP_NETIF_TX_SINGLE_PBUF */
-  p = pbuf_alloc(layer, alloc, PBUF_RAM);
-  if (p == NULL) {
-    return NULL;
-  }
-  LWIP_ASSERT("need unchained pbuf", p->next == NULL);
-  *oversize = p->len - length;
-  /* trim p->len to the currently used size */
-  p->len = p->tot_len = length;
-  return p;
-}
-#else /* TCP_OVERSIZE */
-#define tcp_pbuf_prealloc(layer, length, mx, os, pcb, api, fst) pbuf_alloc((layer), (length), PBUF_RAM)
-#endif /* TCP_OVERSIZE */
-
-#if TCP_CHECKSUM_ON_COPY
-/** Add a checksum of newly added data to the segment */
-static void
-tcp_seg_add_chksum(u16_t chksum, u16_t len, u16_t *seg_chksum,
-                   u8_t *seg_chksum_swapped)
-{
-  u32_t helper;
-  /* add chksum to old chksum and fold to u16_t */
-  helper = chksum + *seg_chksum;
-  chksum = FOLD_U32T(helper);
-  if ((len & 1) != 0) {
-    *seg_chksum_swapped = 1 - *seg_chksum_swapped;
-    chksum = SWAP_BYTES_IN_WORD(chksum);
-  }
-  *seg_chksum = chksum;
-}
-#endif /* TCP_CHECKSUM_ON_COPY */
-
-/** Checks if tcp_write is allowed or not (checks state, snd_buf and snd_queuelen).
- *
- * @param pcb the tcp pcb to check for
- * @param len length of data to send (checked agains snd_buf)
- * @return ERR_OK if tcp_write is allowed to proceed, another err_t otherwise
- */
-static err_t
-tcp_write_checks(struct tcp_pcb *pcb, u16_t len)
-{
-  /* connection is in invalid state for data transmission? */
-  if ((pcb->state != ESTABLISHED) &&
-      (pcb->state != CLOSE_WAIT) &&
-      (pcb->state != SYN_SENT) &&
-      (pcb->state != SYN_RCVD)) {
-    LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_STATE | LWIP_DBG_LEVEL_SEVERE, ("tcp_write() called in invalid state\n"));
-    return ERR_CONN;
-  } else if (len == 0) {
-    return ERR_OK;
-  }
-
-  /* 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;
-    return ERR_MEM;
-  }
-
-  LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_write: queuelen: %"TCPWNDSIZE_F"\n", (tcpwnd_size_t)pcb->snd_queuelen));
-
-  /* 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)) || (pcb->snd_queuelen > TCP_SNDQUEUELEN_OVERFLOW)) {
-    LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("tcp_write: too long queue %"U16_F" (max %"U16_F")\n",
-      pcb->snd_queuelen, TCP_SND_QUEUELEN(pcb)));
-    TCP_STATS_INC(tcp.memerr);
-    pcb->flags |= 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);
-  } else {
-    LWIP_ASSERT("tcp_write: no pbufs on queue => both queues empty",
-      pcb->unacked == NULL && pcb->unsent == NULL);
-  }
-  return ERR_OK;
-}
-
-/**
- * Write data for sending (but does not send it immediately).
- *
- * 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 tcp_output() after
- * calling tcp_write().
- *
- * @param pcb Protocol control block for the TCP connection to enqueue data for.
- * @param arg Pointer to the data to be enqueued for sending.
- * @param len Data length in bytes
- * @param apiflags combination of following flags :
- * - TCP_WRITE_FLAG_COPY (0x01) data will be copied into memory belonging to the stack
- * - TCP_WRITE_FLAG_MORE (0x02) for TCP connection, PSH flag will not be set on last segment sent,
- * @return ERR_OK if enqueued, another err_t on error
- */
-err_t
-tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags)
-{
-  struct pbuf *concat_p = NULL;
-  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 optflags = 0;
-#if TCP_OVERSIZE
-  u16_t oversize = 0;
-  u16_t oversize_used = 0;
-#endif /* TCP_OVERSIZE */
-#if TCP_CHECKSUM_ON_COPY
-  u16_t concat_chksum = 0;
-  u8_t concat_chksum_swapped = 0;
-  u16_t concat_chksummed = 0;
-#endif /* TCP_CHECKSUM_ON_COPY */
-  err_t err;
-  /* 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 = mss_local ? mss_local : pcb->mss;
-
-#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));
-  LWIP_ERROR("tcp_write: arg == NULL (programmer violates API)",
-             arg != NULL, return ERR_ARG;);
-
-  err = tcp_write_checks(pcb, len);
-  if (err != ERR_OK) {
-    return err;
-  }
-  queuelen = pcb->snd_queuelen;
-
-#if LWIP_TCP_TIMESTAMPS
-  if ((pcb->flags & TF_TIMESTAMP)) {
-    /* 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);
-    /* ensure that segments can hold at least one data byte... */
-    mss_local = LWIP_MAX(mss_local, LWIP_TCP_OPT_LEN_TS + 1);
-  }
-#endif /* LWIP_TCP_TIMESTAMPS */
-
-
-  /*
-   * TCP segmentation is done in three phases with increasing complexity:
-   *
-   * 1. Copy data directly into an oversized pbuf.
-   * 2. Chain a new pbuf to the end of pcb->unsent.
-   * 3. Create new segments.
-   *
-   * We may run out of memory at any point. In that case we must
-   * return ERR_MEM and not change anything in pcb. Therefore, all
-   * changes are recorded in local variables and committed at the end
-   * of the function. Some pcb fields are maintained in local copies:
-   *
-   * queuelen = pcb->snd_queuelen
-   * oversize = pcb->unsent_oversize
-   *
-   * These variables are set consistently by the phases:
-   *
-   * seg points to the last segment tampered with.
-   *
-   * pos records progress as data is segmented.
-   */
-
-  /* Find the tail of the unsent queue. */
-  if (pcb->unsent != NULL) {
-    u16_t space;
-    u16_t unsent_optlen;
-
-    /* @todo: this could be sped up by keeping last_unsent in the pcb */
-    for (last_unsent = pcb->unsent; last_unsent->next != NULL;
-         last_unsent = last_unsent->next);
-
-    /* Usable space at the end of the last unsent segment */
-    unsent_optlen = LWIP_TCP_OPT_LENGTH(last_unsent->flags);
-    LWIP_ASSERT("mss_local is too small", mss_local >= last_unsent->len + unsent_optlen);
-    space = mss_local - (last_unsent->len + unsent_optlen);
-
-    /*
-     * Phase 1: Copy data directly into an oversized pbuf.
-     *
-     * The number of bytes copied is recorded in the oversize_used
-     * variable. The actual copying is done at the bottom of the
-     * function.
-     */
-#if TCP_OVERSIZE
-#if TCP_OVERSIZE_DBGCHECK
-    /* check that pcb->unsent_oversize matches last_unsent->unsent_oversize */
-    LWIP_ASSERT("unsent_oversize mismatch (pcb vs. last_unsent)",
-                pcb->unsent_oversize == last_unsent->oversize_left);
-#endif /* TCP_OVERSIZE_DBGCHECK */
-    oversize = pcb->unsent_oversize;
-    if (oversize > 0) {
-      LWIP_ASSERT("inconsistent oversize vs. space", oversize_used <= space);
-      seg = last_unsent;
-      oversize_used = oversize < len ? oversize : len;
-      pos += oversize_used;
-      oversize -= oversize_used;
-      space -= oversize_used;
-    }
-    /* now we are either finished or oversize is zero */
-    LWIP_ASSERT("inconsistend oversize vs. len", (oversize == 0) || (pos == len));
-#endif /* TCP_OVERSIZE */
-
-    /*
-     * Phase 2: Chain a new pbuf to the end of pcb->unsent.
-     *
-     * 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.
-     */
-    if ((pos < len) && (space > 0) && (last_unsent->len > 0)) {
-      u16_t seglen = space < len - pos ? space : len - pos;
-      seg = last_unsent;
-
-      /* Create a pbuf with a copy or reference to seglen bytes. We
-       * can use PBUF_RAW here since the data appears in the middle of
-       * a segment. A header will never be prepended. */
-      if (apiflags & TCP_WRITE_FLAG_COPY) {
-        /* Data is copied */
-        if ((concat_p = tcp_pbuf_prealloc(PBUF_RAW, seglen, space, &oversize, pcb, apiflags, 1)) == NULL) {
-          LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
-                      ("tcp_write : could not allocate memory for pbuf copy size %"U16_F"\n",
-                       seglen));
-          goto memerr;
-        }
-#if TCP_OVERSIZE_DBGCHECK
-        last_unsent->oversize_left += oversize;
-#endif /* TCP_OVERSIZE_DBGCHECK */
-        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 */
-      } else {
-        /* Data is not copied */
-        if ((concat_p = pbuf_alloc(PBUF_RAW, seglen, PBUF_ROM)) == NULL) {
-          LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
-                      ("tcp_write: could not allocate memory for zero-copy pbuf\n"));
-          goto memerr;
-        }
-#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);
-        concat_chksummed += seglen;
-#endif /* TCP_CHECKSUM_ON_COPY */
-        /* reference the non-volatile payload data */
-        ((struct pbuf_rom*)concat_p)->payload = (const u8_t*)arg + pos;
-      }
-
-      pos += seglen;
-      queuelen += pbuf_clen(concat_p);
-    }
-  } else {
-#if TCP_OVERSIZE
-    LWIP_ASSERT("unsent_oversize mismatch (pcb->unsent is NULL)",
-                pcb->unsent_oversize == 0);
-#endif /* TCP_OVERSIZE */
-  }
-
-  /*
-   * Phase 3: Create new segments.
-   *
-   * The new segments are chained together in the local 'queue'
-   * variable, ready to be appended to pcb->unsent.
-   */
-  while (pos < len) {
-    struct pbuf *p;
-    u16_t left = len - pos;
-    u16_t max_len = mss_local - optlen;
-    u16_t seglen = left > max_len ? max_len : left;
-#if TCP_CHECKSUM_ON_COPY
-    u16_t chksum = 0;
-    u8_t chksum_swapped = 0;
-#endif /* TCP_CHECKSUM_ON_COPY */
-
-    if (apiflags & TCP_WRITE_FLAG_COPY) {
-      /* If copy is set, memory should be allocated and data copied
-       * into pbuf */
-      if ((p = tcp_pbuf_prealloc(PBUF_TRANSPORT, seglen + optlen, mss_local, &oversize, pcb, apiflags, queue == NULL)) == NULL) {
-        LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("tcp_write : could not allocate memory for pbuf copy size %"U16_F"\n", seglen));
-        goto memerr;
-      }
-      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);
-    } else {
-      /* Copy is not set: First allocate a pbuf for holding the data.
-       * Since the referenced data is available at least until it is
-       * sent out on the link (as it has to be ACKed by the remote
-       * party) we can safely use PBUF_ROM instead of PBUF_REF here.
-       */
-      struct pbuf *p2;
-#if TCP_OVERSIZE
-      LWIP_ASSERT("oversize == 0", oversize == 0);
-#endif /* TCP_OVERSIZE */
-      if ((p2 = pbuf_alloc(PBUF_TRANSPORT, seglen, PBUF_ROM)) == NULL) {
-        LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("tcp_write: could not allocate memory for zero-copy pbuf\n"));
-        goto memerr;
-      }
-#if TCP_CHECKSUM_ON_COPY
-      /* calculate the checksum of nocopy-data */
-      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;
-
-      /* Second, allocate a pbuf for the headers. */
-      if ((p = pbuf_alloc(PBUF_TRANSPORT, optlen, PBUF_RAM)) == NULL) {
-        /* If allocation fails, we have to deallocate the data pbuf as
-         * well. */
-        pbuf_free(p2);
-        LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("tcp_write: could not allocate memory for header pbuf\n"));
-        goto memerr;
-      }
-      /* Concatenate the headers and data pbufs together. */
-      pbuf_cat(p/*header*/, p2/*data*/);
-    }
-
-    queuelen += pbuf_clen(p);
-
-    /* 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(pcb)) || (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(pcb)));
-      pbuf_free(p);
-      goto memerr;
-    }
-
-    if ((seg = tcp_create_segment(pcb, p, 0, pcb->snd_lbb + pos, optflags)) == NULL) {
-      goto memerr;
-    }
-#if TCP_OVERSIZE_DBGCHECK
-    seg->oversize_left = oversize;
-#endif /* TCP_OVERSIZE_DBGCHECK */
-#if TCP_CHECKSUM_ON_COPY
-    seg->chksum = chksum;
-    seg->chksum_swapped = chksum_swapped;
-    seg->flags |= TF_SEG_DATA_CHECKSUMMED;
-#endif /* TCP_CHECKSUM_ON_COPY */
-
-    /* first segment of to-be-queued data? */
-    if (queue == NULL) {
-      queue = seg;
-    } else {
-      /* Attach the segment to the end of the queued segments */
-      LWIP_ASSERT("prev_seg != NULL", prev_seg != NULL);
-      prev_seg->next = seg;
-    }
-    /* remember last segment of to-be-queued data for next iteration */
-    prev_seg = seg;
-
-    LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_TRACE, ("tcp_write: queueing %"U32_F":%"U32_F"\n",
-      ntohl(seg->tcphdr->seqno),
-      ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg)));
-
-    pos += seglen;
-  }
-
-  /*
-   * All three segmentation phases were successful. We can commit the
-   * transaction.
-   */
-
-  /*
-   * Phase 1: If data has been added to the preallocated tail of
-   * last_unsent, we update the length fields of the pbuf chain.
-   */
-#if TCP_OVERSIZE
-  if (oversize_used > 0) {
-    struct pbuf *p;
-    /* Bump tot_len of whole chain, len of tail */
-    for (p = last_unsent->p; p; p = p->next) {
-      p->tot_len += oversize_used;
-      if (p->next == NULL) {
-        TCP_DATA_COPY((char *)p->payload + p->len, arg, oversize_used, last_unsent);
-        p->len += oversize_used;
-      }
-    }
-    last_unsent->len += oversize_used;
-#if TCP_OVERSIZE_DBGCHECK
-    LWIP_ASSERT("last_unsent->oversize_left >= oversize_used",
-                last_unsent->oversize_left >= oversize_used);
-    last_unsent->oversize_left -= oversize_used;
-#endif /* TCP_OVERSIZE_DBGCHECK */
-  }
-  pcb->unsent_oversize = oversize;
-#endif /* TCP_OVERSIZE */
-
-  /*
-   * Phase 2: concat_p can be concatenated onto last_unsent->p
-   */
-  if (concat_p != NULL) {
-    LWIP_ASSERT("tcp_write: cannot concatenate when pcb->unsent is empty",
-      (last_unsent != NULL));
-    pbuf_cat(last_unsent->p, concat_p);
-    last_unsent->len += concat_p->tot_len;
-#if TCP_CHECKSUM_ON_COPY
-    if (concat_chksummed) {
-      /*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->flags |= TF_SEG_DATA_CHECKSUMMED;
-    }
-#endif /* TCP_CHECKSUM_ON_COPY */
-  }
-
-  /*
-   * Phase 3: Append queue to pcb->unsent. Queue may be NULL, but that
-   * is harmless
-   */
-  if (last_unsent == NULL) {
-    pcb->unsent = queue;
-  } else {
-    last_unsent->next = queue;
-  }
-
-  /*
-   * Finally update the pcb state.
-   */
-  pcb->snd_lbb += len;
-  pcb->snd_buf -= len;
-  pcb->snd_queuelen = queuelen;
-
-  LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_write: %"S16_F" (after enqueued)\n",
-    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)) {
-    TCPH_SET_FLAG(seg->tcphdr, TCP_PSH);
-  }
-
-  return ERR_OK;
-memerr:
-  pcb->flags |= TF_NAGLEMEMERR;
-  TCP_STATS_INC(tcp.memerr);
-
-  if (concat_p != NULL) {
-    pbuf_free(concat_p);
-  }
-  if (queue != NULL) {
-    tcp_segs_free(queue);
-  }
-  if (pcb->snd_queuelen != 0) {
-    LWIP_ASSERT("tcp_write: valid queue length", pcb->unacked != 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.
- *
- * Called by tcp_connect(), tcp_listen_input(), and tcp_send_ctrl().
- *
- * @param pcb Protocol control block for the TCP connection.
- * @param flags TCP header flags to set in the outgoing segment.
- * @param optdata pointer to TCP options, or NULL.
- * @param optlen length of TCP options in bytes.
- */
-err_t
-tcp_enqueue_flags(struct tcp_pcb *pcb, u8_t flags)
-{
-  struct pbuf *p;
-  struct tcp_seg *seg;
-  u8_t optflags = 0;
-  u8_t optlen = 0;
-
-  LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_enqueue_flags: queuelen: %"U16_F"\n", (u16_t)pcb->snd_queuelen));
-
-  LWIP_ASSERT("tcp_enqueue_flags: need either TCP_SYN or TCP_FIN in flags (programmer violates API)",
-              (flags & (TCP_SYN | TCP_FIN)) != 0);
-
-  /* check for configured max queuelen and possible overflow (FIN flag should always come through!) */
-  if (((pcb->snd_queuelen >= TCP_SND_QUEUELEN(pcb)) || (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, TCP_SND_QUEUELEN(pcb)));
-    TCP_STATS_INC(tcp.memerr);
-    pcb->flags |= TF_NAGLEMEMERR;
-    return ERR_MEM;
-  }
-
-  if (flags & TCP_SYN) {
-    optflags = TF_SEG_OPTS_MSS;
-#if LWIP_WND_SCALE
-    if ((pcb->state != SYN_RCVD) || (pcb->flags & TF_WND_SCALE)) {
-      /* In a <SYN,ACK> (sent in state SYN_RCVD), the window scale option may only
-         be sent if we received a window scale option from the remote host. */
-      optflags |= TF_SEG_OPTS_WND_SCALE;
-    }
-#endif /* LWIP_WND_SCALE */
-  }
-#if LWIP_TCP_TIMESTAMPS
-  if ((pcb->flags & TF_TIMESTAMP)) {
-    /* 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;
-  }
-#endif /* LWIP_TCP_TIMESTAMPS */
-  optlen = LWIP_TCP_OPT_LENGTH(optflags);
-
-  /* tcp_enqueue_flags is always called with either SYN or FIN in flags.
-   * We need one available snd_buf byte to do that.
-   * This means we can't send FIN while snd_buf==0. A better fix would be to
-   * not include SYN and FIN sequence numbers in the snd_buf count. */
-  if (pcb->snd_buf == 0) {
-    LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("tcp_enqueue_flags: no send buffer available\n"));
-    TCP_STATS_INC(tcp.memerr);
-    return ERR_MEM;
-  }
-
-  /* Allocate pbuf with room for TCP header + options */
-  if ((p = pbuf_alloc(PBUF_TRANSPORT, optlen, PBUF_RAM)) == NULL) {
-    pcb->flags |= TF_NAGLEMEMERR;
-    TCP_STATS_INC(tcp.memerr);
-    return ERR_MEM;
-  }
-  LWIP_ASSERT("tcp_enqueue_flags: check that first pbuf can hold optlen",
-              (p->len >= optlen));
-
-  /* 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_STATS_INC(tcp.memerr);
-    return ERR_MEM;
-  }
-  LWIP_ASSERT("seg->tcphdr not aligned", ((mem_ptr_t)seg->tcphdr % LWIP_MIN(MEM_ALIGNMENT, 4)) == 0);
-  LWIP_ASSERT("tcp_enqueue_flags: invalid segment length", seg->len == 0);
-
-  LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_TRACE,
-              ("tcp_enqueue_flags: queueing %"U32_F":%"U32_F" (0x%"X16_F")\n",
-               ntohl(seg->tcphdr->seqno),
-               ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg),
-               (u16_t)flags));
-
-  /* Now append seg to pcb->unsent queue */
-  if (pcb->unsent == NULL) {
-    pcb->unsent = seg;
-  } else {
-    struct tcp_seg *useg;
-    for (useg = pcb->unsent; useg->next != NULL; useg = useg->next);
-    useg->next = seg;
-  }
-#if TCP_OVERSIZE
-  /* The new unsent tail has no space */
-  pcb->unsent_oversize = 0;
-#endif /* TCP_OVERSIZE */
-
-  /* SYN and FIN bump the sequence number */
-  if ((flags & TCP_SYN) || (flags & TCP_FIN)) {
-    pcb->snd_lbb++;
-    /* optlen does not influence snd_buf */
-    pcb->snd_buf--;
-  }
-  if (flags & TCP_FIN) {
-    pcb->flags |= TF_FIN;
-  }
-
-  /* update number of segments on the queues */
-  pcb->snd_queuelen += pbuf_clen(seg->p);
-  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);
-  }
-
-  return ERR_OK;
-}
-
-#if LWIP_TCP_TIMESTAMPS
-/* Build a timestamp option (12 bytes long) at the specified options pointer)
- *
- * @param pcb tcp_pcb
- * @param opts option pointer where to store the timestamp option
- */
-static void
-tcp_build_timestamp_option(struct tcp_pcb *pcb, u32_t *opts)
-{
-  /* Pad with two NOP options to make everything nicely aligned */
-  opts[0] = PP_HTONL(0x0101080A);
-  opts[1] = htonl(sys_now());
-  opts[2] = htonl(pcb->ts_recent);
-}
-#endif
-
-#if LWIP_WND_SCALE
-/** Build a window scale option (3 bytes long) at the specified options pointer)
- *
- * @param opts option pointer where to store the window scale option
- */
-static void
-tcp_build_wnd_scale_option(u32_t *opts)
-{
-  /* 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, 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;
-}
-
-/**
- * Find out what we can send and send it
- *
- * @param pcb Protocol control block for the TCP connection to send data
- * @return ERR_OK if data has been sent or nothing to send
- *         another err_t on error
- */
-err_t
-tcp_output(struct tcp_pcb *pcb)
-{
-  struct tcp_seg *seg, *useg;
-  u32_t wnd, snd_nxt;
-  err_t err;
-#if TCP_CWND_DEBUG
-  s16_t i = 0;
-#endif /* TCP_CWND_DEBUG */
-
-
-  /* pcb->state LISTEN not allowed here */
-  LWIP_ASSERT("don't call tcp_output for listen-pcbs",
-    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
-     input processing code to call us when input processing is done
-     with. */
-  if (tcp_input_pcb == pcb) {
-
-    return ERR_OK;
-  }
-
-  wnd = LWIP_MIN(pcb->snd_wnd, pcb->cwnd);
-
-  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 ||
-      ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > wnd)) {
-     return tcp_send_empty_ack(pcb);
-  }
-
-  /* useg should point to last segment on unacked queue */
-  useg = pcb->unacked;
-  if (useg != NULL) {
-    for (; useg->next != NULL; useg = useg->next);
-  }
-
-#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,
-                 ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len,
-                 ntohl(seg->tcphdr->seqno), pcb->lastack));
-  }
-#endif /* TCP_CWND_DEBUG */
-  /* data available and window allows it to be sent? */
-  while (seg != NULL &&
-         ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len <= wnd) {
-    LWIP_ASSERT("RST not expected here!",
-                (TCPH_FLAGS(seg->tcphdr) & TCP_RST) == 0);
-    /* Stop sending if the nagle algorithm would prevent it
-     * Don't stop:
-     * - if tcp_write had a memory error before (prevent delayed ACK timeout) or
-     * - if FIN was already enqueued for this PCB (SYN is always alone in a segment -
-     *   either seg->next != NULL or pcb->unacked == NULL;
-     *   RST is no sent using tcp_write/tcp_output.
-     */
-    if((tcp_do_output_nagle(pcb) == 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,
-                            ntohl(seg->tcphdr->seqno) + seg->len -
-                            pcb->lastack,
-                            ntohl(seg->tcphdr->seqno), pcb->lastack, i));
-    ++i;
-#endif /* TCP_CWND_DEBUG */
-
-    if (pcb->state != SYN_SENT) {
-      TCPH_SET_FLAG(seg->tcphdr, TCP_ACK);
-    }
-
-#if TCP_OVERSIZE_DBGCHECK
-    seg->oversize_left = 0;
-    if (seg->next == NULL) {
-      pcb->unsent_oversize = 0;
-    }
-#endif /* TCP_OVERSIZE_DBGCHECK */
-    err = tcp_output_segment(seg, pcb);
-    if (err != ERR_OK) {
-      /* segment could not be sent, for whatever reason */
-      pcb->flags |= TF_NAGLEMEMERR;
-      return err;
-    }
-    pcb->unsent = seg->next;
-    if (pcb->state != SYN_SENT) {
-      pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
-    }
-    snd_nxt = ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg);
-    if (TCP_SEQ_LT(pcb->snd_nxt, snd_nxt)) {
-      pcb->snd_nxt = snd_nxt;
-    }
-    /* put segment on unacknowledged list if length > 0 */
-    if (TCP_TCPLEN(seg) > 0) {
-      seg->next = NULL;
-      /* unacked list is empty? */
-      if (pcb->unacked == NULL) {
-        pcb->unacked = seg;
-        useg = seg;
-      /* 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
-         * this case. -STJ Jul 27, 2004 */
-        if (TCP_SEQ_LT(ntohl(seg->tcphdr->seqno), ntohl(useg->tcphdr->seqno))) {
-          /* 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(ntohl((*cur_seg)->tcphdr->seqno), ntohl(seg->tcphdr->seqno))) {
-              cur_seg = &((*cur_seg)->next );
-          }
-          seg->next = (*cur_seg);
-          (*cur_seg) = seg;
-        } else {
-          /* add segment to tail of unacked list */
-          useg->next = seg;
-          useg = useg->next;
-        }
-      }
-    /* do not queue empty segments on the unacked list */
-    } else {
-      tcp_seg_free(seg);
-    }
-    seg = pcb->unsent;
-  }
-#if TCP_OVERSIZE
-  if (pcb->unsent == NULL) {
-    /* last unsent has been removed, reset unsent_oversize */
-    pcb->unsent_oversize = 0;
-  }
-#endif /* TCP_OVERSIZE */
-
-  pcb->flags &= ~TF_NAGLEMEMERR;
-  return ERR_OK;
-}
-
-/**
- * Called by tcp_output() to actually send a TCP segment over IP.
- *
- * @param seg the tcp_seg to send
- * @param pcb the tcp_pcb for the TCP connection used to send the segment
- */
-static err_t
-tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb)
-{
-  err_t err;
-  u16_t len;
-  u32_t *opts;
-  struct netif *netif;
-
-  /** @bug Exclude retransmitted segments from this count. */
-  MIB2_STATS_INC(mib2.tcpoutsegs);
-
-  /* The TCP header has already been constructed, but the ackno and
-   wnd fields remain. */
-  seg->tcphdr->ackno = htonl(pcb->rcv_nxt);
-
-  /* advertise our receive window size in this TCP segment */
-#if LWIP_WND_SCALE
-  if (seg->flags & TF_SEG_OPTS_WND_SCALE) {
-    /* The Window field in a SYN segment itself (the only type where we send
-       the window scale option) is never scaled. */
-    seg->tcphdr->wnd = htons(TCPWND_MIN16(pcb->rcv_ann_wnd));
-  } else
-#endif /* LWIP_WND_SCALE */
-  {
-    seg->tcphdr->wnd = htons(TCPWND_MIN16(RCV_WND_SCALE(pcb, pcb->rcv_ann_wnd)));
-  }
-
-  pcb->rcv_ann_right_edge = pcb->rcv_nxt + pcb->rcv_ann_wnd;
-
-  /* Add any requested options.  NB MSS option is only set on SYN
-     packets, so ignore it here */
-  opts = (u32_t *)(void *)(seg->tcphdr + 1);
-  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);
-#else /* TCP_CALCULATE_EFF_SEND_MSS */
-    mss = TCP_MSS;
-#endif /* TCP_CALCULATE_EFF_SEND_MSS */
-    *opts = TCP_BUILD_MSS_OPTION(mss);
-    opts += 1;
-  }
-#if LWIP_TCP_TIMESTAMPS
-  pcb->ts_lastacksent = pcb->rcv_nxt;
-
-  if (seg->flags & TF_SEG_OPTS_TS) {
-    tcp_build_timestamp_option(pcb, opts);
-    opts += 3;
-  }
-#endif
-#if LWIP_WND_SCALE
-  if (seg->flags & TF_SEG_OPTS_WND_SCALE) {
-    tcp_build_wnd_scale_option(opts);
-    opts += 1;
-  }
-#endif
-
-  /* Set retransmission timer running if it is not currently enabled
-     This must be set before checking the route. */
-  if (pcb->rtime == -1) {
-    pcb->rtime = 0;
-  }
-
-  netif = ip_route(&pcb->local_ip, &pcb->remote_ip);
-  if (netif == NULL) {
-    return ERR_RTE;
-  }
-
-  /* If we don't have a local IP address, we get one from netif */
-  if (ip_addr_isany(&pcb->local_ip)) {
-    const ip_addr_t *local_ip = ip_netif_get_local_ip(netif, &pcb->remote_ip);
-    if (local_ip == NULL) {
-      return ERR_RTE;
-    }
-    ip_addr_copy(pcb->local_ip, *local_ip);
-  }
-
-  if (pcb->rttest == 0) {
-    pcb->rttest = tcp_ticks;
-    pcb->rtseq = ntohl(seg->tcphdr->seqno);
-
-    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",
-          htonl(seg->tcphdr->seqno), htonl(seg->tcphdr->seqno) +
-          seg->len));
-
-  len = (u16_t)((u8_t *)seg->tcphdr - (u8_t *)seg->p->payload);
-
-  seg->p->len -= len;
-  seg->p->tot_len -= len;
-
-  seg->p->payload = seg->tcphdr;
-
-  seg->tcphdr->chksum = 0;
-#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);
-#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));
-    }
-
-    /* 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);
-    /* add payload checksum */
-    if (seg->chksum_swapped) {
-      seg->chksum = SWAP_BYTES_IN_WORD(seg->chksum);
-      seg->chksum_swapped = 0;
-    }
-    acc += (u16_t)~(seg->chksum);
-    seg->tcphdr->chksum = 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));
-      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);
-#endif /* TCP_CHECKSUM_ON_COPY */
-  }
-#endif /* CHECKSUM_GEN_TCP */
-  TCP_STATS_INC(tcp.xmit);
-
-  NETIF_SET_HWADDRHINT(netif, &(pcb->addr_hint));
-  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);
-  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 = htons(local_port);
-  tcphdr->dest = htons(remote_port);
-  tcphdr->seqno = htonl(seqno);
-  tcphdr->ackno = htonl(ackno);
-  TCPH_HDRLEN_FLAGS_SET(tcphdr, TCP_HLEN/4, TCP_RST | TCP_ACK);
-#if ESP_PER_SOC_TCP_WND
-#if LWIP_WND_SCALE
-  tcphdr->wnd = PP_HTONS(((TCP_WND_DEFAULT >> TCP_RCV_SCALE) & 0xFFFF));
-#else
-  tcphdr->wnd = PP_HTONS(TCP_WND_DEFAULT);
-#endif
-#else
-#if LWIP_WND_SCALE
-  tcphdr->wnd = PP_HTONS(((TCP_WND_DEFAULT >> TCP_RCV_SCALE) & 0xFFFF));
-#else
-  tcphdr->wnd = PP_HTONS(TCP_WND_DEFAULT);
-#endif
-#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)
-{
-  struct tcp_seg *seg;
-
-  if (pcb->unacked == NULL) {
-    return;
-  }
-
-  /* Move all unacked segments to the head of the unsent queue */
-  for (seg = pcb->unacked; seg->next != NULL; seg = seg->next);
-  /* concatenate unsent queue after unacked queue */
-  seg->next = pcb->unsent;
-#if TCP_OVERSIZE_DBGCHECK
-  /* if last unsent changed, we need to update unsent_oversize */
-  if (pcb->unsent == NULL) {
-    pcb->unsent_oversize = seg->oversize_left;
-  }
-#endif /* TCP_OVERSIZE_DBGCHECK */
-  /* unsent queue is the concatenated queue (of unacked, unsent) */
-  pcb->unsent = pcb->unacked;
-  /* unacked queue is now empty */
-  pcb->unacked = NULL;
-
-  /* increment number of retransmissions */
-  ++pcb->nrtx;
-
-  /* Don't take any RTT measurements after retransmitting. */
-  pcb->rttest = 0;
-
-  /* Do the actual retransmission */
-  tcp_output(pcb);
-}
-
-/**
- * Requeue the first unacked segment for retransmission
- *
- * Called by tcp_receive() for fast retramsmit.
- *
- * @param pcb the tcp_pcb for which to retransmit the first unacked segment
- */
-void
-tcp_rexmit(struct tcp_pcb *pcb)
-{
-  struct tcp_seg *seg;
-  struct tcp_seg **cur_seg;
-
-  if (pcb->unacked == NULL) {
-    return;
-  }
-
-  /* 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(ntohl((*cur_seg)->tcphdr->seqno), ntohl(seg->tcphdr->seqno))) {
-      cur_seg = &((*cur_seg)->next );
-  }
-  seg->next = *cur_seg;
-  *cur_seg = seg;
-#if TCP_OVERSIZE
-  if (seg->next == NULL) {
-    /* the retransmitted segment is last in unsent, so reset unsent_oversize */
-    pcb->unsent_oversize = 0;
-  }
-#endif /* TCP_OVERSIZE */
-
-  ESP_STATS_TCP_PCB(pcb);
-  ++pcb->nrtx;
-
-  /* Don't take any rtt measurements after retransmitting. */
-  pcb->rttest = 0;
-
-  /* Do the actual retransmission. */
-  MIB2_STATS_INC(mib2.tcpretranssegs);
-  /* No need to call tcp_output: we are always called from tcp_input()
-     and thus tcp_output directly returns. */
-}
-
-
-/**
- * Handle retransmission after three dupacks received
- *
- * @param pcb the tcp_pcb for which to retransmit the first unacked segment
- */
-void
-tcp_rexmit_fast(struct tcp_pcb *pcb)
-{
-  if (pcb->unacked != NULL && !(pcb->flags & TF_INFR)) {
-    /* This is fast retransmit. Retransmit the first unacked segment. */
-    LWIP_DEBUGF(TCP_FR_DEBUG,
-                ("tcp_receive: dupacks %"U16_F" (%"U32_F
-                 "), fast retransmit %"U32_F"\n",
-                 (u16_t)pcb->dupacks, pcb->lastack,
-                 ntohl(pcb->unacked->tcphdr->seqno)));
-    tcp_rexmit(pcb);
-
-    /* Set ssthresh to half of the minimum of the current
-     * cwnd and the advertised window */
-    if (pcb->cwnd > pcb->snd_wnd) {
-      pcb->ssthresh = pcb->snd_wnd / 2;
-    } else {
-      pcb->ssthresh = pcb->cwnd / 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, 2*pcb->mss));
-      pcb->ssthresh = 2*pcb->mss;
-    }
-
-    pcb->cwnd = pcb->ssthresh + 3 * pcb->mss;
-    pcb->flags |= TF_INFR;
-  }
-}
-
-
-/**
- * Send keepalive packets to keep a connection active although
- * no data is sent over it.
- *
- * Called by tcp_slowtmr()
- *
- * @param pcb the tcp_pcb for which to send a keepalive packet
- */
-err_t
-tcp_keepalive(struct tcp_pcb *pcb)
-{
-  err_t err;
-  struct pbuf *p;
-  struct netif *netif;
-
-  LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: sending KEEPALIVE probe to "));
-  ip_addr_debug_print(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, pcb->keep_cnt_sent));
-
-  p = tcp_output_alloc_header(pcb, 0, 0, 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);
-
-  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.
- *
- * Called by tcp_slowtmr()
- *
- * @param pcb the tcp_pcb for which to send a zero-window probe packet
- */
-err_t
-tcp_zero_window_probe(struct tcp_pcb *pcb)
-{
-  err_t err;
-  struct pbuf *p;
-  struct tcp_hdr *tcphdr;
-  struct tcp_seg *seg;
-  u16_t len;
-  u8_t is_fin;
-  struct netif *netif;
-
-  LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: sending ZERO WINDOW probe to "));
-  ip_addr_debug_print(TCP_DEBUG, &pcb->remote_ip);
-  LWIP_DEBUGF(TCP_DEBUG, ("\n"));
-
-  LWIP_DEBUGF(TCP_DEBUG,
-              ("tcp_zero_window_probe: tcp_ticks %"U32_F
-               "   pcb->tmr %"U32_F" pcb->keep_cnt_sent %"U16_F"\n",
-               tcp_ticks, pcb->tmr, pcb->keep_cnt_sent));
-
-  seg = pcb->unacked;
-
-  if (seg == NULL) {
-    seg = pcb->unsent;
-  }
-  if (seg == NULL) {
-    /* nothing to send, zero window probe not needed */
-    return ERR_OK;
-  }
-
-  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);
-  if (p == NULL) {
-    LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: no memory for pbuf\n"));
-    return ERR_MEM;
-  }
-  tcphdr = (struct tcp_hdr *)p->payload;
-
-  if (is_fin) {
-    /* FIN segment, no data */
-    TCPH_FLAGS_SET(tcphdr, TCP_ACK | TCP_FIN);
-  } else {
-    /* Data segment, copy in one byte from the head of the unacked queue */
-    char *d = ((char *)p->payload + TCP_HLEN);
-    /* Depending on whether the segment has already been sent (unacked) or not
-       (unsent), seg->p->payload points to the IP header or TCP header.
-       Ensure we copy the first TCP data byte: */
-    pbuf_copy_partial(seg->p, d, 1, seg->p->tot_len - seg->len);
-  }
-
-  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);
-
-  LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: seqno %"U32_F
-                          " ackno %"U32_F" err %d.\n",
-                          pcb->snd_nxt - 1, pcb->rcv_nxt, (int)err));
-  return err;
-}
-#endif /* LWIP_TCP */
diff --git a/components/lwip/core/timers.c b/components/lwip/core/timers.c
deleted file mode 100644 (file)
index b65912b..0000000
+++ /dev/null
@@ -1,439 +0,0 @@
-/**
- * @file
- * 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.
- *
- */
-
-/*
- * 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>
- *         Simon Goldschmidt
- *
- */
-
-#include "lwip/opt.h"
-
-#include "lwip/timers.h"
-#include "lwip/priv/tcp_priv.h"
-
-#include "lwip/def.h"
-#include "lwip/memp.h"
-#include "lwip/priv/tcpip_priv.h"
-
-#include "lwip/ip_frag.h"
-#include "netif/etharp.h"
-#include "lwip/dhcp.h"
-#include "lwip/autoip.h"
-#include "lwip/igmp.h"
-#include "lwip/dns.h"
-#include "lwip/nd6.h"
-#include "lwip/ip6_frag.h"
-#include "lwip/mld6.h"
-#include "lwip/sys.h"
-#include "lwip/pbuf.h"
-
-#if LWIP_DEBUG_TIMERNAMES
-#define HANDLER(x) x, #x
-#else /* LWIP_DEBUG_TIMERNAMES */
-#define HANDLER(x) x
-#endif /* LWIP_DEBUG_TIMERNAMES */
-
-#if ESP_DHCP
-extern void dhcps_coarse_tmr(void);
-#endif 
-
-/** 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[] = {
-#if LWIP_TCP
-  /* The TCP timer is a special case: it does not have to run always and
-   * is triggered to start from TCP using tcp_timer_needed() */
-  {TCP_TMR_INTERVAL, HANDLER(tcp_tmr)},
-#endif /* LWIP_TCP */
-#if LWIP_IPV4
-#if IP_REASSEMBLY
-  {IP_TMR_INTERVAL, HANDLER(ip_reass_tmr)},
-#endif /* IP_REASSEMBLY */
-#if LWIP_ARP
-  {ARP_TMR_INTERVAL, HANDLER(etharp_tmr)},
-#endif /* LWIP_ARP */
-#if LWIP_DHCP
-  {DHCP_COARSE_TIMER_MSECS, HANDLER(dhcp_coarse_tmr)},
-  {DHCP_FINE_TIMER_MSECS, HANDLER(dhcp_fine_tmr)},
-#if ESP_DHCP
-  {DHCP_COARSE_TIMER_MSECS, HANDLER(dhcps_coarse_tmr)},
-#endif
-#endif /* LWIP_DHCP */
-#if LWIP_AUTOIP
-  {AUTOIP_TMR_INTERVAL, HANDLER(autoip_tmr)},
-#endif /* LWIP_AUTOIP */
-#if LWIP_IGMP
-  {IGMP_TMR_INTERVAL, HANDLER(igmp_tmr)},
-#endif /* LWIP_IGMP */
-#endif /* LWIP_IPV4 */
-#if LWIP_DNS
-  {DNS_TMR_INTERVAL, HANDLER(dns_tmr)},
-#endif /* LWIP_DNS */
-#if LWIP_IPV6
-  {ND6_TMR_INTERVAL, HANDLER(nd6_tmr)},
-#if LWIP_IPV6_REASS
-  {IP6_REASS_TMR_INTERVAL, HANDLER(ip6_reass_tmr)},
-#endif /* LWIP_IPV6_REASS */
-#if LWIP_IPV6_MLD
-  {MLD6_TMR_INTERVAL, HANDLER(mld6_tmr)},
-#endif /* LWIP_IPV6_MLD */
-#endif /* LWIP_IPV6 */
-};
-
-#if LWIP_TIMERS && !LWIP_TIMERS_CUSTOM
-
-/** The one and only timeout list */
-static struct sys_timeo *next_timeout;
-static u32_t timeouts_last_time;
-
-#if LWIP_TCP
-/** global variable that shows if the tcp timer is currently scheduled or not */
-static int tcpip_tcp_timer_active;
-
-/**
- * Timer callback function that calls tcp_tmr() and reschedules itself.
- *
- * @param arg unused argument
- */
-static void
-tcpip_tcp_timer(void *arg)
-{
-  LWIP_UNUSED_ARG(arg);
-
-  /* call TCP timer handler */
-  tcp_tmr();
-  /* timer still needed? */
-  if (tcp_active_pcbs || tcp_tw_pcbs) {
-    /* restart timer */
-    sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);
-  } else {
-    /* disable timer */
-    tcpip_tcp_timer_active = 0;
-  }
-}
-
-/**
- * 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.
- */
-void
-tcp_timer_needed(void)
-{
-  /* timer is off but needed again? */
-  if (!tcpip_tcp_timer_active && (tcp_active_pcbs || tcp_tw_pcbs)) {
-    /* enable and start timer */
-    tcpip_tcp_timer_active = 1;
-    sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);
-  }
-}
-#endif /* LWIP_TCP */
-
-/**
- * Timer callback function that calls mld6_tmr() and reschedules itself.
- *
- * @param arg unused argument
- */
-static void
-cyclic_timer(void *arg)
-{
-  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);
-}
-
-/** Initialize this module */
-void sys_timeouts_init(void)
-{
-  size_t i;
-  /* tcp_tmr() at index 0 is started on demand */
-  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]));
-  }
-
-  /* Initialise timestamp for sys_check_timeouts */
-  timeouts_last_time = sys_now();
-}
-
-/**
- * Create a one-shot timer (aka timeout). Timeouts are processed in the
- * following cases:
- * - while waiting for a message using sys_timeouts_mbox_fetch()
- * - by calling sys_check_timeouts() (NO_SYS==1 only)
- *
- * @param msecs time in milliseconds after that the timer should expire
- * @param handler callback function to call when msecs have elapsed
- * @param arg argument to pass to the callback function
- */
-#if LWIP_DEBUG_TIMERNAMES
-void
-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;
-
-  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;
-  }
-
-  now = sys_now();
-  if (next_timeout == NULL) {
-    diff = 0;
-    timeouts_last_time = now;
-  } else {
-    diff = now - timeouts_last_time;
-  }
-
-  timeout->next = NULL;
-  timeout->h = handler;
-  timeout->arg = arg;
-  timeout->time = msecs + diff;
-#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;
-      }
-    }
-  }
-}
-
-/**
- * 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.
- *
- * @param handler callback function that would be called by the timeout
- * @param arg callback argument that would be passed to handler
- */
-void
-sys_untimeout(sys_timeout_handler handler, void *arg)
-{
-  struct sys_timeo *prev_t, *t;
-
-  if (next_timeout == NULL) {
-    return;
-  }
-
-  for (t = next_timeout, prev_t = NULL; t != NULL; prev_t = t, t = t->next) {
-    if ((t->h == handler) && (t->arg == arg)) {
-      /* We have a match */
-      /* Unlink from previous in list */
-      if (prev_t == NULL) {
-        next_timeout = t->next;
-      } 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;
-    }
-  }
-  return;
-}
-
-/**
- * @ingroup lwip_nosys
- * Handle timeouts for NO_SYS==1 (i.e. without using
- * tcpip_thread/sys_timeouts_mbox_fetch(). Uses sys_now() to call timeout
- * handler functions when timeouts expire.
- *
- * 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) {
-    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;
-#if LWIP_DEBUG_TIMERNAMES
-        if (handler != NULL) {
-          LWIP_DEBUGF(TIMERS_DEBUG, ("sct calling h=%s arg=%p\n",tmptimeout->handler_name, 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);
-  }
-}
-
-/** Set back the timestamp of the last call to sys_check_timeouts()
- * 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.
- */
-void
-sys_restart_timeouts(void)
-{
-  timeouts_last_time = sys_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;
-  if (next_timeout == NULL) {
-    return 0xffffffff;
-  }
-  diff = sys_now() - timeouts_last_time;
-  if (diff > next_timeout->time) {
-    return 0;
-  } else {
-    return next_timeout->time - diff;
-  }
-}
-
-#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 ESP_IRAM_ATTR
-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
-tcp_timer_needed(void)
-{
-}
-#endif /* LWIP_TIMERS && !LWIP_TIMERS_CUSTOM */
-
diff --git a/components/lwip/core/udp.c b/components/lwip/core/udp.c
deleted file mode 100644 (file)
index 489e487..0000000
+++ /dev/null
@@ -1,1206 +0,0 @@
-/**
- * @file
- * User Datagram Protocol module
- *
- */
-
-/*
- * 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>
- *
- */
-
-
-/* udp.c
- *
- * The code for the User Datagram Protocol UDP & UDPLite (RFC 3828).
- *
- */
-
-/* @todo Check the use of '(struct udp_pcb).chksum_len_rx'!
- */
-
-#include "lwip/opt.h"
-
-#if LWIP_UDP /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/udp.h"
-#include "lwip/def.h"
-#include "lwip/memp.h"
-#include "lwip/inet_chksum.h"
-#include "lwip/ip_addr.h"
-#include "lwip/ip6.h"
-#include "lwip/ip6_addr.h"
-#include "lwip/inet_chksum.h"
-#include "lwip/netif.h"
-#include "lwip/icmp.h"
-#include "lwip/icmp6.h"
-#include "lwip/stats.h"
-#include "lwip/snmp.h"
-#include "lwip/dhcp.h"
-
-#include <string.h>
-
-#ifndef UDP_LOCAL_PORT_RANGE_START
-/* From http://www.iana.org/assignments/port-numbers:
-   "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))
-#endif
-
-/* last local UDP port */
-static u16_t udp_port = UDP_LOCAL_PORT_RANGE_START;
-
-/* The list of UDP PCBs */
-/* exported in udp.h (was static) */
-struct udp_pcb *udp_pcbs;
-
-/**
- * Initialize this module.
- */
-void
-udp_init(void)
-{
-#if LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS && defined(LWIP_RAND)
-  udp_port = UDP_ENSURE_LOCAL_PORT_RANGE(LWIP_RAND());
-#endif /* LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS && defined(LWIP_RAND) */
-}
-
-/**
- * Allocate a new local UDP port.
- *
- * @return a new (free) local UDP port number
- */
-static u16_t
-udp_new_port(void)
-{
-  u16_t n = 0;
-  struct udp_pcb *pcb;
-
-again:
-  if (udp_port++ == UDP_LOCAL_PORT_RANGE_END) {
-    udp_port = UDP_LOCAL_PORT_RANGE_START;
-  }
-  /* Check all PCBs. */
-  for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
-    if (pcb->local_port == udp_port) {
-      if (++n > (UDP_LOCAL_PORT_RANGE_END - UDP_LOCAL_PORT_RANGE_START)) {
-        return 0;
-      }
-      goto again;
-    }
-  }
-  return udp_port;
-#if 0
-  struct udp_pcb *ipcb = udp_pcbs;
-  while ((ipcb != NULL) && (udp_port != UDP_LOCAL_PORT_RANGE_END)) {
-    if (ipcb->local_port == udp_port) {
-      /* port is already used by another udp_pcb */
-      udp_port++;
-      /* restart scanning all udp pcbs */
-      ipcb = udp_pcbs;
-    } else {
-      /* go on with next udp pcb */
-      ipcb = ipcb->next;
-    }
-  }
-  if (ipcb != NULL) {
-    return 0;
-  }
-  return udp_port;
-#endif
-}
-
-/** Common code to see if the current input packet matches the pcb
- * (current input packet is accessed via ip(4/6)_current_* macros)
- *
- * @param pcb pcb to check
- * @param inp network interface on which the datagram was received (only used for IPv4)
- * @param broadcast 1 if his is an IPv4 broadcast (global or subnet-only), 0 otherwise (only used for IPv4)
- * @return 1 on match, 0 otherwise
- */
-static u8_t ESP_IRAM_ATTR
-udp_input_local_match(struct udp_pcb *pcb, struct netif *inp, u8_t broadcast)
-{
-  LWIP_UNUSED_ARG(inp);       /* in IPv6 only case */
-  LWIP_UNUSED_ARG(broadcast); /* in IPv6 only case */
-
-  /* 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
-    if((broadcast != 0) && !ip_get_option(pcb, SOF_BROADCAST)) {
-      return 0;
-    }
-#endif /* LWIP_IPV4 && IP_SOF_BROADCAST_RECV */
-    return 1;
-  }
-
-  /* Only need to check PCB if incoming IP version matches PCB IP version */
-  if(IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ip_current_dest_addr())) {
-    LWIP_ASSERT("UDP PCB: inconsistent local/remote IP versions", IP_IS_V6_VAL(pcb->local_ip) == IP_IS_V6_VAL(pcb->remote_ip));
-
-#if LWIP_IPV4
-    /* Special case: IPv4 broadcast: all or broadcasts in my subnet
-     * Note: broadcast variable can only be 1 if it is an IPv4 broadcast */
-    if(broadcast != 0) {
-#if IP_SOF_BROADCAST_RECV
-      if(ip_get_option(pcb, SOF_BROADCAST))
-#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))) {
-          return 1;
-        }
-      }
-    } else
-#endif /* LWIP_IPV4 */
-    /* Handle IPv4 and IPv6: all, multicast or exact match */
-    if(ip_addr_isany(&pcb->local_ip) ||
-#if LWIP_IPV6_MLD
-       (ip_current_is_v6() && ip6_addr_ismulticast(ip6_current_dest_addr())) ||
-#endif /* LWIP_IPV6_MLD */
-#if LWIP_IGMP
-       (!ip_current_is_v6() && ip4_addr_ismulticast(ip4_current_dest_addr())) ||
-#endif /* LWIP_IGMP */
-       ip_addr_cmp(&pcb->local_ip, ip_current_dest_addr())) {
-      return 1;
-    }
-  }
-  
-  return 0;
-}
-
-/**
- * Process an incoming UDP datagram.
- *
- * 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.
- *
- * @param p pbuf to be demultiplexed to a UDP PCB (p->payload pointing to the UDP header)
- * @param inp network interface on which the datagram was received.
- *
- */
-void ESP_IRAM_ATTR
-udp_input(struct pbuf *p, struct netif *inp)
-{
-  struct udp_hdr *udphdr;
-  struct udp_pcb *pcb, *prev;
-  struct udp_pcb *uncon_pcb;
-  u16_t src, dest;
-  u8_t broadcast;
-  u8_t for_us = 0;
-
-  LWIP_UNUSED_ARG(inp);
-
-  PERF_START;
-
-  UDP_STATS_INC(udp.recv);
-
-  /* Check minimum length (UDP header) */
-  if (p->len < UDP_HLEN) {
-    /* drop short packets */
-    LWIP_DEBUGF(UDP_DEBUG,
-                ("udp_input: short UDP datagram (%"U16_F" bytes) discarded\n", p->tot_len));
-    UDP_STATS_INC(udp.lenerr);
-    UDP_STATS_INC(udp.drop);
-    MIB2_STATS_INC(mib2.udpinerrors);
-    pbuf_free(p);
-    goto end;
-  }
-
-  udphdr = (struct udp_hdr *)p->payload;
-
-  /* is broadcast packet ? */
-  broadcast = ip_addr_isbroadcast(ip_current_dest_addr(), ip_current_netif());
-
-  LWIP_DEBUGF(UDP_DEBUG, ("udp_input: received datagram of length %"U16_F"\n", p->tot_len));
-
-  /* convert src and dest ports to host byte order */
-  src = ntohs(udphdr->src);
-  dest = ntohs(udphdr->dest);
-
-  udp_debug_print(udphdr);
-
-  /* print the UDP source and destination */
-  LWIP_DEBUGF(UDP_DEBUG, ("udp ("));
-  ip_addr_debug_print(UDP_DEBUG, ip_current_dest_addr());
-  LWIP_DEBUGF(UDP_DEBUG, (", %"U16_F") <-- (", ntohs(udphdr->dest)));
-  ip_addr_debug_print(UDP_DEBUG, ip_current_src_addr());
-  LWIP_DEBUGF(UDP_DEBUG, (", %"U16_F")\n", ntohs(udphdr->src)));
-
-  pcb = NULL;
-  prev = NULL;
-  uncon_pcb = NULL;
-  /* Iterate through the UDP pcb list for a matching pcb.
-   * 'Perfect match' pcbs (connected to the remote port & ip address) are
-   * preferred. If no perfect match is found, the first unconnected pcb that
-   * matches the local port and ip address gets the datagram. */
-  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);
-    LWIP_DEBUGF(UDP_DEBUG, (", %"U16_F") <-- (", pcb->local_port));
-    ip_addr_debug_print(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 ((uncon_pcb == NULL) &&
-          ((pcb->flags & UDP_FLAGS_CONNECTED) == 0)) {
-        /* 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()))) {
-        /* the first fully matching PCB */
-        if (prev != NULL) {
-          /* move the pcb to the front of udp_pcbs so that is
-             found faster next time */
-          prev->next = pcb->next;
-          pcb->next = udp_pcbs;
-          udp_pcbs = pcb;
-        } else {
-          UDP_STATS_INC(udp.cachehit);
-        }
-        break;
-      }
-    }
-
-    prev = pcb;
-  }
-  /* no fully matching pcb found? then look for an unconnected pcb */
-  if (pcb == NULL) {
-    pcb = uncon_pcb;
-  }
-
-  /* Check checksum if this is a match or if it was directed at us. */
-  if (pcb != NULL) {
-    for_us = 1;
-  } else {
-#if LWIP_IPV6
-    if (ip_current_is_v6()) {
-      for_us = netif_get_ip6_addr_match(inp, ip6_current_dest_addr()) >= 0;
-    }
-#endif /* LWIP_IPV6 */
-#if LWIP_IPV4
-    if (!ip_current_is_v6()) {
-      for_us = ip4_addr_cmp(netif_ip4_addr(inp), ip4_current_dest_addr());
-    }
-#endif /* LWIP_IPV4 */
-  }
-
-  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 LWIP_UDPLITE
-      if (ip_current_header_proto() == IP_PROTO_UDPLITE) {
-        /* Do the UDP Lite checksum */
-        u16_t chklen = ntohs(udphdr->len);
-        if (chklen < sizeof(struct udp_hdr)) {
-          if (chklen == 0) {
-            /* For UDP-Lite, checksum length of 0 means checksum
-               over the complete packet (See RFC 3828 chap. 3.1) */
-            chklen = p->tot_len;
-          } else {
-            /* At least the UDP-Lite header must be covered by the
-               checksum! (Again, see RFC 3828 chap. 3.1) */
-            goto chkerr;
-          }
-        }
-        if (ip_chksum_pseudo_partial(p, IP_PROTO_UDPLITE,
-                     p->tot_len, chklen,
-                     ip_current_src_addr(), ip_current_dest_addr()) != 0) {
-          goto chkerr;
-        }
-      } else
-#endif /* LWIP_UDPLITE */
-      {
-        if (udphdr->chksum != 0) {
-          if (ip_chksum_pseudo(p, IP_PROTO_UDP, p->tot_len,
-                               ip_current_src_addr(),
-                               ip_current_dest_addr()) != 0) {
-            goto chkerr;
-          }
-        }
-      }
-    }
-#endif /* CHECKSUM_CHECK_UDP */
-    if (pbuf_header(p, -UDP_HLEN)) {
-      /* Can we cope with this failing? Just assert for now */
-      LWIP_ASSERT("pbuf_header failed\n", 0);
-      UDP_STATS_INC(udp.drop);
-      MIB2_STATS_INC(mib2.udpinerrors);
-      pbuf_free(p);
-      goto end;
-    }
-
-    if (pcb != NULL) {
-      MIB2_STATS_INC(mib2.udpindatagrams);
-#if SO_REUSE && SO_REUSE_RXTOALL
-      if (ip_get_option(pcb, SOF_REUSEADDR) &&
-          (broadcast || ip_addr_ismulticast(ip_current_dest_addr()))) {
-        /* 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 */
-            if ((mpcb->local_port == dest) &&
-                (udp_input_local_match(mpcb, inp, broadcast) != 0)) {
-              /* 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);
-                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);
-                  }
-                }
-              }
-            }
-          }
-        }
-        if (p_header_changed) {
-          /* and move payload to UDP data again */
-          pbuf_header(p, -hdrs_len);
-        }
-      }
-#endif /* SO_REUSE && SO_REUSE_RXTOALL */
-      /* callback */
-      if (pcb->recv != NULL) {
-        /* now the recv function is responsible for freeing p */
-        pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr(), src);
-      } else {
-        /* no recv function registered? then we have to free the pbuf! */
-        pbuf_free(p);
-        goto end;
-      }
-    } else {
-      LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_input: not for us.\n"));
-
-#if LWIP_ICMP || LWIP_ICMP6
-      /* No match was found, send ICMP destination port unreachable unless
-         destination address was broadcast/multicast. */
-      if (!broadcast && !ip_addr_ismulticast(ip_current_dest_addr())) {
-        /* move payload pointer back to ip header */
-        pbuf_header_force(p, ip_current_header_tot_len() + UDP_HLEN);
-        icmp_port_unreach(ip_current_is_v6(), p);
-      }
-#endif /* LWIP_ICMP || LWIP_ICMP6 */
-      UDP_STATS_INC(udp.proterr);
-      UDP_STATS_INC(udp.drop);
-      MIB2_STATS_INC(mib2.udpnoports);
-      pbuf_free(p);
-    }
-  } else {
-    pbuf_free(p);
-  }
-end:
-  PERF_STOP("udp_input");
-  return;
-#if CHECKSUM_CHECK_UDP
-chkerr:
-  LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS,
-              ("udp_input: UDP (or UDP Lite) datagram discarded due to failing checksum\n"));
-  UDP_STATS_INC(udp.chkerr);
-  UDP_STATS_INC(udp.drop);
-  MIB2_STATS_INC(mib2.udpinerrors);
-  pbuf_free(p);
-  PERF_STOP("udp_input");
-#endif /* CHECKSUM_CHECK_UDP */
-}
-
-/**
- * Send data using UDP.
- *
- * @param pcb UDP PCB used to send the data.
- * @param p chain of pbuf's to be sent.
- *
- * The datagram will be sent to the current remote_ip & remote_port
- * stored in pcb. If the pcb is not bound to a port, it will
- * automatically be bound to a random port.
- *
- * @return lwIP error code.
- * - ERR_OK. Successful. No error occurred.
- * - ERR_MEM. Out of memory.
- * - ERR_RTE. Could not find route to destination address.
- * - ERR_VAL. No PCB or PCB is dual-stack
- * - More errors could be returned by lower protocol layers.
- *
- * @see udp_disconnect() udp_sendto()
- */
-err_t ESP_IRAM_ATTR
-udp_send(struct udp_pcb *pcb, struct pbuf *p)
-{
-  if ((pcb == NULL) || 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(pcb, p, &pcb->remote_ip, pcb->remote_port);
-}
-
-#if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP
-/** Same as udp_send() but with checksum
- */
-err_t
-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)) {
-    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);
-}
-#endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */
-
-/**
- * Send data to a specified address using UDP.
- *
- * @param pcb UDP PCB used to send the data.
- * @param p chain of pbuf's to be sent.
- * @param dst_ip Destination IP address.
- * @param dst_port Destination UDP port.
- *
- * dst_ip & dst_port are expected to be in the same byte order as in the pcb.
- *
- * If the PCB already has a remote address association, it will
- * be restored after the data is sent.
- *
- * @return lwIP error code (@see udp_send for possible error codes)
- *
- * @see udp_disconnect() udp_send()
- */
-err_t ESP_IRAM_ATTR
-udp_sendto(struct udp_pcb *pcb, struct pbuf *p,
-  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);
-}
-
-/** Same as udp_sendto(), but with checksum */
-err_t
-udp_sendto_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip,
-                  u16_t dst_port, u8_t have_chksum, u16_t chksum)
-{
-#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)) {
-    return ERR_VAL;
-  }
-
-  LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_send\n"));
-
-#if LWIP_IPV4 && LWIP_IPV6
-  /* Unwrap IPV4-mapped IPV6 addresses and convert to native IPV4 here */
-  if (IP_IS_V4MAPPEDV6(dst_ip)) {
-      ip_addr_t dest_ipv4;
-      ip_addr_ip4_from_mapped_ip6(&dest_ipv4, dst_ip);
-#if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UP
-      return udp_sendto_chksum(pcb, p, &dest_ipv4, dst_port, have_chksum, chksum);
-#else
-      return udp_sendto(pcb, p, &dest_ipv4, dst_port);
-#endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UP */
-  }
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-
-#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 */
-  netif = ip_route(&pcb->local_ip, dst_ip_route);
-
-  /* no outgoing network interface could be found? */
-  if (netif == NULL) {
-    LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("udp_send: No route to "));
-    ip_addr_debug_print(UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, dst_ip);
-    LWIP_DEBUGF(UDP_DEBUG, ("\n"));
-    UDP_STATS_INC(udp.rterr);
-    return ERR_RTE;
-  }
-#if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP
-  return udp_sendto_if_chksum(pcb, p, dst_ip, dst_port, netif, have_chksum, chksum);
-#else /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */
-  return udp_sendto_if(pcb, p, dst_ip, dst_port, netif);
-#endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */
-}
-
-/**
- * Send data to a specified address using UDP.
- * The netif used for sending can be specified.
- *
- * This function exists mainly for DHCP, to be able to send UDP packets
- * on a netif that is still down.
- *
- * @param pcb UDP PCB used to send the data.
- * @param p chain of pbuf's to be sent.
- * @param dst_ip Destination IP address.
- * @param dst_port Destination UDP port.
- * @param netif the netif used for sending.
- *
- * dst_ip & dst_port are expected to be in the same byte order as in the pcb.
- *
- * @return lwIP error code (@see udp_send for possible error codes)
- *
- * @see udp_disconnect() udp_send()
- */
-err_t ESP_IRAM_ATTR
-udp_sendto_if(struct udp_pcb *pcb, struct pbuf *p,
-  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);
-}
-
-/** Same as udp_sendto_if(), but with checksum */
-err_t
-udp_sendto_if_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)
-{
-#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)) {
-    return ERR_VAL;
-  }
-
-  /* PCB local address is IP_ANY_ADDR? */
-#if LWIP_IPV6
-  if (IP_IS_V6(dst_ip)) {
-    if (ip6_addr_isany(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. */
-        return ERR_RTE;
-      }
-    } else {
-      /* use UDP PCB local IPv6 address as source address, if still valid. */
-      if (netif_get_ip6_addr_match(netif, ip_2_ip6(&pcb->local_ip)) < 0) {
-        /* Address isn't valid anymore. */
-        return ERR_RTE;
-      }
-      src_ip = &pcb->local_ip;
-    }
-  }
-#endif /* LWIP_IPV6 */
-#if LWIP_IPV4 && LWIP_IPV6
-  else
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-#if LWIP_IPV4
-  if (ip4_addr_isany(ip_2_ip4(&pcb->local_ip))) {
-    /* use 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_VAL;
-    }
-    /* 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);
-#else /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */
-  return udp_sendto_if_src(pcb, p, dst_ip, dst_port, netif, src_ip);
-#endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */
-}
-
-/** Same as udp_sendto_if(), but with source address */
-err_t ESP_IRAM_ATTR
-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)
-{
-#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);
-}
-
-/** 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)
-{
-#endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */
-  struct udp_hdr *udphdr;
-  err_t err;
-  struct pbuf *q; /* q will be sent down the stack */
-  u8_t ip_proto;
-  u8_t ttl;
-
-  if ((pcb == NULL) || (dst_ip == NULL) || !IP_ADDR_PCB_VERSION_MATCH(pcb, src_ip) ||
-      !IP_ADDR_PCB_VERSION_MATCH(pcb, dst_ip)) {
-    return ERR_VAL;
-  }
-
-#if LWIP_IPV4 && IP_SOF_BROADCAST
-  /* broadcast filter? */
-  if (!ip_get_option(pcb, SOF_BROADCAST) &&
-#if LWIP_IPV6
-      !IP_IS_V6(dst_ip) &&
-#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));
-    return ERR_VAL;
-  }
-#endif /* LWIP_IPV4 && IP_SOF_BROADCAST */
-
-  /* if the PCB is not yet bound to a port, bind it here */
-  if (pcb->local_port == 0) {
-    LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_send: not yet bound to a port, binding now\n"));
-    err = udp_bind(pcb, &pcb->local_ip, pcb->local_port);
-    if (err != ERR_OK) {
-      LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("udp_send: forced port bind failed\n"));
-      return err;
-    }
-  }
-
-  /* not enough space to add an UDP header to first pbuf in given p chain? */
-  if (pbuf_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? */
-    if (q == NULL) {
-      LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("udp_send: could not allocate header\n"));
-      return ERR_MEM;
-    }
-    if (p->tot_len != 0) {
-      /* chain header q in front of given pbuf p (only if p contains data) */
-      pbuf_chain(q, p);
-    }
-    /* first pbuf q points to header pbuf */
-    LWIP_DEBUGF(UDP_DEBUG,
-                ("udp_send: added header pbuf %p before given pbuf %p\n", (void *)q, (void *)p));
-  } else {
-    /* adding space for header within p succeeded */
-    /* first pbuf q equals given pbuf */
-    q = p;
-    LWIP_DEBUGF(UDP_DEBUG, ("udp_send: added header in given pbuf %p\n", (void *)p));
-  }
-  LWIP_ASSERT("check that first pbuf can hold struct udp_hdr",
-              (q->len >= sizeof(struct udp_hdr)));
-  /* q now represents the packet to be sent */
-  udphdr = (struct udp_hdr *)q->payload;
-  udphdr->src = htons(pcb->local_port);
-  udphdr->dest = htons(dst_port);
-  /* in UDP, 0 checksum means 'no checksum' */
-  udphdr->chksum = 0x0000;
-
-  /* Multicast Loop? */
-#if (LWIP_IPV4 && LWIP_MULTICAST_TX_OPTIONS) || (LWIP_IPV6 && LWIP_IPV6_MLD)
-  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) */
-
-  LWIP_DEBUGF(UDP_DEBUG, ("udp_send: sending datagram of length %"U16_F"\n", q->tot_len));
-
-#if LWIP_UDPLITE
-  /* UDP Lite protocol? */
-  if (pcb->flags & UDP_FLAGS_UDPLITE) {
-    u16_t chklen, chklen_hdr;
-    LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP LITE packet length %"U16_F"\n", q->tot_len));
-    /* set UDP message length in UDP header */
-    chklen_hdr = chklen = pcb->chksum_len_tx;
-    if ((chklen < sizeof(struct udp_hdr)) || (chklen > q->tot_len)) {
-      if (chklen != 0) {
-        LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP LITE pcb->chksum_len is illegal: %"U16_F"\n", chklen));
-      }
-      /* For UDP-Lite, checksum length of 0 means checksum
-         over the complete packet. (See RFC 3828 chap. 3.1)
-         At least the UDP-Lite header must be covered by the
-         checksum, therefore, if chksum_len has an illegal
-         value, we generate the checksum over the complete
-         packet to be safe. */
-      chklen_hdr = 0;
-      chklen = q->tot_len;
-    }
-    udphdr->len = htons(chklen_hdr);
-    /* calculate checksum */
-#if CHECKSUM_GEN_UDP
-    IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_UDP) {
-#if LWIP_CHECKSUM_ON_COPY
-      if (have_chksum) {
-        chklen = UDP_HLEN;
-      }
-#endif /* LWIP_CHECKSUM_ON_COPY */
-      udphdr->chksum = ip_chksum_pseudo_partial(q, IP_PROTO_UDPLITE,
-        q->tot_len, chklen, src_ip, dst_ip);
-#if LWIP_CHECKSUM_ON_COPY
-      if (have_chksum) {
-        u32_t acc;
-        acc = udphdr->chksum + (u16_t)~(chksum);
-        udphdr->chksum = FOLD_U32T(acc);
-      }
-#endif /* LWIP_CHECKSUM_ON_COPY */
-
-      /* chksum zero must become 0xffff, as zero means 'no checksum' */
-      if (udphdr->chksum == 0x0000) {
-        udphdr->chksum = 0xffff;
-      }
-    }
-#endif /* CHECKSUM_GEN_UDP */
-
-    ip_proto = IP_PROTO_UDPLITE;
-  } else
-#endif /* LWIP_UDPLITE */
-  {      /* UDP */
-    LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP packet length %"U16_F"\n", q->tot_len));
-    udphdr->len = htons(q->tot_len);
-    /* calculate checksum */
-#if CHECKSUM_GEN_UDP
-    IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_UDP) {
-      /* Checksum is mandatory over IPv6. */
-      if (IP_IS_V6(dst_ip) || (pcb->flags & UDP_FLAGS_NOCHKSUM) == 0) {
-        u16_t udpchksum;
-#if LWIP_CHECKSUM_ON_COPY
-        if (have_chksum) {
-          u32_t acc;
-          udpchksum = ip_chksum_pseudo_partial(q, IP_PROTO_UDP,
-            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);
-        }
-
-        /* chksum zero must become 0xffff, as zero means 'no checksum' */
-        if (udpchksum == 0x0000) {
-          udpchksum = 0xffff;
-        }
-        udphdr->chksum = udpchksum;
-      }
-    }
-#endif /* CHECKSUM_GEN_UDP */
-    ip_proto = IP_PROTO_UDP;
-  }
-
-  /* Determine TTL to use */
-#if LWIP_MULTICAST_TX_OPTIONS
-  ttl = (ip_addr_ismulticast(dst_ip) ? pcb->mcast_ttl : pcb->ttl);
-#else /* LWIP_MULTICAST_TX_OPTIONS */
-  ttl = pcb->ttl;
-#endif /* LWIP_MULTICAST_TX_OPTIONS */
-
-  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));
-  err = ip_output_if_src(q, src_ip, dst_ip, ttl, pcb->tos, ip_proto, netif);
-  NETIF_SET_HWADDRHINT(netif, NULL);
-
-  /* TODO: must this be increased even if error occurred? */
-  MIB2_STATS_INC(mib2.udpoutdatagrams);
-
-  /* did we chain a separate header pbuf earlier? */
-  if (q != p) {
-    /* free the header pbuf */
-    pbuf_free(q);
-    q = NULL;
-    /* p is still referenced by the caller, and will live on */
-  }
-
-  UDP_STATS_INC(udp.xmit);
-  return err;
-}
-
-/**
- * Bind an UDP PCB.
- *
- * @param pcb UDP PCB to be bound with a local address ipaddr and port.
- * @param ipaddr local IP address to bind with. Use IP_ADDR_ANY 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
- * UDP_LOCAL_PORT_RANGE_END.
- *
- * ipaddr & port are expected to be in the same byte order as in the pcb.
- *
- * @return lwIP error code.
- * - ERR_OK. Successful. No error occurred.
- * - ERR_USE. The specified ipaddr and port are already bound to by
- * another UDP PCB.
- *
- * @see udp_disconnect()
- */
-err_t
-udp_bind(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port)
-{
-  struct udp_pcb *ipcb;
-  u8_t rebind;
-
-#if LWIP_IPV4
-  /* Don't propagate NULL pointer (IPv4 ANY) to subsequent functions */
-  if (ipaddr == NULL) {
-    ipaddr = IP_ADDR_ANY;
-  }
-#endif /* LWIP_IPV4 */
-
-  /* still need to check for ipaddr == NULL in IPv6 only case */
-  if ((pcb == NULL) || (ipaddr == NULL) || !IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr)) {
-    return ERR_VAL;
-  }
-
-  LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_bind(ipaddr = "));
-  ip_addr_debug_print(UDP_DEBUG | LWIP_DBG_TRACE, ipaddr);
-  LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, (", port = %"U16_F")\n", port));
-
-  rebind = 0;
-  /* Check for double bind and rebind of the same pcb */
-  for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
-    /* is this UDP PCB already on active list? */
-    if (pcb == ipcb) {
-      rebind = 1;
-      break;
-    }
-  }
-
-  /* no port specified? */
-  if (port == 0) {
-    port = udp_new_port();
-    if (port == 0) {
-      /* no more ports available in local range */
-      LWIP_DEBUGF(UDP_DEBUG, ("udp_bind: out of free UDP ports\n"));
-      return ERR_USE;
-    }
-  } 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. */
-#if SO_REUSE
-        if (!ip_get_option(pcb, SOF_REUSEADDR) ||
-            !ip_get_option(ipcb, SOF_REUSEADDR))
-#endif /* SO_REUSE */
-        {
-          /* port matches that of PCB in list and REUSEADDR not set -> reject */
-          if ((ipcb->local_port == port) && (IP_IS_V6(ipaddr) == IP_IS_V6_VAL(ipcb->local_ip)) &&
-              /* IP address matches, or one is IP_ADDR_ANY? */
-                (ip_addr_isany(&ipcb->local_ip) ||
-                 ip_addr_isany(ipaddr) ||
-                 ip_addr_cmp(&ipcb->local_ip, ipaddr))) {
-            /* 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));
-            return ERR_USE;
-          }
-        }
-      }
-    }
-  }
-
-  ip_addr_set_ipaddr(&pcb->local_ip, ipaddr);
-
-  pcb->local_port = port;
-  mib2_udp_bind(pcb);
-  /* pcb not active yet? */
-  if (rebind == 0) {
-    /* place the PCB on the active list if not already there */
-    pcb->next = udp_pcbs;
-    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);
-  LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (", port %"U16_F")\n", pcb->local_port));
-  return ERR_OK;
-}
-
-/**
- * Connect an UDP PCB.
- *
- * This will associate the UDP PCB with the remote address.
- *
- * @param pcb UDP PCB to be connected with remote address ipaddr and port.
- * @param ipaddr remote IP address to connect with.
- * @param port remote UDP port to connect with.
- *
- * @return lwIP error code
- *
- * ipaddr & port are expected to be in the same byte order as in the pcb.
- *
- * The udp pcb is bound to a random local port if not already bound.
- *
- * @see udp_disconnect()
- */
-err_t
-udp_connect(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port)
-{
-  struct udp_pcb *ipcb;
-
-  if ((pcb == NULL) || (ipaddr == NULL) || !IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr)) {
-    return ERR_VAL;
-  }
-
-  if (pcb->local_port == 0) {
-    err_t err = udp_bind(pcb, &pcb->local_ip, pcb->local_port);
-    if (err != ERR_OK) {
-      return err;
-    }
-  }
-
-  ip_addr_set_ipaddr(&pcb->remote_ip, ipaddr);
-  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);
-  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. */
-  for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
-    if (pcb == ipcb) {
-      /* already on the list, just return */
-      return ERR_OK;
-    }
-  }
-  /* PCB not yet on the list, add PCB now */
-  pcb->next = udp_pcbs;
-  udp_pcbs = pcb;
-  return ERR_OK;
-}
-
-/**
- * Disconnect a UDP PCB
- *
- * @param pcb the udp pcb to disconnect.
- */
-void
-udp_disconnect(struct udp_pcb *pcb)
-{
-  /* reset remote address association */
-  ip_addr_set_any(IP_IS_V6_VAL(pcb->remote_ip), &pcb->remote_ip);
-  pcb->remote_port = 0;
-  /* mark PCB as unconnected */
-  pcb->flags &= ~UDP_FLAGS_CONNECTED;
-}
-
-/**
- * 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
- * @param recv function pointer of the callback function
- * @param recv_arg additional argument to pass to the callback function
- */
-void
-udp_recv(struct udp_pcb *pcb, udp_recv_fn recv, void *recv_arg)
-{
-  /* remember recv() callback and user data */
-  pcb->recv = recv;
-  pcb->recv_arg = recv_arg;
-}
-
-/**
- * Remove an UDP 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.
- *
- * @see udp_new()
- */
-void
-udp_remove(struct udp_pcb *pcb)
-{
-  struct udp_pcb *pcb2;
-
-  mib2_udp_unbind(pcb);
-  /* pcb to be removed is first in list? */
-  if (udp_pcbs == pcb) {
-    /* make list start at 2nd pcb */
-    udp_pcbs = udp_pcbs->next;
-    /* pcb not 1st in list */
-  } else {
-    for (pcb2 = udp_pcbs; pcb2 != NULL; pcb2 = pcb2->next) {
-      /* find pcb in udp_pcbs list */
-      if (pcb2->next != NULL && pcb2->next == pcb) {
-        /* remove pcb from list */
-        pcb2->next = pcb->next;
-        break;
-      }
-    }
-  }
-  memp_free(MEMP_UDP_PCB, pcb);
-}
-
-/**
- * Create a UDP PCB.
- *
- * @return The UDP PCB which was created. NULL if the PCB data structure
- * could not be allocated.
- *
- * @see udp_remove()
- */
-struct udp_pcb *
-udp_new(void)
-{
-  struct udp_pcb *pcb;
-  pcb = (struct udp_pcb *)memp_malloc(MEMP_UDP_PCB);
-  /* could allocate UDP PCB? */
-  if (pcb != NULL) {
-    /* UDP Lite: by initializing to all zeroes, chksum_len is set to 0
-     * which means checksum is generated over the whole datagram per default
-     * (recommended as default by RFC 3828). */
-    /* initialize PCB to all zeroes */
-    memset(pcb, 0, sizeof(struct udp_pcb));
-    pcb->ttl = UDP_TTL;
-#if LWIP_MULTICAST_TX_OPTIONS
-    pcb->mcast_ttl = UDP_TTL;
-#endif /* LWIP_MULTICAST_TX_OPTIONS */
-  }
-  return pcb;
-}
-
-/**
- * Create a UDP PCB for specific IP type.
- *
- * @param type IP address type, see IPADDR_TYPE_XX definitions.
- * @return The UDP PCB which was created. NULL if the PCB data structure
- * could not be allocated.
- *
- * @see udp_remove()
- */
-struct udp_pcb *
-udp_new_ip_type(u8_t type)
-{
-  struct udp_pcb *pcb;
-  pcb = udp_new();
-#if LWIP_IPV4 && LWIP_IPV6
-  if(pcb != NULL) {
-    IP_SET_TYPE_VAL(pcb->local_ip,  type);
-    IP_SET_TYPE_VAL(pcb->remote_ip, type);
-  }
-#else
-  LWIP_UNUSED_ARG(type);
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-  return pcb;
-}
-
-#if LWIP_IPV4
-/** This function is called from netif.c when address is changed
- *
- * @param old_addr IPv4 address of the netif before change
- * @param new_addr IPv4 address of the netif after change
- */
-void udp_netif_ipv4_addr_changed(const ip4_addr_t* old_addr, const ip4_addr_t* new_addr)
-{
-  struct udp_pcb* upcb;
-
-  if (!ip4_addr_isany(new_addr)) {
-    for (upcb = udp_pcbs; upcb != NULL; upcb = upcb->next) {
-      /* Is this an IPv4 pcb? */
-      if (!IP_IS_V6_VAL(upcb->local_ip)) {
-        /* PCB bound to current local interface address? */
-        if (!ip4_addr_isany(ip_2_ip4(&upcb->local_ip)) &&
-            ip4_addr_cmp(ip_2_ip4(&upcb->local_ip), old_addr)) {
-          /* The PCB is bound to the old ipaddr and
-            * is set to bound to the new one instead */
-          ip_addr_copy_from_ip4(upcb->local_ip, *new_addr);
-        }
-      }
-    }
-  }
-}
-#endif /* LWIP_IPV4 */
-
-#if UDP_DEBUG
-/**
- * Print UDP header information for debug purposes.
- *
- * @param udphdr pointer to the udp header in memory.
- */
-void
-udp_debug_print(struct udp_hdr *udphdr)
-{
-  LWIP_DEBUGF(UDP_DEBUG, ("UDP header:\n"));
-  LWIP_DEBUGF(UDP_DEBUG, ("+-------------------------------+\n"));
-  LWIP_DEBUGF(UDP_DEBUG, ("|     %5"U16_F"     |     %5"U16_F"     | (src port, dest port)\n",
-                          ntohs(udphdr->src), ntohs(udphdr->dest)));
-  LWIP_DEBUGF(UDP_DEBUG, ("+-------------------------------+\n"));
-  LWIP_DEBUGF(UDP_DEBUG, ("|     %5"U16_F"     |     0x%04"X16_F"    | (len, chksum)\n",
-                          ntohs(udphdr->len), ntohs(udphdr->chksum)));
-  LWIP_DEBUGF(UDP_DEBUG, ("+-------------------------------+\n"));
-}
-#endif /* UDP_DEBUG */
-
-#endif /* LWIP_UDP */
diff --git a/components/lwip/include/lwip/apps/sntp/sntp.h b/components/lwip/include/lwip/apps/sntp/sntp.h
deleted file mode 100644 (file)
index b008693..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (c) 2007-2009 Frédéric Bernon, 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: Frédéric Bernon, Simon Goldschmidt
- *
- */
-#ifndef LWIP_HDR_APPS_SNTP_H
-#define LWIP_HDR_APPS_SNTP_H
-
-#include "apps/sntp/sntp_opts.h"
-#include "lwip/ip_addr.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* SNTP operating modes: default is to poll using unicast.
-   The mode has to be set before calling sntp_init(). */
-#define SNTP_OPMODE_POLL            0
-#define SNTP_OPMODE_LISTENONLY      1
-void sntp_setoperatingmode(u8_t operating_mode);
-u8_t sntp_getoperatingmode(void);
-
-void sntp_init(void);
-void sntp_stop(void);
-u8_t sntp_enabled(void);
-
-void sntp_setserver(u8_t idx, const ip_addr_t *addr);
-ip_addr_t sntp_getserver(u8_t idx);
-
-#if SNTP_SERVER_DNS
-void sntp_setservername(u8_t idx, char *server);
-char *sntp_getservername(u8_t idx);
-#endif /* SNTP_SERVER_DNS */
-
-#if SNTP_GET_SERVERS_FROM_DHCP
-void sntp_servermode_dhcp(int set_servers_from_dhcp);
-#else /* SNTP_GET_SERVERS_FROM_DHCP */
-#define sntp_servermode_dhcp(x)
-#endif /* SNTP_GET_SERVERS_FROM_DHCP */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_HDR_APPS_SNTP_H */
diff --git a/components/lwip/include/lwip/apps/sntp/sntp_opts.h b/components/lwip/include/lwip/apps/sntp/sntp_opts.h
deleted file mode 100644 (file)
index c8a3964..0000000
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (c) 2007-2009 Frédéric Bernon, 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: Frédéric Bernon, Simon Goldschmidt
- *
- */
-#ifndef LWIP_HDR_APPS_SNTP_OPTS_H
-#define LWIP_HDR_APPS_SNTP_OPTS_H
-
-#include "lwip/opt.h"
-
-/** 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.
- */
-#ifndef SNTP_SET_SYSTEM_TIME
-#define SNTP_SET_SYSTEM_TIME(sec)   LWIP_UNUSED_ARG(sec)
-#endif
-
-/** The maximum number of SNTP servers that can be set */
-#ifndef SNTP_MAX_SERVERS
-#define SNTP_MAX_SERVERS           LWIP_DHCP_MAX_NTP_SERVERS
-#endif
-
-/** Set this to 1 to implement the callback function called by dhcp when
- * NTP servers are received. */
-#ifndef SNTP_GET_SERVERS_FROM_DHCP
-#define SNTP_GET_SERVERS_FROM_DHCP LWIP_DHCP_GET_NTP_SRV
-#endif
-
-/* Set this to 1 to support DNS names (or IP address strings) to set sntp servers */
-#ifndef SNTP_SERVER_DNS
-#define SNTP_SERVER_DNS            1
-#endif
-
-/** One server address/name can be defined as default if SNTP_SERVER_DNS == 1:
- * #define SNTP_SERVER_ADDRESS "pool.ntp.org"
- */
-
-/**
- * SNTP_DEBUG: Enable debugging for SNTP.
- */
-#ifndef SNTP_DEBUG
-#define SNTP_DEBUG                  LWIP_DBG_OFF
-#endif
-
-/** SNTP server port */
-#ifndef SNTP_PORT
-#define SNTP_PORT                   123
-#endif
-
-/** Set this to 1 to allow config of SNTP server(s) by DNS name */
-#ifndef SNTP_SERVER_DNS
-#define SNTP_SERVER_DNS             0
-#endif
-
-/** Sanity check:
- * Define this to
- * - 0 to turn off sanity checks (default; smaller code)
- * - >= 1 to check address and port of the response packet to ensure the
- *        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
- *        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
- *        currently a cozy number like one second. This check avoids using a
- *        server whose synchronization source has expired for a very long time.
- */
-#ifndef SNTP_CHECK_RESPONSE
-#define SNTP_CHECK_RESPONSE         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,
- * which must return the delay in milliseconds as u32_t.
- * Turned off by default.
- */
-#ifndef SNTP_STARTUP_DELAY
-#define SNTP_STARTUP_DELAY          0
-#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.
- */
-#ifndef SNTP_STARTUP_DELAY_FUNC
-#define SNTP_STARTUP_DELAY_FUNC     SNTP_STARTUP_DELAY
-#endif
-
-/** SNTP receive timeout - in milliseconds
- * Also used as retry timeout - this shouldn't be too low.
- * Default is 3 seconds.
- */
-#ifndef SNTP_RECV_TIMEOUT
-#define SNTP_RECV_TIMEOUT           3000
-#endif
-
-/** SNTP update delay - in milliseconds
- * Default is 1 hour. Must not be beolw 15 seconds by specification (i.e. 15000)
- */
-#ifndef SNTP_UPDATE_DELAY
-#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.
- */
-#ifndef SNTP_GET_SYSTEM_TIME
-#define SNTP_GET_SYSTEM_TIME(sec, us)     do { (sec) = 0; (us) = 0; } while(0)
-#endif
-
-/** Default retry timeout (in milliseconds) if the response
- * received is invalid.
- * This is doubled with each retry until SNTP_RETRY_TIMEOUT_MAX is reached.
- */
-#ifndef SNTP_RETRY_TIMEOUT
-#define SNTP_RETRY_TIMEOUT          SNTP_RECV_TIMEOUT
-#endif
-
-/** Maximum retry timeout (in milliseconds). */
-#ifndef SNTP_RETRY_TIMEOUT_MAX
-#define SNTP_RETRY_TIMEOUT_MAX      (SNTP_RETRY_TIMEOUT * 10)
-#endif
-
-/** Increase retry timeout with every retry sent
- * Default is on to conform to RFC.
- */
-#ifndef SNTP_RETRY_TIMEOUT_EXP
-#define SNTP_RETRY_TIMEOUT_EXP      1
-#endif
-
-#endif /* LWIP_HDR_APPS_SNTP_OPTS_H */
diff --git a/components/lwip/include/lwip/lwip/api.h b/components/lwip/include/lwip/lwip/api.h
deleted file mode 100644 (file)
index 5b6a21e..0000000
+++ /dev/null
@@ -1,364 +0,0 @@
-/*
- * 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_API_H
-#define LWIP_HDR_API_H
-
-#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 <stddef.h> /* for size_t */
-
-#include "lwip/netbuf.h"
-#include "lwip/sys.h"
-#include "lwip/ip_addr.h"
-#include "lwip/err.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Throughout this file, IP addresses and port numbers are expected to be in
- * the same byte order as in the corresponding pcb.
- */
-
-/* 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
-
-/* Flags for struct netconn.flags (u8_t) */
-/** 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 this is set, a TCP netconn must call netconn_recved() to update
-    the TCP receive window (done automatically if not set). */
-#define NETCONN_FLAG_NO_AUTO_RECVED           0x08
-/** 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
-#if LWIP_IPV6
-/** 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. */
-#define NETCONN_FLAG_IPV6_V6ONLY              0x20
-#endif /* LWIP_IPV6 */
-
-
-    /* Helpers to process several netconn_types by the same code */
-#define NETCONNTYPE_GROUP(t)         ((t)&0xF0)
-#define NETCONNTYPE_DATAGRAM(t)      ((t)&0xE0)
-#if LWIP_IPV6
-#define NETCONN_TYPE_IPV6            0x08
-#define NETCONNTYPE_ISIPV6(t)        (((t)&NETCONN_TYPE_IPV6) != 0)
-#define NETCONNTYPE_ISUDPLITE(t)     (((t)&0xF3) == NETCONN_UDPLITE)
-#define NETCONNTYPE_ISUDPNOCHKSUM(t) (((t)&0xF3) == NETCONN_UDPNOCHKSUM)
-#else /* LWIP_IPV6 */
-#define NETCONNTYPE_ISUDPLITE(t)     ((t) == NETCONN_UDPLITE)
-#define NETCONNTYPE_ISUDPNOCHKSUM(t) ((t) == NETCONN_UDPNOCHKSUM)
-#endif /* LWIP_IPV6 */
-
-/** Protocol family and type of the netconn */
-enum netconn_type {
-  NETCONN_INVALID     = 0,
-  /* NETCONN_TCP Group */
-  NETCONN_TCP         = 0x10,
-#if LWIP_IPV6
-  NETCONN_TCP_IPV6    = NETCONN_TCP | NETCONN_TYPE_IPV6 /* 0x18 */,
-#endif /* LWIP_IPV6 */
-  /* NETCONN_UDP Group */
-  NETCONN_UDP         = 0x20,
-  NETCONN_UDPLITE     = 0x21,
-  NETCONN_UDPNOCHKSUM = 0x22,
-
-#if LWIP_IPV6
-  NETCONN_UDP_IPV6         = NETCONN_UDP | NETCONN_TYPE_IPV6 /* 0x28 */,
-  NETCONN_UDPLITE_IPV6     = NETCONN_UDPLITE | NETCONN_TYPE_IPV6 /* 0x29 */,
-  NETCONN_UDPNOCHKSUM_IPV6 = NETCONN_UDPNOCHKSUM | NETCONN_TYPE_IPV6 /* 0x2a */,
-#endif /* LWIP_IPV6 */
-
-  /* NETCONN_RAW Group */
-  NETCONN_RAW         = 0x40
-#if LWIP_IPV6
-  , NETCONN_RAW_IPV6    = NETCONN_RAW | NETCONN_TYPE_IPV6 /* 0x48 */
-#endif /* LWIP_IPV6 */
-};
-
-/** Current state of the netconn. Non-TCP netconns are always
- * in state NETCONN_NONE! */
-enum netconn_state {
-  NETCONN_NONE,
-  NETCONN_WRITE,
-  NETCONN_LISTEN,
-  NETCONN_CONNECT,
-  NETCONN_CLOSE
-};
-
-/** Use to inform the callback function about changes */
-enum netconn_evt {
-  NETCONN_EVT_RCVPLUS,
-  NETCONN_EVT_RCVMINUS,
-  NETCONN_EVT_SENDPLUS,
-  NETCONN_EVT_SENDMINUS,
-  NETCONN_EVT_ERROR
-};
-
-#if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD)
-/** Used for netconn_join_leave_group() */
-enum netconn_igmp {
-  NETCONN_JOIN,
-  NETCONN_LEAVE
-};
-#endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */
-
-#if LWIP_DNS
-/* Used for netconn_gethostbyname_addrtype(), these should match the DNS_ADDRTYPE defines in dns.h */
-#define NETCONN_DNS_DEFAULT   NETCONN_DNS_IPV4_IPV6
-#define NETCONN_DNS_IPV4      0
-#define NETCONN_DNS_IPV6      1
-#define NETCONN_DNS_IPV4_IPV6 2 /* try to resolve IPv4 first, try IPv6 if IPv4 fails only */
-#define NETCONN_DNS_IPV6_IPV4 3 /* try to resolve IPv6 first, try IPv4 if IPv6 fails only */
-#endif /* LWIP_DNS */
-
-/* forward-declare some structs to avoid to include their headers */
-struct ip_pcb;
-struct tcp_pcb;
-struct udp_pcb;
-struct raw_pcb;
-struct netconn;
-struct api_msg_msg;
-
-/** A callback prototype to inform about events for a netconn */
-typedef void (* netconn_callback)(struct netconn *, enum netconn_evt, u16_t len);
-
-/** A netconn descriptor */
-struct netconn {
-  /** type of the netconn (TCP, UDP or RAW) */
-  enum netconn_type type;
-  /** current state of the netconn */
-  enum netconn_state state;
-  /** the lwIP internal protocol control block */
-  union {
-    struct ip_pcb  *ip;
-    struct tcp_pcb *tcp;
-    struct udp_pcb *udp;
-    struct raw_pcb *raw;
-  } pcb;
-  /** the last error this netconn had */
-  err_t last_err;
-  
-#if !LWIP_NETCONN_SEM_PER_THREAD
-  /** sem that is used to synchronously execute functions in the core context */
-  sys_sem_t op_completed;
-
-#endif
-
-  /** mbox where received packets are stored until they are fetched
-      by the netconn application thread (can grow quite big) */
-  sys_mbox_t recvmbox;
-#if LWIP_TCP
-  /** mbox where new connections are stored until processed
-      by the application thread */
-  sys_mbox_t acceptmbox;
-#endif /* LWIP_TCP */
-  /** only used for socket layer */
-#if LWIP_SOCKET
-  int socket;
-#endif /* LWIP_SOCKET */
-#if LWIP_SO_SNDTIMEO
-  /** timeout to wait for sending data (which means enqueueing data for sending
-      in internal buffers) in milliseconds */
-  s32_t send_timeout;
-#endif /* LWIP_SO_RCVTIMEO */
-#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;
-#endif /* LWIP_SO_RCVTIMEO */
-#if LWIP_SO_RCVBUF
-  /** maximum amount of bytes queued in recvmbox
-      not used for TCP: adjust TCP_WND instead! */
-  int recv_bufsize;
-  /** 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 */
-  int recv_avail;
-#endif /* LWIP_SO_RCVBUF */
-#if LWIP_SO_LINGER
-   /** values <0 mean linger is disabled, values > 0 are seconds to linger */
-  s16_t linger;
-#endif /* LWIP_SO_LINGER */
-  /** flags holding more netconn-internal state, see NETCONN_FLAG_* defines */
-  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_msg *current_msg;
-#endif /* LWIP_TCP */
-  /** A callback function that is informed about events for this netconn */
-  netconn_callback callback;
-};
-
-/** 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: */
-#define netconn_new(t)                  netconn_new_with_proto_and_callback(t, 0, NULL)
-#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_delete(struct netconn *conn);
-/** Get the type of a netconn (as enum netconn_type). */
-#define netconn_type(conn) (conn->type)
-
-err_t   netconn_getaddr(struct netconn *conn, ip_addr_t *addr,
-                        u16_t *port, u8_t local);
-#define netconn_peer(c,i,p) netconn_getaddr(c,i,p,0)
-#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_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);
-#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_tcp_pbuf(struct netconn *conn, struct pbuf **new_buf);
-void    netconn_recved(struct netconn *conn, u32_t length);
-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);
-#define netconn_write(conn, dataptr, size, apiflags) \
-          netconn_write_partly(conn, dataptr, size, apiflags, NULL)
-err_t   netconn_close(struct netconn *conn);
-err_t   netconn_shutdown(struct netconn *conn, u8_t shut_rx, u8_t shut_tx);
-
-#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);
-#endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */
-#if LWIP_DNS
-#if LWIP_IPV4 && LWIP_IPV6
-err_t   netconn_gethostbyname_addrtype(const char *name, ip_addr_t *addr, u8_t dns_addrtype);
-#define netconn_gethostbyname(name, addr) netconn_gethostbyname_addrtype(name, addr, NETCONN_DNS_DEFAULT)
-#else /* LWIP_IPV4 && LWIP_IPV6 */
-err_t   netconn_gethostbyname(const char *name, ip_addr_t *addr);
-#define netconn_gethostbyname_addrtype(name, addr, dns_addrtype) netconn_gethostbyname(name, addr)
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-#endif /* LWIP_DNS */
-
-#define netconn_err(conn)               ((conn)->last_err)
-#define netconn_recv_bufsize(conn)      ((conn)->recv_bufsize)
-
-/** 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; \
-} else { \
-  (conn)->flags &= ~ 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)
-
-/** TCP: Set the no-auto-recved status of netconn calls (see NETCONN_FLAG_NO_AUTO_RECVED) */
-#define netconn_set_noautorecved(conn, val)  do { if(val) { \
-  (conn)->flags |= NETCONN_FLAG_NO_AUTO_RECVED; \
-} else { \
-  (conn)->flags &= ~ NETCONN_FLAG_NO_AUTO_RECVED; }} while(0)
-/** TCP: Get the no-auto-recved status of netconn calls (see NETCONN_FLAG_NO_AUTO_RECVED) */
-#define netconn_get_noautorecved(conn)        (((conn)->flags & NETCONN_FLAG_NO_AUTO_RECVED) != 0)
-
-#if LWIP_IPV6
-/** 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; \
-} else { \
-  (conn)->flags &= ~ NETCONN_FLAG_IPV6_V6ONLY; }} while(0)
-/** TCP: Get the IPv6 ONLY status of netconn calls (see NETCONN_FLAG_IPV6_V6ONLY) */
-#define netconn_get_ipv6only(conn)        (((conn)->flags & NETCONN_FLAG_IPV6_V6ONLY) != 0)
-#endif /* LWIP_IPV6 */
-
-#if LWIP_SO_SNDTIMEO
-/** Set the send timeout in milliseconds */
-#define netconn_set_sendtimeout(conn, timeout)      ((conn)->send_timeout = (timeout))
-/** Get the send timeout in milliseconds */
-#define netconn_get_sendtimeout(conn)               ((conn)->send_timeout)
-#endif /* LWIP_SO_SNDTIMEO */
-#if LWIP_SO_RCVTIMEO
-/** Set the receive timeout in milliseconds */
-#define netconn_set_recvtimeout(conn, timeout)      ((conn)->recv_timeout = (timeout))
-/** Get the receive timeout in milliseconds */
-#define netconn_get_recvtimeout(conn)               ((conn)->recv_timeout)
-#endif /* LWIP_SO_RCVTIMEO */
-#if LWIP_SO_RCVBUF
-/** Set the receive buffer in bytes */
-#define netconn_set_recvbufsize(conn, recvbufsize)  ((conn)->recv_bufsize = (recvbufsize))
-/** Get the receive buffer in bytes */
-#define netconn_get_recvbufsize(conn)               ((conn)->recv_bufsize)
-#endif /* LWIP_SO_RCVBUF*/
-
-#if LWIP_NETCONN_SEM_PER_THREAD
-void netconn_thread_init(void);
-void netconn_thread_cleanup(void);
-#else /* LWIP_NETCONN_SEM_PER_THREAD */
-#define netconn_thread_init()
-#define netconn_thread_cleanup()
-#endif /* LWIP_NETCONN_SEM_PER_THREAD */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_NETCONN || LWIP_SOCKET */
-
-#endif /* LWIP_HDR_API_H */
diff --git a/components/lwip/include/lwip/lwip/arch.h b/components/lwip/include/lwip/lwip/arch.h
deleted file mode 100644 (file)
index 1fe29bc..0000000
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * 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_ARCH_H
-#define LWIP_HDR_ARCH_H
-
-#ifndef LITTLE_ENDIAN
-#define LITTLE_ENDIAN 1234
-#endif
-
-#ifndef BIG_ENDIAN
-#define BIG_ENDIAN 4321
-#endif
-
-#include "arch/cc.h"
-
-/** Temporary: define format string for size_t if not defined in cc.h */
-#ifndef SZT_F
-#define SZT_F U32_F
-#endif /* SZT_F */
-/** Temporary upgrade helper: define format string for u8_t as hex if not
-    defined in cc.h */
-#ifndef X8_F
-#define X8_F  "02x"
-#endif /* X8_F */
-
-/** 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))
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifndef PACK_STRUCT_BEGIN
-#define PACK_STRUCT_BEGIN
-#endif /* PACK_STRUCT_BEGIN */
-
-#ifndef PACK_STRUCT_END
-#define PACK_STRUCT_END
-#endif /* PACK_STRUCT_END */
-
-#ifndef PACK_STRUCT_STRUCT
-#define PACK_STRUCT_STRUCT
-#endif /* PACK_STRUCT_STRUCT */
-
-#ifndef PACK_STRUCT_FIELD
-#define PACK_STRUCT_FIELD(x) x
-#endif /* PACK_STRUCT_FIELD */
-
-/* Used for struct fields of u8_t,
- * where some compilers warn that packing is not necessary */
-#ifndef PACK_STRUCT_FLD_8
-#define PACK_STRUCT_FLD_8(x) PACK_STRUCT_FIELD(x)
-#endif /* PACK_STRUCT_FLD_8 */
-
-/* Used for struct fields of that are packed structs themself,
- * where some compilers warn that packing is not necessary */
-#ifndef PACK_STRUCT_FLD_S
-#define PACK_STRUCT_FLD_S(x) PACK_STRUCT_FIELD(x)
-#endif /* PACK_STRUCT_FLD_S */
-
-
-#ifndef LWIP_UNUSED_ARG
-#define LWIP_UNUSED_ARG(x) (void)x
-#endif /* LWIP_UNUSED_ARG */
-
-
-#ifdef LWIP_PROVIDE_ERRNO
-
-#define  EPERM         1  /* Operation not permitted */
-#define  ENOENT        2  /* No such file or directory */
-#define  ESRCH         3  /* No such process */
-#define  EINTR         4  /* Interrupted system call */
-#define  EIO           5  /* I/O error */
-#define  ENXIO         6  /* No such device or address */
-#define  E2BIG         7  /* Arg list too long */
-#define  ENOEXEC       8  /* Exec format error */
-#define  EBADF         9  /* Bad file number */
-#define  ECHILD       10  /* No child processes */
-#define  EAGAIN       11  /* Try again */
-#define  ENOMEM       12  /* Out of memory */
-#define  EACCES       13  /* Permission denied */
-#define  EFAULT       14  /* Bad address */
-#define  ENOTBLK      15  /* Block device required */
-#define  EBUSY        16  /* Device or resource busy */
-#define  EEXIST       17  /* File exists */
-#define  EXDEV        18  /* Cross-device link */
-#define  ENODEV       19  /* No such device */
-#define  ENOTDIR      20  /* Not a directory */
-#define  EISDIR       21  /* Is a directory */
-#define  EINVAL       22  /* Invalid argument */
-#define  ENFILE       23  /* File table overflow */
-#define  EMFILE       24  /* Too many open files */
-#define  ENOTTY       25  /* Not a typewriter */
-#define  ETXTBSY      26  /* Text file busy */
-#define  EFBIG        27  /* File too large */
-#define  ENOSPC       28  /* No space left on device */
-#define  ESPIPE       29  /* Illegal seek */
-#define  EROFS        30  /* Read-only file system */
-#define  EMLINK       31  /* Too many links */
-#define  EPIPE        32  /* Broken pipe */
-#define  EDOM         33  /* Math argument out of domain of func */
-#define  ERANGE       34  /* Math result not representable */
-#define  EDEADLK      35  /* Resource deadlock would occur */
-#define  ENAMETOOLONG 36  /* File name too long */
-#define  ENOLCK       37  /* No record locks available */
-#define  ENOSYS       38  /* Function not implemented */
-#define  ENOTEMPTY    39  /* Directory not empty */
-#define  ELOOP        40  /* Too many symbolic links encountered */
-#define  EWOULDBLOCK  EAGAIN  /* Operation would block */
-#define  ENOMSG       42  /* No message of desired type */
-#define  EIDRM        43  /* Identifier removed */
-#define  ECHRNG       44  /* Channel number out of range */
-#define  EL2NSYNC     45  /* Level 2 not synchronized */
-#define  EL3HLT       46  /* Level 3 halted */
-#define  EL3RST       47  /* Level 3 reset */
-#define  ELNRNG       48  /* Link number out of range */
-#define  EUNATCH      49  /* Protocol driver not attached */
-#define  ENOCSI       50  /* No CSI structure available */
-#define  EL2HLT       51  /* Level 2 halted */
-#define  EBADE        52  /* Invalid exchange */
-#define  EBADR        53  /* Invalid request descriptor */
-#define  EXFULL       54  /* Exchange full */
-#define  ENOANO       55  /* No anode */
-#define  EBADRQC      56  /* Invalid request code */
-#define  EBADSLT      57  /* Invalid slot */
-
-#define  EDEADLOCK    EDEADLK
-
-#define  EBFONT       59  /* Bad font file format */
-#define  ENOSTR       60  /* Device not a stream */
-#define  ENODATA      61  /* No data available */
-#define  ETIME        62  /* Timer expired */
-#define  ENOSR        63  /* Out of streams resources */
-#define  ENONET       64  /* Machine is not on the network */
-#define  ENOPKG       65  /* Package not installed */
-#define  EREMOTE      66  /* Object is remote */
-#define  ENOLINK      67  /* Link has been severed */
-#define  EADV         68  /* Advertise error */
-#define  ESRMNT       69  /* Srmount error */
-#define  ECOMM        70  /* Communication error on send */
-#define  EPROTO       71  /* Protocol error */
-#define  EMULTIHOP    72  /* Multihop attempted */
-#define  EDOTDOT      73  /* RFS specific error */
-#define  EBADMSG      74  /* Not a data message */
-#define  EOVERFLOW    75  /* Value too large for defined data type */
-#define  ENOTUNIQ     76  /* Name not unique on network */
-#define  EBADFD       77  /* File descriptor in bad state */
-#define  EREMCHG      78  /* Remote address changed */
-#define  ELIBACC      79  /* Can not access a needed shared library */
-#define  ELIBBAD      80  /* Accessing a corrupted shared library */
-#define  ELIBSCN      81  /* .lib section in a.out corrupted */
-#define  ELIBMAX      82  /* Attempting to link in too many shared libraries */
-#define  ELIBEXEC     83  /* Cannot exec a shared library directly */
-#define  EILSEQ       84  /* Illegal byte sequence */
-#define  ERESTART     85  /* Interrupted system call should be restarted */
-#define  ESTRPIPE     86  /* Streams pipe error */
-#define  EUSERS       87  /* Too many users */
-#define  ENOTSOCK     88  /* Socket operation on non-socket */
-#define  EDESTADDRREQ 89  /* Destination address required */
-#define  EMSGSIZE     90  /* Message too long */
-#define  EPROTOTYPE   91  /* Protocol wrong type for socket */
-#define  ENOPROTOOPT  92  /* Protocol not available */
-#define  EPROTONOSUPPORT 93  /* Protocol not supported */
-#define  ESOCKTNOSUPPORT 94  /* Socket type not supported */
-#define  EOPNOTSUPP      95  /* Operation not supported on transport endpoint */
-#define  EPFNOSUPPORT    96  /* Protocol family not supported */
-#define  EAFNOSUPPORT    97  /* Address family not supported by protocol */
-#define  EADDRINUSE      98  /* Address already in use */
-#define  EADDRNOTAVAIL   99  /* Cannot assign requested address */
-#define  ENETDOWN       100  /* Network is down */
-#define  ENETUNREACH    101  /* Network is unreachable */
-#define  ENETRESET      102  /* Network dropped connection because of reset */
-#define  ECONNABORTED   103  /* Software caused connection abort */
-#define  ECONNRESET     104  /* Connection reset by peer */
-#define  ENOBUFS        105  /* No buffer space available */
-#define  EISCONN        106  /* Transport endpoint is already connected */
-#define  ENOTCONN       107  /* Transport endpoint is not connected */
-#define  ESHUTDOWN      108  /* Cannot send after transport endpoint shutdown */
-#define  ETOOMANYREFS   109  /* Too many references: cannot splice */
-#define  ETIMEDOUT      110  /* Connection timed out */
-#define  ECONNREFUSED   111  /* Connection refused */
-#define  EHOSTDOWN      112  /* Host is down */
-#define  EHOSTUNREACH   113  /* No route to host */
-#define  EALREADY       114  /* Operation already in progress */
-#define  EINPROGRESS    115  /* Operation now in progress */
-#define  ESTALE         116  /* Stale NFS file handle */
-#define  EUCLEAN        117  /* Structure needs cleaning */
-#define  ENOTNAM        118  /* Not a XENIX named type file */
-#define  ENAVAIL        119  /* No XENIX semaphores available */
-#define  EISNAM         120  /* Is a named type file */
-#define  EREMOTEIO      121  /* Remote I/O error */
-#define  EDQUOT         122  /* Quota exceeded */
-
-#define  ENOMEDIUM      123  /* No medium found */
-#define  EMEDIUMTYPE    124  /* Wrong medium type */
-
-#ifndef errno
-extern int errno;
-#endif
-
-#endif /* LWIP_PROVIDE_ERRNO */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_HDR_ARCH_H */
diff --git a/components/lwip/include/lwip/lwip/autoip.h b/components/lwip/include/lwip/lwip/autoip.h
deleted file mode 100644 (file)
index 16eac51..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-/**
- * @file
- *
- * AutoIP Automatic LinkLocal IP Configuration
- */
-
-/*
- *
- * Copyright (c) 2007 Dominik Spies <kontakt@dspies.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.
- *
- * Author: Dominik Spies <kontakt@dspies.de>
- *
- * This is a AutoIP implementation for the lwIP TCP/IP stack. It aims to conform
- * with RFC 3927.
- *
- *
- * Please coordinate changes and requests with Dominik Spies
- * <kontakt@dspies.de>
- */
-
-#ifndef LWIP_HDR_AUTOIP_H
-#define LWIP_HDR_AUTOIP_H
-
-#include "lwip/opt.h"
-
-#if LWIP_IPV4 && LWIP_AUTOIP /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/netif.h"
-/* #include "lwip/udp.h" */
-#include "netif/etharp.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* AutoIP Timing */
-#define AUTOIP_TMR_INTERVAL      100
-#define AUTOIP_TICKS_PER_SECOND (1000 / AUTOIP_TMR_INTERVAL)
-
-/* RFC 3927 Constants */
-#define PROBE_WAIT               1   /* second   (initial random delay)                 */
-#define PROBE_MIN                1   /* second   (minimum delay till repeated probe)    */
-#define PROBE_MAX                2   /* seconds  (maximum delay till repeated probe)    */
-#define PROBE_NUM                3   /*          (number of probe packets)              */
-#define ANNOUNCE_NUM             2   /*          (number of announcement packets)       */
-#define ANNOUNCE_INTERVAL        2   /* seconds  (time between announcement packets)    */
-#define ANNOUNCE_WAIT            2   /* seconds  (delay before announcing)              */
-#define MAX_CONFLICTS            LWIP_AUTOIP_MAX_CONFLICTS   /*          (max conflicts before rate limiting)   */
-#define RATE_LIMIT_INTERVAL      LWIP_AUTOIP_RATE_LIMIT_INTERVAL  /* seconds  (delay between successive attempts)    */
-#define DEFEND_INTERVAL          10  /* seconds  (min. wait between defensive ARPs)     */
-
-/* AutoIP client states */
-#define AUTOIP_STATE_OFF         0
-#define AUTOIP_STATE_PROBING     1
-#define AUTOIP_STATE_ANNOUNCING  2
-#define AUTOIP_STATE_BOUND       3
-
-struct autoip
-{
-  ip4_addr_t llipaddr;      /* the currently selected, probed, announced or used LL IP-Address */
-  u8_t state;               /* current AutoIP state machine state */
-  u8_t sent_num;            /* sent number of probes or announces, dependent on state */
-  u16_t ttw;                /* ticks to wait, tick is AUTOIP_TMR_INTERVAL long */
-  u8_t lastconflict;        /* ticks until a conflict can be solved by defending */
-  u8_t tried_llipaddr;      /* total number of probed/used Link Local IP-Addresses */
-};
-
-
-#define autoip_init() /* Compatibility define, no init needed. */
-
-/** Set a struct autoip allocated by the application to work with */
-void autoip_set_struct(struct netif *netif, struct autoip *autoip);
-
-/** Remove a struct autoip previously set to the netif using autoip_set_struct() */
-#define autoip_remove_struct(netif) do { (netif)->autoip = NULL; } while (0)
-
-/** Start AutoIP client */
-err_t autoip_start(struct netif *netif);
-
-/** Stop AutoIP client */
-err_t autoip_stop(struct netif *netif);
-
-/** Handles every incoming ARP Packet, called by etharp_arp_input */
-void autoip_arp_reply(struct netif *netif, struct etharp_hdr *hdr);
-
-/** Has to be called in loop every AUTOIP_TMR_INTERVAL milliseconds */
-void autoip_tmr(void);
-
-/** Handle a possible change in the network configuration */
-void autoip_network_changed(struct netif *netif);
-
-/** check if AutoIP supplied netif->ip_addr */
-u8_t autoip_supplied_address(struct netif *netif);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_IPV4 && LWIP_AUTOIP */
-
-#endif /* LWIP_HDR_AUTOIP_H */
diff --git a/components/lwip/include/lwip/lwip/debug.h b/components/lwip/include/lwip/lwip/debug.h
deleted file mode 100644 (file)
index 973a633..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * 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_DEBUG_H
-#define LWIP_HDR_DEBUG_H
-
-#include "lwip/arch.h"
-#include "lwip/opt.h"
-
-/** lower two bits indicate debug level
- * - 0 all
- * - 1 warning
- * - 2 serious
- * - 3 severe
- */
-#define LWIP_DBG_LEVEL_ALL     0x00
-#define LWIP_DBG_LEVEL_OFF     LWIP_DBG_LEVEL_ALL /* compatibility define only */
-#define LWIP_DBG_LEVEL_WARNING 0x01 /* bad checksums, dropped packets, ... */
-#define LWIP_DBG_LEVEL_SERIOUS 0x02 /* memory allocation failures, ... */
-#define LWIP_DBG_LEVEL_SEVERE  0x03
-#define LWIP_DBG_MASK_LEVEL    0x03
-
-/** flag for LWIP_DEBUGF to enable that debug message */
-#define LWIP_DBG_ON            0x80U
-/** flag for LWIP_DEBUGF to disable that debug message */
-#define LWIP_DBG_OFF           0x00U
-
-/** flag for LWIP_DEBUGF indicating a tracing message (to follow program flow) */
-#define LWIP_DBG_TRACE         0x40U
-/** flag for LWIP_DEBUGF indicating a state debug message (to follow module states) */
-#define LWIP_DBG_STATE         0x20U
-/** flag for LWIP_DEBUGF indicating newly added code, not thoroughly tested yet */
-#define LWIP_DBG_FRESH         0x10U
-/** flag for LWIP_DEBUGF to halt after printing this debug message */
-#define LWIP_DBG_HALT          0x08U
-
-/**
- * LWIP_NOASSERT: Disable LWIP_ASSERT checks.
- * -- To disable assertions define LWIP_NOASSERT in arch/cc.h.
- */
-#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 */
-
-/** if "expression" isn't true, then print "message" and execute "handler" expression */
-#ifndef LWIP_ERROR
-#ifndef LWIP_NOASSERT
-#define LWIP_PLATFORM_ERROR(message) LWIP_PLATFORM_ASSERT(message)
-#elif defined LWIP_DEBUG
-#define LWIP_PLATFORM_ERROR(message) LWIP_PLATFORM_DIAG((message))
-#else
-#define LWIP_PLATFORM_ERROR(message)
-#endif
-
-#define LWIP_ERROR(message, expression, handler) do { if (!(expression)) { \
-  LWIP_PLATFORM_ERROR(message); handler;}} while(0)
-#endif /* LWIP_ERROR */
-
-#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
-/** print debug message only if debug message type is enabled...
- *  AND is of correct type AND is at least LWIP_DBG_LEVEL
- */
-#define LWIP_DEBUGF(debug, message) do { \
-                               if ( \
-                                   ((debug) & LWIP_DBG_ON) && \
-                                   ((debug) & LWIP_DBG_TYPES_ON) && \
-                                   ((s16_t)((debug) & LWIP_DBG_MASK_LEVEL) >= LWIP_DBG_MIN_LEVEL)) { \
-                                 LWIP_PLATFORM_DIAG(message); \
-                                 if ((debug) & LWIP_DBG_HALT) { \
-                                   while(1); \
-                                 } \
-                               } \
-                             } while(0)
-
-#else  /* LWIP_DEBUG */
-#define LWIP_DEBUGF(debug, message)
-#endif /* LWIP_DEBUG */
-
-#endif /* LWIP_HDR_DEBUG_H */
-
diff --git a/components/lwip/include/lwip/lwip/def.h b/components/lwip/include/lwip/lwip/def.h
deleted file mode 100644 (file)
index 4957136..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * 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_DEF_H
-#define LWIP_HDR_DEF_H
-
-/* arch.h might define NULL already */
-#include "lwip/arch.h"
-#include "lwip/opt.h"
-#if LWIP_PERF
-#include "arch/perf.h"
-#else /* LWIP_PERF */
-#define PERF_START    /* null definition */
-#define PERF_STOP(x)  /* null definition */
-#endif /* LWIP_PERF */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define LWIP_MAX(x , y)  (((x) > (y)) ? (x) : (y))
-#define LWIP_MIN(x , y)  (((x) < (y)) ? (x) : (y))
-
-/* Get the number of entries in an array ('x' must NOT be a pointer!) */
-#define LWIP_ARRAYSIZE(x) (sizeof(x)/sizeof((x)[0]))
-
-#ifndef NULL
-#define NULL ((void *)0)
-#endif
-
-/* Endianess-optimized shifting of two u8_t to create one u16_t */
-#if BYTE_ORDER == LITTLE_ENDIAN
-#define LWIP_MAKE_U16(a, b) ((a << 8) | b)
-#else
-#define LWIP_MAKE_U16(a, b) ((b << 8) | a)
-#endif
-
-#ifndef LWIP_PLATFORM_BYTESWAP
-#define LWIP_PLATFORM_BYTESWAP 0
-#endif
-
-#ifndef LWIP_PREFIX_BYTEORDER_FUNCS
-/* workaround for naming collisions on some platforms */
-
-#ifdef htons
-#undef htons
-#endif /* htons */
-#ifdef htonl
-#undef htonl
-#endif /* htonl */
-#ifdef ntohs
-#undef ntohs
-#endif /* ntohs */
-#ifdef ntohl
-#undef ntohl
-#endif /* ntohl */
-
-#define htons(x) lwip_htons(x)
-#define ntohs(x) lwip_ntohs(x)
-#define htonl(x) lwip_htonl(x)
-#define ntohl(x) lwip_ntohl(x)
-#endif /* LWIP_PREFIX_BYTEORDER_FUNCS */
-
-#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)
-#else /* BYTE_ORDER != BIG_ENDIAN */
-#if LWIP_PLATFORM_BYTESWAP
-#define lwip_htons(x) LWIP_PLATFORM_HTONS(x)
-#define lwip_ntohs(x) LWIP_PLATFORM_HTONS(x)
-#define lwip_htonl(x) LWIP_PLATFORM_HTONL(x)
-#define lwip_ntohl(x) LWIP_PLATFORM_HTONL(x)
-#else /* LWIP_PLATFORM_BYTESWAP */
-u16_t lwip_htons(u16_t x);
-u16_t lwip_ntohs(u16_t x);
-u32_t lwip_htonl(u32_t x);
-u32_t lwip_ntohl(u32_t x);
-#endif /* LWIP_PLATFORM_BYTESWAP */
-
-/* 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) & 0xff) << 8) | (((x) & 0xff00) >> 8))
-#define PP_NTOHS(x) PP_HTONS(x)
-#define PP_HTONL(x) ((((x) & 0xff) << 24) | \
-                     (((x) & 0xff00) << 8) | \
-                     (((x) & 0xff0000UL) >> 8) | \
-                     (((x) & 0xff000000UL) >> 24))
-#define PP_NTOHL(x) PP_HTONL(x)
-
-#endif /* BYTE_ORDER == BIG_ENDIAN */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_HDR_DEF_H */
-
diff --git a/components/lwip/include/lwip/lwip/dhcp.h b/components/lwip/include/lwip/lwip/dhcp.h
deleted file mode 100644 (file)
index f282c8a..0000000
+++ /dev/null
@@ -1,314 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Leon Woestenberg <leon.woestenberg@gmx.net>
- * Copyright (c) 2001-2004 Axon Digital Design B.V., The Netherlands.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Leon Woestenberg <leon.woestenberg@gmx.net>
- *
- */
-#ifndef LWIP_HDR_DHCP_H
-#define LWIP_HDR_DHCP_H
-
-#include "lwip/opt.h"
-
-#if LWIP_DHCP /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/netif.h"
-#include "lwip/udp.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/** period (in seconds) of the application calling dhcp_coarse_tmr() */
-#define DHCP_COARSE_TIMER_SECS 1
-/** period (in milliseconds) of the application calling dhcp_coarse_tmr() */
-#define DHCP_COARSE_TIMER_MSECS (DHCP_COARSE_TIMER_SECS * 1000UL)
-/** period (in milliseconds) of the application calling dhcp_fine_tmr() */
-#define DHCP_FINE_TIMER_MSECS 500
-
-#define DHCP_CHADDR_LEN 16U
-#define DHCP_SNAME_LEN  64U
-#define DHCP_FILE_LEN   128U
-
-struct dhcp
-{
-  /** 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 */
-  u8_t state;
-  /** retries of current request */
-  u8_t tries;
-#if LWIP_DHCP_AUTOIP_COOP
-  u8_t autoip_coop_state;
-#endif
-  u8_t subnet_mask_given;
-
-  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 */
-  u32_t t1_timeout;  /* #ticks with period DHCP_COARSE_TIMER_SECS for renewal time */
-  u32_t t2_timeout;  /* #ticks with period DHCP_COARSE_TIMER_SECS for rebind time */
-  u32_t t1_renew_time;  /* #ticks with period DHCP_COARSE_TIMER_SECS until next renew try */
-  u32_t t2_rebind_time; /* #ticks with period DHCP_COARSE_TIMER_SECS until next rebind try */
-  u32_t lease_used; /* #ticks with period DHCP_COARSE_TIMER_SECS since last received DHCP ack */
-  u32_t t0_timeout; /* #ticks with period DHCP_COARSE_TIMER_SECS for lease time */
-  ip_addr_t server_ip_addr; /* dhcp server address that offered this lease (ip_addr_t because passed to UDP) */
-  ip4_addr_t offered_ip_addr;
-  ip4_addr_t offered_sn_mask;
-  ip4_addr_t offered_gw_addr;
-
-  u32_t offered_t0_lease; /* lease period (in seconds) */
-  u32_t offered_t1_renew; /* recommended renew time (usually 50% of lease period) */
-  u32_t offered_t2_rebind; /* recommended rebind time (usually 87.5 of lease period)  */
-#if LWIP_DHCP_BOOTP_FILE
-  ip_addr_t offered_si_addr;
-  char boot_file_name[DHCP_FILE_LEN];
-#endif /* LWIP_DHCP_BOOTPFILE */
-
-  /* Espressif add start. */
-#ifdef ESP_LWIP
-  void (*cb)(struct netif*); /* callback for dhcp, add a parameter to show dhcp status if needed */
-#else
-  void (*cb)(void); /* callback for dhcp, add a parameter to show dhcp status if needed */
-#endif
-  /* Espressif add end. */
-};
-
-/* MUST be compiled with "pack structs" or equivalent! */
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-/** minimum set of fields of any DHCP message */
-struct dhcp_msg
-{
-  PACK_STRUCT_FLD_8(u8_t op);
-  PACK_STRUCT_FLD_8(u8_t htype);
-  PACK_STRUCT_FLD_8(u8_t hlen);
-  PACK_STRUCT_FLD_8(u8_t hops);
-  PACK_STRUCT_FIELD(u32_t xid);
-  PACK_STRUCT_FIELD(u16_t secs);
-  PACK_STRUCT_FIELD(u16_t flags);
-  PACK_STRUCT_FLD_S(ip4_addr_p_t ciaddr);
-  PACK_STRUCT_FLD_S(ip4_addr_p_t yiaddr);
-  PACK_STRUCT_FLD_S(ip4_addr_p_t siaddr);
-  PACK_STRUCT_FLD_S(ip4_addr_p_t giaddr);
-  PACK_STRUCT_FLD_8(u8_t chaddr[DHCP_CHADDR_LEN]);
-  PACK_STRUCT_FLD_8(u8_t sname[DHCP_SNAME_LEN]);
-  PACK_STRUCT_FLD_8(u8_t file[DHCP_FILE_LEN]);
-  PACK_STRUCT_FIELD(u32_t cookie);
-#define DHCP_MIN_OPTIONS_LEN 68U
-/** make sure user does not configure this too small */
-#if ((defined(DHCP_OPTIONS_LEN)) && (DHCP_OPTIONS_LEN < DHCP_MIN_OPTIONS_LEN))
-#  undef DHCP_OPTIONS_LEN
-#endif
-/** allow this to be configured in lwipopts.h, but not too small */
-#if (!defined(DHCP_OPTIONS_LEN))
-/** set this to be sufficient for your options in outgoing DHCP msgs */
-#  define DHCP_OPTIONS_LEN DHCP_MIN_OPTIONS_LEN
-#endif
-  PACK_STRUCT_FLD_8(u8_t options[DHCP_OPTIONS_LEN]);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
-void dhcp_set_struct(struct netif *netif, struct dhcp *dhcp);
-/** Remove a struct dhcp previously set to the netif using dhcp_set_struct() */
-#define dhcp_remove_struct(netif) do { (netif)->dhcp = NULL; } while(0)
-void dhcp_cleanup(struct netif *netif);
-/* Espressif add start. */
-/** set callback for DHCP */
-#ifdef ESP_LWIP
-void dhcp_set_cb(struct netif *netif, void (*cb)(struct netif*));
-#else
-void dhcp_set_cb(struct netif *netif, void (*cb)(void));
-#endif
-/* Espressif add end. */
-/** start DHCP configuration */
-err_t dhcp_start(struct netif *netif);
-/** enforce early lease renewal (not needed normally)*/
-err_t dhcp_renew(struct netif *netif);
-/** release the DHCP lease, usually called before dhcp_stop()*/
-err_t dhcp_release(struct netif *netif);
-/** stop DHCP configuration */
-void dhcp_stop(struct netif *netif);
-/** inform server of our manual IP address */
-void dhcp_inform(struct netif *netif);
-/** Handle a possible change in the network configuration */
-void dhcp_network_changed(struct netif *netif);
-
-/** if enabled, check whether the offered IP address is not in use, using ARP */
-#if DHCP_DOES_ARP_CHECK
-void dhcp_arp_reply(struct netif *netif, const ip4_addr_t *addr);
-#endif
-
-/** check if DHCP supplied netif->ip_addr */
-u8_t dhcp_supplied_address(struct netif *netif);
-
-/** to be called every minute */
-void dhcp_coarse_tmr(void);
-/** to be called every half second */
-void dhcp_fine_tmr(void);
-
-/** DHCP message item offsets and length */
-#define DHCP_OP_OFS       0
-#define DHCP_HTYPE_OFS    1
-#define DHCP_HLEN_OFS     2
-#define DHCP_HOPS_OFS     3
-#define DHCP_XID_OFS      4
-#define DHCP_SECS_OFS     8
-#define DHCP_FLAGS_OFS    10
-#define DHCP_CIADDR_OFS   12
-#define DHCP_YIADDR_OFS   16
-#define DHCP_SIADDR_OFS   20
-#define DHCP_GIADDR_OFS   24
-#define DHCP_CHADDR_OFS   28
-#define DHCP_SNAME_OFS    44
-#define DHCP_FILE_OFS     108
-#define DHCP_MSG_LEN      236
-
-#define DHCP_COOKIE_OFS   DHCP_MSG_LEN
-#define DHCP_OPTIONS_OFS  (DHCP_MSG_LEN + 4)
-
-#define DHCP_CLIENT_PORT  68
-#define DHCP_SERVER_PORT  67
-
-/** DHCP client states */
-#define DHCP_STATE_OFF          0
-#define DHCP_STATE_REQUESTING   1
-#define DHCP_STATE_INIT         2
-#define DHCP_STATE_REBOOTING    3
-#define DHCP_STATE_REBINDING    4
-#define DHCP_STATE_RENEWING     5
-#define DHCP_STATE_SELECTING    6
-#define DHCP_STATE_INFORMING    7
-#define DHCP_STATE_CHECKING     8
-/** not yet implemented #define DHCP_STATE_PERMANENT 9 */
-#define DHCP_STATE_BOUND        10
-/** not yet implemented #define DHCP_STATE_RELEASING 11 */
-#define DHCP_STATE_BACKING_OFF  12
-
-/** AUTOIP cooperation flags */
-#define DHCP_AUTOIP_COOP_STATE_OFF  0
-#define DHCP_AUTOIP_COOP_STATE_ON   1
-
-#define DHCP_BOOTREQUEST  1
-#define DHCP_BOOTREPLY    2
-
-/** DHCP message types */
-#define DHCP_DISCOVER 1
-#define DHCP_OFFER    2
-#define DHCP_REQUEST  3
-#define DHCP_DECLINE  4
-#define DHCP_ACK      5
-#define DHCP_NAK      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 */
-
-/** BootP options */
-#define DHCP_OPTION_PAD 0
-#define DHCP_OPTION_SUBNET_MASK 1 /* RFC 2132 3.3 */
-#define DHCP_OPTION_ROUTER 3
-#define DHCP_OPTION_DNS_SERVER 6
-#define DHCP_OPTION_HOSTNAME 12
-#define DHCP_OPTION_IP_TTL 23
-#define DHCP_OPTION_MTU 26
-#define DHCP_OPTION_BROADCAST 28
-#define DHCP_OPTION_TCP_TTL 37
-#define DHCP_OPTION_NTP 42
-#define DHCP_OPTION_END 255
-
-#if ESP_LWIP
-/**add options for support more router by liuHan**/
-#define DHCP_OPTION_DOMAIN_NAME 15
-#define DHCP_OPTION_PRD 31
-#define DHCP_OPTION_STATIC_ROUTER 33
-#define DHCP_OPTION_VSN 43
-#define DHCP_OPTION_NB_TINS 44
-#define DHCP_OPTION_NB_TINT 46
-#define DHCP_OPTION_NB_TIS 47
-#define DHCP_OPTION_CLASSLESS_STATIC_ROUTER 121
-#endif
-
-
-
-/** DHCP options */
-#define DHCP_OPTION_REQUESTED_IP 50 /* RFC 2132 9.1, requested IP address */
-#define DHCP_OPTION_LEASE_TIME 51 /* RFC 2132 9.2, time in seconds, in 4 bytes */
-#define DHCP_OPTION_OVERLOAD 52 /* RFC2132 9.3, use file and/or sname field for options */
-
-#define DHCP_OPTION_MESSAGE_TYPE 53 /* RFC 2132 9.6, important for DHCP */
-#define DHCP_OPTION_MESSAGE_TYPE_LEN 1
-
-#define DHCP_OPTION_SERVER_ID 54 /* RFC 2132 9.7, server IP address */
-#define DHCP_OPTION_PARAMETER_REQUEST_LIST 55 /* RFC 2132 9.8, requested option types */
-
-#define DHCP_OPTION_MAX_MSG_SIZE 57 /* RFC 2132 9.10, message size accepted >= 576 */
-#define DHCP_OPTION_MAX_MSG_SIZE_LEN 2
-
-#define DHCP_OPTION_T1 58 /* T1 renewal time */
-#define DHCP_OPTION_T2 59 /* T2 rebinding time */
-#define DHCP_OPTION_US 60
-#define DHCP_OPTION_CLIENT_ID 61
-#define DHCP_OPTION_TFTP_SERVERNAME 66
-#define DHCP_OPTION_BOOTFILE 67
-
-/** possible combinations of overloading the file and sname fields with options */
-#define DHCP_OVERLOAD_NONE 0
-#define DHCP_OVERLOAD_FILE 1
-#define DHCP_OVERLOAD_SNAME  2
-#define DHCP_OVERLOAD_SNAME_FILE 3
-
-#if LWIP_DHCP_GET_NTP_SRV
-/** This function must exist, in other to add offered NTP servers to
- * the NTP (or SNTP) engine.
- * See LWIP_DHCP_MAX_NTP_SERVERS */
-extern void dhcp_set_ntp_servers(u8_t num_ntp_servers, const ip4_addr_t* ntp_server_addrs);
-#endif /* LWIP_DHCP_GET_NTP_SRV */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_DHCP */
-
-#endif /*LWIP_HDR_DHCP_H*/
diff --git a/components/lwip/include/lwip/lwip/dhcp6.h b/components/lwip/include/lwip/lwip/dhcp6.h
deleted file mode 100644 (file)
index 345bcf0..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
- * @file
- *
- * IPv6 address autoconfiguration as per RFC 4862.
- */
-
-/*
- * Copyright (c) 2010 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>
- *
- * IPv6 address autoconfiguration as per RFC 4862.
- *
- * Please coordinate changes and requests with Ivan Delamer
- * <delamer@inicotech.com>
- */
-
-#ifndef LWIP_HDR_IP6_DHCP6_H
-#define LWIP_HDR_IP6_DHCP6_H
-
-#include "lwip/opt.h"
-
-#if LWIP_IPV6_DHCP6  /* don't build if not configured for use in lwipopts.h */
-
-
-struct dhcp6
-{
-  /*TODO: implement DHCP6*/
-};
-
-#endif /* LWIP_IPV6_DHCP6 */
-
-#endif /* LWIP_HDR_IP6_DHCP6_H */
diff --git a/components/lwip/include/lwip/lwip/dns.h b/components/lwip/include/lwip/lwip/dns.h
deleted file mode 100644 (file)
index e080280..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-/**
- * lwip DNS resolver header file.
-
- * Author: Jim Pettinato
- *   April 2007
-
- * ported from uIP resolv.c Copyright (c) 2002-2003, Adam Dunkels.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote
- *    products derived from this software without specific prior
- *    written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
- * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (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 LWIP_HDR_DNS_H
-#define LWIP_HDR_DNS_H
-
-#include "lwip/opt.h"
-
-#if ESP_DNS
-#include "lwip/err.h"
-#endif
-
-
-#if LWIP_DNS
-
-#include "lwip/ip_addr.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/** DNS timer period */
-#define DNS_TMR_INTERVAL          1000
-
-/* DNS resolve types: */
-#define LWIP_DNS_ADDRTYPE_IPV4      0
-#define LWIP_DNS_ADDRTYPE_IPV6      1
-#define LWIP_DNS_ADDRTYPE_IPV4_IPV6 2 /* try to resolve IPv4 first, try IPv6 if IPv4 fails only */
-#define LWIP_DNS_ADDRTYPE_IPV6_IPV4 3 /* try to resolve IPv6 first, try IPv4 if IPv6 fails only */
-#if LWIP_IPV4 && LWIP_IPV6
-#ifndef LWIP_DNS_ADDRTYPE_DEFAULT
-#define LWIP_DNS_ADDRTYPE_DEFAULT   LWIP_DNS_ADDRTYPE_IPV4_IPV6
-#endif
-#elif defined(LWIP_IPV4)
-#define LWIP_DNS_ADDRTYPE_DEFAULT   LWIP_DNS_ADDRTYPE_IPV4
-#else
-#define LWIP_DNS_ADDRTYPE_DEFAULT   LWIP_DNS_ADDRTYPE_IPV6
-#endif
-
-#if DNS_LOCAL_HOSTLIST
-/** struct used for local host-list */
-struct local_hostlist_entry {
-  /** static hostname */
-  const char *name;
-  /** static host address in network byteorder */
-  ip_addr_t addr;
-  struct local_hostlist_entry *next;
-};
-#if DNS_LOCAL_HOSTLIST_IS_DYNAMIC
-#ifndef DNS_LOCAL_HOSTLIST_MAX_NAMELEN
-#define DNS_LOCAL_HOSTLIST_MAX_NAMELEN  DNS_MAX_NAME_LENGTH
-#endif
-#define LOCALHOSTLIST_ELEM_SIZE ((sizeof(struct local_hostlist_entry) + DNS_LOCAL_HOSTLIST_MAX_NAMELEN + 1))
-#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */
-#endif /* DNS_LOCAL_HOSTLIST */
-
-/** Callback which is invoked when a hostname is found.
- * A function of this type must be implemented by the application using the DNS resolver.
- * @param name pointer to the name that was looked up.
- * @param ipaddr 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).
- * @param callback_arg a user-specified callback argument passed to dns_gethostbyname
-*/
-typedef void (*dns_found_callback)(const char *name, const ip_addr_t *ipaddr, void *callback_arg);
-
-void           dns_init(void);
-void           dns_tmr(void);
-void           dns_setserver(u8_t numdns, const ip_addr_t *dnsserver);
-void           dns_clear_servers(bool keep_fallback);
-ip_addr_t      dns_getserver(u8_t numdns);
-err_t          dns_gethostbyname(const char *hostname, ip_addr_t *addr,
-                                 dns_found_callback found, void *callback_arg);
-err_t          dns_gethostbyname_addrtype(const char *hostname, ip_addr_t *addr,
-                                 dns_found_callback found, void *callback_arg,
-                                 u8_t dns_addrtype);
-
-
-#if DNS_LOCAL_HOSTLIST && DNS_LOCAL_HOSTLIST_IS_DYNAMIC
-int            dns_local_removehost(const char *hostname, const ip_addr_t *addr);
-err_t          dns_local_addhost(const char *hostname, const ip_addr_t *addr);
-#endif /* DNS_LOCAL_HOSTLIST && DNS_LOCAL_HOSTLIST_IS_DYNAMIC */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_DNS */
-
-#endif /* LWIP_HDR_DNS_H */
diff --git a/components/lwip/include/lwip/lwip/err.h b/components/lwip/include/lwip/lwip/err.h
deleted file mode 100644 (file)
index a766ee1..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * 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_ERR_H
-#define LWIP_HDR_ERR_H
-
-#include "lwip/opt.h"
-#include "lwip/arch.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/** 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. */
-
-#define ERR_OK          0    /* No error, everything OK. */
-#define ERR_MEM        -1    /* Out of memory error.     */
-#define ERR_BUF        -2    /* Buffer error.            */
-#define ERR_TIMEOUT    -3    /* Timeout.                 */
-#define ERR_RTE        -4    /* Routing problem.         */
-#define ERR_INPROGRESS -5    /* Operation in progress    */
-#define ERR_VAL        -6    /* Illegal value.           */
-#define ERR_WOULDBLOCK -7    /* Operation would block.   */
-#define ERR_USE        -8    /* Address in use.          */
-
-
-#if ESP_LWIP
-#define ERR_ALREADY    -9       /* Already connected.       */
-#define ERR_ISCONN     -10   /* Conn already established.*/
-#define ERR_IS_FATAL(e) ((e) < ERR_ISCONN)
-#define ERR_ABRT       -11   /* Connection aborted.      */
-#define ERR_RST        -12   /* Connection reset.        */
-#define ERR_CLSD       -13   /* Connection closed.       */
-#define ERR_CONN       -14   /* Not connected.           */
-#define ERR_ARG        -15   /* Illegal argument.        */
-#define ERR_IF         -16   /* Low-level netif error    */
-#else
-#define ERR_ALREADY    -9    /* Already connecting.      */
-#define ERR_ISCONN     -10   /* Conn already established.*/
-#define ERR_CONN       -11   /* Not connected.           */
-#define ERR_IF         -12   /* Low-level netif error    */
-#define ERR_IS_FATAL(e) ((e) <= ERR_ABRT)
-#define ERR_ABRT       -13   /* Connection aborted.      */
-#define ERR_RST        -14   /* Connection reset.        */
-#define ERR_CLSD       -15   /* Connection closed.       */
-#define ERR_ARG        -16   /* Illegal argument.        */
-#endif
-
-#ifdef LWIP_DEBUG
-extern const char *lwip_strerr(err_t err);
-#else
-#define lwip_strerr(x) ""
-#endif /* LWIP_DEBUG */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_HDR_ERR_H */
diff --git a/components/lwip/include/lwip/lwip/ethip6.h b/components/lwip/include/lwip/lwip/ethip6.h
deleted file mode 100644 (file)
index 5e88dff..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- * @file
- *
- * Ethernet output for IPv6. Uses ND tables for link-layer addressing.
- */
-
-/*
- * Copyright (c) 2010 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_ETHIP6_H
-#define LWIP_HDR_ETHIP6_H
-
-#include "lwip/opt.h"
-
-#if LWIP_IPV6 && LWIP_ETHERNET /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/pbuf.h"
-#include "lwip/ip6.h"
-#include "lwip/ip6_addr.h"
-#include "lwip/netif.h"
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-err_t ethip6_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_IPV6 && LWIP_ETHERNET */
-
-#endif /* LWIP_HDR_ETHIP6_H */
diff --git a/components/lwip/include/lwip/lwip/icmp.h b/components/lwip/include/lwip/lwip/icmp.h
deleted file mode 100644 (file)
index af3a455..0000000
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * 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_ICMP_H
-#define LWIP_HDR_ICMP_H
-
-#include "lwip/opt.h"
-#include "lwip/pbuf.h"
-#include "lwip/ip_addr.h"
-#include "lwip/netif.h"
-
-#if LWIP_IPV6 && LWIP_ICMP6
-#include "lwip/icmp6.h"
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define ICMP_ER   0    /* echo reply */
-#define ICMP_DUR  3    /* destination unreachable */
-#define ICMP_SQ   4    /* source quench */
-#define ICMP_RD   5    /* redirect */
-#define ICMP_ECHO 8    /* echo */
-#define ICMP_TE  11    /* time exceeded */
-#define ICMP_PP  12    /* parameter problem */
-#define ICMP_TS  13    /* timestamp */
-#define ICMP_TSR 14    /* timestamp reply */
-#define ICMP_IRQ 15    /* information request */
-#define ICMP_IR  16    /* information reply */
-#define ICMP_AM  17    /* address mask request */
-#define ICMP_AMR 18    /* address mask reply */
-
-enum icmp_dur_type {
-  ICMP_DUR_NET   = 0,  /* net unreachable */
-  ICMP_DUR_HOST  = 1,  /* host unreachable */
-  ICMP_DUR_PROTO = 2,  /* protocol unreachable */
-  ICMP_DUR_PORT  = 3,  /* port unreachable */
-  ICMP_DUR_FRAG  = 4,  /* fragmentation needed and DF set */
-  ICMP_DUR_SR    = 5   /* source route failed */
-};
-
-enum icmp_te_type {
-  ICMP_TE_TTL  = 0,    /* time to live exceeded in transit */
-  ICMP_TE_FRAG = 1     /* fragment reassembly time exceeded */
-};
-
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-/** This is the standard ICMP header only that the u32_t data
- *  is split to two u16_t like ICMP echo needs it.
- *  This header is also used for other ICMP types that do not
- *  use the data part.
- */
-PACK_STRUCT_BEGIN
-struct icmp_echo_hdr {
-  PACK_STRUCT_FLD_8(u8_t type);
-  PACK_STRUCT_FLD_8(u8_t code);
-  PACK_STRUCT_FIELD(u16_t chksum);
-  PACK_STRUCT_FIELD(u16_t id);
-  PACK_STRUCT_FIELD(u16_t seqno);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
-#define ICMPH_TYPE(hdr) ((hdr)->type)
-#define ICMPH_CODE(hdr) ((hdr)->code)
-
-/** Combines type and code to an u16_t */
-#define ICMPH_TYPE_SET(hdr, t) ((hdr)->type = (t))
-#define ICMPH_CODE_SET(hdr, c) ((hdr)->code = (c))
-
-
-#if LWIP_IPV4 && LWIP_ICMP /* don't build if not configured for use in lwipopts.h */
-
-void icmp_input(struct pbuf *p, struct netif *inp);
-void icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t);
-void icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t);
-
-#endif /* LWIP_IPV4 && LWIP_ICMP */
-
-#if LWIP_IPV4 && LWIP_IPV6
-#if LWIP_ICMP && LWIP_ICMP6
-#define icmp_port_unreach(isipv6, pbuf) ((isipv6) ? \
-                                         icmp6_dest_unreach(pbuf, ICMP6_DUR_PORT) : \
-                                         icmp_dest_unreach(pbuf, ICMP_DUR_PORT))
-#elif LWIP_ICMP
-#define icmp_port_unreach(isipv6, pbuf) do{ if(!(isipv6)) { icmp_dest_unreach(pbuf, ICMP_DUR_PORT);}}while(0)
-#elif LWIP_ICMP6
-#define icmp_port_unreach(isipv6, pbuf) do{ if(isipv6) { icmp6_dest_unreach(pbuf, ICMP6_DUR_PORT);}}while(0)
-#else
-#define icmp_port_unreach(isipv6, pbuf)
-#endif
-#elif LWIP_IPV6 && LWIP_ICMP6
-#define icmp_port_unreach(isipv6, pbuf) icmp6_dest_unreach(pbuf, ICMP6_DUR_PORT)
-#elif LWIP_IPV4 && LWIP_ICMP
-#define icmp_port_unreach(isipv6, pbuf) icmp_dest_unreach(pbuf, ICMP_DUR_PORT)
-#else /* (LWIP_IPV6 && LWIP_ICMP6) || (LWIP_IPV4 && LWIP_ICMP) */
-#define icmp_port_unreach(isipv6, pbuf)
-#endif /* (LWIP_IPV6 && LWIP_ICMP6) || (LWIP_IPV4 && LWIP_ICMP) LWIP_IPV4*/
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_HDR_ICMP_H */
diff --git a/components/lwip/include/lwip/lwip/icmp6.h b/components/lwip/include/lwip/lwip/icmp6.h
deleted file mode 100644 (file)
index 9d57103..0000000
+++ /dev/null
@@ -1,152 +0,0 @@
-/**
- * @file
- *
- * IPv6 version of ICMP, as per RFC 4443.
- */
-
-/*
- * Copyright (c) 2010 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_ICMP6_H
-#define LWIP_HDR_ICMP6_H
-
-#include "lwip/opt.h"
-#include "lwip/pbuf.h"
-#include "lwip/ip6_addr.h"
-#include "lwip/netif.h"
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-enum icmp6_type {
-  ICMP6_TYPE_DUR = 1,  /* Destination unreachable */
-  ICMP6_TYPE_PTB = 2,  /* Packet too big */
-  ICMP6_TYPE_TE = 3,   /* Time exceeded */
-  ICMP6_TYPE_PP = 4,   /* Parameter problem */
-  ICMP6_TYPE_PE1 = 100,  /* Private experimentation */
-  ICMP6_TYPE_PE2 = 101,  /* Private experimentation */
-  ICMP6_TYPE_RSV_ERR = 127,  /* Reserved for expansion of error messages */
-
-  ICMP6_TYPE_EREQ = 128,  /* Echo request */
-  ICMP6_TYPE_EREP = 129,  /* Echo reply */
-  ICMP6_TYPE_MLQ = 130,  /* Multicast listener query */
-  ICMP6_TYPE_MLR = 131,  /* Multicast listener report */
-  ICMP6_TYPE_MLD = 132,  /* Multicast listener done */
-  ICMP6_TYPE_RS = 133,  /* Router solicitation */
-  ICMP6_TYPE_RA = 134,  /* Router advertisement */
-  ICMP6_TYPE_NS = 135,  /* Neighbor solicitation */
-  ICMP6_TYPE_NA = 136,  /* Neighbor advertisement */
-  ICMP6_TYPE_RD = 137,  /* Redirect */
-  ICMP6_TYPE_MRA = 151,  /* Multicast router advertisement */
-  ICMP6_TYPE_MRS = 152,  /* Multicast router solicitation */
-  ICMP6_TYPE_MRT = 153,  /* Multicast router termination */
-  ICMP6_TYPE_PE3 = 200,  /* Private experimentation */
-  ICMP6_TYPE_PE4 = 201,  /* Private experimentation */
-  ICMP6_TYPE_RSV_INF = 255  /* Reserved for expansion of informational messages */
-};
-
-enum icmp6_dur_code {
-  ICMP6_DUR_NO_ROUTE = 0,     /* No route to destination */
-  ICMP6_DUR_PROHIBITED = 1,   /* Communication with destination administratively prohibited */
-  ICMP6_DUR_SCOPE = 2,        /* Beyond scope of source address */
-  ICMP6_DUR_ADDRESS = 3,      /* Address unreachable */
-  ICMP6_DUR_PORT = 4,         /* Port unreachable */
-  ICMP6_DUR_POLICY = 5,       /* Source address failed ingress/egress policy */
-  ICMP6_DUR_REJECT_ROUTE = 6  /* Reject route to destination */
-};
-
-enum icmp6_te_code {
-  ICMP6_TE_HL = 0,   /* Hop limit exceeded in transit */
-  ICMP6_TE_FRAG = 1  /* Fragment reassembly time exceeded */
-};
-
-enum icmp6_pp_code {
-  ICMP6_PP_FIELD = 0,   /* Erroneous header field encountered */
-  ICMP6_PP_HEADER = 1,  /* Unrecognized next header type encountered */
-  ICMP6_PP_OPTION = 2   /* Unrecognized IPv6 option encountered */
-};
-
-/** This is the standard ICMP6 header. */
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct icmp6_hdr {
-  PACK_STRUCT_FLD_8(u8_t type);
-  PACK_STRUCT_FLD_8(u8_t code);
-  PACK_STRUCT_FIELD(u16_t chksum);
-  PACK_STRUCT_FIELD(u32_t data);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
-/** This is the ICMP6 header adapted for echo req/resp. */
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct icmp6_echo_hdr {
-  PACK_STRUCT_FLD_8(u8_t type);
-  PACK_STRUCT_FLD_8(u8_t code);
-  PACK_STRUCT_FIELD(u16_t chksum);
-  PACK_STRUCT_FIELD(u16_t id);
-  PACK_STRUCT_FIELD(u16_t seqno);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
-
-#if LWIP_ICMP6 && LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */
-
-void icmp6_input(struct pbuf *p, struct netif *inp);
-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);
-
-#endif /* LWIP_ICMP6 && LWIP_IPV6 */
-
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /* LWIP_HDR_ICMP6_H */
diff --git a/components/lwip/include/lwip/lwip/igmp.h b/components/lwip/include/lwip/lwip/igmp.h
deleted file mode 100644 (file)
index bff1a61..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (c) 2002 CITEL 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. Neither the name of CITEL Technologies Ltd nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY CITEL TECHNOLOGIES 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 CITEL TECHNOLOGIES OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This file is a contribution to the lwIP TCP/IP stack.
- * The Swedish Institute of Computer Science and Adam Dunkels
- * are specifically granted permission to redistribute this
- * source code.
-*/
-
-#ifndef LWIP_HDR_IGMP_H
-#define LWIP_HDR_IGMP_H
-
-#include "lwip/opt.h"
-#include "lwip/ip_addr.h"
-#include "lwip/netif.h"
-#include "lwip/pbuf.h"
-
-#if LWIP_IPV4 && LWIP_IGMP /* don't build if not configured for use in lwipopts.h */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-/* IGMP timer */
-#define IGMP_TMR_INTERVAL              100 /* Milliseconds */
-#define IGMP_V1_DELAYING_MEMBER_TMR   (1000/IGMP_TMR_INTERVAL)
-#define IGMP_JOIN_DELAYING_MEMBER_TMR (500 /IGMP_TMR_INTERVAL)
-
-/* MAC Filter Actions, these are passed to a netif's
- * igmp_mac_filter callback function. */
-#define IGMP_DEL_MAC_FILTER            0
-#define IGMP_ADD_MAC_FILTER            1
-
-
-/**
- * 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
- *
- * 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
- */
-struct igmp_group {
-    /** next link */
-  struct igmp_group *next;
-  /** interface on which the group is active */
-  struct netif      *netif;
-  /** multicast address */
-  ip4_addr_t         group_address;
-  /** signifies we were the last person to report */
-  u8_t               last_reporter_flag;
-  /** current state of the group */
-  u8_t               group_state;
-  /** timer for reporting, negative is OFF */
-  u16_t              timer;
-  /** counter of simultaneous uses */
-  u8_t               use; 
-};
-
-/*  Prototypes */
-void   igmp_init(void);
-err_t  igmp_start(struct netif *netif);
-err_t  igmp_stop(struct netif *netif);
-void   igmp_report_groups(struct netif *netif);
-struct igmp_group *igmp_lookfor_group(struct netif *ifp, const ip4_addr_t *addr);
-void   igmp_input(struct pbuf *p, struct netif *inp, const ip4_addr_t *dest);
-err_t  igmp_joingroup(const ip4_addr_t *ifaddr, const ip4_addr_t *groupaddr);
-err_t  igmp_joingroup_netif(struct netif *netif, const ip4_addr_t *groupaddr);
-err_t  igmp_leavegroup(const ip4_addr_t *ifaddr, const ip4_addr_t *groupaddr);
-err_t  igmp_leavegroup_netif(struct netif *netif, const ip4_addr_t *groupaddr);
-void   igmp_tmr(void);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_IPV4 && LWIP_IGMP */
-
-#endif /* LWIP_HDR_IGMP_H */
diff --git a/components/lwip/include/lwip/lwip/inet.h b/components/lwip/include/lwip/lwip/inet.h
deleted file mode 100644 (file)
index 036cd98..0000000
+++ /dev/null
@@ -1,172 +0,0 @@
-/**
- * @file
- * This file (together with sockets.h) aims to provide structs and functions from
- * - arpa/inet.h
- * - netinet/in.h
- *
- */
-
-/*
- * 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_INET_H
-#define LWIP_HDR_INET_H
-
-#include "lwip/opt.h"
-#include "lwip/def.h"
-#include "lwip/ip_addr.h"
-#include "lwip/ip6_addr.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* If your port already typedef's in_addr_t, define IN_ADDR_T_DEFINED
-   to prevent this code from redefining it. */
-#if !defined(in_addr_t) && !defined(IN_ADDR_T_DEFINED)
-typedef u32_t in_addr_t;
-#endif
-
-struct in_addr {
-  in_addr_t s_addr;
-};
-
-struct in6_addr {
-  union {
-    u32_t u32_addr[4];
-    u8_t  u8_addr[16];
-  } un;
-#define s6_addr  un.u8_addr
-};
-
-/** 255.255.255.255 */
-#define INADDR_NONE         IPADDR_NONE
-/** 127.0.0.1 */
-#define INADDR_LOOPBACK     IPADDR_LOOPBACK
-/** 0.0.0.0 */
-#define INADDR_ANY          IPADDR_ANY
-/** 255.255.255.255 */
-#define INADDR_BROADCAST    IPADDR_BROADCAST
-
-/** This macro can be used to initialize a variable of type struct in6_addr
-    to the IPv6 wildcard address. */
-#define IN6ADDR_ANY_INIT {{{0,0,0,0}}}
-/** This macro can be used to initialize a variable of type struct in6_addr
-    to the IPv6 loopback address. */
-#define IN6ADDR_LOOPBACK_INIT {{{0,0,0,PP_HTONL(1)}}}
-/** This variable is initialized by the system to contain the wildcard IPv6 address. */
-extern const struct in6_addr in6addr_any;
-
-/* Definitions of the bits in an (IPv4) Internet address integer.
-
-   On subnets, host and network parts are found according to
-   the subnet mask, not these masks.  */
-#define IN_CLASSA(a)        IP_CLASSA(a)
-#define IN_CLASSA_NET       IP_CLASSA_NET
-#define IN_CLASSA_NSHIFT    IP_CLASSA_NSHIFT
-#define IN_CLASSA_HOST      IP_CLASSA_HOST
-#define IN_CLASSA_MAX       IP_CLASSA_MAX
-
-#define IN_CLASSB(b)        IP_CLASSB(b)
-#define IN_CLASSB_NET       IP_CLASSB_NET
-#define IN_CLASSB_NSHIFT    IP_CLASSB_NSHIFT
-#define IN_CLASSB_HOST      IP_CLASSB_HOST
-#define IN_CLASSB_MAX       IP_CLASSB_MAX
-
-#define IN_CLASSC(c)        IP_CLASSC(c)
-#define IN_CLASSC_NET       IP_CLASSC_NET
-#define IN_CLASSC_NSHIFT    IP_CLASSC_NSHIFT
-#define IN_CLASSC_HOST      IP_CLASSC_HOST
-#define IN_CLASSC_MAX       IP_CLASSC_MAX
-
-#define IN_CLASSD(d)        IP_CLASSD(d)
-#define IN_CLASSD_NET       IP_CLASSD_NET     /* These ones aren't really */
-#define IN_CLASSD_NSHIFT    IP_CLASSD_NSHIFT  /*   net and host fields, but */
-#define IN_CLASSD_HOST      IP_CLASSD_HOST    /*   routing needn't know. */
-#define IN_CLASSD_MAX       IP_CLASSD_MAX
-
-#define IN_MULTICAST(a)     IP_MULTICAST(a)
-
-#define IN_EXPERIMENTAL(a)  IP_EXPERIMENTAL(a)
-#define IN_BADCLASS(a)      IP_BADCLASS(a)
-
-#define IN_LOOPBACKNET      IP_LOOPBACKNET
-
-
-#ifndef INET_ADDRSTRLEN
-#define INET_ADDRSTRLEN     IP4ADDR_STRLEN_MAX
-#endif
-#if LWIP_IPV6
-#ifndef INET6_ADDRSTRLEN
-#define INET6_ADDRSTRLEN    IP6ADDR_STRLEN_MAX
-#endif
-#endif
-
-#if LWIP_IPV4
-
-#define inet_addr_from_ipaddr(target_inaddr, source_ipaddr) ((target_inaddr)->s_addr = ip4_addr_get_u32(source_ipaddr))
-#define inet_addr_to_ipaddr(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 ip_addr_t are an u32_t effectively! */
-#define inet_addr_to_ipaddr_p(target_ipaddr_p, source_inaddr)   ((target_ipaddr_p) = (ip_addr_t*)&((source_inaddr)->s_addr))
-
-/* directly map this to the lwip internal functions */
-#define inet_addr(cp)                   ipaddr_addr(cp)
-#define inet_aton(cp, addr)             ip4addr_aton(cp, (ip4_addr_t*)addr)
-#define inet_ntoa(addr)                 ip4addr_ntoa((const ip4_addr_t*)&(addr))
-#define inet_ntoa_r(addr, buf, buflen)  ip4addr_ntoa_r((const ip4_addr_t*)&(addr), buf, buflen)
-
-#endif /* LWIP_IPV4 */
-
-#if LWIP_IPV6
-#define inet6_addr_from_ip6addr(target_in6addr, source_ip6addr) {(target_in6addr)->un.u32_addr[0] = (source_ip6addr)->addr[0]; \
-                                                                 (target_in6addr)->un.u32_addr[1] = (source_ip6addr)->addr[1]; \
-                                                                 (target_in6addr)->un.u32_addr[2] = (source_ip6addr)->addr[2]; \
-                                                                 (target_in6addr)->un.u32_addr[3] = (source_ip6addr)->addr[3];}
-#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))
-
-/* directly map this to the lwip internal functions */
-#define inet6_aton(cp, addr)            ip6addr_aton(cp, (ip6_addr_t*)addr)
-#define inet6_ntoa(addr)                ip6addr_ntoa((const ip6_addr_t*)&(addr))
-#define inet6_ntoa_r(addr, buf, buflen) ip6addr_ntoa_r((const ip6_addr_t*)&(addr), buf, buflen)
-
-#endif /* LWIP_IPV6 */
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_HDR_INET_H */
diff --git a/components/lwip/include/lwip/lwip/inet_chksum.h b/components/lwip/include/lwip/lwip/inet_chksum.h
deleted file mode 100644 (file)
index 1766f4b..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * 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_INET_CHKSUM_H
-#define LWIP_HDR_INET_CHKSUM_H
-
-#include "lwip/opt.h"
-
-#include "lwip/pbuf.h"
-#include "lwip/ip_addr.h"
-
-/** Swap the bytes in an u16_t: much like htons() for little-endian */
-#ifndef SWAP_BYTES_IN_WORD
-#if LWIP_PLATFORM_BYTESWAP && (BYTE_ORDER == LITTLE_ENDIAN)
-/* little endian and PLATFORM_BYTESWAP defined */
-#define SWAP_BYTES_IN_WORD(w) LWIP_PLATFORM_HTONS(w)
-#else /* LWIP_PLATFORM_BYTESWAP && (BYTE_ORDER == LITTLE_ENDIAN) */
-/* can't use htons on big endian (or PLATFORM_BYTESWAP not defined)... */
-#define SWAP_BYTES_IN_WORD(w) (((w) & 0xff) << 8) | (((w) & 0xff00) >> 8)
-#endif /* LWIP_PLATFORM_BYTESWAP && (BYTE_ORDER == LITTLE_ENDIAN)*/
-#endif /* SWAP_BYTES_IN_WORD */
-
-/** Split an u32_t in two u16_ts and add them up */
-#ifndef FOLD_U32T
-#define FOLD_U32T(u)          (((u) >> 16) + ((u) & 0x0000ffffUL))
-#endif
-
-#if LWIP_CHECKSUM_ON_COPY
-/** Function-like macro: same as MEMCPY but returns the checksum of copied data
-    as u16_t */
-# ifndef LWIP_CHKSUM_COPY
-#  define LWIP_CHKSUM_COPY(dst, src, len) lwip_chksum_copy(dst, src, len)
-#  ifndef LWIP_CHKSUM_COPY_ALGORITHM
-#   define LWIP_CHKSUM_COPY_ALGORITHM 1
-#  endif /* LWIP_CHKSUM_COPY_ALGORITHM */
-# else /* LWIP_CHKSUM_COPY */
-#  define LWIP_CHKSUM_COPY_ALGORITHM 0
-# endif /* LWIP_CHKSUM_COPY */
-#else /* LWIP_CHECKSUM_ON_COPY */
-# define LWIP_CHKSUM_COPY_ALGORITHM 0
-#endif /* LWIP_CHECKSUM_ON_COPY */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-u16_t inet_chksum(const void *dataptr, u16_t len);
-u16_t inet_chksum_pbuf(struct pbuf *p);
-#if LWIP_CHKSUM_COPY_ALGORITHM
-u16_t lwip_chksum_copy(void *dst, const void *src, u16_t len);
-#endif /* LWIP_CHKSUM_COPY_ALGORITHM */
-
-#if LWIP_IPV4
-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);
-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);
-#endif /* LWIP_IPV4 */
-
-#if LWIP_IPV6
-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);
-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);
-#endif /* LWIP_IPV6 */
-
-
-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);
-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);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_HDR_INET_H */
-
diff --git a/components/lwip/include/lwip/lwip/init.h b/components/lwip/include/lwip/lwip/init.h
deleted file mode 100644 (file)
index 70351b8..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * 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
-
-/** X.x.x: Major version of the stack */
-#define LWIP_VERSION_MAJOR      1U
-/** x.X.x: Minor version of the stack */
-#define LWIP_VERSION_MINOR      5U
-/** x.x.X: Revision of the stack */
-#define LWIP_VERSION_REVISION   0U
-/** 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         0U
-
-/** LWIP_VERSION_RC is set to LWIP_RC_RELEASE for official releases */
-#define LWIP_RC_RELEASE         255U
-/** LWIP_VERSION_RC is set to LWIP_RC_DEVELOPMENT for Git versions */
-#define LWIP_RC_DEVELOPMENT     0U
-
-#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))
-
-/** Provides the version of the stack */
-#define LWIP_VERSION   (LWIP_VERSION_MAJOR << 24   | LWIP_VERSION_MINOR << 16 | \
-                        LWIP_VERSION_REVISION << 8 | LWIP_VERSION_RC)
-
-/* Modules initialization */
-void lwip_init(void);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_HDR_INIT_H */
diff --git a/components/lwip/include/lwip/lwip/ip.h b/components/lwip/include/lwip/lwip/ip.h
deleted file mode 100644 (file)
index d42fe68..0000000
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- * 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_IP_H__
-#define LWIP_HDR_IP_H__
-
-#include "lwip/opt.h"
-
-#include "lwip/def.h"
-#include "lwip/pbuf.h"
-#include "lwip/ip_addr.h"
-#include "lwip/err.h"
-#include "lwip/netif.h"
-#include "lwip/ip4.h"
-#include "lwip/ip6.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define IP_PROTO_ICMP    1
-#define IP_PROTO_IGMP    2
-#define IP_PROTO_UDP     17
-#define IP_PROTO_UDPLITE 136
-#define IP_PROTO_TCP     6
-
-/** This operates on a void* by loading the first byte */
-#define IP_HDR_GET_VERSION(ptr)   ((*(u8_t*)(ptr)) >> 4)
-
-/* This is passed as the destination address to ip_output_if (not
-   to ip_output), meaning that an IP header already is constructed
-   in the pbuf. This is used when TCP retransmits. */
-#ifdef IP_HDRINCL
-#undef IP_HDRINCL
-#endif /* IP_HDRINCL */
-#define IP_HDRINCL  NULL
-
-/** 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 */
-#ifndef LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX
-#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 */
-
-/* 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 \
-  /* 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               \
-  /* link layer address resolution hint */ \
-  IP_PCB_ADDRHINT
-
-struct ip_pcb {
-/* Common members of all PCB types */
-  IP_PCB;
-};
-
-/*
- * Option flags per-socket. These are the same like SO_XXX in sockets.h
- */
-#define SOF_REUSEADDR     0x04U  /* allow local address reuse */
-#define SOF_KEEPALIVE     0x08U  /* keep connections alive */
-#define SOF_BROADCAST     0x20U  /* permit to send and to receive broadcast messages (see IP_SOF_BROADCAST option) */
-
-/* These flags are inherited (e.g. from a listen-pcb to a connection-pcb): */
-#define SOF_INHERITED   (SOF_REUSEADDR|SOF_KEEPALIVE)
-
-/* Global variables of this module, kept in a struct for efficient access using base+index. */
-struct ip_globals
-{
-  /** The interface that accepted the packet for the current callback invocation. */
-  struct netif *current_netif;
-  /** The interface that received the packet for the current callback invocation. */
-  struct netif *current_input_netif;
-#if LWIP_IPV4
-  /** Header of the input packet currently being processed. */
-  struct ip_hdr *current_ip4_header;
-#endif /* LWIP_IPV4 */
-#if LWIP_IPV6
-  /** Header of the input IPv6 packet currently being processed. */
-  struct ip6_hdr *current_ip6_header;
-#endif /* LWIP_IPV6 */
-  /** Total header length of current_ip4/6_header (i.e. after this, the UDP/TCP header starts) */
-  u16_t current_ip_header_tot_len;
-  /** Source IP address of current_header */
-  ip_addr_t current_iphdr_src;
-  /** Destination IP address of current_header */
-  ip_addr_t current_iphdr_dest;
-};
-extern struct ip_globals ip_data;
-
-
-/** 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. */
-#define ip_current_netif()      (ip_data.current_netif)
-/** 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. */
-#define ip_current_input_netif() (ip_data.current_input_netif)
-/** Total header length of ip(6)_current_header() (i.e. after this, the UDP/TCP header starts) */
-#define ip_current_header_tot_len() (ip_data.current_ip_header_tot_len)
-/** Source IP address of current_header */
-#define ip_current_src_addr()   (&ip_data.current_iphdr_src)
-/** Destination IP address of current_header */
-#define ip_current_dest_addr()  (&ip_data.current_iphdr_dest)
-
-#if LWIP_IPV4 && LWIP_IPV6
-/** 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))
-/** 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. */
-#define ip6_current_header()      ((const struct ip6_hdr*)(ip_data.current_ip6_header))
-/** Returns TRUE if the current IP input packet is IPv6, FALSE if it is IPv4 */
-#define ip_current_is_v6()        (ip6_current_header() != NULL)
-/** Source IPv6 address of current_header */
-#define ip6_current_src_addr()    (ip_2_ip6(&ip_data.current_iphdr_src))
-/** Destination IPv6 address of current_header */
-#define ip6_current_dest_addr()   (ip_2_ip6(&ip_data.current_iphdr_dest))
-/** Get the transport layer protocol */
-#define ip_current_header_proto() (ip_current_is_v6() ? \
-                                   IP6H_NEXTH(ip6_current_header()) :\
-                                   IPH_PROTO(ip4_current_header()))
-/** Get the transport layer header */
-#define ip_next_header_ptr()     ((const void*)((ip_current_is_v6() ? \
-  (const u8_t*)ip6_current_header() : (const u8_t*)ip4_current_header())  + ip_current_header_tot_len()))
-
-/** Source IP4 address of current_header */
-#define ip4_current_src_addr()     (ip_2_ip4(&ip_data.current_iphdr_src))
-/** Destination IP4 address of current_header */
-#define ip4_current_dest_addr()    (ip_2_ip4(&ip_data.current_iphdr_dest))
-
-#elif LWIP_IPV4 /* LWIP_IPV4 && LWIP_IPV6 */
-
-/** 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))
-/** Always returns FALSE when only supporting IPv4 only */
-#define ip_current_is_v6()        0
-/** Get the transport layer protocol */
-#define ip_current_header_proto() IPH_PROTO(ip4_current_header())
-/** Get the transport layer header */
-#define ip_next_header_ptr()     ((const void*)((const u8_t*)ip4_current_header() + ip_current_header_tot_len()))
-/** Source IP4 address of current_header */
-#define ip4_current_src_addr()     (&ip_data.current_iphdr_src)
-/** Destination IP4 address of current_header */
-#define ip4_current_dest_addr()    (&ip_data.current_iphdr_dest)
-
-#elif LWIP_IPV6 /* LWIP_IPV4 && LWIP_IPV6 */
-
-/** 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. */
-#define ip6_current_header()      ((const struct ip6_hdr*)(ip_data.current_ip6_header))
-/** Always returns TRUE when only supporting IPv6 only */
-#define ip_current_is_v6()        1
-/** 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()))
-/** Source IP6 address of current_header */
-#define ip6_current_src_addr()    (&ip_data.current_iphdr_src)
-/** Destination IP6 address of current_header */
-#define ip6_current_dest_addr()   (&ip_data.current_iphdr_dest)
-
-#endif /* LWIP_IPV6 */
-
-/** Union source address of current_header */
-#define ip_current_src_addr()    (&ip_data.current_iphdr_src)
-/** Union destination address of current_header */
-#define ip_current_dest_addr()   (&ip_data.current_iphdr_dest)
-
-/** 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))
-/** Resets an IP pcb option (SOF_* flags) */
-#define ip_reset_option(pcb, opt) ((pcb)->so_options &= ~(opt))
-
-#if LWIP_IPV4 && LWIP_IPV6
-#define ip_output(p, src, dest, ttl, tos, proto) \
-        (IP_IS_V6(dest) ? \
-        ip6_output(p, ip_2_ip6(src), ip_2_ip6(dest), ttl, tos, proto) : \
-        ip4_output(p, ip_2_ip4(src), ip_2_ip4(dest), ttl, tos, proto))
-#define ip_output_if(p, src, dest, ttl, tos, proto, netif) \
-        (IP_IS_V6(dest) ? \
-        ip6_output_if(p, ip_2_ip6(src), ip_2_ip6(dest), ttl, tos, proto, netif) : \
-        ip4_output_if(p, ip_2_ip4(src), ip_2_ip4(dest), ttl, tos, proto, netif))
-#define ip_output_if_src(p, src, dest, ttl, tos, proto, netif) \
-        (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))
-#define ip_output_hinted(p, src, dest, ttl, tos, proto, addr_hint) \
-        (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))
-#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)))
-#define ip_netif_get_local_ip(netif, dest) (IP_IS_V6(dest) ? \
-        ip6_netif_get_local_ip(netif, ip_2_ip6(dest)) : \
-        ip4_netif_get_local_ip(netif))
-#define ip_debug_print(is_ipv6, p) ((is_ipv6) ? ip6_debug_print(p) : ip4_debug_print(p))
-
-err_t ip_input(struct pbuf *p, struct netif *inp);
-
-#elif LWIP_IPV4 /* LWIP_IPV4 && LWIP_IPV6 */
-
-#define ip_output(p, src, dest, ttl, tos, proto) \
-        ip4_output(p, src, dest, ttl, tos, proto)
-#define ip_output_if(p, src, dest, ttl, tos, proto, netif) \
-        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_route(src, dest) \
-        ip4_route_src(dest, src)
-#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)
-
-#define ip_input ip4_input
-
-#elif LWIP_IPV6 /* LWIP_IPV4 && LWIP_IPV6 */
-
-#define ip_output(p, src, dest, ttl, tos, proto) \
-        ip6_output(p, src, dest, ttl, tos, proto)
-#define ip_output_if(p, src, dest, ttl, tos, proto, netif) \
-        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_route(src, dest) \
-        ip6_route(src, dest)
-#define ip_netif_get_local_ip(netif, dest) \
-        ip6_netif_get_local_ip(netif, dest)
-#define ip_debug_print(is_ipv6, p) ip6_debug_print(p)
-
-#define ip_input ip6_input
-
-#endif /* LWIP_IPV6 */
-
-#define ip_route_get_local_ip(src, dest, netif, ipaddr) do { \
-  (netif) = ip_route(src, dest); \
-  (ipaddr) = ip_netif_get_local_ip(netif, dest); \
-}while(0)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_HDR_IP_H__ */
-
-
diff --git a/components/lwip/include/lwip/lwip/ip4.h b/components/lwip/include/lwip/lwip/ip4.h
deleted file mode 100644 (file)
index e69e55c..0000000
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * 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_IP4_H
-#define LWIP_HDR_IP4_H
-
-#include "lwip/opt.h"
-
-#if LWIP_IPV4
-
-#include "lwip/def.h"
-#include "lwip/pbuf.h"
-#include "lwip/ip4_addr.h"
-#include "lwip/err.h"
-#include "lwip/netif.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef LWIP_HOOK_IP4_ROUTE_SRC
-#define LWIP_IPV4_SRC_ROUTING   1
-#else
-#define LWIP_IPV4_SRC_ROUTING   0
-#endif
-
-/** Currently, the function ip_output_if_opt() is only used with IGMP */
-#define IP_OPTIONS_SEND   (LWIP_IPV4 && LWIP_IGMP)
-
-#define IP_HLEN 20
-
-
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct ip_hdr {
-  /* version / header length */
-  PACK_STRUCT_FLD_8(u8_t _v_hl);
-  /* type of service */
-  PACK_STRUCT_FLD_8(u8_t _tos);
-  /* total length */
-  PACK_STRUCT_FIELD(u16_t _len);
-  /* identification */
-  PACK_STRUCT_FIELD(u16_t _id);
-  /* fragment offset field */
-  PACK_STRUCT_FIELD(u16_t _offset);
-#define IP_RF 0x8000U        /* reserved fragment flag */
-#define IP_DF 0x4000U        /* don't fragment flag */
-#define IP_MF 0x2000U        /* more fragments flag */
-#define IP_OFFMASK 0x1fffU   /* mask for fragmenting bits */
-  /* time to live */
-  PACK_STRUCT_FLD_8(u8_t _ttl);
-  /* protocol*/
-  PACK_STRUCT_FLD_8(u8_t _proto);
-  /* checksum */
-  PACK_STRUCT_FIELD(u16_t _chksum);
-  /* source and destination IP addresses */
-  PACK_STRUCT_FLD_S(ip4_addr_p_t src);
-  PACK_STRUCT_FLD_S(ip4_addr_p_t dest);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
-#define IPH_V(hdr)  ((hdr)->_v_hl >> 4)
-#define IPH_HL(hdr) ((hdr)->_v_hl & 0x0f)
-#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_TTL(hdr) ((hdr)->_ttl)
-#define IPH_PROTO(hdr) ((hdr)->_proto)
-#define IPH_CHKSUM(hdr) ((hdr)->_chksum)
-
-#define IPH_VHL_SET(hdr, v, hl) (hdr)->_v_hl = (u8_t)((((v) << 4) | (hl)))
-#define IPH_TOS_SET(hdr, tos) (hdr)->_tos = (tos)
-#define IPH_LEN_SET(hdr, len) (hdr)->_len = (len)
-#define IPH_ID_SET(hdr, id) (hdr)->_id = (id)
-#define IPH_OFFSET_SET(hdr, off) (hdr)->_offset = (off)
-#define IPH_TTL_SET(hdr, ttl) (hdr)->_ttl = (u8_t)(ttl)
-#define IPH_PROTO_SET(hdr, proto) (hdr)->_proto = (u8_t)(proto)
-#define IPH_CHKSUM_SET(hdr, chksum) (hdr)->_chksum = (chksum)
-
-#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);
-#else /* LWIP_IPV4_SRC_ROUTING */
-#define ip4_route_src(dest, src) 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,
-       u8_t ttl, u8_t tos, u8_t proto);
-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);
-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
-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 */
-#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,
-       u16_t optlen);
-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);
-#endif /* IP_OPTIONS_SEND */
-
-#if LWIP_MULTICAST_TX_OPTIONS
-void  ip4_set_default_multicast_netif(struct netif* default_multicast_netif);
-#endif /* LWIP_MULTICAST_TX_OPTIONS */
-
-#define ip4_netif_get_local_ip(netif) (((netif) != NULL) ? netif_ip_addr4(netif) : NULL)
-
-#if IP_DEBUG
-void ip4_debug_print(struct pbuf *p);
-#else
-#define ip4_debug_print(p)
-#endif /* IP_DEBUG */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_IPV4 */
-
-#endif /* LWIP_HDR_IP_H */
-
-
diff --git a/components/lwip/include/lwip/lwip/ip4_addr.h b/components/lwip/include/lwip/lwip/ip4_addr.h
deleted file mode 100644 (file)
index 9483a2f..0000000
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * 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_IP4_ADDR_H
-#define LWIP_HDR_IP4_ADDR_H
-
-#include "lwip/opt.h"
-#include "lwip/def.h"
-
-#if LWIP_IPV4
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* This is the aligned version of ip4_addr_t,
-   used as local variable, on the stack, etc. */
-struct ip4_addr {
-  u32_t addr;
-};
-
-/* This is the packed version of ip4_addr_t,
-   used in network headers that are itself packed */
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct ip4_addr_packed {
-  PACK_STRUCT_FIELD(u32_t addr);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
-/** 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. */
-typedef struct ip4_addr ip4_addr_t;
-typedef struct ip4_addr_packed ip4_addr_p_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;
-
-/** 255.255.255.255 */
-#define IPADDR_NONE         ((u32_t)0xffffffffUL)
-/** 127.0.0.1 */
-#define IPADDR_LOOPBACK     ((u32_t)0x7f000001UL)
-/** 0.0.0.0 */
-#define IPADDR_ANY          ((u32_t)0x00000000UL)
-/** 255.255.255.255 */
-#define IPADDR_BROADCAST    ((u32_t)0xffffffffUL)
-
-/* Definitions of the bits in an Internet address integer.
-
-   On subnets, host and network parts are found according to
-   the subnet mask, not these masks.  */
-#define IP_CLASSA(a)        ((((u32_t)(a)) & 0x80000000UL) == 0)
-#define IP_CLASSA_NET       0xff000000
-#define IP_CLASSA_NSHIFT    24
-#define IP_CLASSA_HOST      (0xffffffff & ~IP_CLASSA_NET)
-#define IP_CLASSA_MAX       128
-
-#define IP_CLASSB(a)        ((((u32_t)(a)) & 0xc0000000UL) == 0x80000000UL)
-#define IP_CLASSB_NET       0xffff0000
-#define IP_CLASSB_NSHIFT    16
-#define IP_CLASSB_HOST      (0xffffffff & ~IP_CLASSB_NET)
-#define IP_CLASSB_MAX       65536
-
-#define IP_CLASSC(a)        ((((u32_t)(a)) & 0xe0000000UL) == 0xc0000000UL)
-#define IP_CLASSC_NET       0xffffff00
-#define IP_CLASSC_NSHIFT    8
-#define IP_CLASSC_HOST      (0xffffffff & ~IP_CLASSC_NET)
-
-#define IP_CLASSD(a)        (((u32_t)(a) & 0xf0000000UL) == 0xe0000000UL)
-#define IP_CLASSD_NET       0xf0000000          /* These ones aren't really */
-#define IP_CLASSD_NSHIFT    28                  /*   net and host fields, but */
-#define IP_CLASSD_HOST      0x0fffffff          /*   routing needn't know. */
-#define IP_MULTICAST(a)     IP_CLASSD(a)
-
-#define IP_EXPERIMENTAL(a)  (((u32_t)(a) & 0xf0000000UL) == 0xf0000000UL)
-#define IP_BADCLASS(a)      (((u32_t)(a) & 0xf0000000UL) == 0xf0000000UL)
-
-#define IP_LOOPBACKNET      127                 /* official! */
-
-
-#if BYTE_ORDER == BIG_ENDIAN
-/** Set an IP address given by the four byte-parts */
-#define IP4_ADDR(ipaddr, a,b,c,d) \
-        (ipaddr)->addr = ((u32_t)((a) & 0xff) << 24) | \
-                         ((u32_t)((b) & 0xff) << 16) | \
-                         ((u32_t)((c) & 0xff) << 8)  | \
-                          (u32_t)((d) & 0xff)
-#else
-/** Set an IP address given by the four byte-parts.
-    Little-endian version that prevents the use of htonl. */
-#define IP4_ADDR(ipaddr, a,b,c,d) \
-        (ipaddr)->addr = ((u32_t)((d) & 0xff) << 24) | \
-                         ((u32_t)((c) & 0xff) << 16) | \
-                         ((u32_t)((b) & 0xff) << 8)  | \
-                          (u32_t)((a) & 0xff)
-#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 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) */
-#define ip4_addr_set(dest, src) ((dest)->addr = \
-                                    ((src) == NULL ? 0 : \
-                                    (src)->addr))
-/** Set complete address to zero */
-#define ip4_addr_set_zero(ipaddr)     ((ipaddr)->addr = 0)
-/** Set address to IPADDR_ANY (no need for htonl()) */
-#define ip4_addr_set_any(ipaddr)      ((ipaddr)->addr = IPADDR_ANY)
-/** Set address to loopback address */
-#define ip4_addr_set_loopback(ipaddr) ((ipaddr)->addr = PP_HTONL(IPADDR_LOOPBACK))
-/** Check if an address is in the loopback region */
-#define ip4_addr_isloopback(ipaddr)    (((ipaddr)->addr & PP_HTONL(IP_CLASSA_NET)) == PP_HTONL(((u32_t)IP_LOOPBACKNET) << 24))
-/** Safely copy one IP address to another and change byte order
- * from host- to network-order. */
-#define ip4_addr_set_hton(dest, src) ((dest)->addr = \
-                               ((src) == NULL ? 0:\
-                               htonl((src)->addr)))
-/** IPv4 only: set the IP address given as an u32_t */
-#define ip4_addr_set_u32(dest_ipaddr, src_u32) ((dest_ipaddr)->addr = (src_u32))
-/** IPv4 only: get the IP address as an u32_t */
-#define ip4_addr_get_u32(src_ipaddr) ((src_ipaddr)->addr)
-
-/** Get the network address by combining host address with netmask */
-#define ip4_addr_get_network(target, host, netmask) do { ((target)->addr = ((host)->addr) & ((netmask)->addr)); } while(0)
-
-/**
- * Determine if two address are on the same network.
- *
- * @arg addr1 IP address 1
- * @arg addr2 IP address 2
- * @arg mask network identifier mask
- * @return !0 if the network identifiers of both address match
- */
-#define ip4_addr_netcmp(addr1, addr2, mask) (((addr1)->addr & \
-                                              (mask)->addr) == \
-                                             ((addr2)->addr & \
-                                              (mask)->addr))
-#define ip4_addr_cmp(addr1, addr2) ((addr1)->addr == (addr2)->addr)
-
-#define ip4_addr_isany_val(addr1)   ((addr1).addr == IPADDR_ANY)
-#define ip4_addr_isany(addr1) ((addr1) == NULL || ip4_addr_isany_val(*(addr1)))
-
-#define ip4_addr_isbroadcast(addr1, netif) ip4_addr_isbroadcast_u32((addr1)->addr, netif)
-u8_t ip4_addr_isbroadcast_u32(u32_t addr, const struct netif *netif);
-
-#define ip_addr_netmask_valid(netmask) ip4_addr_netmask_valid((netmask)->addr)
-u8_t ip4_addr_netmask_valid(u32_t netmask);
-
-#define ip4_addr_ismulticast(addr1) (((addr1)->addr & PP_HTONL(0xf0000000UL)) == PP_HTONL(0xe0000000UL))
-
-#define ip4_addr_islinklocal(addr1) (((addr1)->addr & PP_HTONL(0xffff0000UL)) == PP_HTONL(0xa9fe0000UL))
-
-#define ip4_addr_debug_print_parts(debug, a, b, c, d) \
-  LWIP_DEBUGF(debug, ("%" U16_F ".%" U16_F ".%" U16_F ".%" U16_F, a, b, c, d))
-#define ip4_addr_debug_print(debug, ipaddr) \
-  ip4_addr_debug_print_parts(debug, \
-                      (ipaddr) != NULL ? ip4_addr1_16(ipaddr) : 0,       \
-                      (ipaddr) != NULL ? ip4_addr2_16(ipaddr) : 0,       \
-                      (ipaddr) != NULL ? ip4_addr3_16(ipaddr) : 0,       \
-                      (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)))
-
-/* 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])
-/* 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 IP4ADDR_STRLEN_MAX  16
-#define IPADDR_STRLEN_MAX   IP4ADDR_STRLEN_MAX
-
-/** For backwards compatibility */
-#define ip_ntoa(ipaddr)  ipaddr_ntoa(ipaddr)
-
-u32_t ipaddr_addr(const char *cp);
-int ip4addr_aton(const char *cp, ip4_addr_t *addr);
-/** returns ptr to static buffer; not reentrant! */
-char *ip4addr_ntoa(const ip4_addr_t *addr);
-char *ip4addr_ntoa_r(const ip4_addr_t *addr, char *buf, int buflen);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_IPV4 */
-
-#endif /* LWIP_HDR_IP_ADDR_H */
diff --git a/components/lwip/include/lwip/lwip/ip6.h b/components/lwip/include/lwip/lwip/ip6.h
deleted file mode 100644 (file)
index f1ffb6b..0000000
+++ /dev/null
@@ -1,197 +0,0 @@
-/**
- * @file
- *
- * IPv6 layer.
- */
-
-/*
- * Copyright (c) 2010 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_IP6_H
-#define LWIP_HDR_IP6_H
-
-#include "lwip/opt.h"
-
-#if LWIP_IPV6  /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/ip6_addr.h"
-#include "lwip/def.h"
-#include "lwip/pbuf.h"
-#include "lwip/netif.h"
-
-#include "lwip/err.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define IP6_HLEN 40
-
-#define IP6_NEXTH_HOPBYHOP  0
-#define IP6_NEXTH_TCP       6
-#define IP6_NEXTH_UDP       17
-#define IP6_NEXTH_ENCAPS    41
-#define IP6_NEXTH_ROUTING   43
-#define IP6_NEXTH_FRAGMENT  44
-#define IP6_NEXTH_ICMP6     58
-#define IP6_NEXTH_NONE      59
-#define IP6_NEXTH_DESTOPTS  60
-#define IP6_NEXTH_UDPLITE   136
-
-
-/* The IPv6 header. */
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct ip6_hdr {
-  /* version / traffic class / flow label */
-  PACK_STRUCT_FIELD(u32_t _v_tc_fl);
-  /* payload length */
-  PACK_STRUCT_FIELD(u16_t _plen);
-  /* next header */
-  PACK_STRUCT_FLD_8(u8_t _nexth);
-  /* hop limit */
-  PACK_STRUCT_FLD_8(u8_t _hoplim);
-  /* source and destination IP addresses */
-  PACK_STRUCT_FLD_S(ip6_addr_p_t src);
-  PACK_STRUCT_FLD_S(ip6_addr_p_t dest);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
-/* 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
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct ip6_hbh_hdr {
-  /* next header */
-  PACK_STRUCT_FLD_8(u8_t _nexth);
-  /* header length */
-  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
-
-/* 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
-PACK_STRUCT_BEGIN
-struct ip6_frag_hdr {
-  /* next header */
-  PACK_STRUCT_FLD_8(u8_t _nexth);
-  /* reserved */
-  PACK_STRUCT_FLD_8(u8_t reserved);
-  /* fragment offset */
-  PACK_STRUCT_FIELD(u16_t _fragment_offset);
-  /* fragmented packet identification */
-  PACK_STRUCT_FIELD(u32_t _identification);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
-#define IP6H_V(hdr)  ((ntohl((hdr)->_v_tc_fl) >> 28) & 0x0f)
-#define IP6H_TC(hdr) ((ntohl((hdr)->_v_tc_fl) >> 20) & 0xff)
-#define IP6H_FL(hdr) (ntohl((hdr)->_v_tc_fl) & 0x000fffff)
-#define IP6H_PLEN(hdr) (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 = (htonl((((u32_t)(v)) << 28) | (((u32_t)(tc)) << 20) | (fl)))
-#define IP6H_PLEN_SET(hdr, plen) (hdr)->_plen = htons(plen)
-#define IP6H_NEXTH_SET(hdr, nexth) (hdr)->_nexth = (nexth)
-#define IP6H_HOPLIM_SET(hdr, hl) (hdr)->_hoplim = (u8_t)(hl)
-
-
-struct netif *ip6_route(const ip6_addr_t *src, const ip6_addr_t *dest);
-const ip_addr_t *ip6_select_source_address(struct netif *netif, const ip6_addr_t * dest);
-err_t         ip6_input(struct pbuf *p, struct netif *inp);
-err_t         ip6_output(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest,
-                         u8_t hl, u8_t tc, u8_t nexth);
-err_t         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);
-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
-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 */
-#if LWIP_IPV6_MLD
-err_t         ip6_options_add_hbh_ra(struct pbuf * p, u8_t nexth, u8_t value);
-#endif /* LWIP_IPV6_MLD */
-
-#define ip6_netif_get_local_ip(netif, dest) (((netif) != NULL) ? \
-  ip6_select_source_address(netif, dest) : NULL)
-
-#if IP6_DEBUG
-void ip6_debug_print(struct pbuf *p);
-#else
-#define ip6_debug_print(p)
-#endif /* IP6_DEBUG */
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_IPV6 */
-
-#endif /* LWIP_HDR_IP6_H */
diff --git a/components/lwip/include/lwip/lwip/ip6_addr.h b/components/lwip/include/lwip/lwip/ip6_addr.h
deleted file mode 100644 (file)
index a75d894..0000000
+++ /dev/null
@@ -1,301 +0,0 @@
-/**
- * @file
- *
- * IPv6 addresses.
- */
-
-/*
- * Copyright (c) 2010 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>
- *
- * Structs and macros for handling IPv6 addresses.
- *
- * Please coordinate changes and requests with Ivan Delamer
- * <delamer@inicotech.com>
- */
-#ifndef LWIP_HDR_IP6_ADDR_H
-#define LWIP_HDR_IP6_ADDR_H
-
-#include "lwip/opt.h"
-
-#if LWIP_IPV6  /* don't build if not configured for use in lwipopts.h */
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-/* This is the aligned version of ip6_addr_t,
-   used as local variable, on the stack, etc. */
-struct ip6_addr {
-  u32_t addr[4];
-};
-
-/* This is the packed version of ip6_addr_t,
-   used in network headers that are itself packed */
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct ip6_addr_packed {
-  PACK_STRUCT_FIELD(u32_t addr[4]);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
-typedef struct ip6_addr ip6_addr_t;
-typedef struct ip6_addr_packed ip6_addr_p_t;
-
-
-#if BYTE_ORDER == BIG_ENDIAN
-/** Set an IPv6 partial address given by byte-parts. */
-#define IP6_ADDR_PART(ip6addr, index, a,b,c,d) \
-  (ip6addr)->addr[index] = ((u32_t)((a) & 0xff) << 24) | \
-                           ((u32_t)((b) & 0xff) << 16) | \
-                           ((u32_t)((c) & 0xff) << 8)  | \
-                            (u32_t)((d) & 0xff)
-#else
-/** Set an IPv6 partial address given by byte-parts.
-Little-endian version, stored in network order (no htonl). */
-#define IP6_ADDR_PART(ip6addr, index, a,b,c,d) \
-  (ip6addr)->addr[index] = ((u32_t)((d) & 0xff) << 24) | \
-                           ((u32_t)((c) & 0xff) << 16) | \
-                           ((u32_t)((b) & 0xff) << 8)  | \
-                            (u32_t)((a) & 0xff)
-#endif
-
-/** Set a full IPv6 address by passing the 4 u32_t indices in network byte order
-    (use PP_HTONL() for constants) */
-#define IP6_ADDR(ip6addr, idx0, idx1, idx2, idx3) do { \
-  (ip6addr)->addr[0] = idx0; \
-  (ip6addr)->addr[1] = idx1; \
-  (ip6addr)->addr[2] = idx2; \
-  (ip6addr)->addr[3] = idx3; } while(0)
-
-/** Access address in 16-bit block */
-#define IP6_ADDR_BLOCK1(ip6addr) ((u16_t)(htonl((ip6addr)->addr[0]) >> 16) & 0xffff)
-#define IP6_ADDR_BLOCK2(ip6addr) ((u16_t)(htonl((ip6addr)->addr[0])) & 0xffff)
-#define IP6_ADDR_BLOCK3(ip6addr) ((u16_t)(htonl((ip6addr)->addr[1]) >> 16) & 0xffff)
-#define IP6_ADDR_BLOCK4(ip6addr) ((u16_t)(htonl((ip6addr)->addr[1])) & 0xffff)
-#define IP6_ADDR_BLOCK5(ip6addr) ((u16_t)(htonl((ip6addr)->addr[2]) >> 16) & 0xffff)
-#define IP6_ADDR_BLOCK6(ip6addr) ((u16_t)(htonl((ip6addr)->addr[2])) & 0xffff)
-#define IP6_ADDR_BLOCK7(ip6addr) ((u16_t)(htonl((ip6addr)->addr[3]) >> 16) & 0xffff)
-#define IP6_ADDR_BLOCK8(ip6addr) ((u16_t)(htonl((ip6addr)->addr[3])) & 0xffff)
-
-/** Copy IPv6 address - faster than ip6_addr_set: no NULL check */
-#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)
-/** 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)
-
-/** 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)
-
-/** Set address to ipv6 'any' (no need for htonl()) */
-#define ip6_addr_set_any(ip6addr)       ip6_addr_set_zero(ip6addr)
-/** Set address to ipv6 loopback address */
-#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)
-/** 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 : htonl((src)->addr[0]); \
-                                        (dest)->addr[1] = (src) == NULL ? 0 : htonl((src)->addr[1]); \
-                                        (dest)->addr[2] = (src) == NULL ? 0 : htonl((src)->addr[2]); \
-                                        (dest)->addr[3] = (src) == NULL ? 0 : htonl((src)->addr[3]);}while(0)
-
-
-/**
- * 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
- */
-#define ip6_addr_netcmp(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \
-                                       ((addr1)->addr[1] == (addr2)->addr[1]))
-
-#define ip6_addr_cmp(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]))
-
-#define ip6_get_subnet_id(ip6addr)   (htonl((ip6addr)->addr[2]) & 0x0000ffffUL)
-
-#define ip6_addr_isany_val(ip6addr) (((ip6addr).addr[0] == 0) && \
-                                     ((ip6addr).addr[1] == 0) && \
-                                     ((ip6addr).addr[2] == 0) && \
-                                     ((ip6addr).addr[3] == 0))
-#define ip6_addr_isany(ip6addr) (((ip6addr) == NULL) || ip6_addr_isany_val(*(ip6addr)))
-
-#define ip6_addr_isloopback(ip6addr) (((ip6addr)->addr[0] == 0UL) && \
-                                      ((ip6addr)->addr[1] == 0UL) && \
-                                      ((ip6addr)->addr[2] == 0UL) && \
-                                      ((ip6addr)->addr[3] == PP_HTONL(0x00000001UL)))
-
-#define ip6_addr_isglobal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xe0000000UL)) == PP_HTONL(0x20000000UL))
-
-#define ip6_addr_islinklocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xffc00000UL)) == PP_HTONL(0xfe800000UL))
-
-#define ip6_addr_issitelocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xffc00000UL)) == PP_HTONL(0xfec00000UL))
-
-#define ip6_addr_isuniquelocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xfe000000UL)) == PP_HTONL(0xfc000000UL))
-
-#define ip6_addr_ismulticast(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff000000UL)) == PP_HTONL(0xff000000UL))
-#define ip6_addr_multicast_transient_flag(ip6addr)  ((ip6addr)->addr[0] & PP_HTONL(0x00100000UL))
-#define ip6_addr_multicast_prefix_flag(ip6addr)     ((ip6addr)->addr[0] & PP_HTONL(0x00200000UL))
-#define ip6_addr_multicast_rendezvous_flag(ip6addr) ((ip6addr)->addr[0] & PP_HTONL(0x00400000UL))
-#define ip6_addr_multicast_scope(ip6addr) ((htonl((ip6addr)->addr[0]) >> 16) & 0xf)
-#define IP6_MULTICAST_SCOPE_RESERVED            0x0
-#define IP6_MULTICAST_SCOPE_RESERVED0           0x0
-#define IP6_MULTICAST_SCOPE_INTERFACE_LOCAL     0x1
-#define IP6_MULTICAST_SCOPE_LINK_LOCAL          0x2
-#define IP6_MULTICAST_SCOPE_RESERVED3           0x3
-#define IP6_MULTICAST_SCOPE_ADMIN_LOCAL         0x4
-#define IP6_MULTICAST_SCOPE_SITE_LOCAL          0x5
-#define IP6_MULTICAST_SCOPE_ORGANIZATION_LOCAL  0x8
-#define IP6_MULTICAST_SCOPE_GLOBAL              0xe
-#define IP6_MULTICAST_SCOPE_RESERVEDF           0xf
-#define ip6_addr_ismulticast_iflocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff010000UL))
-#define ip6_addr_ismulticast_linklocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff020000UL))
-#define ip6_addr_ismulticast_adminlocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff040000UL))
-#define ip6_addr_ismulticast_sitelocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff050000UL))
-#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 */
-#define ip6_addr_isallnodes_iflocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff010000UL)) && \
-    ((ip6addr)->addr[1] == 0UL) && \
-    ((ip6addr)->addr[2] == 0UL) && \
-    ((ip6addr)->addr[3] == PP_HTONL(0x00000001UL)))
-
-#define ip6_addr_isallnodes_linklocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \
-    ((ip6addr)->addr[1] == 0UL) && \
-    ((ip6addr)->addr[2] == 0UL) && \
-    ((ip6addr)->addr[3] == PP_HTONL(0x00000001UL)))
-#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)
-
-#define ip6_addr_isallrouters_linklocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \
-    ((ip6addr)->addr[1] == 0UL) && \
-    ((ip6addr)->addr[2] == 0UL) && \
-    ((ip6addr)->addr[3] == PP_HTONL(0x00000002UL)))
-#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)
-
-#define ip6_addr_issolicitednode(ip6addr) ( ((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \
-        ((ip6addr)->addr[2] == PP_HTONL(0x00000001UL)) && \
-        (((ip6addr)->addr[3] & PP_HTONL(0xff000000UL)) == PP_HTONL(0xff000000UL)) )
-
-#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)
-
-#define ip6_addr_cmp_solicitednode(ip6addr, sn_addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \
-                                    ((ip6addr)->addr[1] == 0) && \
-                                    ((ip6addr)->addr[2] == PP_HTONL(0x00000001UL)) && \
-                                    ((ip6addr)->addr[3] == (PP_HTONL(0xff000000UL) | (sn_addr)->addr[3])))
-
-/* IPv6 address states. */
-#define IP6_ADDR_INVALID      0x00
-#define IP6_ADDR_TENTATIVE    0x08
-#define IP6_ADDR_TENTATIVE_1  0x09 /* 1 probe sent */
-#define IP6_ADDR_TENTATIVE_2  0x0a /* 2 probes sent */
-#define IP6_ADDR_TENTATIVE_3  0x0b /* 3 probes sent */
-#define IP6_ADDR_TENTATIVE_4  0x0c /* 4 probes sent */
-#define IP6_ADDR_TENTATIVE_5  0x0d /* 5 probes sent */
-#define IP6_ADDR_TENTATIVE_6  0x0e /* 6 probes sent */
-#define IP6_ADDR_TENTATIVE_7  0x0f /* 7 probes sent */
-#define IP6_ADDR_VALID        0x10
-#define IP6_ADDR_PREFERRED    0x30
-#define IP6_ADDR_DEPRECATED   0x50
-
-#define ip6_addr_isinvalid(addr_state) (addr_state == IP6_ADDR_INVALID)
-#define ip6_addr_istentative(addr_state) (addr_state & IP6_ADDR_TENTATIVE)
-#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_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, \
-                      a, b, c, d, e, f, g, h))
-#define ip6_addr_debug_print(debug, ipaddr) \
-  ip6_addr_debug_print_parts(debug, \
-                      (ipaddr) != NULL ? IP6_ADDR_BLOCK1(ipaddr) : 0,    \
-                      (ipaddr) != NULL ? IP6_ADDR_BLOCK2(ipaddr) : 0,    \
-                      (ipaddr) != NULL ? IP6_ADDR_BLOCK3(ipaddr) : 0,    \
-                      (ipaddr) != NULL ? IP6_ADDR_BLOCK4(ipaddr) : 0,    \
-                      (ipaddr) != NULL ? IP6_ADDR_BLOCK5(ipaddr) : 0,    \
-                      (ipaddr) != NULL ? IP6_ADDR_BLOCK6(ipaddr) : 0,    \
-                      (ipaddr) != NULL ? IP6_ADDR_BLOCK7(ipaddr) : 0,    \
-                      (ipaddr) != NULL ? IP6_ADDR_BLOCK8(ipaddr) : 0)
-#define ip6_addr_debug_print_val(debug, ipaddr) \
-  ip6_addr_debug_print_parts(debug, \
-                      IP6_ADDR_BLOCK1(&(ipaddr)),    \
-                      IP6_ADDR_BLOCK2(&(ipaddr)),    \
-                      IP6_ADDR_BLOCK3(&(ipaddr)),    \
-                      IP6_ADDR_BLOCK4(&(ipaddr)),    \
-                      IP6_ADDR_BLOCK5(&(ipaddr)),    \
-                      IP6_ADDR_BLOCK6(&(ipaddr)),    \
-                      IP6_ADDR_BLOCK7(&(ipaddr)),    \
-                      IP6_ADDR_BLOCK8(&(ipaddr)))
-
-#define IP6ADDR_STRLEN_MAX    46
-
-int ip6addr_aton(const char *cp, ip6_addr_t *addr);
-/** returns ptr to static buffer; not reentrant! */
-char *ip6addr_ntoa(const ip6_addr_t *addr);
-char *ip6addr_ntoa_r(const ip6_addr_t *addr, char *buf, int buflen);
-
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_IPV6 */
-
-#endif /* LWIP_HDR_IP6_ADDR_H */
diff --git a/components/lwip/include/lwip/lwip/ip6_frag.h b/components/lwip/include/lwip/lwip/ip6_frag.h
deleted file mode 100644 (file)
index 16336e5..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-/**
- * @file
- *
- * IPv6 fragmentation and reassembly.
- */
-
-/*
- * Copyright (c) 2010 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_IP6_FRAG_H
-#define LWIP_HDR_IP6_FRAG_H
-
-#include "lwip/opt.h"
-#include "lwip/pbuf.h"
-#include "lwip/ip6_addr.h"
-#include "lwip/ip6.h"
-#include "lwip/netif.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-#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 */
-#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? */
-#if IPV6_FRAG_COPYHEADER
-#define IPV6_FRAG_HDRPTR
-#define IPV6_FRAG_HDRREF(hdr) (&(hdr))
-#else /* IPV6_FRAG_COPYHEADER */
-#define IPV6_FRAG_HDRPTR *
-#define IPV6_FRAG_HDRREF(hdr) (hdr)
-#endif /* IPV6_FRAG_COPYHEADER */
-
-/* IPv6 reassembly helper struct.
- * This is exported because memp needs to know the size.
- */
-struct ip6_reassdata {
-  struct ip6_reassdata *next;
-  struct pbuf *p;
-  struct ip6_hdr IPV6_FRAG_HDRPTR iphdr;
-  u32_t identification;
-  u16_t datagram_len;
-  u8_t nexth;
-  u8_t timer;
-};
-
-#define ip6_reass_init() /* Compatibility define */
-void ip6_reass_tmr(void);
-struct pbuf * ip6_reass(struct pbuf *p);
-
-#endif /* LWIP_IPV6 && LWIP_IPV6_REASS */
-
-#if LWIP_IPV6 && LWIP_IPV6_FRAG  /* don't build if not configured for use in lwipopts.h */
-
-/** 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. */
-#ifndef LWIP_PBUF_CUSTOM_REF_DEFINED
-#define LWIP_PBUF_CUSTOM_REF_DEFINED
-struct pbuf_custom_ref {
-  /** 'base class' */
-  struct pbuf_custom pc;
-  /** pointer to the original pbuf that is referenced */
-  struct pbuf *original;
-};
-#endif /* LWIP_PBUF_CUSTOM_REF_DEFINED */
-
-err_t ip6_frag(struct pbuf *p, struct netif *netif, const ip6_addr_t *dest);
-
-#endif /* LWIP_IPV6 && LWIP_IPV6_FRAG */
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_HDR_IP6_FRAG_H */
diff --git a/components/lwip/include/lwip/lwip/ip_addr.h b/components/lwip/include/lwip/lwip/ip_addr.h
deleted file mode 100644 (file)
index 5928f7e..0000000
+++ /dev/null
@@ -1,318 +0,0 @@
-/*
- * 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_IP_ADDR_H__
-#define LWIP_HDR_IP_ADDR_H__
-
-#include "lwip/opt.h"
-#include "lwip/def.h"
-
-#include "lwip/ip4_addr.h"
-#include "lwip/ip6_addr.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/** These are the values for ip_addr_t.type */
-#define IPADDR_TYPE_V4                0U
-#define IPADDR_TYPE_V6                6U
-#define IPADDR_TYPE_ANY               46U
-
-#define IP_IS_V4_VAL(ipaddr)   (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_V4)
-
-#if LWIP_IPV4 && LWIP_IPV6
-/** A union struct for both IP version's addresses.
- * ATTENTION: watch out for its size when adding IPv6 address scope!
- */
-typedef struct _ip_addr {
-  union {
-    ip6_addr_t ip6;
-    ip4_addr_t ip4;
-  } u_addr;
-  u8_t type;
-} ip_addr_t;
-
-extern const ip_addr_t ip_addr_any_type;
-
-#define IPADDR4_INIT(u32val)          { { { { u32val, 0ul, 0ul, 0ul } } }, IPADDR_TYPE_V4 }
-#define IPADDR6_INIT(a, b, c, d)      { { { { a, b, c, d } } }, IPADDR_TYPE_V6 }
-
-#define IP_IS_ANY_TYPE_VAL(ipaddr)    (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_ANY)
-#define IPADDR_ANY_TYPE_INIT          { { { { 0ul, 0ul, 0ul, 0ul } } }, IPADDR_TYPE_ANY }
-
-#define IP_IS_V6_VAL(ipaddr)          (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_V6)
-#define IP_IS_V6(ipaddr)              (((ipaddr) != NULL) && IP_IS_V6_VAL(*(ipaddr)))
-
-#define IP_V6_EQ_PART(ipaddr, WORD, VAL) (ip_2_ip6(ipaddr)->addr[WORD] == htonl(VAL))
-#define IP_IS_V4MAPPEDV6(ipaddr) (IP_IS_V6(ipaddr) && IP_V6_EQ_PART(ipaddr, 0, 0) && IP_V6_EQ_PART(ipaddr, 1, 0) && IP_V6_EQ_PART(ipaddr, 2, 0x0000FFFF))
-
-#define IP_SET_TYPE_VAL(ipaddr, iptype) do { (ipaddr).type = (iptype); }while(0)
-#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_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))
-
-/* Convert generic ip address to specific protocol version */
-#define ip_2_ip6(ipaddr)   (&((ipaddr)->u_addr.ip6))
-#define ip_2_ip4(ipaddr)   (&((ipaddr)->u_addr.ip4))
-
-#define IP_ADDR4(ipaddr,a,b,c,d)      do { IP4_ADDR(ip_2_ip4(ipaddr),a,b,c,d); \
-                                           IP_SET_TYPE_VAL(*(ipaddr), IPADDR_TYPE_V4); } while(0)
-#define IP_ADDR6(ipaddr,i0,i1,i2,i3)  do { IP6_ADDR(ip_2_ip6(ipaddr),i0,i1,i2,i3); \
-                                           IP_SET_TYPE_VAL(*(ipaddr), IPADDR_TYPE_V6); } while(0)
-
-#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)
-#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)
-#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)
-#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)
-#define ip_addr_get_ip4_u32(ipaddr)  (((ipaddr) && !IP_IS_V6(ipaddr)) ? \
-  ip4_addr_get_u32(ip_2_ip4(ipaddr)) : 0)
-
-#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)
-  
-#define ip_addr_set_ipaddr(dest, src) ip_addr_set(dest, src)
-#define ip_addr_set_zero(ipaddr)     do{ \
-  ip6_addr_set_zero(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, 0); }while(0)
-#define ip_addr_set_zero_ip4(ipaddr)     do{ \
-  ip6_addr_set_zero(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); }while(0)
-#define ip_addr_set_zero_ip6(ipaddr)     do{ \
-  ip6_addr_set_zero(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); }while(0)
-#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)
-#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)
-#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)
-#define ip_addr_get_network(target, host, netmask) do{if(IP_IS_V6(host)){ \
-  ip4_addr_set_zero(ip_2_ip4(target)); IP_SET_TYPE(target, IPADDR_TYPE_V6); } else { \
-  ip4_addr_get_network(ip_2_ip4(target), ip_2_ip4(host), ip_2_ip4(netmask)); IP_SET_TYPE(target, IPADDR_TYPE_V4); }}while(0)
-#define ip_addr_netcmp(addr1, addr2, mask) ((IP_IS_V6(addr1) && IP_IS_V6(addr2)) ? \
-  0 : \
-  ip4_addr_netcmp(ip_2_ip4(addr1), ip_2_ip4(addr2), mask))
-#define ip_addr_cmp(addr1, addr2)    ((IP_GET_TYPE(addr1) != IP_GET_TYPE(addr2)) ? 0 : (IP_IS_V6_VAL(*(addr1)) ? \
-  ip6_addr_cmp(ip_2_ip6(addr1), ip_2_ip6(addr2)) : \
-  ip4_addr_cmp(ip_2_ip4(addr1), ip_2_ip4(addr2))))
-#define ip_addr_isany(ipaddr)        ((IP_IS_V6(ipaddr)) ? \
-  ip6_addr_isany(ip_2_ip6(ipaddr)) : \
-  ip4_addr_isany(ip_2_ip4(ipaddr)))
-#define ip_addr_isany_val(ipaddr)        ((IP_IS_V6_VAL(ipaddr)) ? \
-  ip6_addr_isany_val(*ip_2_ip6(&(ipaddr))) : \
-  ip4_addr_isany_val(*ip_2_ip4(&(ipaddr))))
-#define ip_addr_isbroadcast(ipaddr, netif) ((IP_IS_V6(ipaddr)) ? \
-  0 : \
-  ip4_addr_isbroadcast(ip_2_ip4(ipaddr), netif))
-#define ip_addr_ismulticast(ipaddr)  ((IP_IS_V6(ipaddr)) ? \
-  ip6_addr_ismulticast(ip_2_ip6(ipaddr)) : \
-  ip4_addr_ismulticast(ip_2_ip4(ipaddr)))
-#define ip_addr_isloopback(ipaddr)  ((IP_IS_V6(ipaddr)) ? \
-  ip6_addr_isloopback(ip_2_ip6(ipaddr)) : \
-  ip4_addr_isloopback(ip_2_ip4(ipaddr)))
-#define ip_addr_islinklocal(ipaddr)  ((IP_IS_V6(ipaddr)) ? \
-  ip6_addr_islinklocal(ip_2_ip6(ipaddr)) : \
-  ip4_addr_islinklocal(ip_2_ip4(ipaddr)))
-#define ip_addr_debug_print(debug, ipaddr) do { if(IP_IS_V6(ipaddr)) { \
-  ip6_addr_debug_print(debug, ip_2_ip6(ipaddr)); } else { \
-  ip4_addr_debug_print(debug, ip_2_ip4(ipaddr)); }}while(0)
-#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)
-#define ipaddr_ntoa(addr)   (((addr) == NULL) ? "NULL" : \
-  ((IP_IS_V6(addr)) ? ip6addr_ntoa(ip_2_ip6(addr)) : ip4addr_ntoa(ip_2_ip4(addr))))
-#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)))
-int ipaddr_aton(const char *cp, ip_addr_t *addr);
-
-/* Map an IPv4 ip_addr into an IPV6 ip_addr, using format
-   defined in RFC4291 2.5.5.2.
-
-   Safe to call when dest==src.
-*/
-#define ip_addr_make_ip4_mapped_ip6(dest, src) do {       \
-        u32_t tmp = ip_2_ip4(src)->addr;                    \
-        IP_ADDR6((dest), 0x0, 0x0, htonl(0x0000FFFF), tmp); \
-    } while(0)
-
-/* Convert an IPv4 mapped V6 address to an IPV4 address.
-
-   Check IP_IS_V4MAPPEDV6(src) before using this.
-
-   Safe to call when dest == src.
-*/
-#define ip_addr_ip4_from_mapped_ip6(dest, src) do {     \
-        ip_2_ip4(dest)->addr = ip_2_ip6(src)->addr[3];  \
-        IP_SET_TYPE(dest, IPADDR_TYPE_V4);         \
-    } while(0)
-
-#else /* LWIP_IPV4 && LWIP_IPV6 */
-
-#define IP_ADDR_PCB_VERSION_MATCH(addr, pcb)         1
-#define IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr) 1
-
-#if LWIP_IPV4
-
-typedef ip4_addr_t ip_addr_t;
-#define IPADDR4_INIT(u32val)                    { u32val }
-#define IP_IS_V6_VAL(ipaddr)                    0
-#define IP_IS_V6(ipaddr)                        0
-#define IP_IS_ANY_TYPE_VAL(ipaddr)              0
-#define IP_SET_TYPE_VAL(ipaddr, iptype)
-#define IP_SET_TYPE(ipaddr, iptype)
-#define IP_GET_TYPE(ipaddr)                     IPADDR_TYPE_V4
-#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_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)
-#define ip_addr_set_zero(ipaddr)                ip4_addr_set_zero(ipaddr)
-#define ip_addr_set_zero_ip4(ipaddr)            ip4_addr_set_zero(ipaddr)
-#define ip_addr_set_any(is_ipv6, ipaddr)        ip4_addr_set_any(ipaddr)
-#define ip_addr_set_loopback(is_ipv6, ipaddr)   ip4_addr_set_loopback(ipaddr)
-#define ip_addr_set_hton(dest, src)             ip4_addr_set_hton(dest, src)
-#define ip_addr_get_network(target, host, mask) ip4_addr_get_network(target, host, mask)
-#define ip_addr_netcmp(addr1, addr2, mask)      ip4_addr_netcmp(addr1, addr2, mask)
-#define ip_addr_cmp(addr1, addr2)               ip4_addr_cmp(addr1, addr2)
-#define ip_addr_isany(ipaddr)                   ip4_addr_isany(ipaddr)
-#define ip_addr_isany_val(ipaddr)               ip4_addr_isany_val(ipaddr)
-#define ip_addr_isloopback(ipaddr)              ip4_addr_isloopback(ipaddr)
-#define ip_addr_islinklocal(ipaddr)             ip4_addr_islinklocal(ipaddr)
-#define ip_addr_isbroadcast(addr, netif)        ip4_addr_isbroadcast(addr, netif)
-#define ip_addr_ismulticast(ipaddr)             ip4_addr_ismulticast(ipaddr)
-#define ip_addr_debug_print(debug, ipaddr)      ip4_addr_debug_print(debug, ipaddr)
-#define ip_addr_debug_print_val(debug, ipaddr)  ip4_addr_debug_print_val(debug, ipaddr)
-#define ipaddr_ntoa(ipaddr)                     ip4addr_ntoa(ipaddr)
-#define ipaddr_ntoa_r(ipaddr, buf, buflen)      ip4addr_ntoa_r(ipaddr, buf, buflen)
-#define ipaddr_aton(cp, addr)                   ip4addr_aton(cp, addr)
-
-#else /* LWIP_IPV4 */
-
-typedef ip6_addr_t ip_addr_t;
-#define IPADDR6_INIT(a, b, c, d)                { { a, b, c, d } }
-#define IP_IS_V6_VAL(ipaddr)                    1
-#define IP_IS_V6(ipaddr)                        1
-#define IP_IS_ANY_TYPE_VAL(ipaddr)              0
-#define IP_SET_TYPE_VAL(ipaddr, iptype)
-#define IP_SET_TYPE(ipaddr, iptype)
-#define IP_GET_TYPE(ipaddr)                     IPADDR_TYPE_V6
-#define ip_2_ip6(ipaddr)                        (ipaddr)
-#define IP_ADDR6(ipaddr,i0,i1,i2,i3)            IP6_ADDR(ipaddr,i0,i1,i2,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_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)
-#define ip_addr_set_zero_ip6(ipaddr)            ip6_addr_set_zero(ipaddr)
-#define ip_addr_set_any(is_ipv6, ipaddr)        ip6_addr_set_any(ipaddr)
-#define ip_addr_set_loopback(is_ipv6, ipaddr)   ip6_addr_set_loopback(ipaddr)
-#define ip_addr_set_hton(dest, src)             ip6_addr_set_hton(dest, src)
-#define ip_addr_get_network(target, host, mask) ip6_addr_set_zero(target)
-#define ip_addr_netcmp(addr1, addr2, mask)      0
-#define ip_addr_cmp(addr1, addr2)               ip6_addr_cmp(addr1, addr2)
-#define ip_addr_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)
-#define ip_addr_islinklocal(ipaddr)             ip6_addr_islinklocal(ipaddr)
-#define ip_addr_isbroadcast(addr, netif)        0
-#define ip_addr_ismulticast(ipaddr)             ip6_addr_ismulticast(ipaddr)
-#define ip_addr_debug_print(debug, ipaddr)      ip6_addr_debug_print(debug, ipaddr)
-#define ip_addr_debug_print_val(debug, ipaddr)  ip6_addr_debug_print_val(debug, ipaddr)
-#define ipaddr_ntoa(ipaddr)                     ip6addr_ntoa(ipaddr)
-#define ipaddr_ntoa_r(ipaddr, buf, buflen)      ip6addr_ntoa_r(ipaddr, buf, buflen)
-#define ipaddr_aton(cp, addr)                   ip6addr_aton(cp, addr)
-
-#endif /* LWIP_IPV4 */
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-
-#if LWIP_IPV4
-
-extern const ip_addr_t ip_addr_any;
-extern const ip_addr_t ip_addr_broadcast;
-
-/** IP_ADDR_ can be used as a fixed/const ip_addr_t
- *  for the IPv4 wildcard and the broadcast address
- */
-#define IP_ADDR_ANY         (&ip_addr_any)
-#define IP_ADDR_BROADCAST   (&ip_addr_broadcast)
-/** IP4_ADDR_ can be used as a fixed/const ip4_addr_t
- *  for the wildcard and the broadcast address
- */
-#define IP4_ADDR_ANY        (ip_2_ip4(&ip_addr_any))
-#define IP4_ADDR_BROADCAST  (ip_2_ip4(&ip_addr_broadcast))
-
-#endif /* LWIP_IPV4*/
-
-#if LWIP_IPV6
-
-extern const ip_addr_t ip6_addr_any;
-
-/** IP6_ADDR_ANY can be used as a fixed ip_addr_t
- *  for the IPv6 wildcard address
- */
-#define IP6_ADDR_ANY   (&ip6_addr_any)
-/** IP6_ADDR_ANY6 can be used as a fixed ip6_addr_t
- *  for the IPv6 wildcard address
- */
-#define IP6_ADDR_ANY6  (ip_2_ip6(&ip6_addr_any))
-
-#if !LWIP_IPV4
-/** Just a little upgrade-helper for IPv6-only configurations: */
-#define IP_ADDR_ANY IP6_ADDR_ANY
-#endif /* !LWIP_IPV4 */
-
-#endif
-
-#if LWIP_IPV4 && LWIP_IPV6
-#define IP_ANY_TYPE    (&ip_addr_any_type)
-#else
-#define IP_ANY_TYPE    IP_ADDR_ANY
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_HDR_IP_ADDR_H__ */
diff --git a/components/lwip/include/lwip/lwip/ip_frag.h b/components/lwip/include/lwip/lwip/ip_frag.h
deleted file mode 100644 (file)
index deeb2f4..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * 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: Jani Monoses <jani@iv.ro>
- *
- */
-
-#ifndef LWIP_HDR_IP_FRAG_H
-#define LWIP_HDR_IP_FRAG_H
-
-#include "lwip/opt.h"
-#include "lwip/err.h"
-#include "lwip/pbuf.h"
-#include "lwip/netif.h"
-#include "lwip/ip_addr.h"
-#include "lwip/ip.h"
-
-#if LWIP_IPV4
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if IP_REASSEMBLY
-/* The IP reassembly timer interval in milliseconds. */
-#define IP_TMR_INTERVAL 1000
-
-/* IP reassembly helper struct.
- * This is exported because memp needs to know the size.
- */
-struct ip_reassdata {
-  struct ip_reassdata *next;
-  struct pbuf *p;
-  struct ip_hdr iphdr;
-  u16_t datagram_len;
-  u8_t flags;
-  u8_t timer;
-};
-
-void ip_reass_init(void);
-void ip_reass_tmr(void);
-struct pbuf * ip4_reass(struct pbuf *p);
-#endif /* IP_REASSEMBLY */
-
-#if IP_FRAG
-#if !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF
-/** 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. */
-#ifndef LWIP_PBUF_CUSTOM_REF_DEFINED
-#define LWIP_PBUF_CUSTOM_REF_DEFINED
-struct pbuf_custom_ref {
-  /** 'base class' */
-  struct pbuf_custom pc;
-  /** pointer to the original pbuf that is referenced */
-  struct pbuf *original;
-};
-#endif /* LWIP_PBUF_CUSTOM_REF_DEFINED */
-#endif /* !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF */
-
-err_t ip4_frag(struct pbuf *p, struct netif *netif, const ip4_addr_t *dest);
-#endif /* IP_FRAG */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_IPV4 */
-
-#endif /* LWIP_HDR_IP_FRAG_H */
diff --git a/components/lwip/include/lwip/lwip/mem.h b/components/lwip/include/lwip/lwip/mem.h
deleted file mode 100644 (file)
index 966d6bb..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * 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_MEM_H
-#define LWIP_HDR_MEM_H
-
-#include "lwip/opt.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if MEM_LIBC_MALLOC
-
-#include <stddef.h> /* for size_t */
-
-typedef size_t mem_size_t;
-#define MEM_SIZE_F SZT_F
-
-/* aliases for C library malloc() */
-#define mem_init()
-/* in case C library malloc() needs extra protection,
- * allow these defines to be overridden.
- */
-
-#ifndef mem_free
-#define mem_free free
-#endif
-/**
- * lwip_malloc: if CONFIG_ALLOC_MEMORY_IN_SPIRAM_FIRST is enabled, Try to
- * allocate memory for lwip in SPIRAM firstly. If failed, try to allocate
- * internal memory then.
- */
-#if CONFIG_WIFI_LWIP_ALLOCATION_FROM_SPIRAM_FIRST
-#ifndef mem_malloc
-#define mem_malloc(size)    heap_caps_malloc_prefer(size, 2, MALLOC_CAP_DEFAULT|MALLOC_CAP_SPIRAM, MALLOC_CAP_DEFAULT|MALLOC_CAP_INTERNAL)
-#endif
-#ifndef mem_calloc
-#define mem_calloc(n, size) heap_caps_calloc_prefer(n, size, 2, MALLOC_CAP_DEFAULT|MALLOC_CAP_SPIRAM, MALLOC_CAP_DEFAULT|MALLOC_CAP_INTERNAL)
-#endif
-#else
-#ifndef mem_malloc
-#define mem_malloc malloc
-#endif
-#ifndef mem_calloc
-#define mem_calloc calloc
-#endif
-#endif
-
-/* Since there is no C library allocation function to shrink memory without
-   moving it, define this to nothing. */
-#ifndef mem_trim
-#define mem_trim(mem, size) (mem)
-#endif
-#else /* MEM_LIBC_MALLOC */
-
-/* MEM_SIZE would have to be aligned, but using 64000 here instead of
- * 65535 leaves some room for alignment...
- */
-#if MEM_SIZE > 64000L
-typedef u32_t mem_size_t;
-#define MEM_SIZE_F U32_F
-#else
-typedef u16_t mem_size_t;
-#define MEM_SIZE_F U16_F
-#endif /* MEM_SIZE > 64000 */
-
-#if MEM_USE_POOLS
-/** mem_init is not used when using pools instead of a heap */
-#define mem_init()
-/** mem_trim is not used when using pools instead of a heap:
-    we can't free part of a pool element and don't want to copy the rest */
-#define mem_trim(mem, size) (mem)
-#else /* MEM_USE_POOLS */
-/* lwIP alternative malloc */
-void  mem_init(void);
-void *mem_trim(void *mem, mem_size_t size);
-#endif /* MEM_USE_POOLS */
-void *mem_malloc(mem_size_t size);
-void *mem_calloc(mem_size_t count, mem_size_t size);
-void  mem_free(void *mem);
-#endif /* MEM_LIBC_MALLOC */
-
-/** Calculate memory size for an aligned buffer - returns the next highest
- * multiple of MEM_ALIGNMENT (e.g. LWIP_MEM_ALIGN_SIZE(3) and
- * LWIP_MEM_ALIGN_SIZE(4) will both yield 4 for MEM_ALIGNMENT == 4).
- */
-#ifndef LWIP_MEM_ALIGN_SIZE
-#define LWIP_MEM_ALIGN_SIZE(size) (((size) + MEM_ALIGNMENT - 1U) & ~(MEM_ALIGNMENT-1U))
-#endif
-
-/** 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*)
- */
-#ifndef LWIP_MEM_ALIGN_BUFFER
-#define LWIP_MEM_ALIGN_BUFFER(size) (((size) + MEM_ALIGNMENT - 1U))
-#endif
-
-/** Align a memory pointer to the alignment defined by MEM_ALIGNMENT
- * so that ADDR % MEM_ALIGNMENT == 0
- */
-#ifndef LWIP_MEM_ALIGN
-#define LWIP_MEM_ALIGN(addr) ((void *)(((mem_ptr_t)(addr) + MEM_ALIGNMENT - 1) & ~(mem_ptr_t)(MEM_ALIGNMENT-1)))
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_HDR_MEM_H */
diff --git a/components/lwip/include/lwip/lwip/memp.h b/components/lwip/include/lwip/lwip/memp.h
deleted file mode 100644 (file)
index abb8e57..0000000
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * 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_MEMP_H
-#define LWIP_HDR_MEMP_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* run once with empty definition to handle all custom includes in lwippools.h */
-#define LWIP_MEMPOOL(name,num,size,desc)
-#include "lwip/priv/memp_std.h"
-
-/* Create the list of all memory pools managed by memp. MEMP_MAX represents a NULL pool at the end */
-typedef enum {
-#define LWIP_MEMPOOL(name,num,size,desc)  MEMP_##name,
-#include "lwip/priv/memp_std.h"
-  MEMP_MAX
-} memp_t;
-
-#include "lwip/priv/memp_priv.h"
-
-/* Private mempools example:
- * .h: only when pool is used in multiple .c files: LWIP_MEMPOOL_PROTOTYPE(my_private_pool);
- * .c:
- *   - in global variables section: LWIP_MEMPOOL_DECLARE(my_private_pool, 10, sizeof(foo), "Some description")
- *   - call ONCE before using pool (e.g. in some init() function): LWIP_MEMPOOL_INIT(my_private_pool);
- *   - allocate: void* my_new_mem = LWIP_MEMPOOL_ALLOC(my_private_pool);
- *   - 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 const struct memp_desc* const memp_pools[MEMP_MAX];
-
-#define LWIP_MEMPOOL_PROTOTYPE(name) extern const struct memp_desc memp_ ## name
-
-#if MEMP_MEM_MALLOC
-
-#include "lwip/mem.h"
-
-#define memp_init()
-#if ESP_STATS_MEM
-static inline void* memp_malloc(int type)
-{
-    ESP_CNT_MEM_MALLOC_INC(type);
-    return mem_malloc(memp_pools[type]->size);
-}
-
-static inline void memp_free(int type, void *mem)
-{
-    ESP_CNT_MEM_FREE_INC(type);
-    mem_free(mem);
-}
-
-//#define memp_malloc(type)     mem_malloc(memp_pools[type]->size); ESP_CNT_MEM_MALLOC_INC(type)
-//#define memp_free(type, mem)  mem_free(mem); ESP_CNT_MEM_FREE_INC(type)
-#else
-#define memp_malloc(type)     mem_malloc(memp_pools[type]->size)
-#define memp_free(type, mem)  mem_free(mem)
-#endif
-
-#define LWIP_MEMPOOL_DECLARE(name,num,size,desc) \
-  const struct memp_desc memp_ ## name = { \
-    LWIP_MEM_ALIGN_SIZE(size) \
-  };
-
-#define LWIP_MEMPOOL_INIT(name)
-#define LWIP_MEMPOOL_ALLOC(name)   mem_malloc(memp_ ## name.size)
-#define LWIP_MEMPOOL_FREE(name, x) mem_free(x)
-
-#else /* MEMP_MEM_MALLOC */
-
-#define LWIP_MEMPOOL_DECLARE(name,num,size,desc) u8_t memp_memory_ ## name ## _base \
-    [((num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size)))]; \
-    \
-  static struct memp *memp_tab_ ## name; \
-    \
-  const struct memp_desc memp_ ## name = { \
-    LWIP_MEM_ALIGN_SIZE(size), \
-    (num), \
-    DECLARE_LWIP_MEMPOOL_DESC(desc) \
-    memp_memory_ ## name ## _base, \
-    &memp_tab_ ## name \
-  };
-
-#define LWIP_MEMPOOL_INIT(name)    memp_init_pool(&memp_ ## name)
-#define LWIP_MEMPOOL_ALLOC(name)   memp_malloc_pool(&memp_ ## name)
-#define LWIP_MEMPOOL_FREE(name, x) memp_free_pool(&memp_ ## name, (x))
-
-#if MEM_USE_POOLS
-/** This structure is used to save the pool one element came from. */
-struct memp_malloc_helper
-{
-   memp_t poolnr;
-#if MEMP_OVERFLOW_CHECK
-   u16_t size;
-#endif /* MEMP_OVERFLOW_CHECK */
-};
-
-#endif /* MEM_USE_POOLS */
-
-void  memp_init(void);
-
-#if MEMP_OVERFLOW_CHECK
-void *memp_malloc_fn(memp_t type, const char* file, const int line);
-#define memp_malloc(t) memp_malloc_fn((t), __FILE__, __LINE__)
-#else
-void *memp_malloc(memp_t type);
-#endif
-void  memp_free(memp_t type, void *mem);
-
-#endif /* MEMP_MEM_MALLOC */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_HDR_MEMP_H */
diff --git a/components/lwip/include/lwip/lwip/mld6.h b/components/lwip/include/lwip/lwip/mld6.h
deleted file mode 100644 (file)
index a54dd49..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-/**
- * @file
- *
- * Multicast listener discovery for IPv6. Aims to be compliant with RFC 2710.
- * No support for MLDv2.
- */
-
-/*
- * Copyright (c) 2010 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_MLD6_H
-#define LWIP_HDR_MLD6_H
-
-#include "lwip/opt.h"
-
-#if LWIP_IPV6_MLD && LWIP_IPV6  /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/pbuf.h"
-#include "lwip/netif.h"
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct mld_group {
-  /** next link */
-  struct mld_group *next;
-  /** interface on which the group is active */
-  struct netif      *netif;
-  /** multicast address */
-  ip6_addr_t         group_address;
-  /** signifies we were the last person to report */
-  u8_t               last_reporter_flag;
-  /** current state of the group */
-  u8_t               group_state;
-  /** timer for reporting */
-  u16_t              timer;
-  /** counter of simultaneous uses */
-  u8_t               use;
-};
-
-/** Multicast listener report/query/done message header. */
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct mld_header {
-  PACK_STRUCT_FLD_8(u8_t type);
-  PACK_STRUCT_FLD_8(u8_t code);
-  PACK_STRUCT_FIELD(u16_t chksum);
-  PACK_STRUCT_FIELD(u16_t max_resp_delay);
-  PACK_STRUCT_FIELD(u16_t reserved);
-  PACK_STRUCT_FLD_S(ip6_addr_p_t multicast_address);
-  /* Options follow. */
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
-#define MLD6_TMR_INTERVAL              100 /* Milliseconds */
-
-/* MAC Filter Actions, these are passed to a netif's
- * mld_mac_filter callback function. */
-#define MLD6_DEL_MAC_FILTER            0
-#define MLD6_ADD_MAC_FILTER            1
-
-
-err_t  mld6_stop(struct netif *netif);
-void   mld6_report_groups(struct netif *netif);
-void   mld6_tmr(void);
-struct mld_group *mld6_lookfor_group(struct netif *ifp, const ip6_addr_t *addr);
-void   mld6_input(struct pbuf *p, struct netif *inp);
-err_t  mld6_joingroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr);
-err_t  mld6_joingroup_netif(struct netif *netif, const ip6_addr_t *groupaddr);
-err_t  mld6_leavegroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr);
-err_t  mld6_leavegroup_netif(struct netif *netif, const ip6_addr_t *groupaddr);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_IPV6_MLD && LWIP_IPV6 */
-
-#endif /* LWIP_HDR_MLD6_H */
diff --git a/components/lwip/include/lwip/lwip/nd6.h b/components/lwip/include/lwip/lwip/nd6.h
deleted file mode 100644 (file)
index 27a4c81..0000000
+++ /dev/null
@@ -1,365 +0,0 @@
-/**
- * @file
- *
- * Neighbor discovery and stateless address autoconfiguration for IPv6.
- * Aims to be compliant with RFC 4861 (Neighbor discovery) and RFC 4862
- * (Address autoconfiguration).
- */
-
-/*
- * Copyright (c) 2010 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_ND6_H
-#define LWIP_HDR_ND6_H
-
-#include "lwip/opt.h"
-
-#if LWIP_IPV6  /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/pbuf.h"
-#include "lwip/ip6.h"
-#include "lwip/ip6_addr.h"
-#include "lwip/netif.h"
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Struct for tables. */
-struct nd6_neighbor_cache_entry {
-  ip6_addr_t next_hop_address;
-  struct netif * netif;
-  u8_t lladdr[NETIF_MAX_HWADDR_LEN];
-  /*u32_t pmtu;*/
-#if LWIP_ND6_QUEUEING
-  /** Pointer to queue of pending outgoing packets on this entry. */
-  struct nd6_q_entry *q;
-#else /* LWIP_ND6_QUEUEING */
-  /** Pointer to a single pending outgoing packet on this entry. */
-  struct pbuf *q;
-#endif /* LWIP_ND6_QUEUEING */
-  u8_t state;
-  u8_t isrouter;
-  union {
-    u32_t reachable_time;
-    u32_t delay_time;
-    u32_t probes_sent;
-    u32_t stale_time;
-  } counter;
-};
-
-struct nd6_destination_cache_entry {
-  ip6_addr_t destination_addr;
-  ip6_addr_t next_hop_addr;
-  u16_t pmtu;
-  u32_t age;
-};
-
-struct nd6_prefix_list_entry {
-  ip6_addr_t prefix;
-  struct netif * netif;
-  u32_t invalidation_timer;
-#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 */
-};
-
-struct nd6_router_list_entry {
-  struct nd6_neighbor_cache_entry * neighbor_entry;
-  u32_t invalidation_timer;
-  u8_t flags;
-};
-
-
-enum nd6_neighbor_cache_entry_state {
-  ND6_NO_ENTRY = 0,
-  ND6_INCOMPLETE,
-  ND6_REACHABLE,
-  ND6_STALE,
-  ND6_DELAY,
-  ND6_PROBE
-};
-
-#if LWIP_ND6_QUEUEING
-/** struct for queueing outgoing packets for unknown address
-  * defined here to be accessed by memp.h
-  */
-struct nd6_q_entry {
-  struct nd6_q_entry *next;
-  struct pbuf *p;
-};
-#endif /* LWIP_ND6_QUEUEING */
-
-/** Neighbor solicitation message header. */
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct ns_header {
-  PACK_STRUCT_FLD_8(u8_t type);
-  PACK_STRUCT_FLD_8(u8_t code);
-  PACK_STRUCT_FIELD(u16_t chksum);
-  PACK_STRUCT_FIELD(u32_t reserved);
-  PACK_STRUCT_FLD_S(ip6_addr_p_t target_address);
-  /* Options follow. */
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
-/** Neighbor advertisement message header. */
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct na_header {
-  PACK_STRUCT_FLD_8(u8_t type);
-  PACK_STRUCT_FLD_8(u8_t code);
-  PACK_STRUCT_FIELD(u16_t chksum);
-  PACK_STRUCT_FLD_8(u8_t flags);
-  PACK_STRUCT_FLD_8(u8_t reserved[3]);
-  PACK_STRUCT_FLD_S(ip6_addr_p_t target_address);
-  /* Options follow. */
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-#define ND6_FLAG_ROUTER      (0x80)
-#define ND6_FLAG_SOLICITED   (0x40)
-#define ND6_FLAG_OVERRIDE    (0x20)
-
-/** Router solicitation message header. */
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct rs_header {
-  PACK_STRUCT_FLD_8(u8_t type);
-  PACK_STRUCT_FLD_8(u8_t code);
-  PACK_STRUCT_FIELD(u16_t chksum);
-  PACK_STRUCT_FIELD(u32_t reserved);
-  /* Options follow. */
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
-/** Router advertisement message header. */
-#define ND6_RA_FLAG_MANAGED_ADDR_CONFIG (0x80)
-#define ND6_RA_FLAG_OTHER_CONFIG (0x40)
-#define ND6_RA_FLAG_HOME_AGENT (0x20)
-#define ND6_RA_PREFERENCE_MASK (0x18)
-#define ND6_RA_PREFERENCE_HIGH (0x08)
-#define ND6_RA_PREFERENCE_MEDIUM (0x00)
-#define ND6_RA_PREFERENCE_LOW (0x18)
-#define ND6_RA_PREFERENCE_DISABLED (0x10)
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct ra_header {
-  PACK_STRUCT_FLD_8(u8_t type);
-  PACK_STRUCT_FLD_8(u8_t code);
-  PACK_STRUCT_FIELD(u16_t chksum);
-  PACK_STRUCT_FLD_8(u8_t current_hop_limit);
-  PACK_STRUCT_FLD_8(u8_t flags);
-  PACK_STRUCT_FIELD(u16_t router_lifetime);
-  PACK_STRUCT_FIELD(u32_t reachable_time);
-  PACK_STRUCT_FIELD(u32_t retrans_timer);
-  /* Options follow. */
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
-/** Redirect message header. */
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct redirect_header {
-  PACK_STRUCT_FLD_8(u8_t type);
-  PACK_STRUCT_FLD_8(u8_t code);
-  PACK_STRUCT_FIELD(u16_t chksum);
-  PACK_STRUCT_FIELD(u32_t reserved);
-  PACK_STRUCT_FLD_S(ip6_addr_p_t target_address);
-  PACK_STRUCT_FLD_S(ip6_addr_p_t destination_address);
-  /* Options follow. */
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
-/** Link-layer address option. */
-#define ND6_OPTION_TYPE_SOURCE_LLADDR (0x01)
-#define ND6_OPTION_TYPE_TARGET_LLADDR (0x02)
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct lladdr_option {
-  PACK_STRUCT_FLD_8(u8_t type);
-  PACK_STRUCT_FLD_8(u8_t length);
-  PACK_STRUCT_FLD_8(u8_t addr[NETIF_MAX_HWADDR_LEN]);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
-/** Prefix information option. */
-#define ND6_OPTION_TYPE_PREFIX_INFO (0x03)
-#define ND6_PREFIX_FLAG_ON_LINK (0x80)
-#define ND6_PREFIX_FLAG_AUTONOMOUS (0x40)
-#define ND6_PREFIX_FLAG_ROUTER_ADDRESS (0x20)
-#define ND6_PREFIX_FLAG_SITE_PREFIX (0x10)
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct prefix_option {
-  PACK_STRUCT_FLD_8(u8_t type);
-  PACK_STRUCT_FLD_8(u8_t length);
-  PACK_STRUCT_FLD_8(u8_t prefix_length);
-  PACK_STRUCT_FLD_8(u8_t flags);
-  PACK_STRUCT_FIELD(u32_t valid_lifetime);
-  PACK_STRUCT_FIELD(u32_t preferred_lifetime);
-  PACK_STRUCT_FLD_8(u8_t reserved2[3]);
-  PACK_STRUCT_FLD_8(u8_t site_prefix_length);
-  PACK_STRUCT_FLD_S(ip6_addr_p_t prefix);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
-/** Redirected header option. */
-#define ND6_OPTION_TYPE_REDIR_HDR (0x04)
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct redirected_header_option {
-  PACK_STRUCT_FLD_8(u8_t type);
-  PACK_STRUCT_FLD_8(u8_t length);
-  PACK_STRUCT_FLD_8(u8_t reserved[6]);
-  /* Portion of redirected packet follows. */
-  /* PACK_STRUCT_FLD_8(u8_t redirected[8]); */
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
-/** MTU option. */
-#define ND6_OPTION_TYPE_MTU (0x05)
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct mtu_option {
-  PACK_STRUCT_FLD_8(u8_t type);
-  PACK_STRUCT_FLD_8(u8_t length);
-  PACK_STRUCT_FIELD(u16_t reserved);
-  PACK_STRUCT_FIELD(u32_t mtu);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
-/** Route information option. */
-#define ND6_OPTION_TYPE_ROUTE_INFO (24)
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct route_option {
-  PACK_STRUCT_FLD_8(u8_t type);
-  PACK_STRUCT_FLD_8(u8_t length);
-  PACK_STRUCT_FLD_8(u8_t prefix_length);
-  PACK_STRUCT_FLD_8(u8_t preference);
-  PACK_STRUCT_FIELD(u32_t route_lifetime);
-  PACK_STRUCT_FLD_S(ip6_addr_p_t prefix);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
-/** 1 second period */
-#define ND6_TMR_INTERVAL 1000
-
-/* Router tables. */
-/* TODO make these static? and entries accessible through API? */
-extern struct nd6_neighbor_cache_entry neighbor_cache[];
-extern struct nd6_destination_cache_entry destination_cache[];
-extern struct nd6_prefix_list_entry prefix_list[];
-extern struct nd6_router_list_entry default_router_list[];
-
-/* Default values, can be updated by a RA message. */
-extern u32_t reachable_time;
-extern u32_t retrans_timer;
-
-void nd6_tmr(void);
-void nd6_input(struct pbuf *p, struct netif *inp);
-s8_t nd6_get_next_hop_entry(const ip6_addr_t * ip6addr, struct netif * netif);
-s8_t nd6_select_router(const ip6_addr_t * ip6addr, struct netif * netif);
-u16_t nd6_get_destination_mtu(const ip6_addr_t * ip6addr, struct netif * netif);
-err_t nd6_queue_packet(s8_t neighbor_index, struct pbuf * p);
-#if LWIP_ND6_TCP_REACHABILITY_HINTS
-void nd6_reachability_hint(const ip6_addr_t * ip6addr);
-#endif /* LWIP_ND6_TCP_REACHABILITY_HINTS */
-
-#if ESP_LWIP
-/** set nd6 callback when ipv6 addr state pref*/
-void nd6_set_cb(struct netif *netif, void (*cb)(struct netif *netif, u8_t ip_index));
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_IPV6 */
-
-#endif /* LWIP_HDR_ND6_H */
diff --git a/components/lwip/include/lwip/lwip/netbuf.h b/components/lwip/include/lwip/lwip/netbuf.h
deleted file mode 100644 (file)
index 8875e12..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * 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_NETBUF_H
-#define LWIP_HDR_NETBUF_H
-
-#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/pbuf.h"
-#include "lwip/ip_addr.h"
-#include "lwip/ip6_addr.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/** This netbuf has dest-addr/port set */
-#define NETBUF_FLAG_DESTADDR    0x01
-/** This netbuf includes a checksum */
-#define NETBUF_FLAG_CHKSUM      0x02
-
-struct netbuf {
-  struct pbuf *p, *ptr;
-  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;
-#endif /* LWIP_NETBUF_RECVINFO */
-#endif /* LWIP_NETBUF_RECVINFO || LWIP_CHECKSUM_ON_COPY */
-};
-
-/* Network buffer functions: */
-struct netbuf *   netbuf_new      (void);
-void              netbuf_delete   (struct netbuf *buf);
-void *            netbuf_alloc    (struct netbuf *buf, u16_t size);
-void              netbuf_free     (struct netbuf *buf);
-err_t             netbuf_ref      (struct netbuf *buf,
-                                   const void *dataptr, u16_t size);
-void              netbuf_chain    (struct netbuf *head, struct netbuf *tail);
-
-err_t             netbuf_data     (struct netbuf *buf,
-                                   void **dataptr, u16_t *len);
-s8_t              netbuf_next     (struct netbuf *buf);
-void              netbuf_first    (struct netbuf *buf);
-
-
-#define netbuf_copy_partial(buf, dataptr, len, offset) \
-  pbuf_copy_partial((buf)->p, (dataptr), (len), (offset))
-#define netbuf_copy(buf,dataptr,len) netbuf_copy_partial(buf, dataptr, len, 0)
-#define netbuf_take(buf, dataptr, len) pbuf_take((buf)->p, dataptr, len)
-#define netbuf_len(buf)              ((buf)->p->tot_len)
-#define netbuf_fromaddr(buf)         (&((buf)->addr))
-#define netbuf_set_fromaddr(buf, fromaddr) ip_addr_set(&((buf)->addr), fromaddr)
-#define netbuf_fromport(buf)         ((buf)->port)
-#if LWIP_NETBUF_RECVINFO
-#define netbuf_destaddr(buf)         (&((buf)->toaddr))
-#define netbuf_set_destaddr(buf, destaddr) ip_addr_set(&((buf)->toaddr), destaddr)
-#if LWIP_CHECKSUM_ON_COPY
-#define netbuf_destport(buf)         (((buf)->flags & NETBUF_FLAG_DESTADDR) ? (buf)->toport_chksum : 0)
-#else /* LWIP_CHECKSUM_ON_COPY */
-#define netbuf_destport(buf)         ((buf)->toport_chksum)
-#endif /* LWIP_CHECKSUM_ON_COPY */
-#endif /* LWIP_NETBUF_RECVINFO */
-#if LWIP_CHECKSUM_ON_COPY
-#define netbuf_set_chksum(buf, chksum) do { (buf)->flags = NETBUF_FLAG_CHKSUM; \
-                                            (buf)->toport_chksum = chksum; } while(0)
-#endif /* LWIP_CHECKSUM_ON_COPY */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_NETCONN || LWIP_SOCKET */
-
-#endif /* LWIP_HDR_NETBUF_H */
diff --git a/components/lwip/include/lwip/lwip/netdb.h b/components/lwip/include/lwip/lwip/netdb.h
deleted file mode 100644 (file)
index 45a0362..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE 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_NETDB_H
-#define LWIP_HDR_NETDB_H
-
-#include "lwip/opt.h"
-
-#if LWIP_DNS && LWIP_SOCKET
-
-#include <stddef.h> /* for size_t */
-
-#include "lwip/inet.h"
-#include "lwip/sockets.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* some rarely used options */
-#ifndef LWIP_DNS_API_DECLARE_H_ERRNO
-#define LWIP_DNS_API_DECLARE_H_ERRNO  1
-#endif
-
-#ifndef LWIP_DNS_API_DEFINE_ERRORS
-#define LWIP_DNS_API_DEFINE_ERRORS    1
-#endif
-
-#ifndef LWIP_DNS_API_DEFINE_FLAGS
-#define LWIP_DNS_API_DEFINE_FLAGS     1
-#endif
-
-#ifndef LWIP_DNS_API_DECLARE_STRUCTS
-#define LWIP_DNS_API_DECLARE_STRUCTS  1
-#endif
-
-#if LWIP_DNS_API_DEFINE_ERRORS
-/** Errors used by the DNS API functions, h_errno can be one of them */
-#define EAI_NONAME      200
-#define EAI_SERVICE     201
-#define EAI_FAIL        202
-#define EAI_MEMORY      203
-#define EAI_FAMILY      204
-
-#define HOST_NOT_FOUND  210
-#define NO_DATA         211
-#define NO_RECOVERY     212
-#define TRY_AGAIN       213
-#endif /* LWIP_DNS_API_DEFINE_ERRORS */
-
-#if LWIP_DNS_API_DEFINE_FLAGS
-/* input flags for struct addrinfo */
-#define AI_PASSIVE      0x01
-#define AI_CANONNAME    0x02
-#define AI_NUMERICHOST  0x04
-#define AI_NUMERICSERV  0x08
-#define AI_V4MAPPED     0x10
-#define AI_ALL          0x20
-#define AI_ADDRCONFIG   0x40
-#endif /* LWIP_DNS_API_DEFINE_FLAGS */
-
-#if LWIP_DNS_API_DECLARE_STRUCTS
-struct hostent {
-    char  *h_name;      /* Official name of the host. */
-    char **h_aliases;   /* A pointer to an array of pointers to alternative host names,
-                           terminated by a null pointer. */
-    int    h_addrtype;  /* Address type. */
-    int    h_length;    /* The length, in bytes, of the address. */
-    char **h_addr_list; /* A pointer to an array of pointers to network addresses (in
-                           network byte order) for the host, terminated by a null pointer. */
-#define h_addr h_addr_list[0] /* for backward compatibility */
-};
-
-struct addrinfo {
-    int               ai_flags;      /* Input flags. */
-    int               ai_family;     /* Address family of socket. */
-    int               ai_socktype;   /* Socket type. */
-    int               ai_protocol;   /* Protocol of socket. */
-    socklen_t         ai_addrlen;    /* Length of socket address. */
-    struct sockaddr  *ai_addr;       /* Socket address of socket. */
-    char             *ai_canonname;  /* Canonical name of service location. */
-    struct addrinfo  *ai_next;       /* Pointer to next in list. */
-};
-#endif /* LWIP_DNS_API_DECLARE_STRUCTS */
-
-#define NETDB_ELEM_SIZE           (sizeof(struct addrinfo) + sizeof(struct sockaddr_storage) + DNS_MAX_NAME_LENGTH + 1)
-
-#if LWIP_DNS_API_DECLARE_H_ERRNO
-/* application accessible error code set by the DNS API functions */
-extern int h_errno;
-#endif /* LWIP_DNS_API_DECLARE_H_ERRNO*/
-
-struct hostent *lwip_gethostbyname(const char *name);
-int lwip_gethostbyname_r(const char *name, struct hostent *ret, char *buf,
-                size_t buflen, struct hostent **result, int *h_errnop);
-void lwip_freeaddrinfo(struct addrinfo *ai);
-int lwip_getaddrinfo(const char *nodename,
-       const char *servname,
-       const struct addrinfo *hints,
-       struct addrinfo **res);
-
-#if LWIP_COMPAT_SOCKETS
-#if LWIP_COMPAT_SOCKET_ADDR == 1
-/* Some libraries have problems with inet_... being macros, so please use this define 
-    to declare normal functions */
-static inline int gethostbyname_r(const char *name, struct hostent *ret, char *buf, size_t buflen, struct hostent **result, int *h_errnop)
-{ return lwip_gethostbyname_r(name, ret, buf, buflen, result, h_errnop); }
-static inline struct hostent *gethostbyname(const char *name)
-{ return lwip_gethostbyname(name); }
-static inline void freeaddrinfo(struct addrinfo *ai)
-{ lwip_freeaddrinfo(ai); }
-static inline int getaddrinfo(const char *nodename, const char *servname, const struct addrinfo *hints, struct addrinfo **res)
-{ return lwip_getaddrinfo(nodename, servname, hints, res); }
-#else
-/* By default fall back to original inet_... macros */
-
-#define gethostbyname(name) lwip_gethostbyname(name)
-#define gethostbyname_r(name, ret, buf, buflen, result, h_errnop) \
-       lwip_gethostbyname_r(name, ret, buf, buflen, result, h_errnop)
-#define freeaddrinfo(addrinfo) lwip_freeaddrinfo(addrinfo)
-#define getaddrinfo(nodname, servname, hints, res) \
-       lwip_getaddrinfo(nodname, servname, hints, res)
-#endif /* LWIP_COMPAT_SOCKET_ADDR == 1 */
-#endif /* LWIP_COMPAT_SOCKETS */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_DNS && LWIP_SOCKET */
-
-#endif /* LWIP_HDR_NETDB_H */
diff --git a/components/lwip/include/lwip/lwip/netif.h b/components/lwip/include/lwip/lwip/netif.h
deleted file mode 100644 (file)
index bd25b82..0000000
+++ /dev/null
@@ -1,451 +0,0 @@
-/*
- * 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_NETIF_H
-#define LWIP_HDR_NETIF_H
-
-#include "lwip/opt.h"
-
-#define ENABLE_LOOPBACK (LWIP_NETIF_LOOPBACK || LWIP_HAVE_LOOPIF)
-
-#include "lwip/err.h"
-
-#include "lwip/ip_addr.h"
-
-#include "lwip/def.h"
-#include "lwip/pbuf.h"
-#include "lwip/stats.h"
-
-#if LWIP_DHCP
-struct dhcp;
-#endif
-#if LWIP_AUTOIP
-struct autoip;
-#endif
-#if LWIP_IPV6_DHCP6
-struct dhcp6;
-#endif /* LWIP_IPV6_DHCP6 */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Throughout this file, IP addresses are expected to be in
- * the same byte order as in IP_PCB. */
-
-/** 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. */
-#ifndef NETIF_MAX_HWADDR_LEN
-#define NETIF_MAX_HWADDR_LEN 6U
-#endif
-
-/** 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).
- */
-#define NETIF_FLAG_UP           0x01U
-/** If set, the netif has broadcast capability.
- * Set by the netif driver in its init function. */
-#define NETIF_FLAG_BROADCAST    0x02U
-/** 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). */
-#define NETIF_FLAG_LINK_UP      0x04U
-/** 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. */
-#define NETIF_FLAG_ETHARP       0x08U
-/** If set, the netif is an ethernet device. It might not use
- * ARP or TCP/IP if it is used for PPPoE only.
- */
-#define NETIF_FLAG_ETHERNET     0x10U
-/** If set, the netif has IGMP capability.
- * Set by the netif driver in its init function. */
-#define NETIF_FLAG_IGMP         0x20U
-/** If set, the netif has MLD6 capability.
- * Set by the netif driver in its init function. */
-#define NETIF_FLAG_MLD6         0x40U
-
-#if LWIP_CHECKSUM_CTRL_PER_NETIF
-#define NETIF_CHECKSUM_GEN_IP       0x0001
-#define NETIF_CHECKSUM_GEN_UDP      0x0002
-#define NETIF_CHECKSUM_GEN_TCP      0x0004
-#define NETIF_CHECKSUM_GEN_ICMP     0x0008
-#define NETIF_CHECKSUM_GEN_ICMP6    0x0010
-#define NETIF_CHECKSUM_CHECK_IP     0x0100
-#define NETIF_CHECKSUM_CHECK_UDP    0x0200
-#define NETIF_CHECKSUM_CHECK_TCP    0x0400
-#define NETIF_CHECKSUM_CHECK_ICMP   0x0800
-#define NETIF_CHECKSUM_CHECK_ICMP6  0x1000
-#define NETIF_CHECKSUM_ENABLE_ALL   0xFFFF
-#define NETIF_CHECKSUM_DISABLE_ALL  0x0000
-#endif /* LWIP_CHECKSUM_CTRL_PER_NETIF */
-
-struct netif;
-
-/** Function prototype for netif init functions. Set up flags and output/linkoutput
- * callback functions in this function.
- *
- * @param netif The netif to initialize
- */
-typedef err_t (*netif_init_fn)(struct netif *netif);
-/** Function prototype for netif->input functions. This function is saved as 'input'
- * callback function in the netif struct. Call it when a packet has been received.
- *
- * @param p The received packet, copied into a pbuf
- * @param inp The netif which received the packet
- */
-typedef err_t (*netif_input_fn)(struct pbuf *p, struct netif *inp);
-
-#if LWIP_IPV4
-/** Function prototype for netif->output functions. Called by lwIP when a packet
- * shall be sent. For ethernet netif, set this to 'etharp_output' and set
- * 'linkoutput'.
- *
- * @param netif The netif which shall send a packet
- * @param p The packet to send (p->payload points to IP header)
- * @param ipaddr The IP address to which the packet shall be sent
- */
-typedef err_t (*netif_output_fn)(struct netif *netif, struct pbuf *p,
-       const ip4_addr_t *ipaddr);
-#endif /* LWIP_IPV4*/
-
-#if LWIP_IPV6
-/** Function prototype for netif->output_ip6 functions. Called by lwIP when a packet
- * shall be sent. For ethernet netif, set this to 'ethip6_output' and set
- * 'linkoutput'.
- *
- * @param netif The netif which shall send a packet
- * @param p The packet to send (p->payload points to IP header)
- * @param ipaddr The IPv6 address to which the packet shall be sent
- */
-typedef err_t (*netif_output_ip6_fn)(struct netif *netif, struct pbuf *p,
-       const ip6_addr_t *ipaddr);
-#endif /* LWIP_IPV6 */
-
-/** Function prototype for netif->linkoutput functions. Only used for ethernet
- * netifs. This function is called by ARP when a packet shall be sent.
- *
- * @param netif The netif which shall send a packet
- * @param p The packet to send (raw ethernet packet)
- */
-typedef err_t (*netif_linkoutput_fn)(struct netif *netif, struct pbuf *p);
-/** Function prototype for netif status- or link-callback functions. */
-typedef void (*netif_status_callback_fn)(struct netif *netif);
-#if LWIP_IPV4 && LWIP_IGMP
-/** Function prototype for netif igmp_mac_filter functions */
-typedef err_t (*netif_igmp_mac_filter_fn)(struct netif *netif,
-       const ip4_addr_t *group, u8_t action);
-#endif /* LWIP_IPV4 && LWIP_IGMP */
-#if LWIP_IPV6 && LWIP_IPV6_MLD
-/** Function prototype for netif mld_mac_filter functions */
-typedef err_t (*netif_mld_mac_filter_fn)(struct netif *netif,
-       const ip6_addr_t *group, u8_t action);
-#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */
-
-
-#if ESP_DHCP
-/*add DHCP event processing by LiuHan*/
-typedef void (*dhcp_event_fn)(void);
-#endif
-
-
-/** 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 {
-  /** pointer to next in linked list */
-  struct netif *next;
-
-#if LWIP_IPV4
-  /** IP address configuration in network byte order */
-  ip_addr_t ip_addr;
-  ip_addr_t netmask;
-  ip_addr_t gw;
-#endif /* LWIP_IPV4 */
-#if LWIP_IPV6
-  /** Array of IPv6 addresses for this netif. */
-  ip_addr_t ip6_addr[LWIP_IPV6_NUM_ADDRESSES];
-  /** The state of each IPv6 address (Tentative, Preferred, etc).
-   * @see ip6_addr.h */
-  u8_t ip6_addr_state[LWIP_IPV6_NUM_ADDRESSES];
-#if ESP_LWIP
-  void (*ipv6_addr_cb)(struct netif* netif, u8_t ip_idex); /* callback for ipv6 addr states changed */
-#endif
-
-#endif /* LWIP_IPV6 */
-  /** This function is called by the network device driver
-   *  to pass a packet up the TCP/IP stack. */
-  netif_input_fn input;
-#if LWIP_IPV4
-  /** 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. */
-  netif_output_fn output;
-#endif /* LWIP_IPV4 */
-  /** This function is called by the ARP module when it wants
-   *  to send a packet on the interface. This function outputs
-   *  the pbuf as-is on the link medium. */
-  netif_linkoutput_fn linkoutput;
-#if LWIP_IPV6
-  /** 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. */
-  netif_output_ip6_fn output_ip6;
-#endif /* LWIP_IPV6 */
-#if LWIP_NETIF_STATUS_CALLBACK
-  /** This function is called when the netif state is set to up or down
-   */
-  netif_status_callback_fn status_callback;
-#endif /* LWIP_NETIF_STATUS_CALLBACK */
-#if LWIP_NETIF_LINK_CALLBACK
-  /** This function is called when the netif link is set to up or down
-   */
-  netif_status_callback_fn link_callback;
-#endif /* LWIP_NETIF_LINK_CALLBACK */
-#if LWIP_NETIF_REMOVE_CALLBACK
-  /** This function is called when the netif has been removed */
-  netif_status_callback_fn remove_callback;
-#endif /* LWIP_NETIF_REMOVE_CALLBACK */
-  /** This field can be set by the device driver and could point
-   *  to state information for the device. */
-  void *state;
-#if LWIP_DHCP
-  /** the DHCP client state information for this netif */
-  struct dhcp *dhcp;
-
-#if ESP_LWIP
-  struct udp_pcb *dhcps_pcb;   
-  dhcp_event_fn dhcp_event;
-#endif  
-
-#endif /* LWIP_DHCP */
-
-#if LWIP_AUTOIP
-  /** the AutoIP client state information for this netif */
-  struct autoip *autoip;
-#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_IPV6_DHCP6
-  /** the DHCPv6 client state information for this netif */
-  struct dhcp6 *dhcp6;
-#endif /* LWIP_IPV6_DHCP6 */
-
-#if LWIP_NETIF_HOSTNAME
-  /* the hostname for this netif, NULL is a valid value */
-  const char*  hostname;
-#endif /* LWIP_NETIF_HOSTNAME */
-
-#if LWIP_CHECKSUM_CTRL_PER_NETIF
-  u16_t chksum_flags;
-#endif /* LWIP_CHECKSUM_CTRL_PER_NETIF*/
-
-  /** maximum transfer unit (in bytes) */
-  u16_t mtu;
-  /** number of bytes used in hwaddr */
-  u8_t hwaddr_len;
-  /** link level hardware address of this interface */
-  u8_t hwaddr[NETIF_MAX_HWADDR_LEN];
-  /** flags (see NETIF_FLAG_ above) */
-  u8_t flags;
-  /** descriptive abbreviation */
-  char name[2];
-  /** number of this interface */
-  u8_t num;
-  
-#if MIB2_STATS
-  /** link type (from "snmp_ifType" enum from snmp_mib2.h) */
-  u8_t link_type;
-  /** (estimate) link speed */
-  u32_t link_speed;
-  /** timestamp at last change made (up/down) */
-  u32_t ts;
-  /** counters */
-  struct stats_mib2_netif_ctrs mib2_counters;
-#endif /* MIB2_STATS */
-
-#if LWIP_IPV4 && LWIP_IGMP
-  /** This function could be called to add or delete an entry in the multicast
-      filter table of the ethernet MAC.*/
-  netif_igmp_mac_filter_fn igmp_mac_filter;
-#endif /* LWIP_IPV4 && LWIP_IGMP */
-
-#if LWIP_IPV6 && LWIP_IPV6_MLD
-  /** This function could be called to add or delete an entry in the IPv6 multicast
-      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 ENABLE_LOOPBACK
-  /* List of packets to be queued for ourselves. */
-  struct pbuf *loop_first;
-  struct pbuf *loop_last;
-#if LWIP_LOOPBACK_MAX_PBUFS
-  u16_t loop_cnt_current;
-#endif /* LWIP_LOOPBACK_MAX_PBUFS */
-#endif /* ENABLE_LOOPBACK */
-
-#if ESP_LWIP
-  void (*l2_buffer_free_notify)(void *user_buf); /* Allows LWIP to notify driver when a L2-supplied pbuf can be freed */
-  ip_addr_t last_ip_addr; /* Store last non-zero ip address */
-#endif
-};
-
-#if LWIP_CHECKSUM_CTRL_PER_NETIF
-#define NETIF_SET_CHECKSUM_CTRL(netif, chksumflags) do { \
-  (netif)->chksum_flags = chksumflags; } while(0)
-#define IF__NETIF_CHECKSUM_ENABLED(netif, chksumflag) if (((netif) == NULL) || (((netif)->chksum_flags & (chksumflag)) != 0))
-#else /* LWIP_CHECKSUM_CTRL_PER_NETIF */
-#define NETIF_SET_CHECKSUM_CTRL(netif, chksumflags)
-#define IF__NETIF_CHECKSUM_ENABLED(netif, chksumflag)
-#endif /* LWIP_CHECKSUM_CTRL_PER_NETIF */
-
-/** The list of network interfaces. */
-extern struct netif *netif_list;
-/** The default network interface. */
-extern struct netif *netif_default;
-
-void netif_init(void);
-
-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
-void netif_set_addr(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask,
-                    const ip4_addr_t *gw);
-#endif /* LWIP_IPV4 */
-void netif_remove(struct netif * netif);
-
-/* Returns a network interface given its name. The name is of the form
-   "et0", where the first two letters are the "name" field in the
-   netif structure, and the digit is in the num field in the same
-   structure. */
-struct netif *netif_find(const char *name);
-
-void netif_set_default(struct netif *netif);
-
-#if LWIP_IPV4
-void netif_set_ipaddr(struct netif *netif, const ip4_addr_t *ipaddr);
-void netif_set_netmask(struct netif *netif, const ip4_addr_t *netmask);
-void netif_set_gw(struct netif *netif, const ip4_addr_t *gw);
-#define netif_ip4_addr(netif)    ((const ip4_addr_t*)ip_2_ip4(&((netif)->ip_addr)))
-#define netif_ip4_netmask(netif) ((const ip4_addr_t*)ip_2_ip4(&((netif)->netmask)))
-#define netif_ip4_gw(netif)      ((const ip4_addr_t*)ip_2_ip4(&((netif)->gw)))
-#define netif_ip_addr4(netif)    ((const ip_addr_t*)&((netif)->ip_addr))
-#define netif_ip_gw4(netif)      ((const ip_addr_t*)&((netif)->gw))
-#endif /* LWIP_IPV4 */
-
-void netif_set_up(struct netif *netif);
-void netif_set_down(struct netif *netif);
-/** Ask if an interface is up */
-#define netif_is_up(netif) ( ((netif) && ((netif)->flags & NETIF_FLAG_UP)) ? (u8_t)1 : (u8_t)0)
-
-#if LWIP_NETIF_STATUS_CALLBACK
-void netif_set_status_callback(struct netif *netif, netif_status_callback_fn status_callback);
-#endif /* LWIP_NETIF_STATUS_CALLBACK */
-#if LWIP_NETIF_REMOVE_CALLBACK
-void netif_set_remove_callback(struct netif *netif, netif_status_callback_fn remove_callback);
-#endif /* LWIP_NETIF_REMOVE_CALLBACK */
-
-void netif_set_link_up(struct netif *netif);
-void netif_set_link_down(struct netif *netif);
-/** Ask if a link is up */
-#define netif_is_link_up(netif) (((netif)->flags & NETIF_FLAG_LINK_UP) ? (u8_t)1 : (u8_t)0)
-
-#if LWIP_NETIF_LINK_CALLBACK
-void netif_set_link_callback(struct netif *netif, netif_status_callback_fn link_callback);
-#endif /* LWIP_NETIF_LINK_CALLBACK */
-
-#if LWIP_NETIF_HOSTNAME
-#define netif_set_hostname(netif, name) do { if((netif) != NULL) { (netif)->hostname = name; }}while(0)
-#define netif_get_hostname(netif) (((netif) != NULL) ? ((netif)->hostname) : NULL)
-#endif /* LWIP_NETIF_HOSTNAME */
-
-#if LWIP_IGMP
-#define netif_set_igmp_mac_filter(netif, function) do { if((netif) != NULL) { (netif)->igmp_mac_filter = function; }}while(0)
-#define netif_get_igmp_mac_filter(netif) (((netif) != NULL) ? ((netif)->igmp_mac_filter) : NULL)
-#endif /* LWIP_IGMP */
-
-#if LWIP_IPV6 && LWIP_IPV6_MLD
-#define netif_set_mld_mac_filter(netif, function) do { if((netif) != NULL) { (netif)->mld_mac_filter = function; }}while(0)
-#define netif_get_mld_mac_filter(netif) (((netif) != NULL) ? ((netif)->mld_mac_filter) : NULL)
-#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */
-
-#if ENABLE_LOOPBACK
-err_t netif_loop_output(struct netif *netif, struct pbuf *p);
-void netif_poll(struct netif *netif);
-#if !LWIP_NETIF_LOOPBACK_MULTITHREADING
-void netif_poll_all(void);
-#endif /* !LWIP_NETIF_LOOPBACK_MULTITHREADING */
-#endif /* ENABLE_LOOPBACK */
-
-#if LWIP_IPV6
-#define netif_ip_addr6(netif, i)  ((const ip_addr_t*)(&((netif)->ip6_addr[i])))
-#define netif_ip6_addr(netif, i)  ((const ip6_addr_t*)ip_2_ip6(&((netif)->ip6_addr[i])))
-#define netif_ip6_addr_set(netif, i, addr6) do { ip6_addr_set(ip_2_ip6(&((netif)->ip6_addr[i])), addr6); IP_SET_TYPE_VAL((netif)->ip6_addr[i], IPADDR_TYPE_V6); } while(0)
-#define netif_ip6_addr_state(netif, i)  ((netif)->ip6_addr_state[i])
-#define netif_ip6_addr_set_state(netif, i, state)  ((netif)->ip6_addr_state[i] = (state))
-s8_t netif_get_ip6_addr_match(struct netif *netif, const ip6_addr_t *ip6addr);
-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);
-#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 */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_HDR_NETIF_H */
diff --git a/components/lwip/include/lwip/lwip/netifapi.h b/components/lwip/include/lwip/lwip/netifapi.h
deleted file mode 100644 (file)
index b09316b..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- */
-#ifndef LWIP_HDR_NETIFAPI_H
-#define LWIP_HDR_NETIFAPI_H
-
-#include "lwip/opt.h"
-
-#if LWIP_NETIF_API /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/sys.h"
-#include "lwip/netif.h"
-#include "lwip/dhcp.h"
-#include "lwip/autoip.h"
-#include "lwip/priv/tcpip_priv.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 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 */
-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,
-#endif /* LWIP_IPV4 */
-                         void *state, netif_init_fn init, netif_input_fn input);
-
-#if LWIP_IPV4
-err_t netifapi_netif_set_addr(struct netif *netif, const ip4_addr_t *ipaddr,
-                              const ip4_addr_t *netmask, const ip4_addr_t *gw);
-#endif /* LWIP_IPV4*/
-
-err_t netifapi_netif_common(struct netif *netif, netifapi_void_fn voidfunc,
-                            netifapi_errt_fn errtfunc);
-
-#define netifapi_netif_remove(n)      netifapi_netif_common(n, netif_remove, NULL)
-#define netifapi_netif_set_up(n)      netifapi_netif_common(n, netif_set_up, NULL)
-#define netifapi_netif_set_down(n)    netifapi_netif_common(n, netif_set_down, NULL)
-#define netifapi_netif_set_default(n) netifapi_netif_common(n, netif_set_default, NULL)
-#define netifapi_dhcp_start(n)        netifapi_netif_common(n, NULL, dhcp_start)
-#define netifapi_dhcp_stop(n)         netifapi_netif_common(n, dhcp_stop, NULL)
-#define netifapi_dhcp_inform(n)       netifapi_netif_common(n, dhcp_inform, NULL)
-#define netifapi_dhcp_renew(n)        netifapi_netif_common(n, NULL, dhcp_renew)
-#define netifapi_dhcp_release(n)      netifapi_netif_common(n, NULL, dhcp_release)
-#define netifapi_autoip_start(n)      netifapi_netif_common(n, NULL, autoip_start)
-#define netifapi_autoip_stop(n)       netifapi_netif_common(n, NULL, autoip_stop)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_NETIF_API */
-
-#endif /* LWIP_HDR_NETIFAPI_H */
diff --git a/components/lwip/include/lwip/lwip/opt.h b/components/lwip/include/lwip/lwip/opt.h
deleted file mode 100644 (file)
index 343eb0c..0000000
+++ /dev/null
@@ -1,3043 +0,0 @@
-/**
- * @file
- *
- * lwIP Options Configuration
- */
-
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam@sics.se>
- *
- */
-#ifndef LWIP_HDR_OPT_H
-#define LWIP_HDR_OPT_H
-
-/*
- * Include user defined options first. Anything not defined in these files
- * will be set to standard values. Override anything you don't like!
- */
-#include "lwipopts.h"
-#include "lwip/debug.h"
-
-/*
-   -----------------------------------------------
-   ---------- Platform specific locking ----------
-   -----------------------------------------------
-*/
-
-/**
- * SYS_LIGHTWEIGHT_PROT==1: if you want inter-task protection for certain
- * critical regions during buffer allocation, deallocation and memory
- * allocation and deallocation.
- */
-#ifndef SYS_LIGHTWEIGHT_PROT
-#define SYS_LIGHTWEIGHT_PROT            0
-#endif
-
-/**
- * NO_SYS==1: Provides VERY minimal functionality. Otherwise,
- * use lwIP facilities.
- */
-#ifndef NO_SYS
-#define NO_SYS                          0
-#endif
-
-/**
- * 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)
- */
-#if !defined LWIP_TIMERS || defined __DOXYGEN__
-#ifdef NO_SYS_NO_TIMERS
-#define LWIP_TIMERS                     (!NO_SYS || (NO_SYS && !NO_SYS_NO_TIMERS))
-#else
-#define LWIP_TIMERS                     1
-#endif
-#endif
-
-/**
- * MEMCPY: override this if you have a faster implementation at hand than the
- * one included in your C library
- */
-#ifndef MEMCPY
-#define MEMCPY(dst,src,len)             memcpy(dst,src,len)
-#endif
-
-/**
- * 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.
- */
-#ifndef SMEMCPY
-#define SMEMCPY(dst,src,len)            memcpy(dst,src,len)
-#endif
-
-/**
- * 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)
- */
-#ifndef LWIP_MPU_COMPATIBLE
-#define LWIP_MPU_COMPATIBLE             0
-#endif
-
-/*
-   ------------------------------------
-   ---------- Memory options ----------
-   ------------------------------------
-*/
-/**
- * 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.
- */
-#ifndef MEM_LIBC_MALLOC
-#define MEM_LIBC_MALLOC                 0
-#endif
-
-/**
-* 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 and usage from interrupts!
-*/
-#ifndef MEMP_MEM_MALLOC
-#define MEMP_MEM_MALLOC                 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
- */
-#ifndef MEM_ALIGNMENT
-#define MEM_ALIGNMENT                   1
-#endif
-
-/**
- * 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.
- */
-#ifndef MEM_SIZE
-#define MEM_SIZE                        1600
-#endif
-
-/**
- * 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 >= 2 checks each element in every pool every time
- *      memp_malloc() or memp_free() is called (useful but slow!)
- */
-#ifndef MEMP_OVERFLOW_CHECK
-#define MEMP_OVERFLOW_CHECK             0
-#endif
-
-/**
- * MEMP_SANITY_CHECK==1: run a sanity check after each memp_free() to make
- * sure that there are no cycles in the linked lists.
- */
-#ifndef MEMP_SANITY_CHECK
-#define MEMP_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.
- * To use this, MEMP_USE_CUSTOM_POOLS also has to be enabled.
- */
-#ifndef MEM_USE_POOLS
-#define MEM_USE_POOLS                   0
-#endif
-
-/**
- * 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. */
-#ifndef MEM_USE_POOLS_TRY_BIGGER_POOL
-#define MEM_USE_POOLS_TRY_BIGGER_POOL   0
-#endif
-
-/**
- * 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.
- */
-#ifndef MEMP_USE_CUSTOM_POOLS
-#define MEMP_USE_CUSTOM_POOLS           0
-#endif
-
-/**
- * Set this to 1 if you want to free PBUF_RAM pbufs (or call mem_free()) 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.
- *
- * 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.
- *
- * 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:
- * - pbuf_free_callback(p);
- * - mem_free_callback(m);
- */
-#ifndef LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT
-#define LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 0
-#endif
-
-/*
-   ------------------------------------------------
-   ---------- Internal Memory Pool Sizes ----------
-   ------------------------------------------------
-*/
-/**
- * MEMP_NUM_PBUF: the number of memp struct pbufs (used for PBUF_ROM and PBUF_REF).
- * If the application sends a lot of data out of ROM (or other static memory),
- * this should be set high.
- */
-#ifndef MEMP_NUM_PBUF
-#define MEMP_NUM_PBUF                   16
-#endif
-
-/**
- * MEMP_NUM_RAW_PCB: Number of raw connection PCBs
- * (requires the LWIP_RAW option)
- */
-#ifndef MEMP_NUM_RAW_PCB
-#define MEMP_NUM_RAW_PCB                4
-#endif
-
-/**
- * MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One
- * per active UDP "connection".
- * (requires the LWIP_UDP option)
- */
-#ifndef MEMP_NUM_UDP_PCB
-#define MEMP_NUM_UDP_PCB                4
-#endif
-
-/**
- * MEMP_NUM_TCP_PCB: the number of simultaneously active TCP connections.
- * (requires the LWIP_TCP option)
- */
-#ifndef MEMP_NUM_TCP_PCB
-#define MEMP_NUM_TCP_PCB                5
-#endif
-
-/**
- * MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP connections.
- * (requires the LWIP_TCP option)
- */
-#ifndef MEMP_NUM_TCP_PCB_LISTEN
-#define MEMP_NUM_TCP_PCB_LISTEN         8
-#endif
-
-/**
- * MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP segments.
- * (requires the LWIP_TCP option)
- */
-#ifndef MEMP_NUM_TCP_SEG
-#define MEMP_NUM_TCP_SEG                16
-#endif
-
-/**
- * MEMP_NUM_REASSDATA: the number of IP packets simultaneously queued for
- * reassembly (whole packets, not fragments!)
- */
-#ifndef MEMP_NUM_REASSDATA
-#define MEMP_NUM_REASSDATA              5
-#endif
-
-/**
- * MEMP_NUM_FRAG_PBUF: the number of IP fragments simultaneously sent
- * (fragments, not whole packets!).
- * This is only used with IP_FRAG_USES_STATIC_BUF==0 and
- * LWIP_NETIF_TX_SINGLE_PBUF==0 and only has to be > 1 with DMA-enabled MACs
- * where the packet is not yet sent when netif->output returns.
- */
-#ifndef MEMP_NUM_FRAG_PBUF
-#define MEMP_NUM_FRAG_PBUF              15
-#endif
-
-/**
- * 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)
- */
-#ifndef MEMP_NUM_ARP_QUEUE
-#define MEMP_NUM_ARP_QUEUE              30
-#endif
-
-/**
- * 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)
- */
-#ifndef MEMP_NUM_IGMP_GROUP
-#define MEMP_NUM_IGMP_GROUP             8
-#endif
-
-/**
- * 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'.
- */
-#ifndef MEMP_NUM_SYS_TIMEOUT
-#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))
-#endif
-
-/**
- * MEMP_NUM_NETBUF: the number of struct netbufs.
- * (only needed if you use the sequential API, like api_lib.c)
- */
-#ifndef MEMP_NUM_NETBUF
-#define MEMP_NUM_NETBUF                 2
-#endif
-
-/**
- * MEMP_NUM_NETCONN: the number of struct netconns.
- * (only needed if you use the sequential API, like api_lib.c)
- */
-#ifndef MEMP_NUM_NETCONN
-#define MEMP_NUM_NETCONN                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)
- */
-#ifndef MEMP_NUM_TCPIP_MSG_API
-#define MEMP_NUM_TCPIP_MSG_API          8
-#endif
-
-/**
- * MEMP_NUM_TCPIP_MSG_INPKT: the number of struct tcpip_msg, which are used
- * for incoming packets.
- * (only needed if you use tcpip.c)
- */
-#ifndef MEMP_NUM_TCPIP_MSG_INPKT
-#define MEMP_NUM_TCPIP_MSG_INPKT        8
-#endif
-
-/**
- * MEMP_NUM_NETDB: the number of concurrently running lwip_addrinfo() calls
- * (before freeing the corresponding memory using lwip_freeaddrinfo()).
- */
-#ifndef MEMP_NUM_NETDB
-#define MEMP_NUM_NETDB                  1
-#endif
-
-/**
- * MEMP_NUM_LOCALHOSTLIST: the number of host entries in the local host list
- * if DNS_LOCAL_HOSTLIST_IS_DYNAMIC==1.
- */
-#ifndef MEMP_NUM_LOCALHOSTLIST
-#define MEMP_NUM_LOCALHOSTLIST          1
-#endif
-
-/**
- * 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
-#endif
-
-/**
- * MEMP_NUM_PPPOS_INTERFACES: the number of concurrently active PPPoS
- * interfaces (only used with PPPOS_SUPPORT==1)
- */
-#ifndef MEMP_NUM_PPPOS_INTERFACES
-#define MEMP_NUM_PPPOS_INTERFACES       MEMP_NUM_PPP_PCB
-#endif
-
-/**
- * MEMP_NUM_PPPOE_INTERFACES: the number of concurrently active PPPoE
- * interfaces (only used with PPPOE_SUPPORT==1)
- */
-#ifndef MEMP_NUM_PPPOE_INTERFACES
-#define MEMP_NUM_PPPOE_INTERFACES       1
-#endif
-
-/**
- * MEMP_NUM_PPPOL2TP_INTERFACES: the number of concurrently active PPPoL2TP
- * interfaces (only used with PPPOL2TP_SUPPORT==1)
- */
-#ifndef MEMP_NUM_PPPOL2TP_INTERFACES
-#define MEMP_NUM_PPPOL2TP_INTERFACES       1
-#endif
-
-/**
- * PBUF_POOL_SIZE: the number of buffers in the pbuf pool.
- */
-#ifndef PBUF_POOL_SIZE
-#define PBUF_POOL_SIZE                  16
-#endif
-
-/** MEMP_NUM_API_MSG: the number of concurrently active calls to various
- * socket, netconn, and tcpip functions
- */
-#ifndef MEMP_NUM_API_MSG
-#define MEMP_NUM_API_MSG                MEMP_NUM_TCPIP_MSG_API
-#endif
-
-/** MEMP_NUM_DNS_API_MSG: the number of concurrently active calls to netconn_gethostbyname
- */
-#ifndef MEMP_NUM_DNS_API_MSG
-#define MEMP_NUM_DNS_API_MSG            MEMP_NUM_TCPIP_MSG_API
-#endif
-
-/** MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA: the number of concurrently active calls
- * to getsockopt/setsockopt
- */
-#ifndef MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA
-#define MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA MEMP_NUM_TCPIP_MSG_API
-#endif
-
-/** MEMP_NUM_NETIFAPI_MSG: the number of concurrently active calls to the
- * netifapi functions
- */
-#ifndef MEMP_NUM_NETIFAPI_MSG
-#define MEMP_NUM_NETIFAPI_MSG           MEMP_NUM_TCPIP_MSG_API
-#endif
-
-/*
-   ---------------------------------
-   ---------- ARP options ----------
-   ---------------------------------
-*/
-/**
- * LWIP_ARP==1: Enable ARP functionality.
- */
-#ifndef LWIP_ARP
-#define LWIP_ARP                        1
-#endif
-
-/**
- * ARP_TABLE_SIZE: Number of active MAC-IP address pairs cached.
- */
-#ifndef ARP_TABLE_SIZE
-#define ARP_TABLE_SIZE                  10
-#endif
-
-/** the time an ARP entry stays valid after its last update,
- *  for ARP_TMR_INTERVAL = 1000, this is
- *  (60 * 5) seconds = 5 minutes.
- */
-#ifndef ARP_MAXAGE
-#define ARP_MAXAGE                      300
-#endif
-
-/**
- * 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.
- */
-#ifndef ARP_QUEUEING
-#define ARP_QUEUEING                    0
-#endif
-
-/** 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.
- */
-#ifndef ARP_QUEUE_LEN
-#define ARP_QUEUE_LEN                   3
-#endif
-
-/**
- * ETHARP_TRUST_IP_MAC==1: Incoming IP packets cause the ARP table to be
- * updated with the source MAC and IP addresses supplied in the packet.
- * You may want to disable this if you do not trust LAN peers to have the
- * correct addresses, or as a limited approach to attempt to handle
- * spoofing. If disabled, lwIP will need to make a new ARP request if
- * the peer is not already in the ARP table, adding a little latency.
- * The peer *is* in the ARP table if it requested our address before.
- * Also notice that this slows down input processing of every IP packet!
- */
-#ifndef ETHARP_TRUST_IP_MAC
-#define ETHARP_TRUST_IP_MAC             0
-#endif
-
-/**
- * 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.
- */
-#ifndef ETHARP_SUPPORT_VLAN
-#define ETHARP_SUPPORT_VLAN             0
-#endif
-
-/** LWIP_ETHERNET==1: enable ethernet support for PPPoE even though ARP
- * might be disabled
- */
-#ifndef LWIP_ETHERNET
-#define LWIP_ETHERNET                   (LWIP_ARP || PPPOE_SUPPORT)
-#endif
-
-/** 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.
- */
-#ifndef ETH_PAD_SIZE
-#define ETH_PAD_SIZE                    0
-#endif
-
-/** ETHARP_SUPPORT_STATIC_ENTRIES==1: enable code to support static ARP table
- * entries (using etharp_add_static_entry/etharp_remove_static_entry).
- */
-#ifndef ETHARP_SUPPORT_STATIC_ENTRIES
-#define ETHARP_SUPPORT_STATIC_ENTRIES   0
-#endif
-
-/** 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).
- */
-#ifndef ETHARP_TABLE_MATCH_NETIF
-#define ETHARP_TABLE_MATCH_NETIF        0
-#endif
-
-/*
-   --------------------------------
-   ---------- IP options ----------
-   --------------------------------
-*/
-/**
- * LWIP_IPV4==1: Enable IPv4
- */
-#ifndef LWIP_IPV4
-#define LWIP_IPV4                       1
-#endif
-
-/**
- * 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.
- */
-#ifndef IP_FORWARD
-#define IP_FORWARD                      0
-#endif
-
-/**
- * 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.
- */
-#ifndef IP_REASSEMBLY
-#define IP_REASSEMBLY                   1
-#endif
-
-/**
- * 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.
- */
-#ifndef IP_FRAG
-#define IP_FRAG                         1
-#endif
-
-#if !LWIP_IPV4
-/* disable IPv4 extensions when IPv4 is disabled */
-#undef IP_FORWARD
-#define IP_FORWARD                      0
-#undef IP_REASSEMBLY
-#define IP_REASSEMBLY                   0
-#undef IP_FRAG
-#define IP_FRAG                         0
-#endif /* !LWIP_IPV4 */
-
-/**
- * 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).
- */
-#ifndef IP_OPTIONS_ALLOWED
-#define IP_OPTIONS_ALLOWED              1
-#endif
-
-/**
- * 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.
- */
-#ifndef IP_REASS_MAXAGE
-#define IP_REASS_MAXAGE                 3
-#endif
-
-/**
- * IP_REASS_MAX_PBUFS: Total maximum amount of pbufs waiting to be reassembled.
- * Since the received pbufs are enqueued, be sure to configure
- * PBUF_POOL_SIZE > IP_REASS_MAX_PBUFS so that the stack is still able to receive
- * packets even if the maximum amount of fragments is enqueued for reassembly!
- */
-#ifndef IP_REASS_MAX_PBUFS
-#define IP_REASS_MAX_PBUFS              10
-#endif
-
-/**
- * IP_FRAG_USES_STATIC_BUF==1: Use a static MTU-sized buffer for IP
- * fragmentation. Otherwise pbufs are allocated and reference the original
- * packet data to be fragmented (or with LWIP_NETIF_TX_SINGLE_PBUF==1,
- * new PBUF_RAM pbufs are used for fragments).
- * ATTENTION: IP_FRAG_USES_STATIC_BUF==1 may not be used for DMA-enabled MACs!
- */
-#ifndef IP_FRAG_USES_STATIC_BUF
-#define IP_FRAG_USES_STATIC_BUF         0
-#endif
-
-/**
- * IP_FRAG_MAX_MTU: Assumed max MTU on any interface for IP frag buffer
- * (requires IP_FRAG_USES_STATIC_BUF==1)
- */
-#if IP_FRAG_USES_STATIC_BUF && !defined(IP_FRAG_MAX_MTU)
-#define IP_FRAG_MAX_MTU                 1500
-#endif
-
-/**
- * IP_DEFAULT_TTL: Default value for Time-To-Live used by transport layers.
- */
-#ifndef IP_DEFAULT_TTL
-#define IP_DEFAULT_TTL                  255
-#endif
-
-/**
- * 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.
- */
-#ifndef IP_SOF_BROADCAST
-#define IP_SOF_BROADCAST                0
-#endif
-
-/**
- * IP_SOF_BROADCAST_RECV (requires IP_SOF_BROADCAST=1) enable the broadcast
- * filter on recv operations.
- */
-#ifndef IP_SOF_BROADCAST_RECV
-#define IP_SOF_BROADCAST_RECV           0
-#endif
-
-/**
- * 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!
- */
-#ifndef IP_FORWARD_ALLOW_TX_ON_RX_NETIF
-#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.
- */
-#ifndef LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS
-#define LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS 0
-#endif
-
-/*
-   ----------------------------------
-   ---------- ICMP options ----------
-   ----------------------------------
-*/
-/**
- * LWIP_ICMP==1: Enable ICMP module inside the IP stack.
- * Be careful, disable that make your product non-compliant to RFC1122
- */
-#ifndef LWIP_ICMP
-#define LWIP_ICMP                       1
-#endif
-
-/**
- * ICMP_TTL: Default value for Time-To-Live used by ICMP packets.
- */
-#ifndef ICMP_TTL
-#define ICMP_TTL                       (IP_DEFAULT_TTL)
-#endif
-
-/**
- * LWIP_BROADCAST_PING==1: respond to broadcast pings (default is unicast only)
- */
-#ifndef LWIP_BROADCAST_PING
-#define LWIP_BROADCAST_PING             0
-#endif
-
-/**
- * LWIP_MULTICAST_PING==1: respond to multicast pings (default is unicast only)
- */
-#ifndef LWIP_MULTICAST_PING
-#define LWIP_MULTICAST_PING             0
-#endif
-
-/*
-   ---------------------------------
-   ---------- RAW options ----------
-   ---------------------------------
-*/
-/**
- * LWIP_RAW==1: Enable application layer to hook into the IP layer itself.
- */
-#ifndef LWIP_RAW
-#define LWIP_RAW                        0
-#endif
-
-/**
- * LWIP_RAW==1: Enable application layer to hook into the IP layer itself.
- */
-#ifndef RAW_TTL
-#define RAW_TTL                        (IP_DEFAULT_TTL)
-#endif
-
-/*
-   ----------------------------------
-   ---------- DHCP options ----------
-   ----------------------------------
-*/
-/**
- * LWIP_DHCP==1: Enable DHCP module.
- */
-#ifndef LWIP_DHCP
-#define LWIP_DHCP                       0
-#endif
-#if !LWIP_IPV4
-/* disable DHCP when IPv4 is disabled */
-#undef LWIP_DHCP
-#define LWIP_DHCP                       0
-#endif /* !LWIP_IPV4 */
-
-/**
- * DHCP_DOES_ARP_CHECK==1: Do an ARP check on the offered address.
- */
-#ifndef DHCP_DOES_ARP_CHECK
-#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.
- */
-#ifndef LWIP_DHCP_CHECK_LINK_UP
-#define LWIP_DHCP_CHECK_LINK_UP         0
-#endif
-
-/**
- * LWIP_DHCP_BOOTP_FILE==1: Store offered_si_addr and boot_file_name.
- */
-#ifndef LWIP_DHCP_BOOTP_FILE
-#define LWIP_DHCP_BOOTP_FILE            0
-#endif
-
-/**
- * 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);
-*/
-#ifndef LWIP_DHCP_GET_NTP_SRV
-#define LWIP_DHCP_GET_NTP_SRV           0
-#endif
-
-/**
- * The maximum of NTP servers requested
- */
-#ifndef LWIP_DHCP_MAX_NTP_SERVERS
-#define LWIP_DHCP_MAX_NTP_SERVERS       1
-#endif
-
-/*
-   ------------------------------------
-   ---------- AUTOIP options ----------
-   ------------------------------------
-*/
-/**
- * LWIP_AUTOIP==1: Enable AUTOIP module.
- */
-#ifndef LWIP_AUTOIP
-#define LWIP_AUTOIP                     0
-#endif
-#if !LWIP_IPV4
-/* disable AUTOIP when IPv4 is disabled */
-#undef LWIP_AUTOIP
-#define LWIP_AUTOIP                     0
-#endif /* !LWIP_IPV4 */
-
-/**
- * LWIP_DHCP_AUTOIP_COOP==1: Allow DHCP and AUTOIP to be both enabled on
- * the same interface at the same time.
- */
-#ifndef LWIP_DHCP_AUTOIP_COOP
-#define LWIP_DHCP_AUTOIP_COOP           0
-#endif
-
-/**
- * LWIP_DHCP_AUTOIP_COOP_TRIES: Set to the number of DHCP DISCOVER probes
- * that should be sent before falling back on AUTOIP. 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.
- */
-#ifndef LWIP_DHCP_AUTOIP_COOP_TRIES
-#define LWIP_DHCP_AUTOIP_COOP_TRIES     9
-#endif
-
-/**
- * LWIP_AUTOIP_MAX_CONFLICTS:
- * Maximum number of AutoIP IP conflicts before rate limiting is enabled.
- */
-#ifndef LWIP_AUTOIP_MAX_CONFLICTS
-#define LWIP_AUTOIP_MAX_CONFLICTS            10
-#endif
-
-/**
- * LWIP_AUTOIP_RATE_LIMIT_INTERVAL:
- * Rate limited request interval, in seconds.
- */
-#ifndef LWIP_AUTOIP_RATE_LIMIT_INTERVAL
-#define LWIP_AUTOIP_RATE_LIMIT_INTERVAL      60
-#endif
-
-/*
-   ----------------------------------
-   ----- SNMP MIB2 support      -----
-   ----------------------------------
-*/
-/**
- * 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.
- */
-#ifndef LWIP_MIB2_CALLBACKS
-#define LWIP_MIB2_CALLBACKS             0
-#endif
-
-/*
-   ----------------------------------
-   ----- Multicast/IGMP options -----
-   ----------------------------------
-*/
-/**
- * LWIP_IGMP==1: Turn on IGMP module.
- */
-#ifndef LWIP_IGMP
-#define LWIP_IGMP                       1
-#endif
-#if !LWIP_IPV4
-#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
- */
-#ifndef LWIP_MULTICAST_TX_OPTIONS
-#define LWIP_MULTICAST_TX_OPTIONS       LWIP_IGMP
-#endif
-
-/*
-   ----------------------------------
-   ---------- DNS options -----------
-   ----------------------------------
-*/
-/**
- * LWIP_DNS==1: Turn on DNS module. UDP must be available for DNS
- * transport.
- */
-#ifndef LWIP_DNS
-#define LWIP_DNS                        0
-#endif
-
-/** DNS maximum number of entries to maintain locally. */
-#ifndef DNS_TABLE_SIZE
-#define DNS_TABLE_SIZE                  4
-#endif
-
-/** DNS maximum host name length supported in the name table. */
-#ifndef DNS_MAX_NAME_LENGTH
-#define DNS_MAX_NAME_LENGTH             256
-#endif
-
-/** 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*'
- */
-#ifndef DNS_MAX_SERVERS
-#define DNS_MAX_SERVERS                 2
-#endif
-
-/** DNS do a name checking between the query and the response. */
-#ifndef DNS_DOES_NAME_CHECK
-#define DNS_DOES_NAME_CHECK             1
-#endif
-
-/** 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. */
-#ifndef LWIP_DNS_SECURE
-#define LWIP_DNS_SECURE (LWIP_DNS_SECURE_RAND_XID | LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING | LWIP_DNS_SECURE_RAND_SRC_PORT)
-#endif
-/* A list of DNS security features follows */
-#define LWIP_DNS_SECURE_RAND_XID                1
-#define LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING 2
-#define LWIP_DNS_SECURE_RAND_SRC_PORT           4
-
-/** DNS_LOCAL_HOSTLIST: Implements a local host-to-address list. If enabled,
- *  you have to define
- *    #define DNS_LOCAL_HOSTLIST_INIT {{"host1", 0x123}, {"host2", 0x234}}
- *  (an array of structs name/address, where address is an u32_t in network
- *  byte order).
- *
- *  Instead, you can also use an external function:
- *  #define DNS_LOOKUP_LOCAL_EXTERN(x) extern u32_t my_lookup_function(const char *name)
- *  that returns the IP address or INADDR_NONE if not found.
- */
-#ifndef DNS_LOCAL_HOSTLIST
-#define DNS_LOCAL_HOSTLIST              0
-#endif /* DNS_LOCAL_HOSTLIST */
-
-/** If this is turned on, the local host-list can be dynamically changed
- *  at runtime. */
-#ifndef DNS_LOCAL_HOSTLIST_IS_DYNAMIC
-#define DNS_LOCAL_HOSTLIST_IS_DYNAMIC   0
-#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */
-
-/*
-   ---------------------------------
-   ---------- UDP options ----------
-   ---------------------------------
-*/
-/**
- * LWIP_UDP==1: Turn on UDP.
- */
-#ifndef LWIP_UDP
-#define LWIP_UDP                        1
-#endif
-
-/**
- * LWIP_UDPLITE==1: Turn on UDP-Lite. (Requires LWIP_UDP)
- */
-#ifndef LWIP_UDPLITE
-#define LWIP_UDPLITE                    0
-#endif
-
-/**
- * UDP_TTL: Default Time-To-Live value.
- */
-#ifndef UDP_TTL
-#define UDP_TTL                         (IP_DEFAULT_TTL)
-#endif
-
-/**
- * LWIP_NETBUF_RECVINFO==1: append destination addr and port to every netbuf.
- */
-#ifndef LWIP_NETBUF_RECVINFO
-#define LWIP_NETBUF_RECVINFO            0
-#endif
-
-/*
-   ---------------------------------
-   ---------- TCP options ----------
-   ---------------------------------
-*/
-/**
- * LWIP_TCP==1: Turn on TCP.
- */
-#ifndef LWIP_TCP
-#define LWIP_TCP                        1
-#endif
-
-/**
- * TCP_TTL: Default Time-To-Live value.
- */
-#ifndef TCP_TTL
-#define TCP_TTL                         (IP_DEFAULT_TTL)
-#endif
-
-/**
- * TCP_WND: The size of a TCP window.  This must be at least
- * (2 * TCP_MSS) for things to work well
- */
-#ifndef TCP_WND
-#define TCP_WND(pcb)                         (4 * TCP_MSS)
-#endif
-
-/**
- * TCP_MAXRTX: Maximum number of retransmissions of data segments.
- */
-#ifndef TCP_MAXRTX
-#define TCP_MAXRTX                      12
-#endif
-
-/**
- * TCP_SYNMAXRTX: Maximum number of retransmissions of SYN segments.
- */
-#ifndef TCP_SYNMAXRTX
-#define TCP_SYNMAXRTX                   6
-#endif
-
-/**
- * TCP_QUEUE_OOSEQ==1: TCP will queue segments that arrive out of order.
- * Define to 0 if your device is low on memory.
- */
-#ifndef TCP_QUEUE_OOSEQ
-#define TCP_QUEUE_OOSEQ                 (LWIP_TCP)
-#endif
-
-/**
- * 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.
- */
-#ifndef TCP_MSS
-#define TCP_MSS                         536
-#endif
-
-/**
- * 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.
- */
-#ifndef TCP_CALCULATE_EFF_SEND_MSS
-#define TCP_CALCULATE_EFF_SEND_MSS      1
-#endif
-
-
-/**
- * TCP_SND_BUF: TCP sender buffer space (bytes).
- * To achieve good performance, this should be at least 2 * TCP_MSS.
- */
-#ifndef TCP_SND_BUF
-#define TCP_SND_BUF(pcb)                     (2 * TCP_MSS)
-#endif
-
-/**
- * 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.
- */
-#ifndef TCP_SND_QUEUELEN
-#define TCP_SND_QUEUELEN(pcb)                ((4 * (TCP_SND_BUF((pcb))) + (TCP_MSS - 1))/(TCP_MSS))
-#endif
-
-/**
- * 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).
- */
-#ifndef TCP_SNDLOWAT
-#define TCP_SNDLOWAT(pcb)                    LWIP_MIN(LWIP_MAX(((TCP_SND_BUF((pcb)))/2), (2 * TCP_MSS) + 1), (TCP_SND_BUF((pcb))) - 1)
-#endif
-
-/**
- * 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).
- */
-#ifndef TCP_SNDQUEUELOWAT
-#define TCP_SNDQUEUELOWAT(pcb)               LWIP_MAX(((TCP_SND_QUEUELEN((pcb)))/2), 5)
-#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==0.
- */
-#ifndef TCP_OOSEQ_MAX_BYTES
-#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==0.
- */
-#ifndef TCP_OOSEQ_MAX_PBUFS
-#define TCP_OOSEQ_MAX_PBUFS             0
-#endif
-
-/**
- * TCP_LISTEN_BACKLOG: Enable the backlog option for tcp listen pcb.
- */
-#ifndef TCP_LISTEN_BACKLOG
-#define TCP_LISTEN_BACKLOG              0
-#endif
-
-/**
- * The maximum allowed backlog for TCP listen netconns.
- * This backlog is used unless another is explicitly specified.
- * 0xff is the maximum (u8_t).
- */
-#ifndef TCP_DEFAULT_LISTEN_BACKLOG
-#define TCP_DEFAULT_LISTEN_BACKLOG      0xff
-#endif
-
-/**
- * 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:
- *
- * 0:         Disable oversized allocation. Each tcp_write() 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.
- */
-#ifndef TCP_OVERSIZE
-#define TCP_OVERSIZE                    TCP_MSS
-#endif
-
-/**
- * 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.
- */
-#ifndef LWIP_TCP_TIMESTAMPS
-#define LWIP_TCP_TIMESTAMPS             0
-#endif
-
-/**
- * TCP_WND_UPDATE_THRESHOLD: difference in window to trigger an
- * explicit window update
- */
-#ifndef TCP_WND_UPDATE_THRESHOLD
-#define TCP_WND_UPDATE_THRESHOLD(pcb)   LWIP_MIN((TCP_WND((pcb)) / 4), (TCP_MSS * 4))
-#endif
-
-/**
- * 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.
- */
-#if !defined(LWIP_EVENT_API) && !defined(LWIP_CALLBACK_API)
-#define LWIP_EVENT_API                  0
-#define LWIP_CALLBACK_API               1
-#endif
-
-/**
- * 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.
- */
-#ifndef LWIP_WND_SCALE
-#define LWIP_WND_SCALE                  0
-#define TCP_RCV_SCALE                   0
-#endif
-
-
-/*
-   ----------------------------------
-   ---------- Pbuf options ----------
-   ----------------------------------
-*/
-/**
- * PBUF_LINK_HLEN: the number of bytes that should be allocated for a
- * link level header. The default is 14, the standard value for
- * Ethernet.
- */
-#ifndef PBUF_LINK_HLEN
-#ifdef LWIP_HOOK_VLAN_SET
-#define PBUF_LINK_HLEN                  (18 + ETH_PAD_SIZE)
-#else /* LWIP_HOOK_VLAN_SET */
-#define PBUF_LINK_HLEN                  (14 + ETH_PAD_SIZE)
-#endif /* LWIP_HOOK_VLAN_SET */
-#endif
-
-/**
- * PBUF_LINK_ENCAPSULATION_HLEN: the number of bytes that should be allocated
- * for an additional encapsulation header before ethernet headers (e.g. 802.11)
- */
-#ifndef PBUF_LINK_ENCAPSULATION_HLEN
-#define PBUF_LINK_ENCAPSULATION_HLEN    0
-#endif
-
-/**
- * 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.
- */
-#ifndef PBUF_POOL_BUFSIZE
-#define PBUF_POOL_BUFSIZE               LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_ENCAPSULATION_HLEN+PBUF_LINK_HLEN)
-#endif
-
-/*
-   ------------------------------------------------
-   ---------- Network Interfaces options ----------
-   ------------------------------------------------
-*/
-/**
- * LWIP_NETIF_HOSTNAME==1: use DHCP_OPTION_HOSTNAME with netif's hostname
- * field.
- */
-#ifndef LWIP_NETIF_HOSTNAME
-#define LWIP_NETIF_HOSTNAME             0
-#endif
-
-/**
- * LWIP_NETIF_API==1: Support netif api (in netifapi.c)
- */
-#ifndef LWIP_NETIF_API
-#define LWIP_NETIF_API                  0
-#endif
-
-/**
- * LWIP_NETIF_STATUS_CALLBACK==1: Support a callback function whenever an interface
- * changes its up/down status (i.e., due to DHCP IP acquisition)
- */
-#ifndef LWIP_NETIF_STATUS_CALLBACK
-#define LWIP_NETIF_STATUS_CALLBACK      0
-#endif
-
-/**
- * LWIP_NETIF_LINK_CALLBACK==1: Support a callback function from an interface
- * whenever the link changes (i.e., link down)
- */
-#ifndef LWIP_NETIF_LINK_CALLBACK
-#define LWIP_NETIF_LINK_CALLBACK        0
-#endif
-
-/**
- * LWIP_NETIF_REMOVE_CALLBACK==1: Support a callback function that is called
- * when a netif has been removed
- */
-#ifndef LWIP_NETIF_REMOVE_CALLBACK
-#define LWIP_NETIF_REMOVE_CALLBACK      0
-#endif
-
-/**
- * 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.
- */
-#ifndef LWIP_NETIF_HWADDRHINT
-#define LWIP_NETIF_HWADDRHINT           0
-#endif
-
-/**
- * LWIP_NETIF_LOOPBACK==1: Support sending packets with a destination IP
- * address equal to the netif IP address, looping them back up the stack.
- */
-#ifndef LWIP_NETIF_LOOPBACK
-#define LWIP_NETIF_LOOPBACK             0
-#endif
-
-/**
- * LWIP_LOOPBACK_MAX_PBUFS: Maximum number of pbufs on queue for loopback
- * sending for each netif (0 = disabled)
- */
-#ifndef LWIP_LOOPBACK_MAX_PBUFS
-#define LWIP_LOOPBACK_MAX_PBUFS         0
-#endif
-
-/**
- * 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
- * tcp_input().
- *    LWIP_NETIF_LOOPBACK_MULTITHREADING==1: Indicates that the user is using a
- *       multithreaded environment like tcpip.c. In this case, netif->input()
- *       is called directly.
- *    LWIP_NETIF_LOOPBACK_MULTITHREADING==0: Indicates a polling (or NO_SYS) setup.
- *       The packets are put on a list and netif_poll() must be called in
- *       the main application loop.
- */
-#ifndef LWIP_NETIF_LOOPBACK_MULTITHREADING
-#define LWIP_NETIF_LOOPBACK_MULTITHREADING    (!NO_SYS)
-#endif
-
-/**
- * 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:
- */
-#ifndef LWIP_NETIF_TX_SINGLE_PBUF
-#define LWIP_NETIF_TX_SINGLE_PBUF             0
-#endif /* LWIP_NETIF_TX_SINGLE_PBUF */
-
-/*
-   ------------------------------------
-   ---------- LOOPIF options ----------
-   ------------------------------------
-*/
-/**
- * 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.
- */
-#ifndef LWIP_HAVE_LOOPIF
-#define LWIP_HAVE_LOOPIF                LWIP_NETIF_LOOPBACK
-#endif
-
-/**
- * LWIP_LOOPIF_MULTICAST==1: Support multicast/IGMP on loop interface (127.0.0.1).
- */
-#ifndef LWIP_LOOPIF_MULTICAST
-#define LWIP_LOOPIF_MULTICAST               0
-#endif
-
-/*
-   ------------------------------------
-   ---------- SLIPIF options ----------
-   ------------------------------------
-*/
-/**
- * LWIP_HAVE_SLIPIF==1: Support slip interface and slipif.c
- */
-#ifndef LWIP_HAVE_SLIPIF
-#define LWIP_HAVE_SLIPIF                0
-#endif
-
-/*
-   ------------------------------------
-   ---------- Thread options ----------
-   ------------------------------------
-*/
-/**
- * TCPIP_THREAD_NAME: The name assigned to the main tcpip thread.
- */
-#ifndef TCPIP_THREAD_NAME
-#define TCPIP_THREAD_NAME              "tcpip_thread"
-#endif
-
-/**
- * TCPIP_THREAD_STACKSIZE: The stack size used by the main tcpip thread.
- * The stack size value itself is platform-dependent, but is passed to
- * sys_thread_new() when the thread is created.
- */
-#ifndef TCPIP_THREAD_STACKSIZE
-#define TCPIP_THREAD_STACKSIZE          0
-#endif
-
-/**
- * TCPIP_THREAD_PRIO: The priority assigned to the main tcpip thread.
- * The priority value itself is platform-dependent, but is passed to
- * sys_thread_new() when the thread is created.
- */
-#ifndef TCPIP_THREAD_PRIO
-#define TCPIP_THREAD_PRIO               1
-#endif
-
-/**
- * TCPIP_MBOX_SIZE: The mailbox size for the tcpip thread messages
- * The queue size value itself is platform-dependent, but is passed to
- * sys_mbox_new() when tcpip_init is called.
- */
-#ifndef TCPIP_MBOX_SIZE
-#define TCPIP_MBOX_SIZE                 0
-#endif
-
-/**
- * SLIPIF_THREAD_NAME: The name assigned to the slipif_loop thread.
- */
-#ifndef SLIPIF_THREAD_NAME
-#define SLIPIF_THREAD_NAME             "slipif_loop"
-#endif
-
-/**
- * SLIP_THREAD_STACKSIZE: The stack size used by the slipif_loop thread.
- * The stack size value itself is platform-dependent, but is passed to
- * sys_thread_new() when the thread is created.
- */
-#ifndef SLIPIF_THREAD_STACKSIZE
-#define SLIPIF_THREAD_STACKSIZE         0
-#endif
-
-/**
- * SLIPIF_THREAD_PRIO: The priority assigned to the slipif_loop thread.
- * The priority value itself is platform-dependent, but is passed to
- * sys_thread_new() when the thread is created.
- */
-#ifndef SLIPIF_THREAD_PRIO
-#define SLIPIF_THREAD_PRIO              1
-#endif
-
-/**
- * DEFAULT_THREAD_NAME: The name assigned to any other lwIP thread.
- */
-#ifndef DEFAULT_THREAD_NAME
-#define DEFAULT_THREAD_NAME            "lwIP"
-#endif
-
-/**
- * DEFAULT_THREAD_STACKSIZE: The stack size used by any other lwIP thread.
- * The stack size value itself is platform-dependent, but is passed to
- * sys_thread_new() when the thread is created.
- */
-#ifndef DEFAULT_THREAD_STACKSIZE
-#define DEFAULT_THREAD_STACKSIZE        0
-#endif
-
-/**
- * DEFAULT_THREAD_PRIO: The priority assigned to any other lwIP thread.
- * The priority value itself is platform-dependent, but is passed to
- * sys_thread_new() when the thread is created.
- */
-#ifndef DEFAULT_THREAD_PRIO
-#define DEFAULT_THREAD_PRIO             1
-#endif
-
-/**
- * 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 sys_mbox_new() when the recvmbox is created.
- */
-#ifndef DEFAULT_RAW_RECVMBOX_SIZE
-#define DEFAULT_RAW_RECVMBOX_SIZE       0
-#endif
-
-/**
- * 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 sys_mbox_new() when the recvmbox is created.
- */
-#ifndef DEFAULT_UDP_RECVMBOX_SIZE
-#define DEFAULT_UDP_RECVMBOX_SIZE       0
-#endif
-
-/**
- * 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 sys_mbox_new() when the recvmbox is created.
- */
-#ifndef DEFAULT_TCP_RECVMBOX_SIZE
-#define DEFAULT_TCP_RECVMBOX_SIZE       0
-#endif
-
-/**
- * DEFAULT_ACCEPTMBOX_SIZE: The mailbox size for the incoming connections.
- * The queue size value itself is platform-dependent, but is passed to
- * sys_mbox_new() when the acceptmbox is created.
- */
-#ifndef DEFAULT_ACCEPTMBOX_SIZE
-#define DEFAULT_ACCEPTMBOX_SIZE         0
-#endif
-
-/*
-   ----------------------------------------------
-   ---------- Sequential layer options ----------
-   ----------------------------------------------
-*/
-/**
- * LWIP_TCPIP_CORE_LOCKING: (EXPERIMENTAL!)
- * Don't use it if you're not an active lwIP project member
- */
-#ifndef LWIP_TCPIP_CORE_LOCKING
-#define LWIP_TCPIP_CORE_LOCKING         0
-#endif
-
-/**
- * LWIP_TCPIP_CORE_LOCKING_INPUT: (EXPERIMENTAL!)
- * Don't use it if you're not an active lwIP project member
- */
-#ifndef LWIP_TCPIP_CORE_LOCKING_INPUT
-#define LWIP_TCPIP_CORE_LOCKING_INPUT   0
-#endif
-
-/**
- * LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c)
- */
-#ifndef LWIP_NETCONN
-#define LWIP_NETCONN                    1
-#endif
-
-/** LWIP_TCPIP_TIMEOUT==1: Enable tcpip_timeout/tcpip_untimeout to create
- * timers running in tcpip_thread from another thread.
- */
-#ifndef LWIP_TCPIP_TIMEOUT
-#define LWIP_TCPIP_TIMEOUT              0
-#endif
-
-/** 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:
- * - LWIP_NETCONN_THREAD_SEM_GET() returning a sys_sem_t*
- * - LWIP_NETCONN_THREAD_SEM_ALLOC() creating the semaphore
- * - 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 sys_thread_new().
- */
-#ifndef LWIP_NETCONN_SEM_PER_THREAD
-#define LWIP_NETCONN_SEM_PER_THREAD     0
-#endif
-
-/** 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:
- * - LWIP_NETCONN_SEM_PER_THREAD==1 is required to use one socket/netconn from
- *   multiple threads at once
- * - sys_mbox_free() has to unblock receive tasks waiting on recvmbox/acceptmbox
- *   and prevent a task pending on this during/after deletion
- */
-#ifndef LWIP_NETCONN_FULLDUPLEX
-#define LWIP_NETCONN_FULLDUPLEX         0
-#endif
-
-/*
-   ------------------------------------
-   ---------- Socket options ----------
-   ------------------------------------
-*/
-/**
- * LWIP_SOCKET==1: Enable Socket API (require to use sockets.c)
- */
-#ifndef LWIP_SOCKET
-#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.
- */
-#ifndef LWIP_SOCKET_SET_ERRNO
-#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.
- * While this helps code completion, it might conflict with existing libraries.
- * (only used if you use sockets.c)
- */
-#ifndef LWIP_COMPAT_SOCKETS
-#define LWIP_COMPAT_SOCKETS             1
-#endif
-
-/**
- * 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 & close). (only used if you use sockets.c)
- */
-#ifndef LWIP_POSIX_SOCKETS_IO_NAMES
-#define LWIP_POSIX_SOCKETS_IO_NAMES     1
-#endif
-
-/**
- * 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).
- */
-#ifndef LWIP_SOCKET_OFFSET
-#define LWIP_SOCKET_OFFSET              0
-#endif
-
-/**
- * LWIP_TCP_KEEPALIVE==1: Enable TCP_KEEPIDLE, TCP_KEEPINTVL and TCP_KEEPCNT
- * options processing. Note that TCP_KEEPIDLE and TCP_KEEPINTVL have to be set
- * in seconds. (does not require sockets.c, and will affect tcp.c)
- */
-#ifndef LWIP_TCP_KEEPALIVE
-#define LWIP_TCP_KEEPALIVE              0
-#endif
-
-/**
- * LWIP_SO_SNDTIMEO==1: Enable send timeout for sockets/netconns and
- * SO_SNDTIMEO processing.
- */
-#ifndef LWIP_SO_SNDTIMEO
-#define LWIP_SO_SNDTIMEO                0
-#endif
-
-/**
- * LWIP_SO_RCVTIMEO==1: Enable receive timeout for sockets/netconns and
- * SO_RCVTIMEO processing.
- */
-#ifndef LWIP_SO_RCVTIMEO
-#define LWIP_SO_RCVTIMEO                0
-#endif
-
-/**
- * LWIP_SO_SNDRCVTIMEO_NONSTANDARD==1: SO_RCVTIMEO/SO_SNDTIMEO take an int
- * (milliseconds, much like winsock does) instead of a struct timeval (default).
- */
-#ifndef LWIP_SO_SNDRCVTIMEO_NONSTANDARD
-#define LWIP_SO_SNDRCVTIMEO_NONSTANDARD 0
-#endif
-
-/**
- * LWIP_SO_RCVBUF==1: Enable SO_RCVBUF processing.
- */
-#ifndef LWIP_SO_RCVBUF
-#define LWIP_SO_RCVBUF                  0
-#endif
-
-/**
- * LWIP_SO_LINGER==1: Enable SO_LINGER processing.
- */
-#ifndef LWIP_SO_LINGER
-#define LWIP_SO_LINGER                  0
-#endif
-
-/**
- * If LWIP_SO_RCVBUF is used, this is the default value for recv_bufsize.
- */
-#ifndef RECV_BUFSIZE_DEFAULT
-#define RECV_BUFSIZE_DEFAULT            INT_MAX
-#endif
-
-/**
- * By default, TCP socket/netconn close waits 20 seconds max to send the FIN
- */
-#ifndef LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT
-#define LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT 20000
-#endif
-
-/**
- * SO_REUSE==1: Enable SO_REUSEADDR option.
- */
-#ifndef SO_REUSE
-#define SO_REUSE                        0
-#endif
-
-/**
- * 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!
- */
-#ifndef SO_REUSE_RXTOALL
-#define SO_REUSE_RXTOALL                0
-#endif
-
-/**
- * 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.
- */
-#ifndef LWIP_FIONREAD_LINUXMODE
-#define LWIP_FIONREAD_LINUXMODE         0
-#endif
-
-/*
-   ----------------------------------------
-   ---------- Statistics options ----------
-   ----------------------------------------
-*/
-/**
- * LWIP_STATS==1: Enable statistics collection in lwip_stats.
- */
-#ifndef LWIP_STATS
-#define LWIP_STATS                      0
-#endif
-
-#if LWIP_STATS
-
-/**
- * LWIP_STATS_DISPLAY==1: Compile in the statistics output functions.
- */
-#ifndef LWIP_STATS_DISPLAY
-#define LWIP_STATS_DISPLAY              0
-#endif
-
-/**
- * LINK_STATS==1: Enable link stats.
- */
-#ifndef LINK_STATS
-#define LINK_STATS                      1
-#endif
-
-/**
- * ETHARP_STATS==1: Enable etharp stats.
- */
-#ifndef ETHARP_STATS
-#define ETHARP_STATS                    (LWIP_ARP)
-#endif
-
-/**
- * IP_STATS==1: Enable IP stats.
- */
-#ifndef IP_STATS
-#define IP_STATS                        1
-#endif
-
-/**
- * IPFRAG_STATS==1: Enable IP fragmentation stats. Default is
- * on if using either frag or reass.
- */
-#ifndef IPFRAG_STATS
-#define IPFRAG_STATS                    (IP_REASSEMBLY || IP_FRAG)
-#endif
-
-/**
- * ICMP_STATS==1: Enable ICMP stats.
- */
-#ifndef ICMP_STATS
-#define ICMP_STATS                      1
-#endif
-
-/**
- * IGMP_STATS==1: Enable IGMP stats.
- */
-#ifndef IGMP_STATS
-#define IGMP_STATS                      (LWIP_IGMP)
-#endif
-
-/**
- * UDP_STATS==1: Enable UDP stats. Default is on if
- * UDP enabled, otherwise off.
- */
-#ifndef UDP_STATS
-#define UDP_STATS                       (LWIP_UDP)
-#endif
-
-/**
- * TCP_STATS==1: Enable TCP stats. Default is on if TCP
- * enabled, otherwise off.
- */
-#ifndef TCP_STATS
-#define TCP_STATS                       (LWIP_TCP)
-#endif
-
-/**
- * MEM_STATS==1: Enable mem.c stats.
- */
-#ifndef MEM_STATS
-#define MEM_STATS                       ((MEM_LIBC_MALLOC == 0) && (MEM_USE_POOLS == 0))
-#endif
-
-/**
- * MEMP_STATS==1: Enable memp.c pool stats.
- */
-#ifndef MEMP_STATS
-#define MEMP_STATS                      (MEMP_MEM_MALLOC == 0)
-#endif
-
-/**
- * SYS_STATS==1: Enable system stats (sem and mbox counts, etc).
- */
-#ifndef SYS_STATS
-#define SYS_STATS                       (NO_SYS == 0)
-#endif
-
-/**
- * IP6_STATS==1: Enable IPv6 stats.
- */
-#ifndef IP6_STATS
-#define IP6_STATS                       (LWIP_IPV6)
-#endif
-
-/**
- * ICMP6_STATS==1: Enable ICMP for IPv6 stats.
- */
-#ifndef ICMP6_STATS
-#define ICMP6_STATS                     (LWIP_IPV6 && LWIP_ICMP6)
-#endif
-
-/**
- * IP6_FRAG_STATS==1: Enable IPv6 fragmentation stats.
- */
-#ifndef IP6_FRAG_STATS
-#define IP6_FRAG_STATS                  (LWIP_IPV6 && (LWIP_IPV6_FRAG || LWIP_IPV6_REASS))
-#endif
-
-/**
- * MLD6_STATS==1: Enable MLD for IPv6 stats.
- */
-#ifndef MLD6_STATS
-#define MLD6_STATS                      (LWIP_IPV6 && LWIP_IPV6_MLD)
-#endif
-
-/**
- * ND6_STATS==1: Enable Neighbor discovery for IPv6 stats.
- */
-#ifndef ND6_STATS
-#define ND6_STATS                       (LWIP_IPV6)
-#endif
-
-/**
- * MIB2_STATS==1: Stats for SNMP MIB2.
- */
-#ifndef MIB2_STATS
-#define MIB2_STATS                      0
-#endif
-
-#else
-
-#define LINK_STATS                      0
-#define ETHARP_STATS                    0
-#define IP_STATS                        0
-#define IPFRAG_STATS                    0
-#define ICMP_STATS                      0
-#define IGMP_STATS                      0
-#define UDP_STATS                       0
-#define TCP_STATS                       0
-#define MEM_STATS                       0
-#define MEMP_STATS                      0
-#define SYS_STATS                       0
-#define LWIP_STATS_DISPLAY              0
-#define IP6_STATS                       0
-#define ICMP6_STATS                     0
-#define IP6_FRAG_STATS                  0
-#define MLD6_STATS                      0
-#define ND6_STATS                       0
-#define MIB2_STATS                      0
-
-#endif /* LWIP_STATS */
-
-/*
-   ---------------------------------
-   ---------- PPP options ----------
-   ---------------------------------
-*/
-
-/**
- * PPP_SUPPORT==1: Enable PPP.
- */
-#ifndef PPP_SUPPORT
-#define PPP_SUPPORT                     0
-#endif
-
-/**
- * PPPOE_SUPPORT==1: Enable PPP Over Ethernet
- */
-#ifndef PPPOE_SUPPORT
-#define PPPOE_SUPPORT                   0
-#endif
-
-/**
- * PPPOL2TP_SUPPORT==1: Enable PPP Over L2TP
- */
-#ifndef PPPOL2TP_SUPPORT
-#define PPPOL2TP_SUPPORT                0
-#endif
-
-/**
- * PPPOL2TP_AUTH_SUPPORT==1: Enable PPP Over L2TP Auth (enable MD5 support)
- */
-#ifndef PPPOL2TP_AUTH_SUPPORT
-#define PPPOL2TP_AUTH_SUPPORT           PPPOL2TP_SUPPORT
-#endif
-
-/**
- * PPPOS_SUPPORT==1: Enable PPP Over Serial
- */
-#ifndef PPPOS_SUPPORT
-#define PPPOS_SUPPORT                   PPP_SUPPORT
-#endif
-
-/**
- * LWIP_PPP_API==1: Enable PPP API (in pppapi.c)
- */
-#ifndef LWIP_PPP_API
-#define LWIP_PPP_API                    (PPP_SUPPORT && (NO_SYS == 0))
-#endif
-
-#if PPP_SUPPORT
-
-/**
- * PPP_INPROC_IRQ_SAFE==1 call pppos_input() using tcpip_callback().
- *
- * Please read the "PPPoS input path" chapter in the PPP documentation about this option.
- */
-#ifndef PPP_INPROC_IRQ_SAFE
-#define PPP_INPROC_IRQ_SAFE             0
-#endif
-
-/**
- * PRINTPKT_SUPPORT==1: Enable PPP print packet support
- *
- * Mandatory for debugging, it displays exchanged packet content in debug trace.
- */
-#ifndef PRINTPKT_SUPPORT
-#define PRINTPKT_SUPPORT                0
-#endif
-
-/**
- * PPP_IPV4_SUPPORT==1: Enable PPP IPv4 support
- */
-#ifndef PPP_IPV4_SUPPORT
-#define PPP_IPV4_SUPPORT                (LWIP_IPV4)
-#endif
-
-/**
- * PPP_IPV6_SUPPORT==1: Enable PPP IPv6 support
- */
-#ifndef PPP_IPV6_SUPPORT
-#define PPP_IPV6_SUPPORT                (LWIP_IPV6)
-#endif
-
-/**
- * PPP_NOTIFY_PHASE==1: Support PPP notify phase support
- *
- * PPP notify phase support allows you to set a callback which is
- * called on change of the internal PPP state machine.
- *
- * This can be used for example to set a LED pattern depending on the
- * current phase of the PPP session.
- */
-#ifndef PPP_NOTIFY_PHASE
-#define PPP_NOTIFY_PHASE                0
-#endif
-
-/**
- * pbuf_type PPP is using for LCP, PAP, CHAP, EAP, CCP, IPCP and IP6CP packets.
- *
- * Memory allocated must be single buffered for PPP to works, it requires pbuf
- * that are not going to be chained when allocated. This requires setting
- * PBUF_POOL_BUFSIZE to at least 512 bytes, which is quite huge for small systems.
- *
- * Setting PPP_USE_PBUF_RAM to 1 makes PPP use memory from heap where continuous
- * buffers are required, allowing you to use a smaller PBUF_POOL_BUFSIZE.
- */
-#ifndef PPP_USE_PBUF_RAM
-#define PPP_USE_PBUF_RAM                0
-#endif
-
-/**
- * PPP_FCS_TABLE: Keep a 256*2 byte table to speed up FCS calculation for PPPoS
- */
-#ifndef PPP_FCS_TABLE
-#define PPP_FCS_TABLE                   1
-#endif
-
-/**
- * PAP_SUPPORT==1: Support PAP.
- */
-#ifndef PAP_SUPPORT
-#define PAP_SUPPORT                     0
-#endif
-
-/**
- * CHAP_SUPPORT==1: Support CHAP.
- */
-#ifndef CHAP_SUPPORT
-#define CHAP_SUPPORT                    0
-#endif
-
-/**
- * MSCHAP_SUPPORT==1: Support MSCHAP.
- */
-#ifndef MSCHAP_SUPPORT
-#define MSCHAP_SUPPORT                  0
-#endif
-#if MSCHAP_SUPPORT
-/* MSCHAP requires CHAP support */
-#undef CHAP_SUPPORT
-#define CHAP_SUPPORT                    1
-#endif /* MSCHAP_SUPPORT */
-
-/**
- * EAP_SUPPORT==1: Support EAP.
- */
-#ifndef EAP_SUPPORT
-#define EAP_SUPPORT                     0
-#endif
-
-/**
- * CCP_SUPPORT==1: Support CCP.
- */
-#ifndef CCP_SUPPORT
-#define CCP_SUPPORT                     0
-#endif
-
-/**
- * MPPE_SUPPORT==1: Support MPPE.
- */
-#ifndef MPPE_SUPPORT
-#define MPPE_SUPPORT                    0
-#endif
-#if MPPE_SUPPORT
-/* MPPE requires CCP support */
-#undef CCP_SUPPORT
-#define CCP_SUPPORT                     1
-/* MPPE requires MSCHAP support */
-#undef MSCHAP_SUPPORT
-#define MSCHAP_SUPPORT                  1
-/* MSCHAP requires CHAP support */
-#undef CHAP_SUPPORT
-#define CHAP_SUPPORT                    1
-#endif /* MPPE_SUPPORT */
-
-/**
- * CBCP_SUPPORT==1: Support CBCP. CURRENTLY NOT SUPPORTED! DO NOT SET!
- */
-#ifndef CBCP_SUPPORT
-#define CBCP_SUPPORT                    0
-#endif
-
-/**
- * ECP_SUPPORT==1: Support ECP. CURRENTLY NOT SUPPORTED! DO NOT SET!
- */
-#ifndef ECP_SUPPORT
-#define ECP_SUPPORT                     0
-#endif
-
-/**
- * DEMAND_SUPPORT==1: Support dial on demand. CURRENTLY NOT SUPPORTED! DO NOT SET!
- */
-#ifndef DEMAND_SUPPORT
-#define DEMAND_SUPPORT                  0
-#endif
-
-/**
- * LQR_SUPPORT==1: Support Link Quality Report. Do nothing except exchanging some LCP packets.
- */
-#ifndef LQR_SUPPORT
-#define LQR_SUPPORT                     0
-#endif
-
-/**
- * PPP_SERVER==1: Enable PPP server support (waiting for incoming PPP session).
- *
- * Currently only supported for PPPoS.
- */
-#ifndef PPP_SERVER
-#define PPP_SERVER                      0
-#endif
-
-#if PPP_SERVER
-/*
- * PPP_OUR_NAME: Our name for authentication purposes
- */
-#ifndef PPP_OUR_NAME
-#define PPP_OUR_NAME                    "lwIP"
-#endif
-#endif /* PPP_SERVER */
-
-/**
- * VJ_SUPPORT==1: Support VJ header compression.
- */
-#ifndef VJ_SUPPORT
-#define VJ_SUPPORT                      1
-#endif
-/* VJ compression is only supported for IPv4 over PPPoS. */
-#if !PPPOS_SUPPORT || !PPP_IPV4_SUPPORT
-#undef VJ_SUPPORT
-#define VJ_SUPPORT                      0
-#endif /* !PPPOS_SUPPORT */
-
-/**
- * PPP_MD5_RANDM==1: Use MD5 for better randomness.
- * Enabled by default if CHAP, EAP, or L2TP AUTH support is enabled.
- */
-#ifndef PPP_MD5_RANDM
-#define PPP_MD5_RANDM                   (CHAP_SUPPORT || EAP_SUPPORT || PPPOL2TP_AUTH_SUPPORT)
-#endif
-
-/**
- * PolarSSL library, used if necessary and not previously disabled
- *
- *
- * lwIP contains some files fetched from the latest BSD release of
- * the PolarSSL project for ciphers and encryption methods we need for lwIP
- * PPP support.
- *
- * The PolarSSL files were cleaned to contain only the necessary struct
- * fields and functions needed for lwIP.
- *
- * The PolarSSL API was not changed at all, so if you are already using
- * PolarSSL you can choose to skip the compilation of the included PolarSSL
- * library into lwIP:
- *
- * The following defines are available for flexibility:
- *
- * LWIP_INCLUDED_POLARSSL_MD4   ; Use lwIP internal PolarSSL for MD4
- * LWIP_INCLUDED_POLARSSL_MD5   ; Use lwIP internal PolarSSL for MD5
- * LWIP_INCLUDED_POLARSSL_SHA1  ; Use lwIP internal PolarSSL for SHA1
- * LWIP_INCLUDED_POLARSSL_DES   ; Use lwIP internal PolarSSL for DES
- *
- * If set (=1), the default if required by another enabled PPP feature unless
- * explicitly set to 0, using included lwIP PolarSSL.
- *
- * If clear (=0), not needed or using external PolarSSL.
- *
- * Beware of the stack requirements which can be a lot larger if you are not
- * using our cleaned PolarSSL library.
- */
-
-/* CHAP, EAP, L2TP AUTH and MD5 Random require MD5 support */
-#if CHAP_SUPPORT || EAP_SUPPORT || PPPOL2TP_AUTH_SUPPORT || PPP_MD5_RANDM
-#ifndef LWIP_INCLUDED_POLARSSL_MD5
-#define LWIP_INCLUDED_POLARSSL_MD5        1
-#endif /* LWIP_INCLUDED_POLARSSL_MD5 */
-#endif /* CHAP_SUPPORT || EAP_SUPPORT || PPPOL2TP_AUTH_SUPPORT || PPP_MD5_RANDM */
-
-#if MSCHAP_SUPPORT
-/* MSCHAP require MD4 support */
-#ifndef LWIP_INCLUDED_POLARSSL_MD4
-#define LWIP_INCLUDED_POLARSSL_MD4      1
-#endif /* LWIP_INCLUDED_POLARSSL_MD4 */
-/* MSCHAP require SHA1 support */
-#ifndef LWIP_INCLUDED_POLARSSL_SHA1
-#define LWIP_INCLUDED_POLARSSL_SHA1     1
-#endif /* LWIP_INCLUDED_POLARSSL_SHA1 */
-/* MSCHAP require DES support */
-#ifndef LWIP_INCLUDED_POLARSSL_DES
-#define LWIP_INCLUDED_POLARSSL_DES      1
-#endif /* LWIP_INCLUDED_POLARSSL_DES */
-/* MS-CHAP support is required for MPPE */
-#if MPPE_SUPPORT
-/* MPPE require ARC4 support */
-#ifndef LWIP_INCLUDED_POLARSSL_ARC4
-#define LWIP_INCLUDED_POLARSSL_ARC4     1
-#endif /* LWIP_INCLUDED_POLARSSL_ARC4*/
-#endif /* MPPE_SUPPORT */
-#endif /* MSCHAP_SUPPORT */
-
-/* Default value if unset */
-#ifndef LWIP_INCLUDED_POLARSSL_MD4
-#define LWIP_INCLUDED_POLARSSL_MD4      0
-#endif /* LWIP_INCLUDED_POLARSSL_MD4 */
-#ifndef LWIP_INCLUDED_POLARSSL_MD5
-#define LWIP_INCLUDED_POLARSSL_MD5      0
-#endif /* LWIP_INCLUDED_POLARSSL_MD5 */
-#ifndef LWIP_INCLUDED_POLARSSL_SHA1
-#define LWIP_INCLUDED_POLARSSL_SHA1     0
-#endif /* LWIP_INCLUDED_POLARSSL_SHA1 */
-#ifndef LWIP_INCLUDED_POLARSSL_DES
-#define LWIP_INCLUDED_POLARSSL_DES      0
-#endif /* LWIP_INCLUDED_POLARSSL_DES */
-#ifndef LWIP_INCLUDED_POLARSSL_ARC4
-#define LWIP_INCLUDED_POLARSSL_ARC4     0
-#endif /* LWIP_INCLUDED_POLARSSL_ARC4 */
-
-/*
- * PPP Timeouts
- */
-
-/**
- * FSM_DEFTIMEOUT: Timeout time in seconds
- */
-#ifndef FSM_DEFTIMEOUT
-#define FSM_DEFTIMEOUT                  6
-#endif
-
-/**
- * FSM_DEFMAXTERMREQS: Maximum Terminate-Request transmissions
- */
-#ifndef FSM_DEFMAXTERMREQS
-#define FSM_DEFMAXTERMREQS              2
-#endif
-
-/**
- * FSM_DEFMAXCONFREQS: Maximum Configure-Request transmissions
- */
-#ifndef FSM_DEFMAXCONFREQS
-#define FSM_DEFMAXCONFREQS              10
-#endif
-
-/**
- * FSM_DEFMAXNAKLOOPS: Maximum number of nak loops
- */
-#ifndef FSM_DEFMAXNAKLOOPS
-#define FSM_DEFMAXNAKLOOPS              5
-#endif
-
-/**
- * UPAP_DEFTIMEOUT: Timeout (seconds) for retransmitting req
- */
-#ifndef UPAP_DEFTIMEOUT
-#define UPAP_DEFTIMEOUT                 6
-#endif
-
-/**
- * UPAP_DEFTRANSMITS: Maximum number of auth-reqs to send
- */
-#ifndef UPAP_DEFTRANSMITS
-#define UPAP_DEFTRANSMITS               10
-#endif
-
-#if PPP_SERVER
-/**
- * UPAP_DEFREQTIME: Time to wait for auth-req from peer
- */
-#ifndef UPAP_DEFREQTIME
-#define UPAP_DEFREQTIME                 30
-#endif
-#endif /* PPP_SERVER */
-
-/**
- * CHAP_DEFTIMEOUT: Timeout (seconds) for retransmitting req
- */
-#ifndef CHAP_DEFTIMEOUT
-#define CHAP_DEFTIMEOUT                 6
-#endif
-
-/**
- * CHAP_DEFTRANSMITS: max # times to send challenge
- */
-#ifndef CHAP_DEFTRANSMITS
-#define CHAP_DEFTRANSMITS               10
-#endif
-
-#if PPP_SERVER
-/**
- * CHAP_DEFRECHALLENGETIME: If this option is > 0, rechallenge the peer every n seconds
- */
-#ifndef CHAP_DEFRECHALLENGETIME
-#define CHAP_DEFRECHALLENGETIME         0
-#endif
-#endif /* PPP_SERVER */
-
-/**
- * EAP_DEFREQTIME: Time to wait for peer request
- */
-#ifndef EAP_DEFREQTIME
-#define EAP_DEFREQTIME                  6
-#endif
-
-/**
- * EAP_DEFALLOWREQ: max # times to accept requests
- */
-#ifndef EAP_DEFALLOWREQ
-#define EAP_DEFALLOWREQ                 10
-#endif
-
-#if PPP_SERVER
-/**
- * EAP_DEFTIMEOUT: Timeout (seconds) for rexmit
- */
-#ifndef EAP_DEFTIMEOUT
-#define EAP_DEFTIMEOUT                  6
-#endif
-
-/**
- * EAP_DEFTRANSMITS: max # times to transmit
- */
-#ifndef EAP_DEFTRANSMITS
-#define EAP_DEFTRANSMITS                10
-#endif
-#endif /* PPP_SERVER */
-
-/**
- * LCP_DEFLOOPBACKFAIL: Default number of times we receive our magic number from the peer
- * before deciding the link is looped-back.
- */
-#ifndef LCP_DEFLOOPBACKFAIL
-#define LCP_DEFLOOPBACKFAIL             10
-#endif
-
-/**
- * LCP_ECHOINTERVAL: Interval in seconds between keepalive echo requests, 0 to disable.
- */
-#ifndef LCP_ECHOINTERVAL
-#define LCP_ECHOINTERVAL                0
-#endif
-
-/**
- * LCP_MAXECHOFAILS: Number of unanswered echo requests before failure.
- */
-#ifndef LCP_MAXECHOFAILS
-#define LCP_MAXECHOFAILS                3
-#endif
-
-/**
- * PPP_MAXIDLEFLAG: Max Xmit idle time (in ms) before resend flag char.
- */
-#ifndef PPP_MAXIDLEFLAG
-#define PPP_MAXIDLEFLAG                 100
-#endif
-
-/**
- * PPP Packet sizes
- */
-
-/**
- * PPP_MRU: Default MRU
- */
-#ifndef PPP_MRU
-#define PPP_MRU                         1500
-#endif
-
-/**
- * PPP_DEFMRU: Default MRU to try
- */
-#ifndef PPP_DEFMRU
-#define PPP_DEFMRU                      1500
-#endif
-
-/**
- * PPP_MAXMRU: Normally limit MRU to this (pppd default = 16384)
- */
-#ifndef PPP_MAXMRU
-#define PPP_MAXMRU                      1500
-#endif
-
-/**
- * PPP_MINMRU: No MRUs below this
- */
-#ifndef PPP_MINMRU
-#define PPP_MINMRU                      128
-#endif
-
-/**
- * PPPOL2TP_DEFMRU: Default MTU and MRU for L2TP
- * Default = 1500 - PPPoE(6) - PPP Protocol(2) - IPv4 header(20) - UDP Header(8)
- * - L2TP Header(6) - HDLC Header(2) - PPP Protocol(2) - MPPE Header(2) - PPP Protocol(2)
- */
-#if PPPOL2TP_SUPPORT
-#ifndef PPPOL2TP_DEFMRU
-#define PPPOL2TP_DEFMRU                 1450
-#endif
-#endif /* PPPOL2TP_SUPPORT */
-
-/**
- * MAXNAMELEN: max length of hostname or name for auth
- */
-#ifndef MAXNAMELEN
-#define MAXNAMELEN                      256
-#endif
-
-/**
- * MAXSECRETLEN: max length of password or secret
- */
-#ifndef MAXSECRETLEN
-#define MAXSECRETLEN                    256
-#endif
-
-#endif /* PPP_SUPPORT */
-
-/*
-   --------------------------------------
-   ---------- Checksum options ----------
-   --------------------------------------
-*/
-
-/**
- * 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!
- */
-#ifndef LWIP_CHECKSUM_CTRL_PER_NETIF
-#define LWIP_CHECKSUM_CTRL_PER_NETIF    0
-#endif
-
-/**
- * CHECKSUM_GEN_IP==1: Generate checksums in software for outgoing IP packets.
- */
-#ifndef CHECKSUM_GEN_IP
-#define CHECKSUM_GEN_IP                 1
-#endif
-
-/**
- * CHECKSUM_GEN_UDP==1: Generate checksums in software for outgoing UDP packets.
- */
-#ifndef CHECKSUM_GEN_UDP
-#define CHECKSUM_GEN_UDP                1
-#endif
-
-/**
- * CHECKSUM_GEN_TCP==1: Generate checksums in software for outgoing TCP packets.
- */
-#ifndef CHECKSUM_GEN_TCP
-#define CHECKSUM_GEN_TCP                1
-#endif
-
-/**
- * CHECKSUM_GEN_ICMP==1: Generate checksums in software for outgoing ICMP packets.
- */
-#ifndef CHECKSUM_GEN_ICMP
-#define CHECKSUM_GEN_ICMP               1
-#endif
-
-/**
- * CHECKSUM_GEN_ICMP6==1: Generate checksums in software for outgoing ICMP6 packets.
- */
-#ifndef CHECKSUM_GEN_ICMP6
-#define CHECKSUM_GEN_ICMP6              1
-#endif
-
-/**
- * CHECKSUM_CHECK_IP==1: Check checksums in software for incoming IP packets.
- */
-#ifndef CHECKSUM_CHECK_IP
-#define CHECKSUM_CHECK_IP               1
-#endif
-
-/**
- * CHECKSUM_CHECK_UDP==1: Check checksums in software for incoming UDP packets.
- */
-#ifndef CHECKSUM_CHECK_UDP
-#define CHECKSUM_CHECK_UDP              1
-#endif
-
-/**
- * CHECKSUM_CHECK_TCP==1: Check checksums in software for incoming TCP packets.
- */
-#ifndef CHECKSUM_CHECK_TCP
-#define CHECKSUM_CHECK_TCP              1
-#endif
-
-/**
- * CHECKSUM_CHECK_ICMP==1: Check checksums in software for incoming ICMP packets.
- */
-#ifndef CHECKSUM_CHECK_ICMP
-#define CHECKSUM_CHECK_ICMP             1
-#endif
-
-/**
- * CHECKSUM_CHECK_ICMP6==1: Check checksums in software for incoming ICMPv6 packets
- */
-#ifndef CHECKSUM_CHECK_ICMP6
-#define CHECKSUM_CHECK_ICMP6            1
-#endif
-
-/**
- * LWIP_CHECKSUM_ON_COPY==1: Calculate checksum when copying data from
- * application buffers to pbufs.
- */
-#ifndef LWIP_CHECKSUM_ON_COPY
-#define LWIP_CHECKSUM_ON_COPY           0
-#endif
-
-/*
-   ---------------------------------------
-   ---------- IPv6 options ---------------
-   ---------------------------------------
-*/
-/**
- * LWIP_IPV6==1: Enable IPv6
- */
-#ifndef LWIP_IPV6
-#define LWIP_IPV6                       0
-#endif
-
-/**
- * LWIP_IPV6_NUM_ADDRESSES: Number of IPv6 addresses per netif.
- */
-#ifndef LWIP_IPV6_NUM_ADDRESSES
-#define LWIP_IPV6_NUM_ADDRESSES         3
-#endif
-
-/**
- * LWIP_IPV6_FORWARD==1: Forward IPv6 packets across netifs
- */
-#ifndef LWIP_IPV6_FORWARD
-#define LWIP_IPV6_FORWARD               0
-#endif
-
-/**
- * LWIP_ICMP6==1: Enable ICMPv6 (mandatory per RFC)
- */
-#ifndef LWIP_ICMP6
-#define LWIP_ICMP6                      (LWIP_IPV6)
-#endif
-
-/**
- * LWIP_ICMP6_DATASIZE: bytes from original packet to send back in
- * ICMPv6 error messages.
- */
-#ifndef LWIP_ICMP6_DATASIZE
-#define LWIP_ICMP6_DATASIZE             8
-#endif
-
-/**
- * LWIP_ICMP6_HL: default hop limit for ICMPv6 messages
- */
-#ifndef LWIP_ICMP6_HL
-#define LWIP_ICMP6_HL                   255
-#endif
-
-/**
- * LWIP_IPV6_MLD==1: Enable multicast listener discovery protocol.
- */
-#ifndef LWIP_IPV6_MLD
-#define LWIP_IPV6_MLD                   (LWIP_IPV6)
-#endif
-
-/**
- * MEMP_NUM_MLD6_GROUP: Max number of IPv6 multicast that can be joined.
- */
-#ifndef MEMP_NUM_MLD6_GROUP
-#define MEMP_NUM_MLD6_GROUP             4
-#endif
-
-/**
- * LWIP_IPV6_FRAG==1: Fragment outgoing IPv6 packets that are too big.
- */
-#ifndef LWIP_IPV6_FRAG
-#define LWIP_IPV6_FRAG                  0
-#endif
-
-/**
- * LWIP_IPV6_REASS==1: reassemble incoming IPv6 packets that fragmented
- */
-#ifndef LWIP_IPV6_REASS
-#define LWIP_IPV6_REASS                 (LWIP_IPV6)
-#endif
-
-/**
- * LWIP_ND6_QUEUEING==1: queue outgoing IPv6 packets while MAC address
- * is being resolved.
- */
-#ifndef LWIP_ND6_QUEUEING
-#define LWIP_ND6_QUEUEING               (LWIP_IPV6)
-#endif
-
-/**
- * MEMP_NUM_ND6_QUEUE: Max number of IPv6 packets to queue during MAC resolution.
- */
-#ifndef MEMP_NUM_ND6_QUEUE
-#define MEMP_NUM_ND6_QUEUE              20
-#endif
-
-/**
- * LWIP_ND6_NUM_NEIGHBORS: Number of entries in IPv6 neighbor cache
- */
-#ifndef LWIP_ND6_NUM_NEIGHBORS
-#define LWIP_ND6_NUM_NEIGHBORS          10
-#endif
-
-/**
- * LWIP_ND6_NUM_DESTINATIONS: number of entries in IPv6 destination cache
- */
-#ifndef LWIP_ND6_NUM_DESTINATIONS
-#define LWIP_ND6_NUM_DESTINATIONS       10
-#endif
-
-/**
- * LWIP_ND6_NUM_PREFIXES: number of entries in IPv6 on-link prefixes cache
- */
-#ifndef LWIP_ND6_NUM_PREFIXES
-#define LWIP_ND6_NUM_PREFIXES           5
-#endif
-
-/**
- * LWIP_ND6_NUM_ROUTERS: number of entries in IPv6 default router cache
- */
-#ifndef LWIP_ND6_NUM_ROUTERS
-#define LWIP_ND6_NUM_ROUTERS            3
-#endif
-
-/**
- * LWIP_ND6_MAX_MULTICAST_SOLICIT: max number of multicast solicit messages to send
- * (neighbor solicit and router solicit)
- */
-#ifndef LWIP_ND6_MAX_MULTICAST_SOLICIT
-#define LWIP_ND6_MAX_MULTICAST_SOLICIT  3
-#endif
-
-/**
- * LWIP_ND6_MAX_UNICAST_SOLICIT: max number of unicast neighbor solicitation messages
- * to send during neighbor reachability detection.
- */
-#ifndef LWIP_ND6_MAX_UNICAST_SOLICIT
-#define LWIP_ND6_MAX_UNICAST_SOLICIT    3
-#endif
-
-/**
- * Unused: See ND RFC (time in milliseconds).
- */
-#ifndef LWIP_ND6_MAX_ANYCAST_DELAY_TIME
-#define LWIP_ND6_MAX_ANYCAST_DELAY_TIME 1000
-#endif
-
-/**
- * Unused: See ND RFC
- */
-#ifndef LWIP_ND6_MAX_NEIGHBOR_ADVERTISEMENT
-#define LWIP_ND6_MAX_NEIGHBOR_ADVERTISEMENT  3
-#endif
-
-/**
- * LWIP_ND6_REACHABLE_TIME: default neighbor reachable time (in milliseconds).
- * May be updated by router advertisement messages.
- */
-#ifndef LWIP_ND6_REACHABLE_TIME
-#define LWIP_ND6_REACHABLE_TIME         30000
-#endif
-
-/**
- * LWIP_ND6_RETRANS_TIMER: default retransmission timer for solicitation messages
- */
-#ifndef LWIP_ND6_RETRANS_TIMER
-#define LWIP_ND6_RETRANS_TIMER          1000
-#endif
-
-/**
- * LWIP_ND6_DELAY_FIRST_PROBE_TIME: Delay before first unicast neighbor solicitation
- * message is sent, during neighbor reachability detection.
- */
-#ifndef LWIP_ND6_DELAY_FIRST_PROBE_TIME
-#define LWIP_ND6_DELAY_FIRST_PROBE_TIME 5000
-#endif
-
-/**
- * LWIP_ND6_ALLOW_RA_UPDATES==1: Allow Router Advertisement messages to update
- * Reachable time and retransmission timers, and netif MTU.
- */
-#ifndef LWIP_ND6_ALLOW_RA_UPDATES
-#define LWIP_ND6_ALLOW_RA_UPDATES       1
-#endif
-
-/**
- * LWIP_IPV6_SEND_ROUTER_SOLICIT==1: Send router solicitation messages during
- * network startup.
- */
-#ifndef LWIP_IPV6_SEND_ROUTER_SOLICIT
-#define LWIP_IPV6_SEND_ROUTER_SOLICIT   1
-#endif
-
-/**
- * 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.
- */
-#ifndef LWIP_ND6_TCP_REACHABILITY_HINTS
-#define LWIP_ND6_TCP_REACHABILITY_HINTS 1
-#endif
-
-/**
- * LWIP_IPV6_AUTOCONFIG==1: Enable stateless address autoconfiguration as per RFC 4862.
- */
-#ifndef LWIP_IPV6_AUTOCONFIG
-#define LWIP_IPV6_AUTOCONFIG            (LWIP_IPV6)
-#endif
-
-/**
- * LWIP_IPV6_DUP_DETECT_ATTEMPTS: Number of duplicate address detection attempts.
- */
-#ifndef LWIP_IPV6_DUP_DETECT_ATTEMPTS
-#define LWIP_IPV6_DUP_DETECT_ATTEMPTS   1
-#endif
-
-/**
- * LWIP_IPV6_DHCP6==1: enable DHCPv6 stateful address autoconfiguration.
- */
-#ifndef LWIP_IPV6_DHCP6
-#define LWIP_IPV6_DHCP6                 0
-#endif
-
-/*
-   ---------------------------------------
-   ---------- Hook options ---------------
-   ---------------------------------------
-*/
-
-/* Hooks are undefined by default, define them to a function if you need them. */
-
-/**
- * LWIP_HOOK_IP4_INPUT(pbuf, input_netif):
- * - called from ip_input() (IPv4)
- * - pbuf: received struct pbuf passed to ip_input()
- * - input_netif: struct netif on which the packet has been received
- * Return values:
- * - 0: Hook has not consumed the packet, packet is processed as normal
- * - != 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).
- */
-
-/**
- * LWIP_HOOK_IP4_ROUTE(dest):
- * - called from ip_route() (IPv4)
- * - dest: destination IPv4 address
- * Returns the destination netif or NULL if no destination netif is found. In
- * that case, ip_route() continues as normal.
- */
-
-/**
- * LWIP_HOOK_IP4_ROUTE_SRC(dest, src):
- * - source-based routing for IPv4 (see LWIP_HOOK_IP4_ROUTE(), src may be NULL)
- */
-
-/**
- * LWIP_HOOK_ETHARP_GET_GW(netif, dest):
- * - called from etharp_output() (IPv4)
- * - 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.
- * The returned address MUST be 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
- * not part of lwIP but can e.g. be hidden in the netif's state argument.
-*/
-
-/**
- * LWIP_HOOK_IP6_INPUT(pbuf, input_netif):
- * - called from ip6_input() (IPv6)
- * - pbuf: received struct pbuf passed to ip6_input()
- * - input_netif: struct netif on which the packet has been received
- * Return values:
- * - 0: Hook has not consumed the packet, packet is processed as normal
- * - != 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).
- */
-
-/**
- * LWIP_HOOK_IP6_ROUTE(src, dest):
- * - called from ip6_route() (IPv6)
- * - src: sourc 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.
- */
-
-/**
- * LWIP_HOOK_VLAN_CHECK(netif, eth_hdr, vlan_hdr):
- * - called from ethernet_input() if VLAN support is enabled
- * - 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
- * Return values:
- * - 0: Packet must be dropped.
- * - != 0: Packet must be accepted.
- */
-
-/**
- * LWIP_HOOK_VLAN_SET(netif, eth_hdr, vlan_hdr):
- * - called from etharp_raw() and etharp_send_ip() if VLAN support is enabled
- * - netif: struct netif that the packet will be sent through
- * - eth_hdr: struct eth_hdr of the packet
- * - vlan_hdr: struct eth_vlan_hdr of the packet
- * Return values:
- * - 0: Packet shall not contain VLAN header.
- * - != 0: Packet shall contain VLAN header.
- * Hook can be used to set prio_vid field of vlan_hdr.
- */
-
-/**
- * LWIP_HOOK_MEMP_AVAILABLE(memp_t_type):
- * - called from memp_free() when a memp pool was empty and an item is now available
- */
-
-/*
-   ---------------------------------------
-   ---------- Debugging options ----------
-   ---------------------------------------
-*/
-/**
- * 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.
- */
-#ifndef LWIP_DBG_MIN_LEVEL
-#define LWIP_DBG_MIN_LEVEL              LWIP_DBG_LEVEL_ALL
-#endif
-
-/**
- * LWIP_DBG_TYPES_ON: A mask that can be used to globally enable/disable
- * debug messages of certain types.
- */
-#ifndef LWIP_DBG_TYPES_ON
-#define LWIP_DBG_TYPES_ON               LWIP_DBG_ON
-#endif
-
-/**
- * ETHARP_DEBUG: Enable debugging in etharp.c.
- */
-#ifndef ETHARP_DEBUG
-#define ETHARP_DEBUG                    LWIP_DBG_OFF
-#endif
-
-/**
- * NETIF_DEBUG: Enable debugging in netif.c.
- */
-#ifndef NETIF_DEBUG
-#define NETIF_DEBUG                     LWIP_DBG_OFF
-#endif
-
-/**
- * PBUF_DEBUG: Enable debugging in pbuf.c.
- */
-#ifndef PBUF_DEBUG
-#define PBUF_DEBUG                      LWIP_DBG_OFF
-#endif
-
-/**
- * API_LIB_DEBUG: Enable debugging in api_lib.c.
- */
-#ifndef API_LIB_DEBUG
-#define API_LIB_DEBUG                   LWIP_DBG_OFF
-#endif
-
-/**
- * API_MSG_DEBUG: Enable debugging in api_msg.c.
- */
-#ifndef API_MSG_DEBUG
-#define API_MSG_DEBUG                   LWIP_DBG_OFF
-#endif
-
-/**
- * SOCKETS_DEBUG: Enable debugging in sockets.c.
- */
-#ifndef SOCKETS_DEBUG
-#define SOCKETS_DEBUG                   LWIP_DBG_OFF
-#endif
-
-/**
- * ICMP_DEBUG: Enable debugging in icmp.c.
- */
-#ifndef ICMP_DEBUG
-#define ICMP_DEBUG                      LWIP_DBG_OFF
-#endif
-
-/**
- * IGMP_DEBUG: Enable debugging in igmp.c.
- */
-#ifndef IGMP_DEBUG
-#define IGMP_DEBUG                      LWIP_DBG_OFF
-#endif
-
-/**
- * INET_DEBUG: Enable debugging in inet.c.
- */
-#ifndef INET_DEBUG
-#define INET_DEBUG                      LWIP_DBG_OFF
-#endif
-
-/**
- * IP_DEBUG: Enable debugging for IP.
- */
-#ifndef IP_DEBUG
-#define IP_DEBUG                        LWIP_DBG_OFF
-#endif
-
-/**
- * IP_REASS_DEBUG: Enable debugging in ip_frag.c for both frag & reass.
- */
-#ifndef IP_REASS_DEBUG
-#define IP_REASS_DEBUG                  LWIP_DBG_OFF
-#endif
-
-/**
- * RAW_DEBUG: Enable debugging in raw.c.
- */
-#ifndef RAW_DEBUG
-#define RAW_DEBUG                       LWIP_DBG_OFF
-#endif
-
-/**
- * MEM_DEBUG: Enable debugging in mem.c.
- */
-#ifndef MEM_DEBUG
-#define MEM_DEBUG                       LWIP_DBG_OFF
-#endif
-
-/**
- * MEMP_DEBUG: Enable debugging in memp.c.
- */
-#ifndef MEMP_DEBUG
-#define MEMP_DEBUG                      LWIP_DBG_OFF
-#endif
-
-/**
- * SYS_DEBUG: Enable debugging in sys.c.
- */
-#ifndef SYS_DEBUG
-#define SYS_DEBUG                       LWIP_DBG_OFF
-#endif
-
-/**
- * TIMERS_DEBUG: Enable debugging in timers.c.
- */
-#ifndef TIMERS_DEBUG
-#define TIMERS_DEBUG                    LWIP_DBG_OFF
-#endif
-
-/**
- * TCP_DEBUG: Enable debugging for TCP.
- */
-#ifndef TCP_DEBUG
-#define TCP_DEBUG                       LWIP_DBG_OFF
-#endif
-
-/**
- * TCP_INPUT_DEBUG: Enable debugging in tcp_in.c for incoming debug.
- */
-#ifndef TCP_INPUT_DEBUG
-#define TCP_INPUT_DEBUG                 LWIP_DBG_OFF
-#endif
-
-/**
- * TCP_FR_DEBUG: Enable debugging in tcp_in.c for fast retransmit.
- */
-#ifndef TCP_FR_DEBUG
-#define TCP_FR_DEBUG                    LWIP_DBG_OFF
-#endif
-
-/**
- * TCP_RTO_DEBUG: Enable debugging in TCP for retransmit
- * timeout.
- */
-#ifndef TCP_RTO_DEBUG
-#define TCP_RTO_DEBUG                   LWIP_DBG_OFF
-#endif
-
-/**
- * TCP_CWND_DEBUG: Enable debugging for TCP congestion window.
- */
-#ifndef TCP_CWND_DEBUG
-#define TCP_CWND_DEBUG                  LWIP_DBG_OFF
-#endif
-
-/**
- * TCP_WND_DEBUG: Enable debugging in tcp_in.c for window updating.
- */
-#ifndef TCP_WND_DEBUG
-#define TCP_WND_DEBUG                   LWIP_DBG_OFF
-#endif
-
-/**
- * TCP_OUTPUT_DEBUG: Enable debugging in tcp_out.c output functions.
- */
-#ifndef TCP_OUTPUT_DEBUG
-#define TCP_OUTPUT_DEBUG                LWIP_DBG_OFF
-#endif
-
-/**
- * TCP_RST_DEBUG: Enable debugging for TCP with the RST message.
- */
-#ifndef TCP_RST_DEBUG
-#define TCP_RST_DEBUG                   LWIP_DBG_OFF
-#endif
-
-/**
- * TCP_QLEN_DEBUG: Enable debugging for TCP queue lengths.
- */
-#ifndef TCP_QLEN_DEBUG
-#define TCP_QLEN_DEBUG                  LWIP_DBG_OFF
-#endif
-
-/**
- * UDP_DEBUG: Enable debugging in UDP.
- */
-#ifndef UDP_DEBUG
-#define UDP_DEBUG                       LWIP_DBG_OFF
-#endif
-
-/**
- * TCPIP_DEBUG: Enable debugging in tcpip.c.
- */
-#ifndef TCPIP_DEBUG
-#define TCPIP_DEBUG                     LWIP_DBG_OFF
-#endif
-
-/**
- * PPP_DEBUG: Enable debugging for PPP.
- */
-#ifndef PPP_DEBUG
-#define PPP_DEBUG                       LWIP_DBG_OFF
-#endif
-
-/**
- * SLIP_DEBUG: Enable debugging in slipif.c.
- */
-#ifndef SLIP_DEBUG
-#define SLIP_DEBUG                      LWIP_DBG_OFF
-#endif
-
-/**
- * DHCP_DEBUG: Enable debugging in dhcp.c.
- */
-#ifndef DHCP_DEBUG
-#define DHCP_DEBUG                      LWIP_DBG_OFF
-#endif
-
-/**
- * AUTOIP_DEBUG: Enable debugging in autoip.c.
- */
-#ifndef AUTOIP_DEBUG
-#define AUTOIP_DEBUG                    LWIP_DBG_OFF
-#endif
-
-/**
- * DNS_DEBUG: Enable debugging for DNS.
- */
-#ifndef DNS_DEBUG
-#define DNS_DEBUG                       LWIP_DBG_OFF
-#endif
-
-/**
- * IP6_DEBUG: Enable debugging for IPv6.
- */
-#ifndef IP6_DEBUG
-#define IP6_DEBUG                       LWIP_DBG_OFF
-#endif
-
-/*
-   --------------------------------------------------
-   ---------- Performance tracking options ----------
-   --------------------------------------------------
-*/
-/**
- * LWIP_PERF: Enable performance testing for lwIP
- * (if enabled, arch/perf.h is included)
- */
-#ifndef LWIP_PERF
-#define LWIP_PERF                       0
-#endif
-
-/**
- * ESP_L2_TO_L3_COPY: enable memcpy when receiving packet from L2
- */
-#ifndef ESP_L2_TO_L3_COPY
-#define ESP_L2_TO_L3_COPY                   0
-#endif
-
-#ifndef ESP_THREAD_SAFE_DEBUG
-#define ESP_THREAD_SAFE_DEBUG               0
-#endif
-
-#endif /* LWIP_HDR_OPT_H */
diff --git a/components/lwip/include/lwip/lwip/pbuf.h b/components/lwip/include/lwip/lwip/pbuf.h
deleted file mode 100644 (file)
index 422cbfe..0000000
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * 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_PBUF_H
-#define LWIP_HDR_PBUF_H
-
-#include "lwip/opt.h"
-#include "lwip/err.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/** LWIP_SUPPORT_CUSTOM_PBUF==1: Custom pbufs behave much like their pbuf type
- * but they are allocated by external code (initialised by calling
- * pbuf_alloced_custom()) and when pbuf_free gives up their last reference, they
- * are freed by calling pbuf_custom->custom_free_function().
- * Currently, the pbuf_custom code is only needed for one specific configuration
- * of IP_FRAG, unless required by external driver/application code. */
-#ifndef LWIP_SUPPORT_CUSTOM_PBUF
-#define LWIP_SUPPORT_CUSTOM_PBUF ((IP_FRAG && !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF) || (LWIP_IPV6 && LWIP_IPV6_FRAG))
-#endif
-
-/* @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) */
-
-#define PBUF_TRANSPORT_HLEN 20
-#if LWIP_IPV6
-#define PBUF_IP_HLEN        40
-#else
-#define PBUF_IP_HLEN        20
-#endif
-
-typedef enum {
-  PBUF_TRANSPORT,
-  PBUF_IP,
-  PBUF_LINK,
-  PBUF_RAW_TX,
-  PBUF_RAW
-} pbuf_layer;
-
-typedef enum {
-  /** 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)
-      pbuf_alloc() allocates PBUF_RAM pbufs as unchained pbufs (although that might
-      change in future versions) */
-  PBUF_RAM,
-  /** 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 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 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) */
-  PBUF_POOL
-} pbuf_type;
-
-
-/** indicates this packet's data should be immediately passed to the application */
-#define PBUF_FLAG_PUSH      0x01U
-/** indicates this is a custom pbuf: pbuf_free calls pbuf_custom->custom_free_function()
-    when the last reference is released (plus custom PBUF_RAM cannot be trimmed) */
-#define PBUF_FLAG_IS_CUSTOM 0x02U
-/** indicates this pbuf is UDP multicast to be looped back */
-#define PBUF_FLAG_MCASTLOOP 0x04U
-/** indicates this pbuf was received as link-level broadcast */
-#define PBUF_FLAG_LLBCAST   0x08U
-/** indicates this pbuf was received as link-level multicast */
-#define PBUF_FLAG_LLMCAST   0x10U
-/** indicates this pbuf includes a TCP FIN flag */
-#define PBUF_FLAG_TCP_FIN   0x20U
-
-struct pbuf {
-  /** next pbuf in singly linked pbuf chain */
-  struct pbuf *next;
-
-  /** pointer to the actual data in the buffer */
-  void *payload;
-
-  /**
-   * total length of this buffer and all next buffers in chain
-   * belonging to the same packet.
-   *
-   * For non-queue packet chains this is the invariant:
-   * p->tot_len == p->len + (p->next? p->next->tot_len: 0)
-   */
-  u16_t tot_len;
-
-  /** length of this buffer */
-  u16_t len;
-
-  /** pbuf_type as u8_t instead of enum to save space */
-  u8_t /*pbuf_type*/ type;
-
-  /** misc flags */
-  u8_t flags;
-
-  /**
-   * 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->next pointers from a chain.
-   */
-  u16_t ref;
-
-#if ESP_LWIP
-  struct netif *l2_owner;
-  void *l2_buf;
-#endif
-};
-
-
-/** Helper struct for const-correctness only.
- * The only meaning of this one is to provide a const payload pointer
- * for PBUF_ROM type.
- */
-struct pbuf_rom {
-  /** next pbuf in singly linked pbuf chain */
-  struct pbuf *next;
-
-  /** pointer to the actual data in the buffer */
-  const void *payload;
-};
-
-#if LWIP_SUPPORT_CUSTOM_PBUF
-/** Prototype for a function to free a custom pbuf */
-typedef void (*pbuf_free_custom_fn)(struct pbuf *p);
-
-/** A custom pbuf: like a pbuf, but following a function pointer to free it. */
-struct pbuf_custom {
-  /** The actual pbuf */
-  struct pbuf pbuf;
-  /** This function is called when pbuf_free deallocates this pbuf(_custom) */
-  pbuf_free_custom_fn custom_free_function;
-};
-#endif /* LWIP_SUPPORT_CUSTOM_PBUF */
-
-
-/** Define this to 0 to prevent freeing ooseq pbufs when the PBUF_POOL is empty */
-#ifndef PBUF_POOL_FREE_OOSEQ
-#define PBUF_POOL_FREE_OOSEQ 1
-#endif /* PBUF_POOL_FREE_OOSEQ */
-#if LWIP_TCP && TCP_QUEUE_OOSEQ && NO_SYS && PBUF_POOL_FREE_OOSEQ
-extern volatile u8_t pbuf_free_ooseq_pending;
-void pbuf_free_ooseq(void);
-/** When not using sys_check_timeouts(), call PBUF_CHECK_FREE_OOSEQ()
-    at regular intervals from main level to check if ooseq pbufs need to be
-    freed! */
-#define PBUF_CHECK_FREE_OOSEQ() do { if(pbuf_free_ooseq_pending) { \
-  /* pbuf_alloc() reported PBUF_POOL to be empty -> try to free some \
-     ooseq queued pbufs now */ \
-  pbuf_free_ooseq(); }}while(0)
-#else /* LWIP_TCP && TCP_QUEUE_OOSEQ && NO_SYS && PBUF_POOL_FREE_OOSEQ */
-  /* Otherwise declare an empty PBUF_CHECK_FREE_OOSEQ */
-  #define PBUF_CHECK_FREE_OOSEQ()
-#endif /* LWIP_TCP && TCP_QUEUE_OOSEQ && NO_SYS && PBUF_POOL_FREE_OOSEQ*/
-
-/* Initializes the pbuf module. This call is empty for now, but may not be in future. */
-#define pbuf_init()
-
-struct pbuf *pbuf_alloc(pbuf_layer l, 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);
-u8_t pbuf_header(struct pbuf *p, s16_t header_size);
-u8_t pbuf_header_force(struct pbuf *p, s16_t header_size);
-void pbuf_ref(struct pbuf *p);
-u8_t pbuf_free(struct pbuf *p);
-u8_t pbuf_clen(struct pbuf *p);
-void pbuf_cat(struct pbuf *head, struct pbuf *tail);
-void pbuf_chain(struct pbuf *head, struct pbuf *tail);
-struct pbuf *pbuf_dechain(struct pbuf *p);
-err_t pbuf_copy(struct pbuf *p_to, struct pbuf *p_from);
-u16_t pbuf_copy_partial(struct pbuf *p, void *dataptr, 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);
-#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);
-#endif /* LWIP_CHECKSUM_ON_COPY */
-#if LWIP_TCP && TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
-void pbuf_split_64k(struct pbuf *p, struct pbuf **rest);
-#endif /* LWIP_TCP && TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */
-
-u8_t pbuf_get_at(struct pbuf* p, u16_t offset);
-void pbuf_put_at(struct pbuf* p, u16_t offset, u8_t data);
-u16_t pbuf_memcmp(struct pbuf* p, u16_t offset, const void* s2, u16_t n);
-u16_t pbuf_memfind(struct pbuf* p, const void* mem, u16_t mem_len, u16_t start_offset);
-u16_t pbuf_strstr(struct pbuf* p, const char* substr);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_HDR_PBUF_H */
diff --git a/components/lwip/include/lwip/lwip/pppapi.h b/components/lwip/include/lwip/lwip/pppapi.h
deleted file mode 100644 (file)
index 3ddf3da..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- */
-
-#ifndef __LWIP_PPPAPI_H__
-#define __LWIP_PPPAPI_H__
-
-#include "lwip/opt.h"
-
-#if LWIP_PPP_API /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/sys.h"
-#include "lwip/netif.h"
-#include "lwip/priv/tcpip_priv.h"
-#include "netif/ppp/ppp.h"
-#if PPPOS_SUPPORT
-#include "netif/ppp/pppos.h"
-#endif /* PPPOS_SUPPORT */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct pppapi_msg_msg {
-  ppp_pcb *ppp;
-  union {
-    struct {
-      u8_t authtype;
-      const char *user;
-      const char *passwd;
-    } setauth;
-#if PPP_NOTIFY_PHASE
-    struct {
-      ppp_notify_phase_cb_fn notify_phase_cb;
-    } setnotifyphasecb;
-#endif /* PPP_NOTIFY_PHASE */
-#if PPPOS_SUPPORT
-    struct {
-      struct netif *pppif;
-      pppos_output_cb_fn output_cb;
-      ppp_link_status_cb_fn link_status_cb;
-      void *ctx_cb;
-    } serialcreate;
-#endif /* PPPOS_SUPPORT */
-#if PPPOE_SUPPORT
-    struct {
-      struct netif *pppif;
-      struct netif *ethif;
-      const char *service_name;
-      const char *concentrator_name;
-      ppp_link_status_cb_fn link_status_cb;
-      void *ctx_cb;
-    } ethernetcreate;
-#endif /* PPPOE_SUPPORT */
-#if PPPOL2TP_SUPPORT
-    struct {
-      struct netif *pppif;
-      struct netif *netif;
-      ip_addr_t *ipaddr;
-      u16_t port;
-#if PPPOL2TP_AUTH_SUPPORT
-      const u8_t *secret;
-      u8_t secret_len;
-#endif /* PPPOL2TP_AUTH_SUPPORT */
-      ppp_link_status_cb_fn link_status_cb;
-      void *ctx_cb;
-    } l2tpcreate;
-#endif /* PPPOL2TP_SUPPORT */
-    struct {
-      u16_t holdoff;
-    } connect;
-#if PPP_SERVER
-    struct {
-      struct ppp_addrs *addrs;
-    } listen;
-#endif /* PPP_SERVER */
-    struct {
-      u8_t nocarrier;
-    } close;
-    struct {
-      u8_t cmd;
-      void *arg;
-    } ioctl;
-  } msg;
-};
-
-struct pppapi_msg {
-  struct tcpip_api_call call;
-  struct pppapi_msg_msg msg;
-};
-
-/* API for application */
-void pppapi_set_default(ppp_pcb *pcb);
-void pppapi_set_auth(ppp_pcb *pcb, u8_t authtype, const char *user, const char *passwd);
-#if PPP_NOTIFY_PHASE
-void pppapi_set_notify_phase_callback(ppp_pcb *pcb, ppp_notify_phase_cb_fn notify_phase_cb);
-#endif /* PPP_NOTIFY_PHASE */
-#if PPPOS_SUPPORT
-ppp_pcb *pppapi_pppos_create(struct netif *pppif, pppos_output_cb_fn output_cb, ppp_link_status_cb_fn link_status_cb, void *ctx_cb);
-#endif /* PPPOS_SUPPORT */
-#if PPPOE_SUPPORT
-ppp_pcb *pppapi_pppoe_create(struct netif *pppif, struct netif *ethif, const char *service_name,
-                                const char *concentrator_name, ppp_link_status_cb_fn link_status_cb,
-                                void *ctx_cb);
-#endif /* PPPOE_SUPPORT */
-#if PPPOL2TP_SUPPORT
-ppp_pcb *pppapi_pppol2tp_create(struct netif *pppif, struct netif *netif, ip_addr_t *ipaddr, u16_t port,
-                            const u8_t *secret, u8_t secret_len,
-                            ppp_link_status_cb_fn link_status_cb, void *ctx_cb);
-#endif /* PPPOL2TP_SUPPORT */
-err_t pppapi_connect(ppp_pcb *pcb, u16_t holdoff);
-#if PPP_SERVER
-err_t pppapi_listen(ppp_pcb *pcb, struct ppp_addrs *addrs);
-#endif /* PPP_SERVER */
-err_t pppapi_close(ppp_pcb *pcb, u8_t nocarrier);
-err_t pppapi_free(ppp_pcb *pcb);
-err_t pppapi_ioctl(ppp_pcb *pcb, u8_t cmd, void *arg);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_PPP_API */
-
-#endif /* __LWIP_PPPAPI_H__ */
diff --git a/components/lwip/include/lwip/lwip/priv/api_msg.h b/components/lwip/include/lwip/lwip/priv/api_msg.h
deleted file mode 100644 (file)
index a786b2e..0000000
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * 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_API_MSG_H
-#define LWIP_HDR_API_MSG_H
-
-#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 <stddef.h> /* for size_t */
-
-#include "lwip/ip_addr.h"
-#include "lwip/err.h"
-#include "lwip/sys.h"
-#include "lwip/igmp.h"
-#include "lwip/api.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if LWIP_MPU_COMPATIBLE
-#define API_MSG_M_DEF(m)      m
-#define API_MSG_M_DEF_C(t, m) t m
-#if LWIP_NETCONN_SEM_PER_THREAD
-#define API_MSG_M_DEF_SEM(m)  *m
-#else
-#define API_MSG_M_DEF_SEM(m)  API_MSG_M_DEF(m)
-#endif
-#else /* LWIP_MPU_COMPATIBLE */
-#define API_MSG_M_DEF(m)      *m
-#define API_MSG_M_DEF_C(t, m) const t * m
-#define API_MSG_M_DEF_SEM(m)  API_MSG_M_DEF(m)
-#endif /* LWIP_MPU_COMPATIBLE */
-
-/* For the netconn API, these values are use as a bitmask! */
-#define NETCONN_SHUT_RD   1
-#define NETCONN_SHUT_WR   2
-#define NETCONN_SHUT_RDWR (NETCONN_SHUT_RD | NETCONN_SHUT_WR)
-
-/* IP addresses and port numbers are expected to be in
- * the same byte order as in the corresponding pcb.
- */
-/** 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). */
-struct api_msg_msg {
-  /** The netconn which to process - always needed: it includes the semaphore
-      which is used to block the application thread until the function finished. */
-  struct netconn *conn;
-  /** The return value of the function executed in tcpip_thread. */
-  err_t err;
-  /** Depending on the executed function, one of these union members is used */
-  union {
-    /** used for lwip_netconn_do_send */
-    struct netbuf *b;
-    /** used for lwip_netconn_do_newconn */
-    struct {
-      u8_t proto;
-    } n;
-    /** used for lwip_netconn_do_bind and lwip_netconn_do_connect */
-    struct {
-      API_MSG_M_DEF_C(ip_addr_t, ipaddr);
-      u16_t port;
-    } bc;
-    /** used for lwip_netconn_do_getaddr */
-    struct {
-      ip_addr_t API_MSG_M_DEF(ipaddr);
-      u16_t API_MSG_M_DEF(port);
-      u8_t local;
-    } ad;
-    /** used for lwip_netconn_do_write */
-    struct {
-      const void *dataptr;
-      size_t len;
-      u8_t apiflags;
-#if LWIP_SO_SNDTIMEO
-      u32_t time_started;
-#endif /* LWIP_SO_SNDTIMEO */
-    } w;
-    /** used for lwip_netconn_do_recv */
-    struct {
-      u32_t len;
-    } r;
-#if LWIP_TCP
-    /** used for lwip_netconn_do_close (/shutdown) */
-    struct {
-      u8_t shut;
-#if LWIP_SO_SNDTIMEO || LWIP_SO_LINGER
-      u32_t time_started;
-#else /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */
-      u8_t polls_left;
-#endif /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */
-    } sd;
-#endif /* LWIP_TCP */
-#if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD)
-    /** used for lwip_netconn_do_join_leave_group */
-    struct {
-      API_MSG_M_DEF_C(ip_addr_t, multiaddr);
-      API_MSG_M_DEF_C(ip_addr_t, netif_addr);
-      enum netconn_igmp join_or_leave;
-    } jl;
-#endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */
-#if TCP_LISTEN_BACKLOG
-    struct {
-      u8_t backlog;
-    } lb;
-#endif /* TCP_LISTEN_BACKLOG */
-  } msg;
-#if LWIP_NETCONN_SEM_PER_THREAD
-  sys_sem_t* op_completed_sem;
-#endif /* LWIP_NETCONN_SEM_PER_THREAD */
-};
-
-#if LWIP_NETCONN_SEM_PER_THREAD
-#define LWIP_API_MSG_SEM(msg)          ((msg)->op_completed_sem)
-#else /* LWIP_NETCONN_SEM_PER_THREAD */
-#define LWIP_API_MSG_SEM(msg)          (&(msg)->conn->op_completed)
-#endif /* LWIP_NETCONN_SEM_PER_THREAD */
-
-
-/** This struct contains a function to execute in another thread context and
-    a struct api_msg_msg that serves as an argument for this function.
-    This is passed to tcpip_apimsg to execute functions in tcpip_thread context. */
-struct api_msg {
-  /** function to execute in tcpip_thread context */
-  void (* function)(void *msg);
-  /** arguments for this function */
-  struct api_msg_msg msg;
-};
-
-#if LWIP_DNS
-/** As lwip_netconn_do_gethostbyname requires more arguments but doesn't require a netconn,
-    it has its own struct (to avoid struct api_msg getting bigger than necessary).
-    lwip_netconn_do_gethostbyname must be called using tcpip_callback instead of tcpip_apimsg
-    (see netconn_gethostbyname). */
-struct dns_api_msg {
-  /** Hostname to query or dotted IP address string */
-#if LWIP_MPU_COMPATIBLE
-  char name[DNS_MAX_NAME_LENGTH];
-#else /* LWIP_MPU_COMPATIBLE */
-  const char *name;
-#endif /* LWIP_MPU_COMPATIBLE */
-  /** The resolved address is stored here */
-  ip_addr_t API_MSG_M_DEF(addr);
-#if LWIP_IPV4 && LWIP_IPV6
-  /** Type of resolve call */
-  u8_t dns_addrtype;
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-  /** This semaphore is posted when the name is resolved, the application thread
-      should wait on it. */
-  sys_sem_t API_MSG_M_DEF_SEM(sem);
-  /** Errors are given back here */
-  err_t API_MSG_M_DEF(err);
-};
-#endif /* LWIP_DNS */
-
-#if LWIP_NETCONN_SEM_PER_THREAD
-#if ESP_THREAD_SAFE
-#define LWIP_NETCONN_THREAD_SEM_GET() sys_thread_sem_get()
-#define LWIP_NETCONN_THREAD_SEM_ALLOC() sys_thread_sem_init()
-#define LWIP_NETCONN_THREAD_SEM_FREE() sys_thread_sem_deinit()
-#endif
-#endif
-
-#if LWIP_TCPIP_CORE_LOCKING
-#ifdef LWIP_DEBUG
-#define TCIP_APIMSG_SET_ERR(m, e) (m)->msg.err = e  /* catch functions that don't set err */
-#else
-#define TCIP_APIMSG_SET_ERR(m, e)
-#endif
-#if LWIP_NETCONN_SEM_PER_THREAD
-#define TCPIP_APIMSG_SET_SEM(m) ((m)->msg.op_completed_sem = LWIP_NETCONN_THREAD_SEM_GET())
-#else
-#define TCPIP_APIMSG_SET_SEM(m)
-#endif
-#define TCPIP_APIMSG_NOERR(m,f) do { \
-  TCIP_APIMSG_SET_ERR(m, ERR_VAL); \
-  TCPIP_APIMSG_SET_SEM(m); \
-  LOCK_TCPIP_CORE(); \
-  f(&((m)->msg)); \
-  UNLOCK_TCPIP_CORE(); \
-} while(0)
-#define TCPIP_APIMSG(m,f,e)   do { \
-  TCPIP_APIMSG_NOERR(m,f); \
-  (e) = (m)->msg.err; \
-} while(0)
-#define TCPIP_APIMSG_ACK(m)   NETCONN_SET_SAFE_ERR((m)->conn, (m)->err)
-#else /* LWIP_TCPIP_CORE_LOCKING */
-#define TCPIP_APIMSG_NOERR(m,f) do { (m)->function = f; tcpip_apimsg(m); } while(0)
-#define TCPIP_APIMSG(m,f,e)   do { (m)->function = f; (e) = tcpip_apimsg(m); } while(0)
-#define TCPIP_APIMSG_ACK(m)   do { NETCONN_SET_SAFE_ERR((m)->conn, (m)->err); sys_sem_signal(LWIP_API_MSG_SEM(m)); } while(0)
-
-#endif /* LWIP_TCPIP_CORE_LOCKING */
-
-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_connect         (void *m);
-void lwip_netconn_do_disconnect      (void *m);
-void lwip_netconn_do_listen          (void *m);
-void lwip_netconn_do_send            (void *m);
-void lwip_netconn_do_recv            (void *m);
-#if TCP_LISTEN_BACKLOG
-void lwip_netconn_do_accepted        (void *m);
-#endif
-void lwip_netconn_do_write           (void *m);
-void lwip_netconn_do_getaddr         (void *m);
-void lwip_netconn_do_close           (void *m);
-void lwip_netconn_do_shutdown        (void *m);
-#if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD)
-void lwip_netconn_do_join_leave_group(void *m);
-#endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */
-
-#if LWIP_DNS
-void lwip_netconn_do_gethostbyname(void *arg);
-#endif /* LWIP_DNS */
-
-struct netconn* netconn_alloc(enum netconn_type t, netconn_callback callback);
-void netconn_free(struct netconn *conn);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_NETCONN || LWIP_SOCKET */
-
-#endif /* LWIP_HDR_API_MSG_H */
diff --git a/components/lwip/include/lwip/lwip/priv/memp_priv.h b/components/lwip/include/lwip/lwip/priv/memp_priv.h
deleted file mode 100644 (file)
index abb5ebc..0000000
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * 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_MEMP_PRIV_H
-#define LWIP_HDR_MEMP_PRIV_H
-
-#include "lwip/opt.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-    
-#include "lwip/mem.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)
-
-#else /* MEMP_OVERFLOW_CHECK */
-
-/* No sanity checks
- * We don't need to preserve the struct memp while not allocated, so we
- * can save a little space and set MEMP_SIZE to 0.
- */
-#define MEMP_SIZE           0
-#define MEMP_ALIGN_SIZE(x) (LWIP_MEM_ALIGN_SIZE(x))
-
-#endif /* MEMP_OVERFLOW_CHECK */
-
-struct memp {
-  struct memp *next;
-#if MEMP_OVERFLOW_CHECK
-  const char *file;
-  int line;
-#endif /* MEMP_OVERFLOW_CHECK */
-};
-
-#if MEM_USE_POOLS
-/* Use a helper type to get the start and end of the user "memory pools" for mem_malloc */
-typedef enum {
-    /* Get the first (via:
-       MEMP_POOL_HELPER_START = ((u8_t) 1*MEMP_POOL_A + 0*MEMP_POOL_B + 0*MEMP_POOL_C + 0)*/
-    MEMP_POOL_HELPER_FIRST = ((u8_t)
-#define LWIP_MEMPOOL(name,num,size,desc)
-#define LWIP_MALLOC_MEMPOOL_START 1
-#define LWIP_MALLOC_MEMPOOL(num, size) * MEMP_POOL_##size + 0
-#define LWIP_MALLOC_MEMPOOL_END
-#include "lwip/priv/memp_std.h"
-    ) ,
-    /* Get the last (via:
-       MEMP_POOL_HELPER_END = ((u8_t) 0 + MEMP_POOL_A*0 + MEMP_POOL_B*0 + MEMP_POOL_C*1) */
-    MEMP_POOL_HELPER_LAST = ((u8_t)
-#define LWIP_MEMPOOL(name,num,size,desc)
-#define LWIP_MALLOC_MEMPOOL_START
-#define LWIP_MALLOC_MEMPOOL(num, size) 0 + MEMP_POOL_##size *
-#define LWIP_MALLOC_MEMPOOL_END 1
-#include "lwip/priv/memp_std.h"
-    )
-} memp_pool_helper_t;
-
-/* The actual start and stop values are here (cast them over)
-   We use this helper type and these defines so we can avoid using const memp_t values */
-#define MEMP_POOL_FIRST ((memp_t) MEMP_POOL_HELPER_FIRST)
-#define MEMP_POOL_LAST   ((memp_t) MEMP_POOL_HELPER_LAST)
-#endif /* MEM_USE_POOLS */
-
-struct memp_desc {
-  /** Element size */
-  u16_t size;
-
-#if !MEMP_MEM_MALLOC
-  /** Number of elements */
-  u16_t num;
-
-#if defined(LWIP_DEBUG) || MEMP_OVERFLOW_CHECK
-  /** Textual description */
-  const char *desc;
-#endif /* LWIP_DEBUG || MEMP_OVERFLOW_CHECK */
-
-  /** Base */
-  u8_t *base;  
-
-  /** First free element of each pool. Elements form a linked list. */
-  struct memp **tab;
-#endif /* MEMP_MEM_MALLOC */
-};
-
-#if (ESP_STATS_MEM == 1)
-extern uint32_t g_lwip_mem_cnt[MEMP_MAX][2];
-#define ESP_CNT_MEM_MALLOC_INC(type)  g_lwip_mem_cnt[type][0]++
-#define ESP_CNT_MEM_FREE_INC(type)    g_lwip_mem_cnt[type][1]++
-#else
-#define ESP_CNT_MEM_MALLOC_INC(type)
-#define ESP_CNT_MEM_FREE_INC(type)
-#endif
-
-
-#ifdef LWIP_DEBUG
-#define DECLARE_LWIP_MEMPOOL_DESC(desc) (desc),
-#else
-#define DECLARE_LWIP_MEMPOOL_DESC(desc)
-#endif
-
-void memp_init_pool(const struct memp_desc *desc);
-
-#if MEMP_OVERFLOW_CHECK
-void *memp_malloc_pool_fn(const struct memp_desc* desc, const char* file, const int line);
-#define memp_malloc_pool(d) memp_malloc_pool_fn((d), __FILE__, __LINE__)
-#else
-void *memp_malloc_pool(const struct memp_desc *desc);
-#endif
-void  memp_free_pool(const struct memp_desc* desc, void *mem);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_HDR_MEMP_PRIV_H */
diff --git a/components/lwip/include/lwip/lwip/priv/memp_std.h b/components/lwip/include/lwip/lwip/priv/memp_std.h
deleted file mode 100644 (file)
index 4def116..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * SETUP: Make sure we define everything we will need.
- *
- * We have create three types of pools:
- *   1) MEMPOOL - standard pools
- *   2) MALLOC_MEMPOOL - to be used by mem_malloc in mem.c
- *   3) PBUF_MEMPOOL - a mempool of pbuf's, so include space for the pbuf struct
- *
- * If the include'r doesn't require any special treatment of each of the types
- * above, then will declare #2 & #3 to be just standard mempools.
- */
-#ifndef LWIP_MALLOC_MEMPOOL
-/* This treats "malloc pools" just like any other pool.
-   The pools are a little bigger to provide 'size' as the amount of user data. */
-#define LWIP_MALLOC_MEMPOOL(num, size) LWIP_MEMPOOL(POOL_##size, num, (size + LWIP_MEM_ALIGN_SIZE(sizeof(struct memp_malloc_helper))), "MALLOC_"#size)
-#define LWIP_MALLOC_MEMPOOL_START
-#define LWIP_MALLOC_MEMPOOL_END
-#endif /* LWIP_MALLOC_MEMPOOL */
-
-#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)
-#endif /* LWIP_PBUF_MEMPOOL */
-
-
-/*
- * A list of internal pools used by LWIP.
- *
- * LWIP_MEMPOOL(pool_name, number_elements, element_size, pool_description)
- *     creates a pool name MEMP_pool_name. description is used in stats.c
- */
-#if LWIP_RAW
-LWIP_MEMPOOL(RAW_PCB,        MEMP_NUM_RAW_PCB,         sizeof(struct raw_pcb),        "RAW_PCB")
-#endif /* LWIP_RAW */
-
-#if LWIP_UDP
-LWIP_MEMPOOL(UDP_PCB,        MEMP_NUM_UDP_PCB,         sizeof(struct udp_pcb),        "UDP_PCB")
-#endif /* LWIP_UDP */
-
-#if LWIP_TCP
-LWIP_MEMPOOL(TCP_PCB,        MEMP_NUM_TCP_PCB,         sizeof(struct tcp_pcb),        "TCP_PCB")
-LWIP_MEMPOOL(TCP_PCB_LISTEN, MEMP_NUM_TCP_PCB_LISTEN,  sizeof(struct tcp_pcb_listen), "TCP_PCB_LISTEN")
-LWIP_MEMPOOL(TCP_SEG,        MEMP_NUM_TCP_SEG,         sizeof(struct tcp_seg),        "TCP_SEG")
-#endif /* LWIP_TCP */
-
-#if LWIP_IPV4 && IP_REASSEMBLY
-LWIP_MEMPOOL(REASSDATA,      MEMP_NUM_REASSDATA,       sizeof(struct ip_reassdata),   "REASSDATA")
-#endif /* LWIP_IPV4 && IP_REASSEMBLY */
-#if (IP_FRAG && !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF) || (LWIP_IPV6 && LWIP_IPV6_FRAG)
-LWIP_MEMPOOL(FRAG_PBUF,      MEMP_NUM_FRAG_PBUF,       sizeof(struct pbuf_custom_ref),"FRAG_PBUF")
-#endif /* IP_FRAG && !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF */
-
-#if LWIP_NETCONN || LWIP_SOCKET
-LWIP_MEMPOOL(NETBUF,         MEMP_NUM_NETBUF,          sizeof(struct netbuf),         "NETBUF")
-LWIP_MEMPOOL(NETCONN,        MEMP_NUM_NETCONN,         sizeof(struct netconn),        "NETCONN")
-#endif /* LWIP_NETCONN || LWIP_SOCKET */
-
-#if NO_SYS==0
-LWIP_MEMPOOL(TCPIP_MSG_API,  MEMP_NUM_TCPIP_MSG_API,   sizeof(struct tcpip_msg),      "TCPIP_MSG_API")
-#if LWIP_MPU_COMPATIBLE
-LWIP_MEMPOOL(API_MSG,        MEMP_NUM_API_MSG,         sizeof(struct api_msg),        "API_MSG")
-#if LWIP_DNS
-LWIP_MEMPOOL(DNS_API_MSG,    MEMP_NUM_DNS_API_MSG,     sizeof(struct dns_api_msg),    "DNS_API_MSG")
-#endif
-#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_NETIF_API
-LWIP_MEMPOOL(NETIFAPI_MSG,   MEMP_NUM_NETIFAPI_MSG,    sizeof(struct netifapi_msg),   "NETIFAPI_MSG")
-#endif
-#endif /* LWIP_MPU_COMPATIBLE */
-#if !LWIP_TCPIP_CORE_LOCKING_INPUT
-LWIP_MEMPOOL(TCPIP_MSG_INPKT,MEMP_NUM_TCPIP_MSG_INPKT, sizeof(struct tcpip_msg),      "TCPIP_MSG_INPKT")
-#endif /* !LWIP_TCPIP_CORE_LOCKING_INPUT */
-#endif /* NO_SYS==0 */
-
-#if LWIP_IPV4 && LWIP_ARP && ARP_QUEUEING
-LWIP_MEMPOOL(ARP_QUEUE,      MEMP_NUM_ARP_QUEUE,       sizeof(struct etharp_q_entry), "ARP_QUEUE")
-#endif /* LWIP_IPV4 && LWIP_ARP && ARP_QUEUEING */
-
-#if LWIP_IGMP
-LWIP_MEMPOOL(IGMP_GROUP,     MEMP_NUM_IGMP_GROUP,      sizeof(struct igmp_group),     "IGMP_GROUP")
-#endif /* LWIP_IGMP */
-
-#if (!NO_SYS || (NO_SYS && !NO_SYS_NO_TIMERS)) /* LWIP_TIMERS */
-LWIP_MEMPOOL(SYS_TIMEOUT,    MEMP_NUM_SYS_TIMEOUT,     sizeof(struct sys_timeo),      "SYS_TIMEOUT")
-#endif /* LWIP_TIMERS */
-
-#if LWIP_DNS && LWIP_SOCKET
-LWIP_MEMPOOL(NETDB,          MEMP_NUM_NETDB,           NETDB_ELEM_SIZE,               "NETDB")
-#endif /* LWIP_DNS && LWIP_SOCKET */
-#if LWIP_DNS && DNS_LOCAL_HOSTLIST && DNS_LOCAL_HOSTLIST_IS_DYNAMIC
-LWIP_MEMPOOL(LOCALHOSTLIST,  MEMP_NUM_LOCALHOSTLIST,   LOCALHOSTLIST_ELEM_SIZE,       "LOCALHOSTLIST")
-#endif /* LWIP_DNS && DNS_LOCAL_HOSTLIST && DNS_LOCAL_HOSTLIST_IS_DYNAMIC */
-
-#if PPP_SUPPORT
-LWIP_MEMPOOL(PPP_PCB,       MEMP_NUM_PPP_PCB,              sizeof(ppp_pcb),             "PPP_PCB")
-#if PPPOS_SUPPORT
-LWIP_MEMPOOL(PPPOS_PCB,     MEMP_NUM_PPPOS_INTERFACES,     sizeof(pppos_pcb),           "PPPOS_PCB")
-#endif /* PPPOS_SUPPORT */
-#if PPPOE_SUPPORT
-LWIP_MEMPOOL(PPPOE_IF,      MEMP_NUM_PPPOE_INTERFACES,     sizeof(struct pppoe_softc),  "PPPOE_IF")
-#endif /* PPPOE_SUPPORT */
-#if PPPOL2TP_SUPPORT
-LWIP_MEMPOOL(PPPOL2TP_PCB,  MEMP_NUM_PPPOL2TP_INTERFACES,  sizeof(pppol2tp_pcb),        "PPPOL2TP_PCB")
-#endif /* PPPOL2TP_SUPPORT */
-#endif /* PPP_SUPPORT */
-
-#if LWIP_IPV6 && LWIP_ND6_QUEUEING
-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")
-#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")
-#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */
-
-
-/*
- * A list of pools of pbuf's used by LWIP.
- *
- * LWIP_PBUF_MEMPOOL(pool_name, number_elements, pbuf_payload_size, pool_description)
- *     creates a pool name MEMP_pool_name. description is used in stats.c
- *     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_PBUF_MEMPOOL(PBUF_POOL, PBUF_POOL_SIZE,           PBUF_POOL_BUFSIZE,             "PBUF_POOL")
-
-
-/*
- * Allow for user-defined pools; this must be explicitly set in lwipopts.h
- * since the default is to NOT look for lwippools.h
- */
-#if MEMP_USE_CUSTOM_POOLS
-#include "lwippools.h"
-#endif /* MEMP_USE_CUSTOM_POOLS */
-
-/*
- * REQUIRED CLEANUP: Clear up so we don't get "multiply defined" error later
- * (#undef is ignored for something that is not defined)
- */
-#undef LWIP_MEMPOOL
-#undef LWIP_MALLOC_MEMPOOL
-#undef LWIP_MALLOC_MEMPOOL_START
-#undef LWIP_MALLOC_MEMPOOL_END
-#undef LWIP_PBUF_MEMPOOL
diff --git a/components/lwip/include/lwip/lwip/priv/tcp_priv.h b/components/lwip/include/lwip/lwip/priv/tcp_priv.h
deleted file mode 100644 (file)
index 0c49894..0000000
+++ /dev/null
@@ -1,545 +0,0 @@
-/*
- * 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_TCP_IMPL_H
-#define LWIP_HDR_TCP_IMPL_H
-
-#include "lwip/opt.h"
-
-#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/tcp.h"
-#include "lwip/mem.h"
-#include "lwip/pbuf.h"
-#include "lwip/ip.h"
-#include "lwip/icmp.h"
-#include "lwip/err.h"
-#include "lwip/ip6.h"
-#include "lwip/ip6_addr.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Functions for interfacing with TCP: */
-
-/* Lower layer interface to TCP: */
-void             tcp_init    (void);  /* Initialize this module. */
-void             tcp_tmr     (void);  /* Must be called every
-                                         TCP_TMR_INTERVAL
-                                         ms. (Typically 250 ms). */
-/* It is also possible to call these two functions at the right
-   intervals (instead of calling tcp_tmr()). */
-void             tcp_slowtmr (void);
-void             tcp_fasttmr (void);
-
-/* Call this from a netif driver (watch out for threading issues!) that has
-   returned a memory error on transmit and now has free buffers to send more.
-   This iterates all active pcbs that had an error and tries to call
-   tcp_output, so use this with care as it might slow down the system. */
-void             tcp_txnow   (void);
-
-/* Only used by IP to pass a TCP segment to TCP: */
-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_abandon (struct tcp_pcb *pcb, int reset);
-err_t            tcp_send_empty_ack(struct tcp_pcb *pcb);
-void             tcp_rexmit  (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);
-err_t            tcp_process_refused_data(struct tcp_pcb *pcb);
-
-/**
- * This is the Nagle algorithm: try to combine user data to send as few TCP
- * segments as possible. Only send if
- * - no previously transmitted data on the connection remains unacknowledged or
- * - the TF_NODELAY flag is set (nagle algorithm turned off for this pcb) or
- * - the only unsent segment is at least pcb->mss bytes long (or there is more
- *   than one unsent segment - with lwIP, this can happen although unsent->len < mss)
- * - or if we are in fast-retransmit (TF_INFR)
- */
-#define tcp_do_output_nagle(tpcb) ((((tpcb)->unacked == NULL) || \
-                            ((tpcb)->flags & (TF_NODELAY | TF_INFR)) || \
-                            (((tpcb)->unsent != NULL) && (((tpcb)->unsent->next != NULL) || \
-                              ((tpcb)->unsent->len >= (tpcb)->mss))) || \
-                            ((tcp_sndbuf(tpcb) == 0) || (tcp_sndqueuelen(tpcb) >= TCP_SND_QUEUELEN(tpcb))) \
-                            ) ? 1 : 0)
-#define tcp_output_nagle(tpcb) (tcp_do_output_nagle(tpcb) ? tcp_output(tpcb) : ERR_OK)
-
-
-#define TCP_SEQ_LT(a,b)     ((s32_t)((u32_t)(a) - (u32_t)(b)) < 0)
-#define TCP_SEQ_LEQ(a,b)    ((s32_t)((u32_t)(a) - (u32_t)(b)) <= 0)
-#define TCP_SEQ_GT(a,b)     ((s32_t)((u32_t)(a) - (u32_t)(b)) > 0)
-#define TCP_SEQ_GEQ(a,b)    ((s32_t)((u32_t)(a) - (u32_t)(b)) >= 0)
-/* is b<=a<=c? */
-#if 0 /* see bug #10548 */
-#define TCP_SEQ_BETWEEN(a,b,c) ((c)-(b) >= (a)-(b))
-#endif
-#define TCP_SEQ_BETWEEN(a,b,c) (TCP_SEQ_GEQ(a,b) && TCP_SEQ_LEQ(a,c))
-#define TCP_FIN 0x01U
-#define TCP_SYN 0x02U
-#define TCP_RST 0x04U
-#define TCP_PSH 0x08U
-#define TCP_ACK 0x10U
-#define TCP_URG 0x20U
-#define TCP_ECE 0x40U
-#define TCP_CWR 0x80U
-
-#define TCP_FLAGS 0x3fU
-
-/* Length of the TCP header, excluding options. */
-#define TCP_HLEN 20
-
-#ifndef TCP_TMR_INTERVAL
-#define TCP_TMR_INTERVAL       250  /* The TCP timer interval in milliseconds. */
-#endif /* TCP_TMR_INTERVAL */
-
-#ifndef TCP_FAST_INTERVAL
-#define TCP_FAST_INTERVAL      TCP_TMR_INTERVAL /* the fine grained timeout in milliseconds */
-#endif /* TCP_FAST_INTERVAL */
-
-#ifndef TCP_SLOW_INTERVAL
-#define TCP_SLOW_INTERVAL      (2*TCP_TMR_INTERVAL)  /* the coarse grained timeout in milliseconds */
-#endif /* TCP_SLOW_INTERVAL */
-
-#define TCP_FIN_WAIT_TIMEOUT 20000 /* milliseconds */
-#define TCP_SYN_RCVD_TIMEOUT 20000 /* milliseconds */
-
-#define TCP_OOSEQ_TIMEOUT        6U /* x RTO */
-
-#ifndef TCP_MSL
-#define TCP_MSL 60000UL /* The maximum segment lifetime in milliseconds */
-#endif
-
-/* Keepalive values, compliant with RFC 1122. Don't change this unless you know what you're doing */
-#ifndef  TCP_KEEPIDLE_DEFAULT
-#define  TCP_KEEPIDLE_DEFAULT     7200000UL /* Default KEEPALIVE timer in milliseconds */
-#endif
-
-#ifndef  TCP_KEEPINTVL_DEFAULT
-#define  TCP_KEEPINTVL_DEFAULT    75000UL   /* Default Time between KEEPALIVE probes in milliseconds */
-#endif
-
-#ifndef  TCP_KEEPCNT_DEFAULT
-#define  TCP_KEEPCNT_DEFAULT      9U        /* Default Counter for KEEPALIVE probes */
-#endif
-
-#define  TCP_MAXIDLE              TCP_KEEPCNT_DEFAULT * TCP_KEEPINTVL_DEFAULT  /* Maximum KEEPALIVE probe time */
-
-/* Fields are (of course) in network byte order.
- * Some fields are converted to host byte order in tcp_input().
- */
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct tcp_hdr {
-  PACK_STRUCT_FIELD(u16_t src);
-  PACK_STRUCT_FIELD(u16_t dest);
-  PACK_STRUCT_FIELD(u32_t seqno);
-  PACK_STRUCT_FIELD(u32_t ackno);
-  PACK_STRUCT_FIELD(u16_t _hdrlen_rsvd_flags);
-  PACK_STRUCT_FIELD(u16_t wnd);
-  PACK_STRUCT_FIELD(u16_t chksum);
-  PACK_STRUCT_FIELD(u16_t urgp);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
-#define TCPH_HDRLEN(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) >> 12)
-#define TCPH_FLAGS(phdr)  (ntohs((phdr)->_hdrlen_rsvd_flags) & TCP_FLAGS)
-
-#define TCPH_HDRLEN_SET(phdr, len) (phdr)->_hdrlen_rsvd_flags = htons(((len) << 12) | TCPH_FLAGS(phdr))
-#define TCPH_FLAGS_SET(phdr, flags) (phdr)->_hdrlen_rsvd_flags = (((phdr)->_hdrlen_rsvd_flags & PP_HTONS(~TCP_FLAGS)) | htons(flags))
-#define TCPH_HDRLEN_FLAGS_SET(phdr, len, flags) (phdr)->_hdrlen_rsvd_flags = htons(((len) << 12) | (flags))
-
-#define TCPH_SET_FLAG(phdr, flags ) (phdr)->_hdrlen_rsvd_flags = ((phdr)->_hdrlen_rsvd_flags | htons(flags))
-#define TCPH_UNSET_FLAG(phdr, flags) (phdr)->_hdrlen_rsvd_flags = ((phdr)->_hdrlen_rsvd_flags & ~htons(flags))
-
-#define TCP_TCPLEN(seg) ((seg)->len + (((TCPH_FLAGS((seg)->tcphdr) & (TCP_FIN | TCP_SYN)) != 0) ? 1U : 0U))
-
-/** Flags used on input processing, not on pcb->flags
-*/
-#define TF_RESET     (u8_t)0x08U   /* Connection was reset. */
-#define TF_CLOSED    (u8_t)0x10U   /* Connection was successfully closed. */
-#define TF_GOT_FIN   (u8_t)0x20U   /* Connection was closed by the remote end. */
-
-
-#if LWIP_EVENT_API
-
-#define TCP_EVENT_ACCEPT(pcb,err,ret)    ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\
-                LWIP_EVENT_ACCEPT, NULL, 0, err)
-#define TCP_EVENT_SENT(pcb,space,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\
-                   LWIP_EVENT_SENT, NULL, space, ERR_OK)
-#define TCP_EVENT_RECV(pcb,p,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\
-                LWIP_EVENT_RECV, (p), 0, (err))
-#define TCP_EVENT_CLOSED(pcb,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\
-                LWIP_EVENT_RECV, NULL, 0, ERR_OK)
-#define TCP_EVENT_CONNECTED(pcb,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\
-                LWIP_EVENT_CONNECTED, NULL, 0, (err))
-#define TCP_EVENT_POLL(pcb,ret)       ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\
-                LWIP_EVENT_POLL, NULL, 0, ERR_OK)
-#define TCP_EVENT_ERR(errf,arg,err)  lwip_tcp_event((arg), NULL, \
-                LWIP_EVENT_ERR, NULL, 0, (err))
-
-#else /* LWIP_EVENT_API */
-
-#define TCP_EVENT_ACCEPT(pcb,err,ret)                          \
-  do {                                                         \
-    if((pcb)->accept != NULL)                                  \
-      (ret) = (pcb)->accept((pcb)->callback_arg,(pcb),(err));  \
-    else (ret) = ERR_ARG;                                      \
-  } while (0)
-
-#define TCP_EVENT_SENT(pcb,space,ret)                          \
-  do {                                                         \
-    if((pcb)->sent != NULL)                                    \
-      (ret) = (pcb)->sent((pcb)->callback_arg,(pcb),(space));  \
-    else (ret) = ERR_OK;                                       \
-  } while (0)
-
-#define TCP_EVENT_RECV(pcb,p,err,ret)                          \
-  do {                                                         \
-    if((pcb)->recv != NULL) {                                  \
-      (ret) = (pcb)->recv((pcb)->callback_arg,(pcb),(p),(err));\
-    } else {                                                   \
-      (ret) = tcp_recv_null(NULL, (pcb), (p), (err));          \
-    }                                                          \
-  } while (0)
-
-#define TCP_EVENT_CLOSED(pcb,ret)                                \
-  do {                                                           \
-    if(((pcb)->recv != NULL)) {                                  \
-      (ret) = (pcb)->recv((pcb)->callback_arg,(pcb),NULL,ERR_OK);\
-    } else {                                                     \
-      (ret) = ERR_OK;                                            \
-    }                                                            \
-  } while (0)
-
-#define TCP_EVENT_CONNECTED(pcb,err,ret)                         \
-  do {                                                           \
-    if((pcb)->connected != NULL)                                 \
-      (ret) = (pcb)->connected((pcb)->callback_arg,(pcb),(err)); \
-    else (ret) = ERR_OK;                                         \
-  } while (0)
-
-#define TCP_EVENT_POLL(pcb,ret)                                \
-  do {                                                         \
-    if((pcb)->poll != NULL)                                    \
-      (ret) = (pcb)->poll((pcb)->callback_arg,(pcb));          \
-    else (ret) = ERR_OK;                                       \
-  } while (0)
-
-#define TCP_EVENT_ERR(errf,arg,err)                            \
-  do {                                                         \
-    if((errf) != NULL)                                         \
-      (errf)((arg),(err));                                     \
-  } while (0)
-
-#endif /* LWIP_EVENT_API */
-
-/** Enabled extra-check for TCP_OVERSIZE if LWIP_DEBUG is enabled */
-#if TCP_OVERSIZE && defined(LWIP_DEBUG)
-#define TCP_OVERSIZE_DBGCHECK 1
-#else
-#define TCP_OVERSIZE_DBGCHECK 0
-#endif
-
-/** Don't generate checksum on copy if CHECKSUM_GEN_TCP is disabled */
-#define TCP_CHECKSUM_ON_COPY  (LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_TCP)
-
-/* This structure represents a TCP segment on the unsent, unacked and ooseq queues */
-struct tcp_seg {
-  struct tcp_seg *next;    /* used when putting segments on a queue */
-  struct pbuf *p;          /* buffer containing data + TCP header */
-  u16_t len;               /* the TCP length of this segment */
-#if TCP_OVERSIZE_DBGCHECK
-  u16_t oversize_left;     /* Extra bytes available at the end of the last
-                              pbuf in unsent (used for asserting vs.
-                              tcp_pcb.unsent_oversized only) */
-#endif /* TCP_OVERSIZE_DBGCHECK */
-#if TCP_CHECKSUM_ON_COPY
-  u16_t chksum;
-  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_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 */
-  struct tcp_hdr *tcphdr;  /* the TCP header */
-};
-
-#define LWIP_TCP_OPT_EOL        0
-#define LWIP_TCP_OPT_NOP        1
-#define LWIP_TCP_OPT_MSS        2
-#define LWIP_TCP_OPT_WS         3
-#define LWIP_TCP_OPT_TS         8
-
-#define LWIP_TCP_OPT_LEN_MSS    4
-#if LWIP_TCP_TIMESTAMPS
-#define LWIP_TCP_OPT_LEN_TS     10
-#define LWIP_TCP_OPT_LEN_TS_OUT 12 /* aligned for output (includes NOP padding) */
-#else
-#define LWIP_TCP_OPT_LEN_TS_OUT 0
-#endif
-#if LWIP_WND_SCALE
-#define LWIP_TCP_OPT_LEN_WS     3
-#define LWIP_TCP_OPT_LEN_WS_OUT 4 /* aligned for output (includes NOP padding) */
-#else
-#define LWIP_TCP_OPT_LEN_WS_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)
-
-/** This returns a TCP header option for MSS in an u32_t */
-#define TCP_BUILD_MSS_OPTION(mss) htonl(0x02040000 | ((mss) & 0xFFFF))
-
-#if LWIP_WND_SCALE
-#define TCPWNDSIZE_F       U32_F
-#define TCPWND_MAX         0xFFFFFFFFU
-#define TCPWND_CHECK16(x)  LWIP_ASSERT("window size > 0xFFFF", (x) <= 0xFFFF)
-#define TCPWND_MIN16(x)    ((u16_t)LWIP_MIN((x), 0xFFFF))
-#else /* LWIP_WND_SCALE */
-#define TCPWNDSIZE_F       U16_F
-#define TCPWND_MAX         0xFFFFU
-#define TCPWND_CHECK16(x)
-#define TCPWND_MIN16(x)    x
-#endif /* LWIP_WND_SCALE */
-
-/* Global variables: */
-extern struct tcp_pcb *tcp_input_pcb;
-extern u32_t tcp_ticks;
-extern u8_t tcp_active_pcbs_changed;
-
-/* The TCP PCB lists. */
-union tcp_listen_pcbs_t { /* List of all TCP PCBs in LISTEN state. */
-  struct tcp_pcb_listen *listen_pcbs;
-  struct tcp_pcb *pcbs;
-};
-extern struct tcp_pcb *tcp_bound_pcbs;
-extern union tcp_listen_pcbs_t tcp_listen_pcbs;
-extern struct tcp_pcb *tcp_active_pcbs;  /* List of all TCP PCBs that are in a
-              state in which they accept or send
-              data. */
-extern struct tcp_pcb *tcp_tw_pcbs;      /* List of all TCP PCBs in TIME-WAIT. */
-
-#define NUM_TCP_PCB_LISTS_NO_TIME_WAIT  3
-#define NUM_TCP_PCB_LISTS               4
-extern struct tcp_pcb ** const tcp_pcb_lists[NUM_TCP_PCB_LISTS];
-
-/* Axioms about the above lists:
-   1) Every TCP PCB that is not CLOSED is in one of the lists.
-   2) A PCB is only in one of the lists.
-   3) All PCBs in the tcp_listen_pcbs list is in LISTEN state.
-   4) All PCBs in the tcp_tw_pcbs list is in TIME-WAIT state.
-*/
-/* Define two macros, TCP_REG and TCP_RMV that registers a TCP PCB
-   with a PCB list or removes a PCB from a list, respectively. */
-#ifndef TCP_DEBUG_PCB_LISTS
-#define TCP_DEBUG_PCB_LISTS 0
-#endif
-#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)); \
-                            for (tcp_tmp_pcb = *(pcbs); \
-          tcp_tmp_pcb != NULL; \
-        tcp_tmp_pcb = tcp_tmp_pcb->next) { \
-                                LWIP_ASSERT("TCP_REG: already registered\n", tcp_tmp_pcb != (npcb)); \
-                            } \
-                            LWIP_ASSERT("TCP_REG: pcb->state != CLOSED", ((pcbs) == &tcp_bound_pcbs) || ((npcb)->state != CLOSED)); \
-                            (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()); \
-              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))); \
-                            if(*(pcbs) == (npcb)) { \
-                               *(pcbs) = (*pcbs)->next; \
-                            } else for (tcp_tmp_pcb = *(pcbs); tcp_tmp_pcb != NULL; tcp_tmp_pcb = tcp_tmp_pcb->next) { \
-                               if(tcp_tmp_pcb->next == (npcb)) { \
-                                  tcp_tmp_pcb->next = (npcb)->next; \
-                                  break; \
-                               } \
-                            } \
-                            (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))); \
-                            } while(0)
-
-#else /* LWIP_DEBUG */
-
-#define TCP_REG(pcbs, npcb)                        \
-  do {                                             \
-    (npcb)->next = *pcbs;                          \
-    *(pcbs) = (npcb);                              \
-    tcp_timer_needed();                            \
-  } while (0)
-
-#define TCP_RMV(pcbs, npcb)                        \
-  do {                                             \
-    if(*(pcbs) == (npcb)) {                        \
-      (*(pcbs)) = (*pcbs)->next;                   \
-    }                                              \
-    else {                                         \
-      struct tcp_pcb *tcp_tmp_pcb;                 \
-      for (tcp_tmp_pcb = *pcbs;                    \
-          tcp_tmp_pcb != NULL;                     \
-          tcp_tmp_pcb = tcp_tmp_pcb->next) {       \
-        if(tcp_tmp_pcb->next == (npcb)) {          \
-          tcp_tmp_pcb->next = (npcb)->next;        \
-          break;                                   \
-        }                                          \
-      }                                            \
-    }                                              \
-    (npcb)->next = NULL;                           \
-  } while(0)
-
-#endif /* LWIP_DEBUG */
-
-#define TCP_REG_ACTIVE(npcb)                       \
-  do {                                             \
-    TCP_REG(&tcp_active_pcbs, npcb);               \
-    tcp_active_pcbs_changed = 1;                   \
-  } while (0)
-
-#define TCP_RMV_ACTIVE(npcb)                       \
-  do {                                             \
-    TCP_RMV(&tcp_active_pcbs, npcb);               \
-    tcp_active_pcbs_changed = 1;                   \
-  } while (0)
-
-#define TCP_PCB_REMOVE_ACTIVE(pcb)                 \
-  do {                                             \
-    tcp_pcb_remove(&tcp_active_pcbs, pcb);         \
-    tcp_active_pcbs_changed = 1;                   \
-  } while (0)
-
-
-/* Internal functions: */
-struct tcp_pcb *tcp_pcb_copy(struct tcp_pcb *pcb);
-void tcp_pcb_purge(struct tcp_pcb *pcb);
-void tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb);
-
-void tcp_segs_free(struct tcp_seg *seg);
-void tcp_seg_free(struct tcp_seg *seg);
-struct tcp_seg *tcp_seg_copy(struct tcp_seg *seg);
-
-#define tcp_ack(pcb)                               \
-  do {                                             \
-    if((pcb)->flags & TF_ACK_DELAY) {              \
-      (pcb)->flags &= ~TF_ACK_DELAY;               \
-      (pcb)->flags |= TF_ACK_NOW;                  \
-    }                                              \
-    else {                                         \
-      (pcb)->flags |= TF_ACK_DELAY;                \
-    }                                              \
-  } while (0)
-
-#define tcp_ack_now(pcb)                           \
-  do {                                             \
-    (pcb)->flags |= TF_ACK_NOW;                    \
-  } while (0)
-
-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,
-       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(void);
-
-err_t tcp_keepalive(struct tcp_pcb *pcb);
-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 */
-#endif /* TCP_CALCULATE_EFF_SEND_MSS */
-
-#if LWIP_CALLBACK_API
-err_t tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err);
-#endif /* LWIP_CALLBACK_API */
-
-#if TCP_DEBUG || TCP_INPUT_DEBUG || TCP_OUTPUT_DEBUG
-void tcp_debug_print(struct tcp_hdr *tcphdr);
-void tcp_debug_print_flags(u8_t flags);
-void tcp_debug_print_state(enum tcp_state s);
-void tcp_debug_print_pcbs(void);
-s16_t tcp_pcbs_sane(void);
-#else
-#  define tcp_debug_print(tcphdr)
-#  define tcp_debug_print_flags(flags)
-#  define tcp_debug_print_state(s)
-#  define tcp_debug_print_pcbs()
-#  define tcp_pcbs_sane() 1
-#endif /* TCP_DEBUG */
-
-/** External function (implemented in timers.c), called when TCP detects
- * that a timer is needed (i.e. active- or time-wait-pcb found). */
-void tcp_timer_needed(void);
-
-#if LWIP_IPV4
-void tcp_netif_ipv4_addr_changed(const ip4_addr_t* old_addr, const ip4_addr_t* new_addr);
-#endif /* LWIP_IPV4 */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_TCP */
-
-#endif /* LWIP_HDR_TCP_H */
diff --git a/components/lwip/include/lwip/lwip/priv/tcpip_priv.h b/components/lwip/include/lwip/lwip/priv/tcpip_priv.h
deleted file mode 100644 (file)
index cc1c54e..0000000
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * 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_TCPIP_PRIV_H
-#define LWIP_HDR_TCPIP_PRIV_H
-
-#include "lwip/opt.h"
-
-#if !NO_SYS /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/tcpip.h"
-#include "lwip/sys.h"
-#include "lwip/timers.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-  
-struct pbuf;
-struct netif;
-
-/** Define this to something that triggers a watchdog. This is called from
- * tcpip_thread after processing a message. */
-#ifndef LWIP_TCPIP_THREAD_ALIVE
-#define LWIP_TCPIP_THREAD_ALIVE()
-#endif
-
-#if LWIP_TCPIP_CORE_LOCKING
-/** The global semaphore to lock the stack. */
-extern sys_mutex_t lock_tcpip_core;
-#define LOCK_TCPIP_CORE()     sys_mutex_lock(&lock_tcpip_core)
-#define UNLOCK_TCPIP_CORE()   sys_mutex_unlock(&lock_tcpip_core)
-#else /* LWIP_TCPIP_CORE_LOCKING */
-#define LOCK_TCPIP_CORE()
-#define UNLOCK_TCPIP_CORE()
-#endif /* LWIP_TCPIP_CORE_LOCKING */
-
-#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) do { \
-                                          name = (type *)memp_malloc(pool); \
-                                          if (name == NULL) { \
-                                            return ERR_MEM; \
-                                          } \
-                                        } while(0)
-#define API_VAR_ALLOC_DONTFAIL(type, pool, name) do { \
-                                          name = (type *)memp_malloc(pool); \
-                                          LWIP_ASSERT("pool empty", name != NULL); \
-                                        } while(0)
-#define API_VAR_FREE(pool, name)        memp_free(pool, name)
-#define API_EXPR_REF(expr)              &(expr)
-#if LWIP_NETCONN_SEM_PER_THREAD
-#define API_EXPR_REF_SEM(expr)          (expr)
-#else
-#define API_EXPR_REF_SEM(expr)          API_EXPR_REF(expr)
-#endif
-#define API_EXPR_DEREF(expr)            expr
-#else /* LWIP_MPU_COMPATIBLE */
-#define API_VAR_REF(name)               name
-#define API_VAR_DECLARE(type, name)     type name
-#define API_VAR_ALLOC(type, pool, name)
-#define API_VAR_ALLOC_DONTFAIL(type, pool, name)
-#define API_VAR_FREE(pool, name)
-#define API_EXPR_REF(expr)              expr
-#define API_EXPR_REF_SEM(expr)          API_EXPR_REF(expr)
-#define API_EXPR_DEREF(expr)            *(expr)
-#endif /* LWIP_MPU_COMPATIBLE */
-
-#if !LWIP_TCPIP_CORE_LOCKING
-err_t tcpip_send_api_msg(tcpip_callback_fn fn, void *apimsg, sys_sem_t* sem);
-#endif /* !LWIP_TCPIP_CORE_LOCKING */
-
-struct tcpip_api_call;
-typedef err_t (*tcpip_api_call_fn)(struct tcpip_api_call* call);
-struct tcpip_api_call
-{
-  tcpip_api_call_fn function;
-#if !LWIP_TCPIP_CORE_LOCKING
-#if LWIP_NETCONN_SEM_PER_THREAD
-  sys_sem_t *sem;
-#else /* LWIP_NETCONN_SEM_PER_THREAD */
-  sys_sem_t sem;
-#endif /* LWIP_NETCONN_SEM_PER_THREAD */
-  err_t err;
-#endif /* !LWIP_TCPIP_CORE_LOCKING */
-};
-err_t tcpip_api_call(tcpip_api_call_fn fn, struct tcpip_api_call *call);
-
-enum tcpip_msg_type {
-  TCPIP_MSG_API,
-  TCPIP_MSG_API_CALL,
-  TCPIP_MSG_INPKT,
-#if LWIP_TCPIP_TIMEOUT
-  TCPIP_MSG_TIMEOUT,
-  TCPIP_MSG_UNTIMEOUT,
-#endif /* LWIP_TCPIP_TIMEOUT */
-  TCPIP_MSG_CALLBACK,
-  TCPIP_MSG_CALLBACK_STATIC
-};
-
-struct tcpip_msg {
-  enum tcpip_msg_type type;
-  union {
-    struct {
-      tcpip_callback_fn function;
-      void* msg;
-    } api;
-    struct tcpip_api_call *api_call;
-    struct {
-      struct pbuf *p;
-      struct netif *netif;
-      netif_input_fn input_fn;
-    } inp;
-    struct {
-      tcpip_callback_fn function;
-      void *ctx;
-    } cb;
-#if LWIP_TCPIP_TIMEOUT
-    struct {
-      u32_t msecs;
-      sys_timeout_handler h;
-      void *arg;
-    } tmo;
-#endif /* LWIP_TCPIP_TIMEOUT */
-  } msg;
-};
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* !NO_SYS */
-
-#endif /* LWIP_HDR_TCPIP_PRIV_H */
diff --git a/components/lwip/include/lwip/lwip/raw.h b/components/lwip/include/lwip/lwip/raw.h
deleted file mode 100644 (file)
index 474fdc1..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * 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_H
-#define LWIP_HDR_RAW_H
-
-#include "lwip/opt.h"
-
-#if LWIP_RAW /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/pbuf.h"
-#include "lwip/def.h"
-#include "lwip/ip.h"
-#include "lwip/ip_addr.h"
-#include "lwip/ip6_addr.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct raw_pcb;
-
-/** Function prototype for raw pcb receive callback functions.
- * @param arg user supplied argument (raw_pcb.recv_arg)
- * @param pcb the raw_pcb which received data
- * @param p the packet buffer that was received
- * @param addr the remote IP address from which the packet was received
- * @return 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.
- */
-typedef u8_t (*raw_recv_fn)(void *arg, struct raw_pcb *pcb, struct pbuf *p,
-    const ip_addr_t *addr);
-
-struct raw_pcb {
-  /* Common members of all PCB types */
-  IP_PCB;
-
-  struct raw_pcb *next;
-
-  u8_t protocol;
-
-  /** receive callback function */
-  raw_recv_fn recv;
-  /* user-supplied argument for the recv callback */
-  void *recv_arg;
-#if LWIP_IPV6
-  /* fields for handling checksum computations as per RFC3542. */
-  u16_t chksum_offset;
-  u8_t  chksum_reqd;
-#endif
-};
-
-/* The following functions is the application layer interface to the
-   RAW code. */
-struct raw_pcb * raw_new        (u8_t proto);
-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);
-err_t            raw_connect    (struct raw_pcb *pcb, const ip_addr_t *ipaddr);
-
-err_t            raw_sendto     (struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *ipaddr);
-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. */
-
-/* for compatibility with older implementation */
-#define raw_new_ip6(proto) raw_new_ip_type(IPADDR_TYPE_V6, proto)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_RAW */
-
-#endif /* LWIP_HDR_RAW_H */
diff --git a/components/lwip/include/lwip/lwip/sio.h b/components/lwip/include/lwip/lwip/sio.h
deleted file mode 100644 (file)
index 09cf799..0000000
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * 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.
- */
-
-/*
- * This is the interface to the platform specific serial IO module
- * It needs to be implemented by those platforms which need SLIP or PPP
- */
-
-#ifndef SIO_H
-#define SIO_H
-
-#include "lwip/arch.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* If you want to define sio_fd_t elsewhere or differently,
-   define this in your cc.h file. */
-#ifndef __sio_fd_t_defined
-typedef void * sio_fd_t;
-#endif
-
-/* The following functions can be defined to something else in your cc.h file
-   or be implemented in your custom sio.c file. */
-
-#ifndef sio_open
-/**
- * Opens a serial device for communication.
- *
- * @param devnum device number
- * @return handle to serial device if successful, NULL otherwise
- */
-sio_fd_t sio_open(u8_t devnum);
-#endif
-
-#ifndef sio_send
-/**
- * Sends a single character to the serial device.
- *
- * @param c character to send
- * @param fd serial device handle
- *
- * @note This function will block until the character can be sent.
- */
-void sio_send(u8_t c, sio_fd_t fd);
-#endif
-
-#ifndef sio_recv
-/**
- * Receives a single character from the serial device.
- *
- * @param fd serial device handle
- *
- * @note This function will block until a character is received.
- */
-u8_t sio_recv(sio_fd_t fd);
-#endif
-
-#ifndef sio_read
-/**
- * Reads from the serial device.
- *
- * @param fd serial device handle
- * @param data pointer to data buffer for receiving
- * @param len maximum length (in bytes) of data to receive
- * @return number of bytes actually received - may be 0 if aborted by sio_read_abort
- *
- * @note This function will block until data can be received. The blocking
- * can be cancelled by calling sio_read_abort().
- */
-u32_t sio_read(sio_fd_t fd, u8_t *data, u32_t len);
-#endif
-
-#ifndef sio_tryread
-/**
- * Tries to read from the serial device. Same as sio_read but returns
- * immediately if no data is available and never blocks.
- *
- * @param fd serial device handle
- * @param data pointer to data buffer for receiving
- * @param len maximum length (in bytes) of data to receive
- * @return number of bytes actually received
- */
-u32_t sio_tryread(sio_fd_t fd, u8_t *data, u32_t len);
-#endif
-
-#ifndef sio_write
-/**
- * Writes to the serial device.
- *
- * @param fd serial device handle
- * @param data pointer to data to send
- * @param len length (in bytes) of data to send
- * @return number of bytes actually sent
- *
- * @note This function will block until all data can be sent.
- */
-u32_t sio_write(sio_fd_t fd, u8_t *data, u32_t len);
-#endif
-
-#ifndef sio_read_abort
-/**
- * Aborts a blocking sio_read() call.
- *
- * @param fd serial device handle
- */
-void sio_read_abort(sio_fd_t fd);
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* SIO_H */
diff --git a/components/lwip/include/lwip/lwip/snmp.h b/components/lwip/include/lwip/lwip/snmp.h
deleted file mode 100644 (file)
index 07368cc..0000000
+++ /dev/null
@@ -1,195 +0,0 @@
-/**
- * @file
- * MIB2 callback functions called from throughout the stack to integrate a MIB2
- * into lwIP (together with MIB2_STATS).
- */
-
-/*
- * 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: Dirk Ziegelmeier <dziegel@gmx.de>
- *
- */
-#ifndef LWIP_HDR_SNMP_H
-#define LWIP_HDR_SNMP_H
-
-#include "lwip/opt.h"
-#include "lwip/ip_addr.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct udp_pcb;
-struct netif;
-
-/* MIB2 statistics functions */
-#if MIB2_STATS  /* don't build if not configured for use in lwipopts.h */
-/**
- * @see RFC1213, "MIB-II, 6. Definitions"
- */
-enum snmp_ifType {
-  snmp_ifType_other=1,                /* none of the following */
-  snmp_ifType_regular1822,
-  snmp_ifType_hdh1822,
-  snmp_ifType_ddn_x25,
-  snmp_ifType_rfc877_x25,
-  snmp_ifType_ethernet_csmacd,
-  snmp_ifType_iso88023_csmacd,
-  snmp_ifType_iso88024_tokenBus,
-  snmp_ifType_iso88025_tokenRing,
-  snmp_ifType_iso88026_man,
-  snmp_ifType_starLan,
-  snmp_ifType_proteon_10Mbit,
-  snmp_ifType_proteon_80Mbit,
-  snmp_ifType_hyperchannel,
-  snmp_ifType_fddi,
-  snmp_ifType_lapb,
-  snmp_ifType_sdlc,
-  snmp_ifType_ds1,                    /* T-1 */
-  snmp_ifType_e1,                     /* european equiv. of T-1 */
-  snmp_ifType_basicISDN,
-  snmp_ifType_primaryISDN,            /* proprietary serial */
-  snmp_ifType_propPointToPointSerial,
-  snmp_ifType_ppp,
-  snmp_ifType_softwareLoopback,
-  snmp_ifType_eon,                    /* CLNP over IP [11] */
-  snmp_ifType_ethernet_3Mbit,
-  snmp_ifType_nsip,                   /* XNS over IP */
-  snmp_ifType_slip,                   /* generic SLIP */
-  snmp_ifType_ultra,                  /* ULTRA technologies */
-  snmp_ifType_ds3,                    /* T-3 */
-  snmp_ifType_sip,                    /* SMDS */
-  snmp_ifType_frame_relay
-};
-
-/* This macro has a precision of ~49 days because sys_now returns u32_t. #define your own if you want ~490 days. */
-#ifndef MIB2_COPY_SYSUPTIME_TO
-#define MIB2_COPY_SYSUPTIME_TO(ptrToVal) (*(ptrToVal) = (sys_now() / 10))
-#endif
-
-#define MIB2_STATS_NETIF_INC(n, x)      do { ++(n)->mib2_counters.x; } while(0)
-#define MIB2_STATS_NETIF_ADD(n, x, val) do { (n)->mib2_counters.x += (val); } while(0)
-
-#define MIB2_INIT_NETIF(netif, type, speed) do { \
-  /* use "snmp_ifType" enum from snmp_mib2.h for "type", snmp_ifType_ethernet_csmacd by example */ \
-  (netif)->link_type = (type);  \
-  /* your link speed here (units: bits per second) */  \
-  (netif)->link_speed = (speed);\
-  (netif)->ts = 0;              \
-  (netif)->mib2_counters.ifinoctets = 0;      \
-  (netif)->mib2_counters.ifinucastpkts = 0;   \
-  (netif)->mib2_counters.ifinnucastpkts = 0;  \
-  (netif)->mib2_counters.ifindiscards = 0;    \
-  (netif)->mib2_counters.ifinerrors = 0;    \
-  (netif)->mib2_counters.ifinunknownprotos = 0;    \
-  (netif)->mib2_counters.ifoutoctets = 0;     \
-  (netif)->mib2_counters.ifoutucastpkts = 0;  \
-  (netif)->mib2_counters.ifoutnucastpkts = 0; \
-  (netif)->mib2_counters.ifoutdiscards = 0; \
-  (netif)->mib2_counters.ifouterrors = 0; } while(0)
-#else /* MIB2_STATS */
-#ifndef MIB2_COPY_SYSUPTIME_TO
-#define MIB2_COPY_SYSUPTIME_TO(ptrToVal)
-#endif
-#define MIB2_INIT_NETIF(netif, type, speed)
-#define MIB2_STATS_NETIF_INC(n, x)
-#define MIB2_STATS_NETIF_ADD(n, x, val)
-#endif /* MIB2_STATS */
-
-/* LWIP MIB2 callbacks */
-#if LWIP_MIB2_CALLBACKS /* don't build if not configured for use in lwipopts.h */
-/* network interface */
-void mib2_netif_added(struct netif *ni);
-void mib2_netif_removed(struct netif *ni);
-
-#if LWIP_IPV4 && LWIP_ARP
-/* ARP (for atTable and ipNetToMediaTable) */
-void mib2_add_arp_entry(struct netif *ni, ip4_addr_t *ip);
-void mib2_remove_arp_entry(struct netif *ni, ip4_addr_t *ip);
-#else /* LWIP_IPV4 && LWIP_ARP */
-#define mib2_add_arp_entry(ni,ip)
-#define mib2_remove_arp_entry(ni,ip)
-#endif /* LWIP_IPV4 && LWIP_ARP */
-
-/* IP */
-#if LWIP_IPV4
-void mib2_add_ip4(struct netif *ni);
-void mib2_remove_ip4(struct netif *ni);
-void mib2_add_route_ip4(u8_t dflt, struct netif *ni);
-void mib2_remove_route_ip4(u8_t dflt, struct netif *ni);
-#endif /* LWIP_IPV4 */
-
-/* UDP */
-#if LWIP_UDP
-void mib2_udp_bind(struct udp_pcb *pcb);
-void mib2_udp_unbind(struct udp_pcb *pcb);
-#endif /* LWIP_UDP */
-
-#else /* LWIP_MIB2_CALLBACKS */
-/* LWIP_MIB2_CALLBACKS support not available */
-/* define everything to be empty */
-
-/* network interface */
-#define mib2_netif_added(ni)
-#define mib2_netif_removed(ni)
-
-/* ARP */
-#define mib2_add_arp_entry(ni,ip)
-#define mib2_remove_arp_entry(ni,ip)
-
-/* IP */
-#define mib2_add_ip4(ni)
-#define mib2_remove_ip4(ni)
-#define mib2_add_route_ip4(dflt, ni)
-#define mib2_remove_route_ip4(dflt, ni)
-
-/* UDP */
-#define mib2_udp_bind(pcb)
-#define mib2_udp_unbind(pcb)
-#endif /* LWIP_MIB2_CALLBACKS */
-
-/* for source-code compatibility reasons only, can be removed (not used internally) */
-#define NETIF_INIT_SNMP                MIB2_INIT_NETIF
-#define snmp_add_ifinoctets(ni,value)  MIB2_STATS_NETIF_ADD(ni, ifinoctets, value)
-#define snmp_inc_ifinucastpkts(ni)     MIB2_STATS_NETIF_INC(ni, ifinucastpkts)
-#define snmp_inc_ifinnucastpkts(ni)    MIB2_STATS_NETIF_INC(ni, ifinnucastpkts)
-#define snmp_inc_ifindiscards(ni)      MIB2_STATS_NETIF_INC(ni, ifindiscards)
-#define snmp_inc_ifinerrors(ni)        MIB2_STATS_NETIF_INC(ni, ifinerrors)
-#define snmp_inc_ifinunknownprotos(ni) MIB2_STATS_NETIF_INC(ni, ifinunknownprotos)
-#define snmp_add_ifoutoctets(ni,value) MIB2_STATS_NETIF_ADD(ni, ifoutoctets, value)
-#define snmp_inc_ifoutucastpkts(ni)    MIB2_STATS_NETIF_INC(ni, ifoutucastpkts)
-#define snmp_inc_ifoutnucastpkts(ni)   MIB2_STATS_NETIF_INC(ni, ifoutnucastpkts)
-#define snmp_inc_ifoutdiscards(ni)     MIB2_STATS_NETIF_INC(ni, ifoutdiscards)
-#define snmp_inc_ifouterrors(ni)       MIB2_STATS_NETIF_INC(ni, ifouterrors)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_HDR_SNMP_H */
diff --git a/components/lwip/include/lwip/lwip/sockets.h b/components/lwip/include/lwip/lwip/sockets.h
deleted file mode 100644 (file)
index ecc219b..0000000
+++ /dev/null
@@ -1,717 +0,0 @@
-/*
- * 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_SOCKETS_H
-#define LWIP_HDR_SOCKETS_H
-
-#include "lwip/opt.h"
-
-#if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */
-
-#include <stddef.h> /* for size_t */
-#include <string.h> /* for FD_ZERO */
-
-#include "lwip/ip_addr.h"
-#include "lwip/err.h"
-#include "lwip/inet.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* If your port already typedef's sa_family_t, define SA_FAMILY_T_DEFINED
-   to prevent this code from redefining it. */
-#if !defined(sa_family_t) && !defined(SA_FAMILY_T_DEFINED)
-typedef u8_t sa_family_t;
-#endif
-/* If your port already typedef's in_port_t, define IN_PORT_T_DEFINED
-   to prevent this code from redefining it. */
-#if !defined(in_port_t) && !defined(IN_PORT_T_DEFINED)
-typedef u16_t in_port_t;
-#endif
-
-#if LWIP_IPV4
-/* members are in network byte order */
-struct sockaddr_in {
-  u8_t            sin_len;
-  sa_family_t     sin_family;
-  in_port_t       sin_port;
-  struct in_addr  sin_addr;
-#define SIN_ZERO_LEN 8
-  char            sin_zero[SIN_ZERO_LEN];
-};
-#endif /* LWIP_IPV4 */
-
-#if LWIP_IPV6
-struct sockaddr_in6 {
-  u8_t            sin6_len;      /* length of this structure    */
-  sa_family_t     sin6_family;   /* AF_INET6                    */
-  in_port_t       sin6_port;     /* Transport layer port #      */
-  u32_t           sin6_flowinfo; /* IPv6 flow information       */
-  struct in6_addr sin6_addr;     /* IPv6 address                */
-  u32_t           sin6_scope_id; /* Set of interfaces for scope */
-};
-#endif /* LWIP_IPV6 */
-
-struct sockaddr {
-  u8_t        sa_len;
-  sa_family_t sa_family;
-  char        sa_data[14];
-};
-
-struct sockaddr_storage {
-  u8_t        s2_len;
-  sa_family_t ss_family;
-  char        s2_data1[2];
-  u32_t       s2_data2[3];
-#if LWIP_IPV6
-  u32_t       s2_data3[3];
-#endif /* LWIP_IPV6 */
-};
-
-/* If your port already typedef's socklen_t, define SOCKLEN_T_DEFINED
-   to prevent this code from redefining it. */
-#if !defined(socklen_t) && !defined(SOCKLEN_T_DEFINED)
-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(iovec)
-struct iovec {
-  void  *iov_base;
-  size_t iov_len;
-};
-#endif
-
-struct msghdr {
-  void         *msg_name;
-  socklen_t     msg_namelen;
-  struct iovec *msg_iov;
-  int           msg_iovlen;
-  void         *msg_control;
-  socklen_t     msg_controllen;
-  int           msg_flags;
-};
-
-/* Socket protocol types (TCP/UDP/RAW) */
-#define SOCK_STREAM     1
-#define SOCK_DGRAM      2
-#define SOCK_RAW        3
-
-/*
- * Option flags per-socket. These must match the SOF_ flags in ip.h (checked in init.c)
- */
-#define SO_REUSEADDR   0x0004 /* Allow local address reuse */
-#define SO_KEEPALIVE   0x0008 /* keep connections alive */
-#define SO_BROADCAST   0x0020 /* permit to send and to receive broadcast messages (see IP_SOF_BROADCAST option) */
-
-
-/*
- * 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 */
-
-/*
- * Structure used for manipulating linger option.
- */
-struct linger {
-       int l_onoff;                /* option on/off */
-       int l_linger;               /* linger time in seconds */
-};
-
-/*
- * Level number for (get/set)sockopt() to apply to socket itself.
- */
-#define  SOL_SOCKET  0xfff    /* options for socket level */
-
-
-#define AF_UNSPEC       0
-#define AF_INET         2
-#if LWIP_IPV6
-#define AF_INET6        10
-#else /* LWIP_IPV6 */
-#define AF_INET6        AF_UNSPEC
-#endif /* LWIP_IPV6 */
-#define PF_INET         AF_INET
-#define PF_INET6        AF_INET6
-#define PF_UNSPEC       AF_UNSPEC
-
-#define IPPROTO_IP      0
-#define IPPROTO_ICMP    1
-#define IPPROTO_TCP     6
-#define IPPROTO_UDP     17
-#if LWIP_IPV6
-#define IPPROTO_IPV6    41
-#define IPPROTO_ICMPV6  58
-#endif /* LWIP_IPV6 */
-#define IPPROTO_UDPLITE 136
-#define IPPROTO_RAW     255
-
-/* Flags we can use with send and recv. */
-#define MSG_PEEK       0x01    /* Peeks at an incoming message */
-#define MSG_WAITALL    0x02    /* Unimplemented: Requests that the function block until the full amount of data requested can be returned */
-#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 */
-
-
-/*
- * Options for level IPPROTO_IP
- */
-#define IP_TOS             1
-#define IP_TTL             2
-
-#if LWIP_TCP
-/*
- * Options for level IPPROTO_TCP
- */
-#define TCP_NODELAY    0x01    /* don't delay send to coalesce packets */
-#define TCP_KEEPALIVE  0x02    /* send KEEPALIVE probes when idle for pcb->keep_idle milliseconds */
-#define TCP_KEEPIDLE   0x03    /* set pcb->keep_idle  - Same as TCP_KEEPALIVE, but use seconds for get/setsockopt */
-#define TCP_KEEPINTVL  0x04    /* set pcb->keep_intvl - Use seconds for get/setsockopt */
-#define TCP_KEEPCNT    0x05    /* set pcb->keep_cnt   - Use number of probes sent for get/setsockopt */
-#if ESP_PER_SOC_TCP_WND
-#define TCP_WINDOW     0x06    /* set pcb->per_soc_tcp_wnd */
-#define TCP_SNDBUF     0x07    /* set pcb->per_soc_tcp_snd_buf */
-#endif
-
-#endif /* LWIP_TCP */
-
-#if LWIP_IPV6
-/*
- * Options for level IPPROTO_IPV6
- */
-#define IPV6_CHECKSUM       7  /* RFC3542: calculate and insert the ICMPv6 checksum for raw sockets. */
-#define IPV6_V6ONLY         27 /* RFC3493: boolean control to restrict AF_INET6 sockets to IPv6 communications only. */
-
-#if LWIP_IPV6_MLD
-/* Socket options for IPV6 multicast, uses the MLD interface to manage group memberships. RFC2133. */
-#define IPV6_MULTICAST_IF 0x300
-#define IPV6_MULTICAST_HOPS 0x301
-#define IPV6_MULTICAST_LOOP 0x302
-#define IPV6_ADD_MEMBERSHIP 0x303
-#define IPV6_DROP_MEMBERSHIP 0x304
-
-/* Structure used for IPV6_ADD/DROP_MEMBERSHIP */
-typedef struct ip6_mreq {
-    struct in6_addr ipv6mr_multiaddr; /* IPv6 multicast addr */
-    struct in6_addr ipv6mr_interface; /* local IP address of interface */
-} ip6_mreq;
-
-/* Commonly used synonyms for these options */
-#define IPV6_JOIN_GROUP IPV6_ADD_MEMBERSHIP
-#define IPV6_LEAVE_GROUP IPV6_DROP_MEMBERSHIP
-
-#endif /* LWIP_IPV6_MLD */
-
-#endif /* LWIP_IPV6 */
-
-#if LWIP_UDP && LWIP_UDPLITE
-/*
- * Options for level IPPROTO_UDPLITE
- */
-#define UDPLITE_SEND_CSCOV 0x01 /* sender checksum coverage */
-#define UDPLITE_RECV_CSCOV 0x02 /* minimal receiver checksum coverage */
-#endif /* LWIP_UDP && LWIP_UDPLITE*/
-
-
-#if LWIP_MULTICAST_TX_OPTIONS
-/*
- * Options and types for UDP multicast traffic handling
- */
-#define IP_MULTICAST_TTL   5
-#define IP_MULTICAST_IF    6
-#define IP_MULTICAST_LOOP  7
-#endif /* LWIP_MULTICAST_TX_OPTIONS */
-
-#if LWIP_IGMP
-/*
- * Options and types related to multicast membership
- */
-#define IP_ADD_MEMBERSHIP  3
-#define IP_DROP_MEMBERSHIP 4
-
-typedef struct ip_mreq {
-    struct in_addr imr_multiaddr; /* IP multicast address of group */
-    struct in_addr imr_interface; /* local IP address of interface */
-} ip_mreq;
-#endif /* LWIP_IGMP */
-
-/*
- * The Type of Service provides an indication of the abstract
- * parameters of the quality of service desired.  These parameters are
- * to be used to guide the selection of the actual service parameters
- * when transmitting a datagram through a particular network.  Several
- * networks offer service precedence, which somehow treats high
- * precedence traffic as more important than other traffic (generally
- * by accepting only traffic above a certain precedence at time of high
- * load).  The major choice is a three way tradeoff between low-delay,
- * high-reliability, and high-throughput.
- * The use of the Delay, Throughput, and Reliability indications may
- * increase the cost (in some sense) of the service.  In many networks
- * better performance for one of these parameters is coupled with worse
- * performance on another.  Except for very unusual cases at most two
- * of these three indications should be set.
- */
-#define IPTOS_TOS_MASK          0x1E
-#define IPTOS_TOS(tos)          ((tos) & IPTOS_TOS_MASK)
-#define IPTOS_LOWDELAY          0x10
-#define IPTOS_THROUGHPUT        0x08
-#define IPTOS_RELIABILITY       0x04
-#define IPTOS_LOWCOST           0x02
-#define IPTOS_MINCOST           IPTOS_LOWCOST
-
-/*
- * The Network Control precedence designation is intended to be used
- * within a network only.  The actual use and control of that
- * designation is up to each network. The Internetwork Control
- * designation is intended for use by gateway control originators only.
- * If the actual use of these precedence designations is of concern to
- * a particular network, it is the responsibility of that network to
- * control the access to, and use of, those precedence designations.
- */
-#define IPTOS_PREC_MASK                 0xe0
-#define IPTOS_PREC(tos)                ((tos) & IPTOS_PREC_MASK)
-#define IPTOS_PREC_NETCONTROL           0xe0
-#define IPTOS_PREC_INTERNETCONTROL      0xc0
-#define IPTOS_PREC_CRITIC_ECP           0xa0
-#define IPTOS_PREC_FLASHOVERRIDE        0x80
-#define IPTOS_PREC_FLASH                0x60
-#define IPTOS_PREC_IMMEDIATE            0x40
-#define IPTOS_PREC_PRIORITY             0x20
-#define IPTOS_PREC_ROUTINE              0x00
-
-
-/*
- * Commands for ioctlsocket(),  taken from the BSD file fcntl.h.
- * lwip_ioctl only supports FIONREAD and FIONBIO, for now
- *
- * Ioctl's have the command encoded in the lower word,
- * and the size of any in or out parameters in the upper
- * word.  The high 2 bits of the upper word are used
- * to encode the in/out status of the parameter; for now
- * we restrict parameters to at most 128 bytes.
- */
-#if !defined(FIONREAD) || !defined(FIONBIO)
-#define IOCPARM_MASK    0x7fU           /* parameters must be < 128 bytes */
-#define IOC_VOID        0x20000000UL    /* no parameters */
-#define IOC_OUT         0x40000000UL    /* copy out parameters */
-#define IOC_IN          0x80000000UL    /* copy in parameters */
-#define IOC_INOUT       (IOC_IN|IOC_OUT)
-                                        /* 0x20000000 distinguishes new &
-                                           old ioctl's */
-#define _IO(x,y)        (IOC_VOID|((x)<<8)|(y))
-
-#define _IOR(x,y,t)     (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
-
-#define _IOW(x,y,t)     (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
-#endif /* !defined(FIONREAD) || !defined(FIONBIO) */
-
-#ifndef FIONREAD
-#define FIONREAD    _IOR('f', 127, unsigned long) /* get # bytes to read */
-#endif
-#ifndef FIONBIO
-#define FIONBIO     _IOW('f', 126, unsigned long) /* set/clear non-blocking i/o */
-#endif
-
-/* Socket I/O Controls: unimplemented */
-#ifndef SIOCSHIWAT
-#define SIOCSHIWAT  _IOW('s',  0, unsigned long)  /* set high watermark */
-#define SIOCGHIWAT  _IOR('s',  1, unsigned long)  /* get high watermark */
-#define SIOCSLOWAT  _IOW('s',  2, unsigned long)  /* set low watermark */
-#define SIOCGLOWAT  _IOR('s',  3, unsigned long)  /* get low watermark */
-#define SIOCATMARK  _IOR('s',  7, unsigned long)  /* at oob mark? */
-#endif
-
-/* commands for fnctl */
-#ifndef F_GETFL
-#define F_GETFL 3
-#endif
-#ifndef F_SETFL
-#define F_SETFL 4
-#endif
-
-/* File status flags and file access modes for fnctl,
-   these are bits in an int. */
-#ifndef O_NONBLOCK
-#define O_NONBLOCK  1 /* nonblocking I/O */
-#endif
-#ifndef O_NDELAY
-#define O_NDELAY    1 /* same as O_NONBLOCK, for compatibility */
-#endif
-
-#ifndef SHUT_RD
-  #define SHUT_RD   0
-  #define SHUT_WR   1
-  #define SHUT_RDWR 2
-#endif
-
-/* FD_SET used for lwip_select */
-#ifndef FD_SET
-#undef  FD_SETSIZE
-/* Make FD_SETSIZE match NUM_SOCKETS in socket.c */
-#define FD_SETSIZE    MEMP_NUM_NETCONN
-#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_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)))
-
-typedef struct fd_set
-{
-  unsigned char fd_bits [(FD_SETSIZE+7)/8];
-} fd_set;
-
-#endif /* FD_SET */
-
-/** 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
-#define LWIP_TIMEVAL_PRIVATE 1
-#endif
-
-#if LWIP_TIMEVAL_PRIVATE
-struct timeval {
-  long    tv_sec;         /* seconds */
-  long    tv_usec;        /* and microseconds */
-};
-#endif /* LWIP_TIMEVAL_PRIVATE */
-
-#define lwip_socket_init() /* Compatibility define, no init needed. */
-void lwip_socket_thread_init(void); /* LWIP_NETCONN_SEM_PER_THREAD==1: initialize thread-local semaphore */
-void lwip_socket_thread_cleanup(void); /* LWIP_NETCONN_SEM_PER_THREAD==1: destroy thread-local semaphore */
-
-#if LWIP_COMPAT_SOCKETS == 2
-
-
-/* This helps code parsers/code completion by not having the COMPAT functions as defines */
-#define lwip_accept       accept
-#define lwip_bind         bind
-#define lwip_shutdown     shutdown
-#define lwip_getpeername  getpeername
-#define lwip_getsockname  getsockname
-#define lwip_setsockopt   setsockopt
-#define lwip_getsockopt   getsockopt
-#define lwip_close        closesocket
-#define lwip_connect      connect
-#define lwip_listen       listen
-#define lwip_recv         recv
-#define lwip_recvfrom     recvfrom
-#define lwip_send         send
-#define lwip_sendmsg      sendmsg
-#define lwip_sendto       sendto
-#define lwip_socket       socket
-#define lwip_select       select
-#define lwip_ioctlsocket  ioctl
-
-#if LWIP_POSIX_SOCKETS_IO_NAMES
-#define lwip_read         read
-#define lwip_write        write
-#define lwip_writev       writev
-#undef lwip_close
-#define lwip_close        close
-#define closesocket(s)    close(s)
-#define lwip_fcntl        fcntl
-#define lwip_ioctl        ioctl
-#endif /* LWIP_POSIX_SOCKETS_IO_NAMES */
-#endif /* LWIP_COMPAT_SOCKETS == 2 */
-
-int lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen);
-int lwip_bind(int s, const struct sockaddr *name, socklen_t namelen);
-int lwip_shutdown(int s, int how);
-int lwip_getpeername (int s, struct sockaddr *name, socklen_t *namelen);
-int lwip_getsockname (int s, struct sockaddr *name, socklen_t *namelen);
-int lwip_getsockopt (int s, int level, int optname, void *optval, socklen_t *optlen);
-int lwip_setsockopt (int s, int level, int optname, const void *optval, socklen_t optlen);
-int lwip_close(int s);
-int lwip_connect(int s, const struct sockaddr *name, socklen_t namelen);
-int lwip_listen(int s, int backlog);
-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,
-      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,
-    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);
-int lwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,
-                struct timeval *timeout);
-int lwip_ioctl(int s, long cmd, void *argp);
-int lwip_fcntl(int s, int cmd, int val);
-
-#if LWIP_COMPAT_SOCKETS
-#if LWIP_COMPAT_SOCKETS != 2
-
-#if ESP_THREAD_SAFE
-int lwip_accept_r(int s, struct sockaddr *addr, socklen_t *addrlen);
-int lwip_bind_r(int s, const struct sockaddr *name, socklen_t namelen);
-int lwip_shutdown_r(int s, int how);
-int lwip_getpeername_r (int s, struct sockaddr *name, socklen_t *namelen);
-int lwip_getsockname_r (int s, struct sockaddr *name, socklen_t *namelen);
-int lwip_getsockopt_r (int s, int level, int optname, void *optval, socklen_t *optlen);
-int lwip_setsockopt_r (int s, int level, int optname, const void *optval, socklen_t optlen);
-int lwip_close_r(int s);
-int lwip_connect_r(int s, const struct sockaddr *name, socklen_t namelen);
-int lwip_listen_r(int s, int backlog);
-int lwip_recvmsg_r(int s, struct msghdr *message, int flags);
-int lwip_recv_r(int s, void *mem, size_t len, int flags);
-int lwip_read_r(int s, void *mem, size_t len); 
-int lwip_recvfrom_r(int s, void *mem, size_t len, int flags,
-      struct sockaddr *from, socklen_t *fromlen);
-int lwip_send_r(int s, const void *dataptr, size_t size, int flags);
-int lwip_sendmsg_r(int s, const struct msghdr *message, int flags);
-int lwip_sendto_r(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_r(int s, const void *dataptr, size_t size);
-int lwip_writev_r(int s, const struct iovec *iov, int iovcnt);
-int lwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,
-                struct timeval *timeout);
-int lwip_ioctl_r(int s, long cmd, void *argp);
-int lwip_fcntl_r(int s, int cmd, int val);
-
-static inline int accept(int s,struct sockaddr *addr,socklen_t *addrlen)
-{ return lwip_accept_r(s,addr,addrlen); }
-static inline int bind(int s,const struct sockaddr *name, socklen_t namelen)
-{ return lwip_bind_r(s,name,namelen); }
-static inline int shutdown(int s,int how)
-{ return lwip_shutdown_r(s,how); }
-static inline int getpeername(int s,struct sockaddr *name,socklen_t *namelen)
-{ return lwip_getpeername_r(s,name,namelen); }
-static inline int getsockname(int s,struct sockaddr *name,socklen_t *namelen)
-{ return lwip_getsockname_r(s,name,namelen); }
-static inline int setsockopt(int s,int level,int optname,const void *opval,socklen_t optlen)
-{ return lwip_setsockopt_r(s,level,optname,opval,optlen); }
-static inline int getsockopt(int s,int level,int optname,void *opval,socklen_t *optlen)
-{ return lwip_getsockopt_r(s,level,optname,opval,optlen); }
-static inline int closesocket(int s)
-{ return lwip_close_r(s); }
-static inline int connect(int s,const struct sockaddr *name,socklen_t namelen)
-{ return lwip_connect_r(s,name,namelen); }
-static inline int listen(int s,int backlog)
-{ return lwip_listen_r(s,backlog); }
-static inline int recvmsg(int sockfd, struct msghdr *msg, int flags)
-{ return lwip_recvmsg_r(sockfd, msg, flags); }
-static inline int recv(int s,void *mem,size_t len,int flags)
-{ return lwip_recv_r(s,mem,len,flags); }
-static inline int recvfrom(int s,void *mem,size_t len,int flags,struct sockaddr *from,socklen_t *fromlen)
-{ return lwip_recvfrom_r(s,mem,len,flags,from,fromlen); }
-static inline int send(int s,const void *dataptr,size_t size,int flags)
-{ return lwip_send_r(s,dataptr,size,flags); }
-static inline int sendmsg(int s,const struct msghdr *message,int flags)
-{ return lwip_sendmsg_r(s,message,flags); }
-static inline int sendto(int s,const void *dataptr,size_t size,int flags,const struct sockaddr *to,socklen_t tolen)
-{ return lwip_sendto_r(s,dataptr,size,flags,to,tolen); }
-static inline int socket(int domain,int type,int protocol)
-{ return lwip_socket(domain,type,protocol); }
-#ifndef ESP_HAS_SELECT
-static inline int select(int maxfdp1,fd_set *readset,fd_set *writeset,fd_set *exceptset,struct timeval *timeout)
-{ return lwip_select(maxfdp1,readset,writeset,exceptset,timeout); }
-#endif /* ESP_HAS_SELECT */
-static inline int ioctlsocket(int s,long cmd,void *argp)
-{ return lwip_ioctl_r(s,cmd,argp); }
-
-#if LWIP_POSIX_SOCKETS_IO_NAMES
-static inline int read(int s,void *mem,size_t len)
-{ return lwip_read_r(s,mem,len); }
-static inline int write(int s,const void *dataptr,size_t len)
-{ return lwip_write_r(s,dataptr,len); }
-static inline int writev(int s,const struct iovec *iov,int iovcnt)
-{ return lwip_writev_r(s,iov,iovcnt); }
-static inline int close(int s)
-{ return lwip_close_r(s); }
-static inline int fcntl(int s,int cmd,int val)
-{ return lwip_fcntl_r(s,cmd,val); }
-static inline int ioctl(int s,long cmd,void *argp)
-{ return lwip_ioctl_r(s,cmd,argp); }
-#endif /* { RETURN LWIP_POSIX_SOCKETS_IO_NAMES */
-
-#else
-
-static inline int accept(int s,struct sockaddr *addr,socklen_t *addrlen)
-{ return lwip_accept(s,addr,addrlen); }
-static inline int bind(int s,const struct sockaddr *name,socklen_t namelen)
-{ return lwip_bind(s,name,namelen); }
-static inline int shutdown(int s,int how)
-{ return lwip_shutdown(s,how); }
-static inline int getpeername(int s,struct sockaddr *name,socklen_t *namelen)
-{ return lwip_getpeername(s,name,namelen); }
-static inline int getsockname(int s,struct sockaddr *name,socklen_t *namelen)
-{ return lwip_getsockname(s,name,namelen); }
-static inline int setsockopt(int s,int level,int optname,const void *opval,socklen_t optlen)
-{ return lwip_setsockopt(s,level,optname,opval,optlen); }
-static inline int getsockopt(int s,int level,int optname,void *opval,socklen_t *optlen)
-{ return lwip_getsockopt(s,level,optname,opval,optlen); }
-static inline int closesocket(int s)
-{ return lwip_close(s); }
-static inline int connect(int s,const struct sockaddr *name,socklen_t namelen)
-{ return lwip_connect(s,name,namelen); }
-static inline int listen(int s,int backlog)
-{ return lwip_listen(s,backlog); }
-static inline int recvmsg(int sockfd, struct msghdr *msg, int flags)
-{ return lwip_recvmsg(sockfd, msg, flags); }
-static inline int recv(int s,void *mem,size_t len,int flags)
-{ return lwip_recv(s,mem,len,flags); }
-static inline int recvfrom(int s,void *mem,size_t len,int flags,struct sockaddr *from,socklen_t *fromlen)
-{ return lwip_recvfrom(s,mem,len,flags,from,fromlen); }
-static inline int send(int s,const void *dataptr,size_t size,int flags)
-{ return lwip_send(s,dataptr,size,flags); }
-static inline int sendmsg(int s,const struct msghdr *message,int flags)
-{ return lwip_sendmsg(s,message,flags); }
-static inline int sendto(int s,const void *dataptr,size_t size,int flags,const struct sockaddr *to,socklen_t tolen)
-{ return lwip_sendto(s,dataptr,size,flags,to,tolen); }
-static inline int socket(int domain,int type,int protocol)
-{ return lwip_socket(domain,type,protocol); }
-#ifndef ESP_HAS_SELECT
-static inline int select(int maxfdp1,fd_set t*readset,fd_set *writeset,fd_set *exceptset,struct timeval *timeout)
-{ return lwip_select(maxfdp1,readset,writeset,exceptset,timeout); }
-#endif /* ESP_HAS_SELECT */
-static inline int ioctlsocket(int s,long cmd,void *argp)
-{ return lwip_ioctl(s,cmd,argp); }
-
-#if LWIP_POSIX_SOCKETS_IO_NAMES
-static inline int read(int s,void *mem,size_t len)
-{ return lwip_read(s,mem,len); }
-static inline int write(int s,const void *dataptr,size_t len)
-{ return lwip_write(s,dataptr,len); }
-static inline int writev(int s,const struct iovec *iov,int iovcnt)
-{ return lwip_writev(s,iov,iovcnt); }
-static inline int close(int s)
-{ return lwip_close(s); }
-static inline int fcntl(int s,long cmd,void *val)
-{ return lwip_fcntl(s,cmd,val); }
-static inline int ioctl(int s,int cmd,int argp)
-{ return lwip_ioctl(s,cmd,argp); }
-#endif /* LWIP_POSIX_SOCKETS_IO_NAMES */
-#endif /* ESP_THREAD_SAFE */
-
-#endif /* LWIP_COMPAT_SOCKETS != 2 */
-
-#if LWIP_IPV4 && LWIP_IPV6
-#define lwip_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))
-#define lwip_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 lwip_inet_ntop(af,src,dst,size) \
-    (((af) == AF_INET) ? ip4addr_ntoa_r((const ip4_addr_t*)(src),(dst),(size)) : NULL)
-#define lwip_inet_pton(af,src,dst) \
-    (((af) == AF_INET) ? ip4addr_aton((src),(ip4_addr_t*)(dst)) : 0)
-#else /* LWIP_IPV4 && LWIP_IPV6 */
-#define lwip_inet_ntop(af,src,dst,size) \
-    (((af) == AF_INET6) ? ip6addr_ntoa_r((const ip6_addr_t*)(src),(dst),(size)) : NULL)
-#define lwip_inet_pton(af,src,dst) \
-    (((af) == AF_INET6) ? ip6addr_aton((src),(ip6_addr_t*)(dst)) : 0)
-#endif /* LWIP_IPV4 && LWIP_IPV6 */
-
-#if LWIP_COMPAT_SOCKET_INET == 1
-/* Some libraries have problems with inet_... being macros, so please use this define 
-    to declare normal functions */
-static inline const char *inet_ntop(int af, const void *src, char *dst, socklen_t size)
-{ lwip_inet_ntop(af, src, dst, size);    return dst; }
-static inline int inet_pton(int af, const char *src, void *dst)
-{ lwip_inet_pton(af, src, dst); return 1; }   
-#else
-/* By default fall back to original inet_... macros */
-# define inet_ntop(a,b,c,d) lwip_inet_ntop(a,b,c,d) 
-# define inet_pton(a,b,c)   lwip_inet_pton(a,b,c)   
-#endif /* LWIP_COMPAT_SOCKET_INET */
-
-#endif /* LWIP_COMPAT_SOCKETS */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_SOCKET */
-
-#endif /* LWIP_HDR_SOCKETS_H */
diff --git a/components/lwip/include/lwip/lwip/stats.h b/components/lwip/include/lwip/lwip/stats.h
deleted file mode 100644 (file)
index a4c700b..0000000
+++ /dev/null
@@ -1,492 +0,0 @@
-/*
- * 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_STATS_H
-#define LWIP_HDR_STATS_H
-
-#include "lwip/opt.h"
-
-#include "lwip/mem.h"
-#include "lwip/memp.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if LWIP_STATS
-
-#ifndef LWIP_STATS_LARGE
-#define LWIP_STATS_LARGE 0
-#endif
-
-#if LWIP_STATS_LARGE
-#define STAT_COUNTER     u32_t
-#define STAT_COUNTER_F   U32_F
-#else
-#define STAT_COUNTER     u16_t
-#define STAT_COUNTER_F   U16_F
-#endif
-
-struct stats_proto {
-  STAT_COUNTER xmit;             /* Transmitted packets. */
-  STAT_COUNTER recv;             /* Received packets. */
-  STAT_COUNTER fw;               /* Forwarded packets. */
-  STAT_COUNTER drop;             /* Dropped packets. */
-  STAT_COUNTER chkerr;           /* Checksum error. */
-  STAT_COUNTER lenerr;           /* Invalid length error. */
-  STAT_COUNTER memerr;           /* Out of memory error. */
-  STAT_COUNTER rterr;            /* Routing error. */
-  STAT_COUNTER proterr;          /* Protocol error. */
-  STAT_COUNTER opterr;           /* Error in options. */
-  STAT_COUNTER err;              /* Misc error. */
-  STAT_COUNTER cachehit;
-};
-
-struct stats_igmp {
-  STAT_COUNTER xmit;             /* Transmitted packets. */
-  STAT_COUNTER recv;             /* Received packets. */
-  STAT_COUNTER drop;             /* Dropped packets. */
-  STAT_COUNTER chkerr;           /* Checksum error. */
-  STAT_COUNTER lenerr;           /* Invalid length error. */
-  STAT_COUNTER memerr;           /* Out of memory error. */
-  STAT_COUNTER proterr;          /* Protocol error. */
-  STAT_COUNTER rx_v1;            /* Received v1 frames. */
-  STAT_COUNTER rx_group;         /* Received group-specific queries. */
-  STAT_COUNTER rx_general;       /* Received general queries. */
-  STAT_COUNTER rx_report;        /* Received reports. */
-  STAT_COUNTER tx_join;          /* Sent joins. */
-  STAT_COUNTER tx_leave;         /* Sent leaves. */
-  STAT_COUNTER tx_report;        /* Sent reports. */
-};
-
-struct stats_mem {
-#ifdef LWIP_DEBUG
-  const char *name;
-#endif /* LWIP_DEBUG */
-  STAT_COUNTER err;
-  mem_size_t avail;
-  mem_size_t used;
-  mem_size_t max;
-  STAT_COUNTER illegal;
-};
-
-struct stats_syselem {
-  STAT_COUNTER used;
-  STAT_COUNTER max;
-  STAT_COUNTER err;
-};
-
-struct stats_sys {
-  struct stats_syselem sem;
-  struct stats_syselem mutex;
-  struct stats_syselem mbox;
-};
-
-struct stats_mib2 {
-  /* IP */
-  u32_t ipinhdrerrors;
-  u32_t ipinaddrerrors;
-  u32_t ipinunknownprotos;
-  u32_t ipindiscards;
-  u32_t ipindelivers;
-  u32_t ipoutrequests;
-  u32_t ipoutdiscards;
-  u32_t ipoutnoroutes;
-  u32_t ipreasmoks;
-  u32_t ipreasmfails;
-  u32_t ipfragoks;
-  u32_t ipfragfails;
-  u32_t ipfragcreates;
-  u32_t ipreasmreqds;
-  u32_t ipforwdatagrams;
-  u32_t ipinreceives;
-
-  /* TCP */
-  u32_t tcpactiveopens;
-  u32_t tcppassiveopens;
-  u32_t tcpattemptfails;
-  u32_t tcpestabresets;
-  u32_t tcpoutsegs;
-  u32_t tcpretranssegs;
-  u32_t tcpinsegs;
-  u32_t tcpinerrs;
-  u32_t tcpoutrsts;
-
-  /* UDP */
-  u32_t udpindatagrams;
-  u32_t udpnoports;
-  u32_t udpinerrors;
-  u32_t udpoutdatagrams;
-
-  /* ICMP */
-  u32_t icmpinmsgs;
-  u32_t icmpinerrors;
-  u32_t icmpindestunreachs;
-  u32_t icmpintimeexcds;
-  u32_t icmpinparmprobs;
-  u32_t icmpinsrcquenchs;
-  u32_t icmpinredirects;
-  u32_t icmpinechos;
-  u32_t icmpinechoreps;
-  u32_t icmpintimestamps;
-  u32_t icmpintimestampreps;
-  u32_t icmpinaddrmasks;
-  u32_t icmpinaddrmaskreps;
-  u32_t icmpoutmsgs;
-  u32_t icmpouterrors;
-  u32_t icmpoutdestunreachs;
-  u32_t icmpouttimeexcds;
-  u32_t icmpoutechos; /* can be incremented by user application ('ping') */
-  u32_t icmpoutechoreps;
-};
-
-struct stats_mib2_netif_ctrs {
-  /* The total number of octets received on the interface, including framing characters */
-  u32_t ifinoctets;
-  /* 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 */
-  u32_t ifinucastpkts;
-  /* 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 */
-  u32_t ifinnucastpkts;
-  /* 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 */
-  u32_t ifindiscards;
-  /* 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. */
-  u32_t ifinerrors;
-  /* 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 */
-  u32_t ifinunknownprotos;
-  /* The total number of octets transmitted out of the interface, including framing characters. */
-  u32_t ifoutoctets;
-  /* 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. */
-  u32_t ifoutucastpkts;
-  /* 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. */
-  u32_t ifoutnucastpkts;
-  /* 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. */
-  u32_t ifoutdiscards;
-  /* 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. */
-  u32_t ifouterrors;
-};
-
-struct stats_esp {
-    /* mbox post fail stats */
-    u32_t  rx_rawmbox_post_fail;
-    u32_t  rx_udpmbox_post_fail;
-    u32_t  rx_tcpmbox_post_fail;
-    u32_t  err_tcp_rxmbox_post_fail;
-    u32_t  err_tcp_acceptmbox_post_fail;
-    u32_t  acceptmbox_post_fail;
-    u32_t  free_mbox_post_fail;
-    u32_t  tcpip_inpkt_post_fail;
-    u32_t  tcpip_cb_post_fail;
-
-    /* memory malloc/free/failed stats */
-    u32_t  wlanif_input_pbuf_fail;
-    u32_t  wlanif_outut_pbuf_fail;
-};
-
-struct stats_ {
-#if LINK_STATS
-  struct stats_proto link;
-#endif
-#if ETHARP_STATS
-  struct stats_proto etharp;
-#endif
-#if IPFRAG_STATS
-  struct stats_proto ip_frag;
-#endif
-#if IP_STATS
-  struct stats_proto ip;
-#endif
-#if ICMP_STATS
-  struct stats_proto icmp;
-#endif
-#if IGMP_STATS
-  struct stats_igmp igmp;
-#endif
-#if UDP_STATS
-  struct stats_proto udp;
-#endif
-#if TCP_STATS
-  struct stats_proto tcp;
-#endif
-#if MEM_STATS
-  struct stats_mem mem;
-#endif
-#if MEMP_STATS
-  struct stats_mem memp[MEMP_MAX];
-#endif
-#if SYS_STATS
-  struct stats_sys sys;
-#endif
-#if IP6_STATS
-  struct stats_proto ip6;
-#endif
-#if ICMP6_STATS
-  struct stats_proto icmp6;
-#endif
-#if IP6_FRAG_STATS
-  struct stats_proto ip6_frag;
-#endif
-#if MLD6_STATS
-  struct stats_igmp mld6;
-#endif
-#if ND6_STATS
-  struct stats_proto nd6;
-#endif
-#if MIB2_STATS
-  struct stats_mib2 mib2;
-#endif
-#if ESP_STATS_DROP
-  struct stats_esp esp;
-#endif
-};
-
-extern struct stats_ lwip_stats;
-
-void stats_init(void);
-
-#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; \
-                                if (lwip_stats.x.max < lwip_stats.x.used) { \
-                                    lwip_stats.x.max = lwip_stats.x.used; \
-                                } \
-                             } while(0)
-#define STATS_GET(x) lwip_stats.x
-#else /* LWIP_STATS */
-#define stats_init()
-#define STATS_INC(x)
-#define STATS_DEC(x)
-#define STATS_INC_USED(x)
-#endif /* LWIP_STATS */
-
-#if TCP_STATS
-#define TCP_STATS_INC(x) STATS_INC(x)
-#define TCP_STATS_DISPLAY() stats_display_proto(&lwip_stats.tcp, "TCP")
-#else
-#define TCP_STATS_INC(x)
-#define TCP_STATS_DISPLAY()
-#endif
-
-#if UDP_STATS
-#define UDP_STATS_INC(x) STATS_INC(x)
-#define UDP_STATS_DISPLAY() stats_display_proto(&lwip_stats.udp, "UDP")
-#else
-#define UDP_STATS_INC(x)
-#define UDP_STATS_DISPLAY()
-#endif
-
-#if ICMP_STATS
-#define ICMP_STATS_INC(x) STATS_INC(x)
-#define ICMP_STATS_DISPLAY() stats_display_proto(&lwip_stats.icmp, "ICMP")
-#else
-#define ICMP_STATS_INC(x)
-#define ICMP_STATS_DISPLAY()
-#endif
-
-#if IGMP_STATS
-#define IGMP_STATS_INC(x) STATS_INC(x)
-#define IGMP_STATS_DISPLAY() stats_display_igmp(&lwip_stats.igmp, "IGMP")
-#else
-#define IGMP_STATS_INC(x)
-#define IGMP_STATS_DISPLAY()
-#endif
-
-#if IP_STATS
-#define IP_STATS_INC(x) STATS_INC(x)
-#define IP_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip, "IP")
-#else
-#define IP_STATS_INC(x)
-#define IP_STATS_DISPLAY()
-#endif
-
-#if IPFRAG_STATS
-#define IPFRAG_STATS_INC(x) STATS_INC(x)
-#define IPFRAG_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip_frag, "IP_FRAG")
-#else
-#define IPFRAG_STATS_INC(x)
-#define IPFRAG_STATS_DISPLAY()
-#endif
-
-#if ETHARP_STATS
-#define ETHARP_STATS_INC(x) STATS_INC(x)
-#define ETHARP_STATS_DISPLAY() stats_display_proto(&lwip_stats.etharp, "ETHARP")
-#else
-#define ETHARP_STATS_INC(x)
-#define ETHARP_STATS_DISPLAY()
-#endif
-
-#if LINK_STATS
-#define LINK_STATS_INC(x) STATS_INC(x)
-#define LINK_STATS_DISPLAY() stats_display_proto(&lwip_stats.link, "LINK")
-#else
-#define LINK_STATS_INC(x)
-#define LINK_STATS_DISPLAY()
-#endif
-
-#if MEM_STATS
-#define MEM_STATS_AVAIL(x, y) 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)
-#define MEM_STATS_DEC_USED(x, y) lwip_stats.mem.x -= y
-#define MEM_STATS_DISPLAY() stats_display_mem(&lwip_stats.mem, "HEAP")
-#else
-#define MEM_STATS_AVAIL(x, y)
-#define MEM_STATS_INC(x)
-#define MEM_STATS_INC_USED(x, y)
-#define MEM_STATS_DEC_USED(x, y)
-#define MEM_STATS_DISPLAY()
-#endif
-
-#if MEMP_STATS
-#define MEMP_STATS_AVAIL(x, i, y) lwip_stats.memp[i].x = y
-#define MEMP_STATS_INC(x, i) STATS_INC(memp[i].x)
-#define MEMP_STATS_DEC(x, i) STATS_DEC(memp[i].x)
-#define MEMP_STATS_INC_USED(x, i) STATS_INC_USED(memp[i], 1)
-#define MEMP_STATS_DISPLAY(i) stats_display_memp(&lwip_stats.memp[i], i)
-#define MEMP_STATS_GET(x, i) STATS_GET(memp[i].x)
-#else
-#define MEMP_STATS_AVAIL(x, i, y)
-#define MEMP_STATS_INC(x, i)
-#define MEMP_STATS_DEC(x, i)
-#define MEMP_STATS_INC_USED(x, i)
-#define MEMP_STATS_DISPLAY(i)
-#define MEMP_STATS_GET(x, i) 0
-#endif
-
-#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_DISPLAY() stats_display_sys(&lwip_stats.sys)
-#else
-#define SYS_STATS_INC(x)
-#define SYS_STATS_DEC(x)
-#define SYS_STATS_INC_USED(x)
-#define SYS_STATS_DISPLAY()
-#endif
-
-#if IP6_STATS
-#define IP6_STATS_INC(x) STATS_INC(x)
-#define IP6_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip6, "IPv6")
-#else
-#define IP6_STATS_INC(x)
-#define IP6_STATS_DISPLAY()
-#endif
-
-#if ICMP6_STATS
-#define ICMP6_STATS_INC(x) STATS_INC(x)
-#define ICMP6_STATS_DISPLAY() stats_display_proto(&lwip_stats.icmp6, "ICMPv6")
-#else
-#define ICMP6_STATS_INC(x)
-#define ICMP6_STATS_DISPLAY()
-#endif
-
-#if IP6_FRAG_STATS
-#define IP6_FRAG_STATS_INC(x) STATS_INC(x)
-#define IP6_FRAG_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip6_frag, "IPv6 FRAG")
-#else
-#define IP6_FRAG_STATS_INC(x)
-#define IP6_FRAG_STATS_DISPLAY()
-#endif
-
-#if MLD6_STATS
-#define MLD6_STATS_INC(x) STATS_INC(x)
-#define MLD6_STATS_DISPLAY() stats_display_igmp(&lwip_stats.mld6, "MLDv1")
-#else
-#define MLD6_STATS_INC(x)
-#define MLD6_STATS_DISPLAY()
-#endif
-
-#if ND6_STATS
-#define ND6_STATS_INC(x) STATS_INC(x)
-#define ND6_STATS_DISPLAY() stats_display_proto(&lwip_stats.nd6, "ND")
-#else
-#define ND6_STATS_INC(x)
-#define ND6_STATS_DISPLAY()
-#endif
-
-#if MIB2_STATS
-#define MIB2_STATS_INC(x) STATS_INC(x)
-#else
-#define MIB2_STATS_INC(x)
-#endif
-
-#if ESP_STATS_DROP
-#define ESP_STATS_DROP_INC(x) STATS_INC(x)
-#define ESP_STATS_DROP_DISPLAY() stats_display_esp(&lwip_stats.esp);
-#else
-#define ESP_STATS_DROP_INC(x)
-#define ESP_STATS_DROP_DISPLAY()
-#endif
-
-/* Display of statistics */
-#if LWIP_STATS_DISPLAY
-void stats_display(void);
-void stats_display_proto(struct stats_proto *proto, const char *name);
-void stats_display_igmp(struct stats_igmp *igmp, const char *name);
-void stats_display_mem(struct stats_mem *mem, const char *name);
-void stats_display_memp(struct stats_mem *mem, int index);
-void stats_display_sys(struct stats_sys *sys);
-void stats_display_esp(struct stats_esp *esp);
-#else /* LWIP_STATS_DISPLAY */
-#define stats_display()
-#define stats_display_proto(proto, name)
-#define stats_display_igmp(igmp, name)
-#define stats_display_mem(mem, name)
-#define stats_display_memp(mem, index)
-#define stats_display_sys(sys)
-#define stats_display_esp(esp)
-#endif /* LWIP_STATS_DISPLAY */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_HDR_STATS_H */
diff --git a/components/lwip/include/lwip/lwip/sys.h b/components/lwip/include/lwip/lwip/sys.h
deleted file mode 100644 (file)
index 67729e3..0000000
+++ /dev/null
@@ -1,366 +0,0 @@
-/*
- * 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_SYS_H
-#define LWIP_HDR_SYS_H
-
-#include "lwip/opt.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if NO_SYS
-
-/* For a totally minimal and standalone system, we provide null
-   definitions of the sys_ functions. */
-typedef u8_t sys_sem_t;
-typedef u8_t sys_mutex_t;
-typedef u8_t sys_mbox_t;
-
-#define sys_sem_new(s, c) ERR_OK
-#define sys_sem_signal(s)
-#define sys_sem_wait(s)
-#define sys_arch_sem_wait(s,t)
-#define sys_sem_free(s)
-#define sys_sem_valid(s) 0
-#define sys_sem_valid_val(s) 0
-#define sys_sem_set_invalid(s)
-#define sys_sem_set_invalid_val(s)
-#define sys_mutex_new(mu) ERR_OK
-#define sys_mutex_lock(mu)
-#define sys_mutex_unlock(mu)
-#define sys_mutex_free(mu)
-#define sys_mutex_valid(mu) 0
-#define sys_mutex_set_invalid(mu)
-#define sys_mbox_new(m, s) ERR_OK
-#define sys_mbox_fetch(m,d)
-#define sys_mbox_tryfetch(m,d)
-#define sys_mbox_post(m,d)
-#define sys_mbox_trypost(m,d)
-#define sys_mbox_free(m)
-#define sys_mbox_valid(m)
-#define sys_mbox_valid_val(m)
-#define sys_mbox_set_invalid(m)
-#define sys_mbox_set_invalid_val(m)
-
-#define sys_thread_new(n,t,a,s,p)
-
-#define sys_msleep(t)
-
-#else /* NO_SYS */
-
-/** Return code for timeouts from sys_arch_mbox_fetch and sys_arch_sem_wait */
-#define SYS_ARCH_TIMEOUT 0xffffffffUL
-
-/** sys_mbox_tryfetch() returns SYS_MBOX_EMPTY if appropriate.
- * For now we use the same magic value, but we allow this to change in future.
- */
-#define SYS_MBOX_EMPTY SYS_ARCH_TIMEOUT
-
-#include "lwip/err.h"
-#include "arch/sys_arch.h"
-
-/** Function prototype for thread functions */
-typedef void (*lwip_thread_fn)(void *arg);
-
-/* Function prototypes for functions to be implemented by platform ports
-   (in sys_arch.c) */
-
-/* Mutex functions: */
-
-/** Define LWIP_COMPAT_MUTEX if the port has no mutexes and binary semaphores
-    should be used instead */
-#ifndef LWIP_COMPAT_MUTEX
-#define LWIP_COMPAT_MUTEX 0
-#endif
-
-#if LWIP_COMPAT_MUTEX
-/* for old ports that don't have mutexes: define them to binary semaphores */
-#define sys_mutex_t                   sys_sem_t
-#define sys_mutex_new(mutex)          sys_sem_new(mutex, 1)
-#define sys_mutex_lock(mutex)         sys_sem_wait(mutex)
-#define sys_mutex_unlock(mutex)       sys_sem_signal(mutex)
-#define sys_mutex_free(mutex)         sys_sem_free(mutex)
-#define sys_mutex_valid(mutex)        sys_sem_valid(mutex)
-#define sys_mutex_set_invalid(mutex)  sys_sem_set_invalid(mutex)
-
-#else /* LWIP_COMPAT_MUTEX */
-
-/** Create a new mutex
- * @param mutex pointer to the mutex to create
- * @return a new mutex */
-err_t sys_mutex_new(sys_mutex_t *mutex);
-/** Lock a mutex
- * @param mutex the mutex to lock */
-void sys_mutex_lock(sys_mutex_t *mutex);
-/** Unlock a mutex
- * @param mutex the mutex to unlock */
-void sys_mutex_unlock(sys_mutex_t *mutex);
-/** Delete a semaphore
- * @param mutex the mutex to delete */
-void sys_mutex_free(sys_mutex_t *mutex);
-#ifndef sys_mutex_valid
-/** Check if a mutex is valid/allocated: return 1 for valid, 0 for invalid */
-int sys_mutex_valid(sys_mutex_t *mutex);
-#endif
-#ifndef sys_mutex_set_invalid
-/** Set a mutex invalid so that sys_mutex_valid returns 0 */
-void sys_mutex_set_invalid(sys_mutex_t *mutex);
-#endif
-#endif /* LWIP_COMPAT_MUTEX */
-
-/* Semaphore functions: */
-
-/** Create a new semaphore
- * @param sem pointer to the semaphore to create
- * @param count initial count of the semaphore
- * @return ERR_OK if successful, another err_t otherwise */
-err_t sys_sem_new(sys_sem_t *sem, u8_t count);
-/** Signals a semaphore
- * @param sem the semaphore to signal */
-void sys_sem_signal(sys_sem_t *sem);
-/** Signals a semaphore (ISR version)
- * @param sem the semaphore to signal
- * @return non-zero if a higher priority task has been woken  */
-int sys_sem_signal_isr(sys_sem_t *sem);
-/** Wait for a semaphore for the specified timeout
- * @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 */
-u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout);
-/** Delete a semaphore
- * @param sem semaphore to delete */
-void sys_sem_free(sys_sem_t *sem);
-/** Wait for a semaphore - forever/no timeout */
-#define sys_sem_wait(sem)                  sys_arch_sem_wait(sem, 0)
-#ifndef sys_sem_valid
-/** Check if a semaphore is valid/allocated: return 1 for valid, 0 for invalid */
-int sys_sem_valid(sys_sem_t *sem);
-#endif
-#ifndef sys_sem_set_invalid
-/** Set a semaphore invalid so that sys_sem_valid returns 0 */
-void sys_sem_set_invalid(sys_sem_t *sem);
-#endif
-#ifndef sys_sem_valid_val
-/** Same as sys_sem_valid() but taking a value, not a pointer */
-#define sys_sem_valid_val(sem)       sys_sem_valid(&(sem))
-#endif
-#ifndef sys_sem_set_invalid_val
-/** Same as sys_sem_set_invalid() but taking a value, not a pointer */
-#define sys_sem_set_invalid_val(sem) sys_sem_set_invalid(&(sem))
-#endif
-
-/* Time functions. */
-#ifndef sys_msleep
-void sys_msleep(u32_t ms); /* only has a (close to) 1 ms resolution. */
-#endif
-
-/* Mailbox functions. */
-
-/** Create a new mbox of specified size
- * @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 */
-err_t sys_mbox_new(sys_mbox_t *mbox, int size);
-/** Post a message to an mbox - may not fail
- * -> blocks if full, only 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);
-/** Try to post a message to an mbox - may fail if full or ISR
- * @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);
-/** Wait for a new message to arrive in the mbox
- * @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! */
-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
-/** Wait for a new message to arrive in the mbox
- * @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
- *         or SYS_MBOX_EMPTY if the mailbox is empty */
-u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg);
-#endif
-/** For now, we map straight to sys_arch implementation. */
-#define sys_mbox_tryfetch(mbox, msg) sys_arch_mbox_tryfetch(mbox, msg)
-/** Delete an mbox
- * @param mbox mbox to delete */
-void sys_mbox_free(sys_mbox_t *mbox);
-#define sys_mbox_fetch(mbox, msg) sys_arch_mbox_fetch(mbox, msg, 0)
-#ifndef sys_mbox_valid
-/** Check if an mbox is valid/allocated: return 1 for valid, 0 for invalid */
-int sys_mbox_valid(sys_mbox_t *mbox);
-#endif
-#ifndef sys_mbox_set_invalid
-/** Set an mbox invalid so that sys_mbox_valid returns 0 */
-void sys_mbox_set_invalid(sys_mbox_t *mbox);
-#endif
-#ifndef sys_mbox_valid_val
-/** Same as sys_mbox_valid() but taking a value, not a pointer */
-#define sys_mbox_valid_val(mbox)       sys_mbox_valid(&(mbox))
-#endif
-#ifndef sys_mbox_set_invalid_val
-/** Same as sys_mbox_set_invalid() but taking a value, not a pointer */
-#define sys_mbox_set_invalid_val(mbox) sys_mbox_set_invalid(&(mbox))
-#endif
-
-
-/** The only thread function:
- * Creates a new thread
- * 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'
- * @param stacksize stack size in bytes for the new thread (may be ignored by ports)
- * @param prio priority of the new thread (may be ignored by ports) */
-sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, int stacksize, int prio);
-
-#endif /* NO_SYS */
-
-/* sys_init() must be called before anything else. */
-void sys_init(void);
-
-#ifndef sys_jiffies
-/** Ticks/jiffies since power up. */
-u32_t sys_jiffies(void);
-#endif
-
-/** Returns the current time in milliseconds,
- * may be the same as sys_jiffies or at least based on it. */
-u32_t sys_now(void);
-
-/* Critical Region Protection */
-/* These functions must be implemented in the sys_arch.c file.
-   In some implementations they can provide a more light-weight protection
-   mechanism than using semaphores. Otherwise semaphores can be used for
-   implementation */
-#ifndef SYS_ARCH_PROTECT
-/** 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.
- */
-#if SYS_LIGHTWEIGHT_PROT
-
-/** 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.
- */
-#define SYS_ARCH_DECL_PROTECT(lev) sys_prot_t lev
-/** 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
- */
-#define SYS_ARCH_PROTECT(lev) lev = sys_arch_protect()
-/** 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
- */
-#define SYS_ARCH_UNPROTECT(lev) sys_arch_unprotect(lev)
-sys_prot_t sys_arch_protect(void);
-void sys_arch_unprotect(sys_prot_t pval);
-
-#else
-
-#define SYS_ARCH_DECL_PROTECT(lev)
-#define SYS_ARCH_PROTECT(lev)
-#define SYS_ARCH_UNPROTECT(lev)
-
-#endif /* SYS_LIGHTWEIGHT_PROT */
-
-#endif /* SYS_ARCH_PROTECT */
-
-/*
- * Macros to set/get and increase/decrease variables in a thread-safe way.
- * Use these for accessing variable that are used from more than one thread.
- */
-
-#ifndef SYS_ARCH_INC
-#define SYS_ARCH_INC(var, val) do { \
-                                SYS_ARCH_DECL_PROTECT(old_level); \
-                                SYS_ARCH_PROTECT(old_level); \
-                                var += val; \
-                                SYS_ARCH_UNPROTECT(old_level); \
-                              } while(0)
-#endif /* SYS_ARCH_INC */
-
-#ifndef SYS_ARCH_DEC
-#define SYS_ARCH_DEC(var, val) do { \
-                                SYS_ARCH_DECL_PROTECT(old_level); \
-                                SYS_ARCH_PROTECT(old_level); \
-                                var -= val; \
-                                SYS_ARCH_UNPROTECT(old_level); \
-                              } while(0)
-#endif /* SYS_ARCH_DEC */
-
-#ifndef SYS_ARCH_GET
-#define SYS_ARCH_GET(var, ret) do { \
-                                SYS_ARCH_DECL_PROTECT(old_level); \
-                                SYS_ARCH_PROTECT(old_level); \
-                                ret = var; \
-                                SYS_ARCH_UNPROTECT(old_level); \
-                              } while(0)
-#endif /* SYS_ARCH_GET */
-
-#ifndef SYS_ARCH_SET
-#define SYS_ARCH_SET(var, val) do { \
-                                SYS_ARCH_DECL_PROTECT(old_level); \
-                                SYS_ARCH_PROTECT(old_level); \
-                                var = val; \
-                                SYS_ARCH_UNPROTECT(old_level); \
-                              } while(0)
-#endif /* SYS_ARCH_SET */
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_HDR_SYS_H */
diff --git a/components/lwip/include/lwip/lwip/tcp.h b/components/lwip/include/lwip/lwip/tcp.h
deleted file mode 100644 (file)
index 269b4e3..0000000
+++ /dev/null
@@ -1,449 +0,0 @@
-/*
- * 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_TCP_H
-#define LWIP_HDR_TCP_H
-
-#include "lwip/opt.h"
-
-#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/mem.h"
-#include "lwip/pbuf.h"
-#include "lwip/ip.h"
-#include "lwip/icmp.h"
-#include "lwip/err.h"
-#include "lwip/ip6.h"
-#include "lwip/ip6_addr.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct tcp_pcb;
-
-/** Function prototype for tcp accept callback functions. Called when a new
- * connection can be accepted on a listening pcb.
- *
- * @param arg Additional argument to pass to the callback function (@see tcp_arg())
- * @param newpcb The new connection pcb
- * @param err 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!
- */
-typedef err_t (*tcp_accept_fn)(void *arg, struct tcp_pcb *newpcb, err_t err);
-
-/** Function prototype for tcp receive callback functions. Called when data has
- * been received.
- *
- * @param arg Additional argument to pass to the callback function (@see tcp_arg())
- * @param tpcb The connection pcb which received data
- * @param p The received data (or NULL when the connection has been closed!)
- * @param err 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!
- */
-typedef err_t (*tcp_recv_fn)(void *arg, struct tcp_pcb *tpcb,
-                             struct pbuf *p, err_t err);
-
-/** 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.
- *
- * @param arg Additional argument to pass to the callback function (@see tcp_arg())
- * @param tpcb The connection pcb for which data has been acknowledged
- * @param len The amount of bytes acknowledged
- * @return 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!
- */
-typedef err_t (*tcp_sent_fn)(void *arg, struct tcp_pcb *tpcb,
-                              u16_t len);
-
-/** Function prototype for tcp poll callback functions. Called periodically as
- * specified by @see tcp_poll.
- *
- * @param arg Additional argument to pass to the callback function (@see tcp_arg())
- * @param tpcb tcp pcb
- * @return 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!
- */
-typedef err_t (*tcp_poll_fn)(void *arg, struct tcp_pcb *tpcb);
-
-/** Function prototype for tcp error callback functions. Called when the pcb
- * receives a RST or is unexpectedly closed for any other reason.
- *
- * @note The corresponding pcb is already freed when this callback is called!
- *
- * @param arg Additional argument to pass to the callback function (@see tcp_arg())
- * @param err 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
- */
-typedef void  (*tcp_err_fn)(void *arg, err_t err);
-
-/** Function prototype for tcp connected callback functions. Called when a pcb
- * is connected to the remote side after initiating a connection attempt by
- * calling tcp_connect().
- *
- * @param arg Additional argument to pass to the callback function (@see tcp_arg())
- * @param tpcb The connection pcb which is connected
- * @param err An unused error code, always ERR_OK currently ;-) TODO!
- *            Only return ERR_ABRT if you have called tcp_abort from within the
- *            callback function!
- *
- * @note When a connection attempt fails, the error callback is currently called!
- */
-typedef err_t (*tcp_connected_fn)(void *arg, struct tcp_pcb *tpcb, err_t err);
-
-#if LWIP_WND_SCALE
-#define RCV_WND_SCALE(pcb, wnd) (((wnd) >> (pcb)->rcv_scale))
-#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(pcb) : TCPWND16(TCP_WND(pcb))))
-typedef u32_t tcpwnd_size_t;
-typedef u16_t tcpflags_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(pcb)
-typedef u16_t tcpwnd_size_t;
-typedef u16_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_CALLBACK_API
-  /* Function to call when a listener has been connected.
-   * @param arg user-supplied argument (tcp_pcb.callback_arg)
-   * @param pcb a new tcp_pcb that now is connected
-   * @param err an error argument (TODO: that is current always ERR_OK?)
-   * @return ERR_OK: accept the new connection,
-   *                 any other err_t aborts the new connection
-   */
-#define DEF_ACCEPT_CALLBACK  tcp_accept_fn accept;
-#else /* LWIP_CALLBACK_API */
-#define DEF_ACCEPT_CALLBACK
-#endif /* LWIP_CALLBACK_API */
-
-/**
- * members common to struct tcp_pcb and struct tcp_listen_pcb
- */
-#define TCP_PCB_COMMON(type) \
-  type *next; /* for the linked list */ \
-  void *callback_arg; \
-  /* the accept callback for listen- and normal pcbs, if LWIP_CALLBACK_API */ \
-  DEF_ACCEPT_CALLBACK \
-  enum tcp_state state; /* TCP state */ \
-  u8_t prio; \
-  /* ports are in host byte order */ \
-  u16_t local_port
-
-
-/* the TCP protocol control block */
-struct tcp_pcb {
-/** common PCB members */
-  IP_PCB;
-/** protocol specific PCB members */
-  TCP_PCB_COMMON(struct tcp_pcb);
-
-  /* ports are in host byte order */
-  u16_t remote_port;
-
-  tcpflags_t flags;
-#define TF_ACK_DELAY   0x01U   /* Delayed ACK. */
-#define TF_ACK_NOW     0x02U   /* Immediate ACK. */
-#define TF_INFR        0x04U   /* In fast recovery. */
-#define TF_TIMESTAMP   0x08U   /* Timestamp option enabled */
-#define TF_RXCLOSED    0x10U   /* rx closed by tcp_shutdown */
-#define TF_FIN         0x20U   /* Connection was closed locally (FIN segment enqueued). */
-#define TF_NODELAY     0x40U   /* Disable Nagle algorithm */
-#define TF_NAGLEMEMERR 0x80U   /* nagle enabled, memerr, try to output to prevent delayed ACK to happen */
-#if LWIP_WND_SCALE
-#define TF_WND_SCALE   0x0100U /* Window Scale option enabled */
-#endif
-#if TCP_LISTEN_BACKLOG
-#define TF_BACKLOGPEND 0x0200U /* If this is set, a connection pcb has increased the backlog on its listener */
-#endif
-
-  /* the rest of the fields are in host byte order
-     as we have to do some math with them */
-
-  /* Timers */
-  u8_t polltmr, pollinterval;
-  u8_t last_timer;
-  u32_t tmr;
-
-  /* receiver variables */
-  u32_t rcv_nxt;   /* next seqno expected */
-  tcpwnd_size_t rcv_wnd;   /* receiver window available */
-  tcpwnd_size_t rcv_ann_wnd; /* receiver window to announce */
-  u32_t rcv_ann_right_edge; /* announced right edge of window */
-
-  /* Retransmission timer. */
-  s16_t rtime;
-
-  u16_t mss;   /* maximum segment size */
-
-  /* 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 rto;    /* retransmission time-out */
-  u8_t nrtx;    /* number of retransmissions */
-
-  /* fast retransmit/recovery */
-  u8_t dupacks;
-  u32_t lastack; /* Highest acknowledged seqno. */
-
-#if ESP_PER_SOC_TCP_WND
-  tcpwnd_size_t per_soc_tcp_wnd; /* per tcp socket tcp window size */
-  tcpwnd_size_t per_soc_tcp_snd_buf; /* per tcp socket tcp send buffer size */
-#endif
-
-  /* congestion avoidance/control variables */
-  tcpwnd_size_t cwnd;
-  tcpwnd_size_t ssthresh;
-
-  /* sender variables */
-  u32_t snd_nxt;   /* next new seqno to be sent */
-  u32_t snd_wl1, snd_wl2; /* Sequence and acknowledgement numbers of last
-                             window update. */
-  u32_t snd_lbb;       /* Sequence number of next byte to be buffered. */
-  tcpwnd_size_t snd_wnd;   /* sender window */
-  tcpwnd_size_t snd_wnd_max; /* the maximum sender window announced by the remote host */
-
-  tcpwnd_size_t acked;
-
-  tcpwnd_size_t snd_buf;   /* Available buffer space for sending (in bytes). */
-#define TCP_SNDQUEUELEN_OVERFLOW (0xffffU-3)
-  u16_t snd_queuelen; /* Number of pbufs currently in the send buffer. */
-
-#if TCP_OVERSIZE
-  /* Extra bytes available at the end of the last pbuf in unsent. */
-  u16_t unsent_oversize;
-#endif /* TCP_OVERSIZE */
-
-  /* These are ordered by sequence number: */
-  struct tcp_seg *unsent;   /* Unsent (queued) segments. */
-  struct tcp_seg *unacked;  /* Sent but unacknowledged segments. */
-#if TCP_QUEUE_OOSEQ
-  struct tcp_seg *ooseq;    /* Received out of sequence segments. */
-#endif /* TCP_QUEUE_OOSEQ */
-
-  struct pbuf *refused_data; /* Data previously received but not yet taken by upper layer */
-
-#if LWIP_CALLBACK_API
-  /* Function to be called when more send buffer space is available. */
-  tcp_sent_fn sent;
-  /* Function to be called when (in-sequence) data has arrived. */
-  tcp_recv_fn recv;
-  /* Function to be called when a connection has been set up. */
-  tcp_connected_fn connected;
-  /* Function which is called periodically. */
-  tcp_poll_fn poll;
-  /* Function to be called whenever a fatal error occurs. */
-  tcp_err_fn errf;
-#endif /* LWIP_CALLBACK_API */
-
-#if LWIP_TCP_TIMESTAMPS
-  u32_t ts_lastacksent;
-  u32_t ts_recent;
-#endif /* LWIP_TCP_TIMESTAMPS */
-
-  /* idle time before KEEPALIVE is sent */
-  u32_t keep_idle;
-#if LWIP_TCP_KEEPALIVE
-  u32_t keep_intvl;
-  u32_t keep_cnt;
-#endif /* LWIP_TCP_KEEPALIVE */
-
-  /* Persist timer counter */
-  u8_t persist_cnt;
-  /* Persist timer back-off */
-  u8_t persist_backoff;
-
-  /* KEEPALIVE counter */
-  u8_t keep_cnt_sent;
-
-#if LWIP_WND_SCALE
-  u8_t snd_scale;
-  u8_t rcv_scale;
-#endif
-
-#if TCP_LISTEN_BACKLOG
-  struct tcp_pcb_listen *listener;
-#endif
-
-#if ESP_STATS_TCP
-#define ESP_STATS_TCP_ARRAY_SIZE 20
-  u16_t retry_cnt[TCP_MAXRTX];
-  u16_t rto_cnt[ESP_STATS_TCP_ARRAY_SIZE];
-#endif
-};
-
-#if ESP_STATS_TCP
-#define ESP_STATS_TCP_PCB(_pcb) do {\
-  if ((_pcb)->unacked) {\
-    (_pcb)->retry_cnt[(_pcb)->nrtx]++;\
-    if ((_pcb)->rto < ESP_STATS_TCP_ARRAY_SIZE) {\
-      (_pcb)->rto_cnt[(_pcb)->rto]++;\
-    } else {\
-      (_pcb)->rto_cnt[ESP_STATS_TCP_ARRAY_SIZE-1] ++;\
-    }\
-  }\
-} while(0)
-#else
-#define ESP_STATS_TCP_PCB(pcb) 
-#endif
-
-struct tcp_pcb_listen {
-/* Common members of all PCB types */
-  IP_PCB;
-/* Protocol specific PCB members */
-  TCP_PCB_COMMON(struct tcp_pcb_listen);
-
-#if TCP_LISTEN_BACKLOG
-  u8_t backlog;
-  u8_t accepts_pending;
-#endif /* TCP_LISTEN_BACKLOG */
-};
-
-#if LWIP_EVENT_API
-
-enum lwip_event {
-  LWIP_EVENT_ACCEPT,
-  LWIP_EVENT_SENT,
-  LWIP_EVENT_RECV,
-  LWIP_EVENT_CONNECTED,
-  LWIP_EVENT_POLL,
-  LWIP_EVENT_ERR
-};
-
-err_t lwip_tcp_event(void *arg, struct tcp_pcb *pcb,
-         enum lwip_event,
-         struct pbuf *p,
-         u16_t size,
-         err_t err);
-
-#endif /* LWIP_EVENT_API */
-
-/* Application program's interface: */
-struct tcp_pcb * tcp_new     (void);
-struct tcp_pcb * tcp_new_ip_type (u8_t type);
-
-void             tcp_arg     (struct tcp_pcb *pcb, void *arg);
-void             tcp_accept  (struct tcp_pcb *pcb, tcp_accept_fn accept);
-void             tcp_recv    (struct tcp_pcb *pcb, tcp_recv_fn recv);
-void             tcp_sent    (struct tcp_pcb *pcb, tcp_sent_fn sent);
-void             tcp_poll    (struct tcp_pcb *pcb, tcp_poll_fn poll, u8_t interval);
-void             tcp_err     (struct tcp_pcb *pcb, tcp_err_fn err);
-
-#define          tcp_mss(pcb)             (((pcb)->flags & TF_TIMESTAMP) ? ((pcb)->mss - 12)  : (pcb)->mss)
-#define          tcp_sndbuf(pcb)          (TCPWND16((pcb)->snd_buf))
-#define          tcp_sndqueuelen(pcb)     ((pcb)->snd_queuelen)
-#define          tcp_nagle_disable(pcb)   ((pcb)->flags |= TF_NODELAY)
-#define          tcp_nagle_enable(pcb)    ((pcb)->flags = (tcpflags_t)((pcb)->flags & ~TF_NODELAY))
-#define          tcp_nagle_disabled(pcb)  (((pcb)->flags & TF_NODELAY) != 0)
-
-#if TCP_LISTEN_BACKLOG
-#define          tcp_backlog_set(pcb, new_backlog) do { \
-  LWIP_ASSERT("pcb->state == LISTEN (called for wrong pcb?)", (pcb)->state == LISTEN); \
-  ((struct tcp_pcb_listen *)(pcb))->backlog = ((new_backlog) ? (new_backlog) : 1); } while(0)
-void             tcp_backlog_delayed(struct tcp_pcb* pcb);
-void             tcp_backlog_accepted(struct tcp_pcb* pcb);
-#else  /* TCP_LISTEN_BACKLOG */
-#define          tcp_backlog_set(pcb, new_backlog)
-#define          tcp_backlog_delayed(pcb)
-#define          tcp_backlog_accepted(pcb)
-#endif /* TCP_LISTEN_BACKLOG */
-#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);
-err_t            tcp_connect (struct tcp_pcb *pcb, const ip_addr_t *ipaddr,
-                              u16_t port, tcp_connected_fn connected);
-
-struct tcp_pcb * tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog);
-#define          tcp_listen(pcb) tcp_listen_with_backlog(pcb, TCP_DEFAULT_LISTEN_BACKLOG)
-
-void             tcp_abort (struct tcp_pcb *pcb);
-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);
-
-
-const char* tcp_debug_state_str(enum tcp_state s);
-
-/* for compatibility with older implementation */
-#define tcp_new_ip6() tcp_new_ip_type(IPADDR_TYPE_V6)
-
-#if ESP_PER_SOC_TCP_WND
-#define PER_SOC_WND(pcb) (pcb->per_soc_wnd)
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_TCP */
-
-#endif /* LWIP_HDR_TCP_H */
diff --git a/components/lwip/include/lwip/lwip/tcpip.h b/components/lwip/include/lwip/lwip/tcpip.h
deleted file mode 100644 (file)
index c123586..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * 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_TCPIP_H
-#define LWIP_HDR_TCPIP_H
-
-#include "lwip/opt.h"
-
-#if !NO_SYS /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/err.h"
-#include "lwip/timers.h"
-#include "lwip/netif.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct pbuf;
-struct netif;
-
-/** Function prototype for the init_done function passed to tcpip_init */
-typedef void (*tcpip_init_done_fn)(void *arg);
-/** Function prototype for functions passed to tcpip_callback() */
-typedef void (*tcpip_callback_fn)(void *ctx);
-
-/* Forward declarations */
-struct tcpip_callback_msg;
-
-void   tcpip_init(tcpip_init_done_fn tcpip_init_done, void *arg);
-
-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);
-#define tcpip_callback(f, ctx)  tcpip_callback_with_block(f, ctx, 1)
-
-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);
-
-/* free pbufs or heap memory from another context without blocking */
-err_t  pbuf_free_callback(struct pbuf *p);
-err_t  mem_free_callback(void *m);
-
-#if LWIP_TCPIP_TIMEOUT
-err_t  tcpip_timeout(u32_t msecs, sys_timeout_handler h, void *arg);
-err_t  tcpip_untimeout(sys_timeout_handler h, void *arg);
-#endif /* LWIP_TCPIP_TIMEOUT */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* !NO_SYS */
-
-#endif /* LWIP_HDR_TCPIP_H */
diff --git a/components/lwip/include/lwip/lwip/timers.h b/components/lwip/include/lwip/lwip/timers.h
deleted file mode 100644 (file)
index 40a33fc..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * 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>
- *         Simon Goldschmidt
- *
- */
-#ifndef LWIP_HDR_TIMERS_H
-#define LWIP_HDR_TIMERS_H
-
-#include "lwip/opt.h"
-#include "lwip/err.h"
-#if !NO_SYS
-#include "lwip/sys.h"
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifndef LWIP_DEBUG_TIMERNAMES
-#ifdef LWIP_DEBUG
-#define LWIP_DEBUG_TIMERNAMES SYS_DEBUG
-#else /* LWIP_DEBUG */
-#define LWIP_DEBUG_TIMERNAMES 0
-#endif /* LWIP_DEBUG*/
-#endif
-
-/** Function prototype for a stack-internal timer function that has to be
- * called at a defined interval */
-typedef void (* lwip_cyclic_timer_handler)(void);
-
-/** This struct contains information about a stack-internal timer function
- *  that has to be called at a defined interval */
-struct lwip_cyclic_timer {
-  u32_t interval_ms;
-  lwip_cyclic_timer_handler handler;
-#if LWIP_DEBUG_TIMERNAMES
-  const char* handler_name;
-#endif /* LWIP_DEBUG_TIMERNAMES */
-};
-
-/** This array contains all stack-internal cyclic timers. To get the number of
- * timers, use LWIP_ARRAYSIZE() */
-extern const struct lwip_cyclic_timer lwip_cyclic_timers[];
-
-#if LWIP_TIMERS
-
-/** Function prototype for a timeout callback function. Register such a function
- * using sys_timeout().
- *
- * @param arg Additional argument to pass to the function - set up by sys_timeout()
- */
-typedef void (* sys_timeout_handler)(void *arg);
-
-struct sys_timeo {
-  struct sys_timeo *next;
-  u32_t time;
-  sys_timeout_handler h;
-  void *arg;
-#if LWIP_DEBUG_TIMERNAMES
-  const char* handler_name;
-#endif /* LWIP_DEBUG_TIMERNAMES */
-};
-
-void sys_timeouts_init(void);
-
-#if LWIP_DEBUG_TIMERNAMES
-void sys_timeout_debug(u32_t msecs, sys_timeout_handler handler, void *arg, const char* handler_name);
-#define sys_timeout(msecs, handler, arg) sys_timeout_debug(msecs, handler, arg, #handler)
-#else /* LWIP_DEBUG_TIMERNAMES */
-void sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg);
-#endif /* LWIP_DEBUG_TIMERNAMES */
-
-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 */
-
-
-#endif /* LWIP_TIMERS */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_HDR_TIMERS_H */
-
diff --git a/components/lwip/include/lwip/lwip/udp.h b/components/lwip/include/lwip/lwip/udp.h
deleted file mode 100644 (file)
index c2f6ed9..0000000
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * 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_UDP_H
-#define LWIP_HDR_UDP_H
-
-#include "lwip/opt.h"
-
-#if LWIP_UDP /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/pbuf.h"
-#include "lwip/netif.h"
-#include "lwip/ip_addr.h"
-#include "lwip/ip.h"
-#include "lwip/ip6_addr.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define UDP_HLEN 8
-
-/* Fields are (of course) in network byte order. */
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct udp_hdr {
-  PACK_STRUCT_FIELD(u16_t src);
-  PACK_STRUCT_FIELD(u16_t dest);  /* src/dest UDP ports */
-  PACK_STRUCT_FIELD(u16_t len);
-  PACK_STRUCT_FIELD(u16_t chksum);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
-#define UDP_FLAGS_NOCHKSUM       0x01U
-#define UDP_FLAGS_UDPLITE        0x02U
-#define UDP_FLAGS_CONNECTED      0x04U
-#define UDP_FLAGS_MULTICAST_LOOP 0x08U
-
-struct udp_pcb;
-
-/** 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.
- *
- * ATTENTION: Be aware that 'addr' might point into the pbuf 'p' so freeing this pbuf
- *            can make 'addr' invalid, too.
- *
- * @param arg user supplied argument (udp_pcb.recv_arg)
- * @param pcb the udp_pcb which received data
- * @param p the packet buffer that was received
- * @param addr the remote IP address from which the packet was received
- * @param port the remote port from which the packet was received
- */
-typedef void (*udp_recv_fn)(void *arg, struct udp_pcb *pcb, struct pbuf *p,
-    const ip_addr_t *addr, u16_t port);
-
-struct udp_pcb {
-/* Common members of all PCB types */
-  IP_PCB;
-
-/* Protocol specific PCB members */
-
-  struct udp_pcb *next;
-
-  u8_t flags;
-  /** ports are in host byte order */
-  u16_t local_port, remote_port;
-
-#if LWIP_MULTICAST_TX_OPTIONS
-  /** outgoing network interface for multicast packets */
-  ip_addr_t multicast_ip;
-  /** TTL for outgoing multicast packets */
-  u8_t mcast_ttl;
-#endif /* LWIP_MULTICAST_TX_OPTIONS */
-
-#if LWIP_UDPLITE
-  /** used for UDP_LITE only */
-  u16_t chksum_len_rx, chksum_len_tx;
-#endif /* LWIP_UDPLITE */
-
-  /** receive callback function */
-  udp_recv_fn recv;
-  /** user-supplied argument for the recv callback */
-  void *recv_arg;
-};
-/* udp_pcbs export for external reference (e.g. SNMP agent) */
-extern struct udp_pcb *udp_pcbs;
-
-/* The following functions is the application layer interface to the
-   UDP code. */
-struct udp_pcb * udp_new        (void);
-struct udp_pcb * udp_new_ip_type(u8_t type);
-void             udp_remove     (struct udp_pcb *pcb);
-err_t            udp_bind       (struct udp_pcb *pcb, const ip_addr_t *ipaddr,
-                                 u16_t port);
-err_t            udp_connect    (struct udp_pcb *pcb, const ip_addr_t *ipaddr,
-                                 u16_t port);
-void             udp_disconnect (struct udp_pcb *pcb);
-void             udp_recv       (struct udp_pcb *pcb, udp_recv_fn recv,
-                                 void *recv_arg);
-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);
-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);
-err_t            udp_sendto     (struct udp_pcb *pcb, struct pbuf *p,
-                                 const ip_addr_t *dst_ip, u16_t dst_port);
-err_t            udp_send       (struct udp_pcb *pcb, struct pbuf *p);
-
-#if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP
-err_t            udp_sendto_if_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);
-err_t            udp_sendto_chksum(struct udp_pcb *pcb, struct pbuf *p,
-                                 const ip_addr_t *dst_ip, u16_t dst_port,
-                                 u8_t have_chksum, u16_t chksum);
-err_t            udp_send_chksum(struct udp_pcb *pcb, struct pbuf *p,
-                                 u8_t have_chksum, u16_t chksum);
-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);
-#endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */
-
-#define          udp_flags(pcb) ((pcb)->flags)
-#define          udp_setflags(pcb, f)  ((pcb)->flags = (f))
-
-/* The following functions are the lower layer interface to UDP. */
-void             udp_input      (struct pbuf *p, struct netif *inp);
-
-void             udp_init       (void);
-
-/* for compatibility with older implementation */
-#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)
-#define udp_get_multicast_ttl(pcb)                 ((pcb)->mcast_ttl)
-
-#if LWIP_IPV6_MLD
-#define udp_set_multicast_netif_ip6addr(pcb, ip6addr) ip_addr_copy_from_ip6((pcb)->multicast_ip, *(ip6addr))
-#define udp_get_multicast_netif_ip6addr(pcb)          ip_2_ip6(&(pcb)->multicast_ip)
-#endif
-
-#endif /* LWIP_MULTICAST_TX_OPTIONS */
-
-#if UDP_DEBUG
-void udp_debug_print(struct udp_hdr *udphdr);
-#else
-#define udp_debug_print(udphdr)
-#endif
-
-#if LWIP_IPV4
-void udp_netif_ipv4_addr_changed(const ip4_addr_t* old_addr, const ip4_addr_t* new_addr);
-#endif /* LWIP_IPV4 */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_UDP */
-
-#endif /* LWIP_HDR_UDP_H */
diff --git a/components/lwip/include/lwip/netif/etharp.h b/components/lwip/include/lwip/netif/etharp.h
deleted file mode 100644 (file)
index 3e25c38..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (c) 2001-2003 Swedish Institute of Computer Science.
- * Copyright (c) 2003-2004 Leon Woestenberg <leon.woestenberg@axon.tv>
- * Copyright (c) 2003-2004 Axon Digital Design B.V., The Netherlands.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam@sics.se>
- *
- */
-
-#ifndef LWIP_HDR_NETIF_ETHARP_H
-#define LWIP_HDR_NETIF_ETHARP_H
-
-#include "lwip/opt.h"
-
-#if LWIP_ARP || LWIP_ETHERNET /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/pbuf.h"
-#include "lwip/ip4_addr.h"
-#include "lwip/netif.h"
-#include "lwip/ip4.h"
-#include "netif/ethernet.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if LWIP_IPV4 && LWIP_ARP /* don't build if not configured for use in lwipopts.h */
-
-#ifndef ETHARP_HWADDR_LEN
-#define ETHARP_HWADDR_LEN     ETH_HWADDR_LEN
-#endif
-
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-/** the ARP message, see RFC 826 ("Packet format") */
-struct etharp_hdr {
-  PACK_STRUCT_FIELD(u16_t hwtype);
-  PACK_STRUCT_FIELD(u16_t proto);
-  PACK_STRUCT_FLD_8(u8_t  hwlen);
-  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 eth_addr dhwaddr);
-  PACK_STRUCT_FLD_S(struct ip4_addr2 dipaddr);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
-#define SIZEOF_ETHARP_HDR 28
-
-#define SIZEOF_ETHARP_PACKET    (SIZEOF_ETH_HDR + SIZEOF_ETHARP_HDR)
-#if ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET)
-#define SIZEOF_ETHARP_PACKET_TX (SIZEOF_ETHARP_PACKET + SIZEOF_VLAN_HDR)
-#else /* ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET) */
-#define SIZEOF_ETHARP_PACKET_TX SIZEOF_ETHARP_PACKET
-#endif /* ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET) */
-
-/** 1 seconds period */
-#define ARP_TMR_INTERVAL 1000
-
-/** ARP message types (opcodes) */
-#define ARP_REQUEST 1
-#define ARP_REPLY   2
-
-#if ARP_QUEUEING
-/** struct for queueing outgoing packets for unknown address
-  * defined here to be accessed by memp.h
-  */
-struct etharp_q_entry {
-  struct etharp_q_entry *next;
-  struct pbuf *p;
-};
-#endif /* ARP_QUEUEING */
-
-#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,
-         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);
-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);
-/** 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. */
-#define etharp_gratuitous(netif) etharp_request((netif), netif_ip4_addr(netif))
-void etharp_cleanup_netif(struct netif *netif);
-
-#if ETHARP_SUPPORT_STATIC_ENTRIES
-err_t etharp_add_static_entry(const ip4_addr_t *ipaddr, struct eth_addr *ethaddr);
-err_t etharp_remove_static_entry(const ip4_addr_t *ipaddr);
-#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
-
-#if LWIP_AUTOIP
-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,
-                 const struct eth_addr *hwdst_addr, const ip4_addr_t *ipdst_addr,
-                 const u16_t opcode);
-#endif /* LWIP_AUTOIP */
-
-#endif /* LWIP_IPV4 && LWIP_ARP */
-
-void etharp_arp_input(struct netif *netif, struct eth_addr *ethaddr, struct pbuf *p);
-
-#if ETHARP_TRUST_IP_MAC
-void etharp_ip_input(struct netif *netif, struct pbuf *p);
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_ARP || LWIP_ETHERNET */
-
-#endif /* LWIP_HDR_NETIF_ETHARP_H */
diff --git a/components/lwip/include/lwip/netif/ethernet.h b/components/lwip/include/lwip/netif/ethernet.h
deleted file mode 100644 (file)
index 17623e4..0000000
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (c) 2001-2003 Swedish Institute of Computer Science.
- * Copyright (c) 2003-2004 Leon Woestenberg <leon.woestenberg@axon.tv>
- * Copyright (c) 2003-2004 Axon Digital Design B.V., The Netherlands.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam@sics.se>
- *
- */
-
-#ifndef LWIP_HDR_NETIF_ETHERNET_H
-#define LWIP_HDR_NETIF_ETHERNET_H
-
-#include "lwip/opt.h"
-
-#include "lwip/pbuf.h"
-#include "lwip/netif.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifndef ETH_HWADDR_LEN
-#ifdef ETHARP_HWADDR_LEN
-#define ETH_HWADDR_LEN    ETHARP_HWADDR_LEN /* compatibility mode */
-#else
-#define ETH_HWADDR_LEN    6
-#endif
-#endif
-
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct eth_addr {
-  PACK_STRUCT_FLD_8(u8_t addr[ETH_HWADDR_LEN]);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-/** Ethernet header */
-struct eth_hdr {
-#if ETH_PAD_SIZE
-  PACK_STRUCT_FLD_8(u8_t padding[ETH_PAD_SIZE]);
-#endif
-  PACK_STRUCT_FLD_S(struct eth_addr dest);
-  PACK_STRUCT_FLD_S(struct eth_addr src);
-  PACK_STRUCT_FIELD(u16_t type);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
-#define SIZEOF_ETH_HDR (14 + ETH_PAD_SIZE)
-
-#if ETHARP_SUPPORT_VLAN
-
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-/** VLAN header inserted between ethernet header and payload
- * if 'type' in ethernet header is ETHTYPE_VLAN.
- * See IEEE802.Q */
-struct eth_vlan_hdr {
-  PACK_STRUCT_FIELD(u16_t prio_vid);
-  PACK_STRUCT_FIELD(u16_t tpid);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
-#define SIZEOF_VLAN_HDR 4
-#define VLAN_ID(vlan_hdr) (htons((vlan_hdr)->prio_vid) & 0xFFF)
-
-#endif /* ETHARP_SUPPORT_VLAN */
-
-/* A list of often ethtypes (although lwIP does not use all of them): */
-#define ETHTYPE_IP        0x0800U  /* Internet protocol v4 */
-#define ETHTYPE_ARP       0x0806U  /* Address resolution protocol */
-#define ETHTYPE_WOL       0x0842U  /* Wake on lan */
-#define ETHTYPE_VLAN      0x8100U  /* Virtual local area network */
-#define ETHTYPE_IPV6      0x86DDU  /* Internet protocol v6 */
-#define ETHTYPE_PPPOEDISC 0x8863U  /* PPP Over Ethernet Discovery Stage */
-#define ETHTYPE_PPPOE     0x8864U  /* PPP Over Ethernet Session Stage */
-#define ETHTYPE_JUMBO     0x8870U  /* Jumbo Frames */
-#define ETHTYPE_PROFINET  0x8892U  /* Process field network */
-#define ETHTYPE_ETHERCAT  0x88A4U  /* Ethernet for control automation technology */
-#define ETHTYPE_LLDP      0x88CCU  /* Link layer discovery protocol */
-#define ETHTYPE_SERCOS    0x88CDU  /* Serial real-time communication system */
-#define ETHTYPE_PTP       0x88F7U  /* Precision time protocol */
-#define ETHTYPE_QINQ      0x9100U  /* Q-in-Q, 802.1ad */
-
-/** 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
-#define LL_IP4_MULTICAST_ADDR_2 0x5e
-
-/** IPv6 multicast uses this prefix */
-#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
-
-#if LWIP_ARP || LWIP_ETHERNET
-
-/** 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).
- */
-#ifndef LWIP_ARP_FILTER_NETIF
-#define LWIP_ARP_FILTER_NETIF 0
-#endif
-
-err_t ethernet_input(struct pbuf *p, struct netif *netif);
-
-#define eth_addr_cmp(addr1, addr2) (memcmp((addr1)->addr, (addr2)->addr, ETH_HWADDR_LEN) == 0)
-
-extern const struct eth_addr ethbroadcast, ethzero;
-
-#endif /* LWIP_ARP || LWIP_ETHERNET */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_HDR_NETIF_ETHERNET_H */
diff --git a/components/lwip/include/lwip/netif/lowpan6.h b/components/lwip/include/lwip/netif/lowpan6.h
deleted file mode 100644 (file)
index 2155293..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-/**
- * @file
- *
- * 6LowPAN output 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_H
-#define LWIP_HDR_LOWPAN6_H
-
-#include "netif/lowpan6_opts.h"
-
-#if LWIP_IPV6 && LWIP_6LOWPAN /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/pbuf.h"
-#include "lwip/ip.h"
-#include "lwip/ip_addr.h"
-#include "lwip/netif.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/** 1 second period */
-#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_short_addr(u8_t addr_high, u8_t addr_low);
-
-#if LWIP_IPV4
-err_t lowpan4_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr);
-#endif /* LWIP_IPV4 */
-err_t lowpan6_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr);
-err_t lowpan6_input(struct pbuf * p, struct netif *netif);
-err_t lowpan6_if_init(struct netif *netif);
-
-/* pan_id in network byte order. */
-err_t lowpan6_set_pan_id(u16_t pan_id);
-
-err_t tcpip_6lowpan_input(struct pbuf *p, struct netif *inp);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_IPV6 && LWIP_6LOWPAN */
-
-#endif /* LWIP_HDR_LOWPAN6_H */
diff --git a/components/lwip/include/lwip/netif/lowpan6_opts.h b/components/lwip/include/lwip/netif/lowpan6_opts.h
deleted file mode 100644 (file)
index 6a76957..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * 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_OPTS_H
-#define LWIP_HDR_LOWPAN6_OPTS_H
-
-#include "lwip/opt.h"
-
-#ifndef LWIP_6LOWPAN
-#define LWIP_6LOWPAN                     0
-#endif
-
-#ifndef LWIP_6LOWPAN_NUM_CONTEXTS
-#define LWIP_6LOWPAN_NUM_CONTEXTS        10
-#endif
-
-#ifndef LWIP_6LOWPAN_INFER_SHORT_ADDRESS
-#define LWIP_6LOWPAN_INFER_SHORT_ADDRESS 1
-#endif
-
-#ifndef LWIP_6LOWPAN_IPHC
-#define LWIP_6LOWPAN_IPHC                1
-#endif
-
-#ifndef LWIP_6LOWPAN_HW_CRC
-#define LWIP_6LOWPAN_HW_CRC              1
-#endif
-
-#ifndef LOWPAN6_DEBUG
-#define LOWPAN6_DEBUG                    LWIP_DBG_OFF
-#endif
-
-#endif /* LWIP_HDR_LOWPAN6_OPTS_H */
diff --git a/components/lwip/include/lwip/netif/ppp/ccp.h b/components/lwip/include/lwip/netif/ppp/ccp.h
deleted file mode 100644 (file)
index a8eab9c..0000000
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * ccp.h - Definitions for PPP Compression Control Protocol.
- *
- * Copyright (c) 1994-2002 Paul Mackerras. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. The name(s) of the authors of this software must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission.
- *
- * 3. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by Paul Mackerras
- *     <paulus@samba.org>".
- *
- * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * $Id: ccp.h,v 1.12 2004/11/04 10:02:26 paulus Exp $
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && CCP_SUPPORT  /* don't build if not configured for use in lwipopts.h */
-
-#ifndef CCP_H
-#define CCP_H
-
-/*
- * CCP codes.
- */
-
-#define CCP_CONFREQ    1
-#define CCP_CONFACK    2
-#define CCP_TERMREQ    5
-#define CCP_TERMACK    6
-#define CCP_RESETREQ   14
-#define CCP_RESETACK   15
-
-/*
- * Max # bytes for a CCP option
- */
-
-#define CCP_MAX_OPTION_LENGTH  32
-
-/*
- * Parts of a CCP packet.
- */
-
-#define CCP_CODE(dp)           ((dp)[0])
-#define CCP_ID(dp)             ((dp)[1])
-#define CCP_LENGTH(dp)         (((dp)[2] << 8) + (dp)[3])
-#define CCP_HDRLEN             4
-
-#define CCP_OPT_CODE(dp)       ((dp)[0])
-#define CCP_OPT_LENGTH(dp)     ((dp)[1])
-#define CCP_OPT_MINLEN         2
-
-#if BSDCOMPRESS_SUPPORT
-/*
- * Definitions for BSD-Compress.
- */
-
-#define CI_BSD_COMPRESS                21      /* config. option for BSD-Compress */
-#define CILEN_BSD_COMPRESS     3       /* length of config. option */
-
-/* Macros for handling the 3rd byte of the BSD-Compress config option. */
-#define BSD_NBITS(x)           ((x) & 0x1F)    /* number of bits requested */
-#define BSD_VERSION(x)         ((x) >> 5)      /* version of option format */
-#define BSD_CURRENT_VERSION    1               /* current version number */
-#define BSD_MAKE_OPT(v, n)     (((v) << 5) | (n))
-
-#define BSD_MIN_BITS           9       /* smallest code size supported */
-#define BSD_MAX_BITS           15      /* largest code size supported */
-#endif /* BSDCOMPRESS_SUPPORT */
-
-#if DEFLATE_SUPPORT
-/*
- * Definitions for Deflate.
- */
-
-#define CI_DEFLATE             26      /* config option for Deflate */
-#define CI_DEFLATE_DRAFT       24      /* value used in original draft RFC */
-#define CILEN_DEFLATE          4       /* length of its config option */
-
-#define DEFLATE_MIN_SIZE       9
-#define DEFLATE_MAX_SIZE       15
-#define DEFLATE_METHOD_VAL     8
-#define DEFLATE_SIZE(x)                (((x) >> 4) + 8)
-#define DEFLATE_METHOD(x)      ((x) & 0x0F)
-#define DEFLATE_MAKE_OPT(w)    ((((w) - 8) << 4) + DEFLATE_METHOD_VAL)
-#define DEFLATE_CHK_SEQUENCE   0
-#endif /* DEFLATE_SUPPORT */
-
-#if MPPE_SUPPORT
-/*
- * Definitions for MPPE.
- */
-
-#define CI_MPPE                18      /* config option for MPPE */
-#define CILEN_MPPE              6      /* length of config option */
-#endif /* MPPE_SUPPORT */
-
-#if PREDICTOR_SUPPORT
-/*
- * Definitions for other, as yet unsupported, compression methods.
- */
-
-#define CI_PREDICTOR_1         1       /* config option for Predictor-1 */
-#define CILEN_PREDICTOR_1      2       /* length of its config option */
-#define CI_PREDICTOR_2         2       /* config option for Predictor-2 */
-#define CILEN_PREDICTOR_2      2       /* length of its config option */
-#endif /* PREDICTOR_SUPPORT */
-
-typedef struct ccp_options {
-#if DEFLATE_SUPPORT
-    unsigned int deflate          :1; /* do Deflate? */
-    unsigned int deflate_correct  :1; /* use correct code for deflate? */
-    unsigned int deflate_draft    :1; /* use draft RFC code for deflate? */
-#endif /* DEFLATE_SUPPORT */
-#if BSDCOMPRESS_SUPPORT
-    unsigned int bsd_compress     :1; /* do BSD Compress? */
-#endif /* BSDCOMPRESS_SUPPORT */
-#if PREDICTOR_SUPPORT
-    unsigned int predictor_1      :1; /* do Predictor-1? */
-    unsigned int predictor_2      :1; /* do Predictor-2? */
-#endif /* PREDICTOR_SUPPORT */
-
-#if MPPE_SUPPORT
-    u8_t mppe;                 /* MPPE bitfield */
-#endif /* MPPE_SUPPORT */
-#if BSDCOMPRESS_SUPPORT
-    u_short bsd_bits;          /* # bits/code for BSD Compress */
-#endif /* BSDCOMPRESS_SUPPORT */
-#if DEFLATE_SUPPORT
-    u_short deflate_size;      /* lg(window size) for Deflate */
-#endif /* DEFLATE_SUPPORT */
-    u8_t method;               /* code for chosen compression method */
-} ccp_options;
-
-extern const struct protent ccp_protent;
-
-void ccp_resetrequest(ppp_pcb *pcb);  /* Issue a reset-request. */
-
-#endif /* CCP_H */
-#endif /* PPP_SUPPORT && CCP_SUPPORT */
diff --git a/components/lwip/include/lwip/netif/ppp/chap-md5.h b/components/lwip/include/lwip/netif/ppp/chap-md5.h
deleted file mode 100644 (file)
index a05a157..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * chap-md5.h - New CHAP/MD5 implementation.
- *
- * Copyright (c) 2003 Paul Mackerras. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. The name(s) of the authors of this software must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission.
- *
- * 3. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by Paul Mackerras
- *     <paulus@samba.org>".
- *
- * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && CHAP_SUPPORT  /* don't build if not configured for use in lwipopts.h */
-
-extern const struct chap_digest_type md5_digest;
-
-#endif /* PPP_SUPPORT && CHAP_SUPPORT */
diff --git a/components/lwip/include/lwip/netif/ppp/chap-new.h b/components/lwip/include/lwip/netif/ppp/chap-new.h
deleted file mode 100644 (file)
index 9b7c048..0000000
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * chap-new.c - New CHAP implementation.
- *
- * Copyright (c) 2003 Paul Mackerras. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. The name(s) of the authors of this software must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission.
- *
- * 3. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by Paul Mackerras
- *     <paulus@samba.org>".
- *
- * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && CHAP_SUPPORT  /* don't build if not configured for use in lwipopts.h */
-
-#ifndef CHAP_H
-#define CHAP_H
-
-#include "ppp.h"
-
-/*
- * CHAP packets begin with a standard header with code, id, len (2 bytes).
- */
-#define CHAP_HDRLEN    4
-
-/*
- * Values for the code field.
- */
-#define CHAP_CHALLENGE 1
-#define CHAP_RESPONSE  2
-#define CHAP_SUCCESS   3
-#define CHAP_FAILURE   4
-
-/*
- * CHAP digest codes.
- */
-#define CHAP_MD5               5
-#if MSCHAP_SUPPORT
-#define CHAP_MICROSOFT         0x80
-#define CHAP_MICROSOFT_V2      0x81
-#endif /* MSCHAP_SUPPORT */
-
-/*
- * Semi-arbitrary limits on challenge and response fields.
- */
-#define MAX_CHALLENGE_LEN      64
-#define MAX_RESPONSE_LEN       64
-
-/*
- * These limits apply to challenge and response packets we send.
- * The +4 is the +1 that we actually need rounded up.
- */
-#define CHAL_MAX_PKTLEN        (PPP_HDRLEN + CHAP_HDRLEN + 4 + MAX_CHALLENGE_LEN + MAXNAMELEN)
-#define RESP_MAX_PKTLEN        (PPP_HDRLEN + CHAP_HDRLEN + 4 + MAX_RESPONSE_LEN + MAXNAMELEN)
-
-/* bitmask of supported algorithms */
-#if MSCHAP_SUPPORT
-#define MDTYPE_MICROSOFT_V2    0x1
-#define MDTYPE_MICROSOFT       0x2
-#endif /* MSCHAP_SUPPORT */
-#define MDTYPE_MD5             0x4
-#define MDTYPE_NONE            0
-
-#if MSCHAP_SUPPORT
-/* Return the digest alg. ID for the most preferred digest type. */
-#define CHAP_DIGEST(mdtype) \
-    ((mdtype) & MDTYPE_MD5)? CHAP_MD5: \
-    ((mdtype) & MDTYPE_MICROSOFT_V2)? CHAP_MICROSOFT_V2: \
-    ((mdtype) & MDTYPE_MICROSOFT)? CHAP_MICROSOFT: \
-    0
-#else /* !MSCHAP_SUPPORT */
-#define CHAP_DIGEST(mdtype) \
-    ((mdtype) & MDTYPE_MD5)? CHAP_MD5: \
-    0
-#endif /* MSCHAP_SUPPORT */
-
-/* Return the bit flag (lsb set) for our most preferred digest type. */
-#define CHAP_MDTYPE(mdtype) ((mdtype) ^ ((mdtype) - 1)) & (mdtype)
-
-/* Return the bit flag for a given digest algorithm ID. */
-#if MSCHAP_SUPPORT
-#define CHAP_MDTYPE_D(digest) \
-    ((digest) == CHAP_MICROSOFT_V2)? MDTYPE_MICROSOFT_V2: \
-    ((digest) == CHAP_MICROSOFT)? MDTYPE_MICROSOFT: \
-    ((digest) == CHAP_MD5)? MDTYPE_MD5: \
-    0
-#else /* !MSCHAP_SUPPORT */
-#define CHAP_MDTYPE_D(digest) \
-    ((digest) == CHAP_MD5)? MDTYPE_MD5: \
-    0
-#endif /* MSCHAP_SUPPORT */
-
-/* Can we do the requested digest? */
-#if MSCHAP_SUPPORT
-#define CHAP_CANDIGEST(mdtype, digest) \
-    ((digest) == CHAP_MICROSOFT_V2)? (mdtype) & MDTYPE_MICROSOFT_V2: \
-    ((digest) == CHAP_MICROSOFT)? (mdtype) & MDTYPE_MICROSOFT: \
-    ((digest) == CHAP_MD5)? (mdtype) & MDTYPE_MD5: \
-    0
-#else /* !MSCHAP_SUPPORT */
-#define CHAP_CANDIGEST(mdtype, digest) \
-    ((digest) == CHAP_MD5)? (mdtype) & MDTYPE_MD5: \
-    0
-#endif /* MSCHAP_SUPPORT */
-
-/*
- * The code for each digest type has to supply one of these.
- */
-struct chap_digest_type {
-       int code;
-
-#if PPP_SERVER
-       /*
-        * Note: challenge and response arguments below are formatted as
-        * a length byte followed by the actual challenge/response data.
-        */
-       void (*generate_challenge)(ppp_pcb *pcb, unsigned char *challenge);
-       int (*verify_response)(ppp_pcb *pcb, int id, const char *name,
-               const unsigned char *secret, int secret_len,
-               const unsigned char *challenge, const unsigned char *response,
-               char *message, int message_space);
-#endif /* PPP_SERVER */
-       void (*make_response)(ppp_pcb *pcb, unsigned char *response, int id, const char *our_name,
-               const unsigned char *challenge, const char *secret, int secret_len,
-               unsigned char *priv);
-       int (*check_success)(ppp_pcb *pcb, unsigned char *pkt, int len, unsigned char *priv);
-       void (*handle_failure)(ppp_pcb *pcb, unsigned char *pkt, int len);
-};
-
-/*
- * Each interface is described by chap structure.
- */
-#if CHAP_SUPPORT
-typedef struct chap_client_state {
-       u8_t flags;
-       const char *name;
-       const struct chap_digest_type *digest;
-       unsigned char priv[64];         /* private area for digest's use */
-} chap_client_state;
-
-#if PPP_SERVER
-typedef struct chap_server_state {
-       u8_t flags;
-       u8_t id;
-       const char *name;
-       const struct chap_digest_type *digest;
-       int challenge_xmits;
-       int challenge_pktlen;
-       unsigned char challenge[CHAL_MAX_PKTLEN];
-} chap_server_state;
-#endif /* PPP_SERVER */
-#endif /* CHAP_SUPPORT */
-
-#if 0 /* UNUSED */
-/* Hook for a plugin to validate CHAP challenge */
-extern int (*chap_verify_hook)(char *name, char *ourname, int id,
-                       const struct chap_digest_type *digest,
-                       unsigned char *challenge, unsigned char *response,
-                       char *message, int message_space);
-#endif /* UNUSED */
-
-#if PPP_SERVER
-/* Called by authentication code to start authenticating the peer. */
-extern void chap_auth_peer(ppp_pcb *pcb, const char *our_name, int digest_code);
-#endif /* PPP_SERVER */
-
-/* Called by auth. code to start authenticating us to the peer. */
-extern void chap_auth_with_peer(ppp_pcb *pcb, const char *our_name, int digest_code);
-
-/* Represents the CHAP protocol to the main pppd code */
-extern const struct protent chap_protent;
-
-#endif /* CHAP_H */
-#endif /* PPP_SUPPORT && CHAP_SUPPORT */
diff --git a/components/lwip/include/lwip/netif/ppp/chap_ms.h b/components/lwip/include/lwip/netif/ppp/chap_ms.h
deleted file mode 100644 (file)
index 709bb89..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * chap_ms.h - Challenge Handshake Authentication Protocol definitions.
- *
- * Copyright (c) 1995 Eric Rosenquist.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The name(s) of the authors of this software must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission.
- *
- * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * $Id: chap_ms.h,v 1.13 2004/11/15 22:13:26 paulus Exp $
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && MSCHAP_SUPPORT  /* don't build if not configured for use in lwipopts.h */
-
-#ifndef __CHAPMS_INCLUDE__
-
-extern const struct chap_digest_type chapms_digest;
-extern const struct chap_digest_type chapms2_digest;
-
-#define __CHAPMS_INCLUDE__
-#endif /* __CHAPMS_INCLUDE__ */
-
-#endif /* PPP_SUPPORT && MSCHAP_SUPPORT */
diff --git a/components/lwip/include/lwip/netif/ppp/eap.h b/components/lwip/include/lwip/netif/ppp/eap.h
deleted file mode 100644 (file)
index 7dfd676..0000000
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * eap.h - Extensible Authentication Protocol for PPP (RFC 2284)
- *
- * Copyright (c) 2001 by Sun Microsystems, Inc.
- * All rights reserved.
- *
- * Non-exclusive rights to redistribute, modify, translate, and use
- * this software in source and binary forms, in whole or in part, is
- * hereby granted, provided that the above copyright notice is
- * duplicated in any source form, and that neither the name of the
- * copyright holder nor the author is used to endorse or promote
- * products derived from this software.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Original version by James Carlson
- *
- * $Id: eap.h,v 1.2 2003/06/11 23:56:26 paulus Exp $
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && EAP_SUPPORT  /* don't build if not configured for use in lwipopts.h */
-
-#ifndef PPP_EAP_H
-#define        PPP_EAP_H
-
-#include "ppp.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * Packet header = Code, id, length.
- */
-#define        EAP_HEADERLEN   4
-
-
-/* EAP message codes. */
-#define        EAP_REQUEST     1
-#define        EAP_RESPONSE    2
-#define        EAP_SUCCESS     3
-#define        EAP_FAILURE     4
-
-/* EAP types */
-#define        EAPT_IDENTITY           1
-#define        EAPT_NOTIFICATION       2
-#define        EAPT_NAK                3       /* (response only) */
-#define        EAPT_MD5CHAP            4
-#define        EAPT_OTP                5       /* One-Time Password; RFC 1938 */
-#define        EAPT_TOKEN              6       /* Generic Token Card */
-/* 7 and 8 are unassigned. */
-#define        EAPT_RSA                9       /* RSA Public Key Authentication */
-#define        EAPT_DSS                10      /* DSS Unilateral */
-#define        EAPT_KEA                11      /* KEA */
-#define        EAPT_KEA_VALIDATE       12      /* KEA-VALIDATE */
-#define        EAPT_TLS                13      /* EAP-TLS */
-#define        EAPT_DEFENDER           14      /* Defender Token (AXENT) */
-#define        EAPT_W2K                15      /* Windows 2000 EAP */
-#define        EAPT_ARCOT              16      /* Arcot Systems */
-#define        EAPT_CISCOWIRELESS      17      /* Cisco Wireless */
-#define        EAPT_NOKIACARD          18      /* Nokia IP smart card */
-#define        EAPT_SRP                19      /* Secure Remote Password */
-/* 20 is deprecated */
-
-/* EAP SRP-SHA1 Subtypes */
-#define        EAPSRP_CHALLENGE        1       /* Request 1 - Challenge */
-#define        EAPSRP_CKEY             1       /* Response 1 - Client Key */
-#define        EAPSRP_SKEY             2       /* Request 2 - Server Key */
-#define        EAPSRP_CVALIDATOR       2       /* Response 2 - Client Validator */
-#define        EAPSRP_SVALIDATOR       3       /* Request 3 - Server Validator */
-#define        EAPSRP_ACK              3       /* Response 3 - final ack */
-#define        EAPSRP_LWRECHALLENGE    4       /* Req/resp 4 - Lightweight rechal */
-
-#define        SRPVAL_EBIT     0x00000001      /* Use shared key for ECP */
-
-#define        SRP_PSEUDO_ID   "pseudo_"
-#define        SRP_PSEUDO_LEN  7
-
-#define MD5_SIGNATURE_SIZE     16
-#define EAP_MIN_CHALLENGE_LENGTH       17
-#define EAP_MAX_CHALLENGE_LENGTH       24
-#define EAP_MIN_MAX_POWER_OF_TWO_CHALLENGE_LENGTH     3   /* 2^3-1 = 7, 17+7 = 24 */
-
-#define        EAP_STATES      \
-       "Initial", "Pending", "Closed", "Listen", "Identify", \
-       "SRP1", "SRP2", "SRP3", "MD5Chall", "Open", "SRP4", "BadAuth"
-
-#define        eap_client_active(pcb)  ((pcb)->eap.es_client.ea_state == eapListen)
-#if PPP_SERVER
-#define        eap_server_active(pcb)  \
-       ((pcb)->eap.es_server.ea_state >= eapIdentify && \
-        (pcb)->eap.es_server.ea_state <= eapMD5Chall)
-#endif /* PPP_SERVER */
-
-/*
- * Complete EAP state for one PPP session.
- */
-enum eap_state_code {
-       eapInitial = 0, /* No EAP authentication yet requested */
-       eapPending,     /* Waiting for LCP (no timer) */
-       eapClosed,      /* Authentication not in use */
-       eapListen,      /* Client ready (and timer running) */
-       eapIdentify,    /* EAP Identify sent */
-       eapSRP1,        /* Sent EAP SRP-SHA1 Subtype 1 */
-       eapSRP2,        /* Sent EAP SRP-SHA1 Subtype 2 */
-       eapSRP3,        /* Sent EAP SRP-SHA1 Subtype 3 */
-       eapMD5Chall,    /* Sent MD5-Challenge */
-       eapOpen,        /* Completed authentication */
-       eapSRP4,        /* Sent EAP SRP-SHA1 Subtype 4 */
-       eapBadAuth      /* Failed authentication */
-};
-
-struct eap_auth {
-       const char *ea_name;    /* Our name */
-       char ea_peer[MAXNAMELEN +1];    /* Peer's name */
-       void *ea_session;       /* Authentication library linkage */
-       u_char *ea_skey;        /* Shared encryption key */
-       u_short ea_namelen;     /* Length of our name */
-       u_short ea_peerlen;     /* Length of peer's name */
-       enum eap_state_code ea_state;
-       u_char ea_id;           /* Current id */
-       u_char ea_requests;     /* Number of Requests sent/received */
-       u_char ea_responses;    /* Number of Responses */
-       u_char ea_type;         /* One of EAPT_* */
-       u32_t ea_keyflags;      /* SRP shared key usage flags */
-};
-
-#ifndef EAP_MAX_CHALLENGE_LENGTH
-#define EAP_MAX_CHALLENGE_LENGTH       24
-#endif
-typedef struct eap_state {
-       struct eap_auth es_client;      /* Client (authenticatee) data */
-#if PPP_SERVER
-       struct eap_auth es_server;      /* Server (authenticator) data */
-#endif /* PPP_SERVER */
-       int es_savedtime;               /* Saved timeout */
-       int es_rechallenge;             /* EAP rechallenge interval */
-       int es_lwrechallenge;           /* SRP lightweight rechallenge inter */
-       u8_t es_usepseudo;              /* Use SRP Pseudonym if offered one */
-       int es_usedpseudo;              /* Set if we already sent PN */
-       int es_challen;                 /* Length of challenge string */
-       u_char es_challenge[EAP_MAX_CHALLENGE_LENGTH];
-} eap_state;
-
-/*
- * Timeouts.
- */
-#if 0 /* moved to opt.h */
-#define        EAP_DEFTIMEOUT          3       /* Timeout (seconds) for rexmit */
-#define        EAP_DEFTRANSMITS        10      /* max # times to transmit */
-#define        EAP_DEFREQTIME          20      /* Time to wait for peer request */
-#define        EAP_DEFALLOWREQ         20      /* max # times to accept requests */
-#endif /* moved to opt.h */
-
-void eap_authwithpeer(ppp_pcb *pcb, const char *localname);
-void eap_authpeer(ppp_pcb *pcb, const char *localname);
-
-extern const struct protent eap_protent;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* PPP_EAP_H */
-
-#endif /* PPP_SUPPORT && EAP_SUPPORT */
diff --git a/components/lwip/include/lwip/netif/ppp/ecp.h b/components/lwip/include/lwip/netif/ppp/ecp.h
deleted file mode 100644 (file)
index cba6678..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * ecp.h - Definitions for PPP Encryption Control Protocol.
- *
- * Copyright (c) 2002 Google, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The name(s) of the authors of this software must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission.
- *
- * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * $Id: ecp.h,v 1.2 2003/01/10 07:12:36 fcusack Exp $
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && ECP_SUPPORT  /* don't build if not configured for use in lwipopts.h */
-
-typedef struct ecp_options {
-    bool required;             /* Is ECP required? */
-    unsigned enctype;          /* Encryption type */
-} ecp_options;
-
-extern fsm ecp_fsm[];
-extern ecp_options ecp_wantoptions[];
-extern ecp_options ecp_gotoptions[];
-extern ecp_options ecp_allowoptions[];
-extern ecp_options ecp_hisoptions[];
-
-extern const struct protent ecp_protent;
-
-#endif /* PPP_SUPPORT && ECP_SUPPORT */
diff --git a/components/lwip/include/lwip/netif/ppp/eui64.h b/components/lwip/include/lwip/netif/ppp/eui64.h
deleted file mode 100644 (file)
index dffb5e4..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * eui64.h - EUI64 routines for IPv6CP.
- *
- * Copyright (c) 1999 Tommi Komulainen.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The name(s) of the authors of this software must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission.
- *
- * 4. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by Tommi Komulainen
- *     <Tommi.Komulainen@iki.fi>".
- *
- * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * $Id: eui64.h,v 1.6 2002/12/04 23:03:32 paulus Exp $
-*/
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && PPP_IPV6_SUPPORT  /* don't build if not configured for use in lwipopts.h */
-
-#ifndef __EUI64_H__
-#define __EUI64_H__
-
-/*
- * TODO:
- *
- * Maybe this should be done by processing struct in6_addr directly...
- */
-typedef union
-{
-    u8_t e8[8];
-    u16_t e16[4];
-    u32_t e32[2];
-} eui64_t;
-
-#define eui64_iszero(e)                (((e).e32[0] | (e).e32[1]) == 0)
-#define eui64_equals(e, o)     (((e).e32[0] == (o).e32[0]) && \
-                               ((e).e32[1] == (o).e32[1]))
-#define eui64_zero(e)          (e).e32[0] = (e).e32[1] = 0;
-
-#define eui64_copy(s, d)       memcpy(&(d), &(s), sizeof(eui64_t))
-
-#define eui64_magic(e)         do {                    \
-                               (e).e32[0] = magic();   \
-                               (e).e32[1] = magic();   \
-                               (e).e8[0] &= ~2;        \
-                               } while (0)
-#define eui64_magic_nz(x)      do {                            \
-                               eui64_magic(x);                 \
-                               } while (eui64_iszero(x))
-#define eui64_magic_ne(x, y)   do {                            \
-                               eui64_magic(x);                 \
-                               } while (eui64_equals(x, y))
-
-#define eui64_get(ll, cp)      do {                            \
-                               eui64_copy((*cp), (ll));        \
-                               (cp) += sizeof(eui64_t);        \
-                               } while (0)
-
-#define eui64_put(ll, cp)      do {                            \
-                               eui64_copy((ll), (*cp));        \
-                               (cp) += sizeof(eui64_t);        \
-                               } while (0)
-
-#define eui64_set32(e, l)      do {                    \
-                               (e).e32[0] = 0;         \
-                               (e).e32[1] = htonl(l);  \
-                               } while (0)
-#define eui64_setlo32(e, l)    eui64_set32(e, l)
-
-char *eui64_ntoa(eui64_t);     /* Returns ascii representation of id */
-
-#endif /* __EUI64_H__ */
-#endif /* PPP_SUPPORT && PPP_IPV6_SUPPORT */
diff --git a/components/lwip/include/lwip/netif/ppp/fsm.h b/components/lwip/include/lwip/netif/ppp/fsm.h
deleted file mode 100644 (file)
index fc0a4b1..0000000
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * fsm.h - {Link, IP} Control Protocol Finite State Machine definitions.
- *
- * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The name "Carnegie Mellon University" must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission. For permission or any legal
- *    details, please contact
- *      Office of Technology Transfer
- *      Carnegie Mellon University
- *      5000 Forbes Avenue
- *      Pittsburgh, PA  15213-3890
- *      (412) 268-4387, fax: (412) 268-7395
- *      tech-transfer@andrew.cmu.edu
- *
- * 4. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by Computing Services
- *     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
- *
- * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
- * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * $Id: fsm.h,v 1.10 2004/11/13 02:28:15 paulus Exp $
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */
-
-#ifndef FSM_H
-#define        FSM_H
-
-#include "ppp.h"
-
-/*
- * Packet header = Code, id, length.
- */
-#define HEADERLEN      4
-
-
-/*
- *  CP (LCP, IPCP, etc.) codes.
- */
-#define CONFREQ                1       /* Configuration Request */
-#define CONFACK                2       /* Configuration Ack */
-#define CONFNAK                3       /* Configuration Nak */
-#define CONFREJ                4       /* Configuration Reject */
-#define TERMREQ                5       /* Termination Request */
-#define TERMACK                6       /* Termination Ack */
-#define CODEREJ                7       /* Code Reject */
-
-
-/*
- * Each FSM is described by an fsm structure and fsm callbacks.
- */
-typedef struct fsm {
-    ppp_pcb *pcb;              /* PPP Interface */
-    const struct fsm_callbacks *callbacks;     /* Callback routines */
-    const char *term_reason;   /* Reason for closing protocol */
-    u8_t seen_ack;             /* Have received valid Ack/Nak/Rej to Req */
-                                 /* -- This is our only flag, we might use u_int :1 if we have more flags */
-    u16_t protocol;            /* Data Link Layer Protocol field value */
-    u8_t state;                        /* State */
-    u8_t flags;                        /* Contains option bits */
-    u8_t id;                   /* Current id */
-    u8_t reqid;                        /* Current request id */
-    u8_t retransmits;          /* Number of retransmissions left */
-    u8_t nakloops;             /* Number of nak loops since last ack */
-    u8_t rnakloops;            /* Number of naks received */
-    u8_t maxnakloops;          /* Maximum number of nak loops tolerated
-                                  (necessary because IPCP require a custom large max nak loops value) */
-    u8_t term_reason_len;      /* Length of term_reason */
-} fsm;
-
-
-typedef struct fsm_callbacks {
-    void (*resetci)            /* Reset our Configuration Information */
-               (fsm *);
-    int  (*cilen)              /* Length of our Configuration Information */
-               (fsm *);
-    void (*addci)              /* Add our Configuration Information */
-               (fsm *, u_char *, int *);
-    int  (*ackci)              /* ACK our Configuration Information */
-               (fsm *, u_char *, int);
-    int  (*nakci)              /* NAK our Configuration Information */
-               (fsm *, u_char *, int, int);
-    int  (*rejci)              /* Reject our Configuration Information */
-               (fsm *, u_char *, int);
-    int  (*reqci)              /* Request peer's Configuration Information */
-               (fsm *, u_char *, int *, int);
-    void (*up)                 /* Called when fsm reaches PPP_FSM_OPENED state */
-               (fsm *);
-    void (*down)               /* Called when fsm leaves PPP_FSM_OPENED state */
-               (fsm *);
-    void (*starting)           /* Called when we want the lower layer */
-               (fsm *);
-    void (*finished)           /* Called when we don't want the lower layer */
-               (fsm *);
-    void (*protreject)         /* Called when Protocol-Reject received */
-               (int);
-    void (*retransmit)         /* Retransmission is necessary */
-               (fsm *);
-    int  (*extcode)            /* Called when unknown code received */
-               (fsm *, int, int, u_char *, int);
-    const char *proto_name;    /* String name for protocol (for messages) */
-} fsm_callbacks;
-
-
-/*
- * Link states.
- */
-#define PPP_FSM_INITIAL                0       /* Down, hasn't been opened */
-#define PPP_FSM_STARTING       1       /* Down, been opened */
-#define PPP_FSM_CLOSED         2       /* Up, hasn't been opened */
-#define PPP_FSM_STOPPED                3       /* Open, waiting for down event */
-#define PPP_FSM_CLOSING                4       /* Terminating the connection, not open */
-#define PPP_FSM_STOPPING       5       /* Terminating, but open */
-#define PPP_FSM_REQSENT                6       /* We've sent a Config Request */
-#define PPP_FSM_ACKRCVD                7       /* We've received a Config Ack */
-#define PPP_FSM_ACKSENT                8       /* We've sent a Config Ack */
-#define PPP_FSM_OPENED         9       /* Connection available */
-
-
-/*
- * Flags - indicate options controlling FSM operation
- */
-#define OPT_PASSIVE    1       /* Don't die if we don't get a response */
-#define OPT_RESTART    2       /* Treat 2nd OPEN as DOWN, UP */
-#define OPT_SILENT     4       /* Wait for peer to speak first */
-
-
-/*
- * Timeouts.
- */
-#if 0 /* moved to opt.h */
-#define DEFTIMEOUT     3       /* Timeout time in seconds */
-#define DEFMAXTERMREQS 2       /* Maximum Terminate-Request transmissions */
-#define DEFMAXCONFREQS 10      /* Maximum Configure-Request transmissions */
-#define DEFMAXNAKLOOPS 5       /* Maximum number of nak loops */
-#endif /* moved to opt.h */
-
-
-/*
- * Prototypes
- */
-void fsm_init(fsm *f);
-void fsm_lowerup(fsm *f);
-void fsm_lowerdown(fsm *f);
-void fsm_open(fsm *f);
-void fsm_close(fsm *f, const char *reason);
-void fsm_input(fsm *f, u_char *inpacket, int l);
-void fsm_protreject(fsm *f);
-void fsm_sdata(fsm *f, u_char code, u_char id, const u_char *data, int datalen);
-
-
-#endif /* FSM_H */
-#endif /* PPP_SUPPORT */
diff --git a/components/lwip/include/lwip/netif/ppp/ipcp.h b/components/lwip/include/lwip/netif/ppp/ipcp.h
deleted file mode 100644 (file)
index 298f8dc..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * ipcp.h - IP Control Protocol definitions.
- *
- * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The name "Carnegie Mellon University" must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission. For permission or any legal
- *    details, please contact
- *      Office of Technology Transfer
- *      Carnegie Mellon University
- *      5000 Forbes Avenue
- *      Pittsburgh, PA  15213-3890
- *      (412) 268-4387, fax: (412) 268-7395
- *      tech-transfer@andrew.cmu.edu
- *
- * 4. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by Computing Services
- *     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
- *
- * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
- * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * $Id: ipcp.h,v 1.14 2002/12/04 23:03:32 paulus Exp $
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && PPP_IPV4_SUPPORT /* don't build if not configured for use in lwipopts.h */
-
-#ifndef IPCP_H
-#define        IPCP_H
-
-/*
- * Options.
- */
-#define CI_ADDRS       1       /* IP Addresses */
-#if VJ_SUPPORT
-#define CI_COMPRESSTYPE        2       /* Compression Type */
-#endif /* VJ_SUPPORT */
-#define        CI_ADDR         3
-
-#if LWIP_DNS
-#define CI_MS_DNS1      129    /* Primary DNS value */
-#define CI_MS_DNS2      131     /* Secondary DNS value */
-#endif /* LWIP_DNS */
-#if 0 /* UNUSED - WINS */
-#define CI_MS_WINS1     130     /* Primary WINS value */
-#define CI_MS_WINS2     132    /* Secondary WINS value */
-#endif /* UNUSED - WINS */
-
-#if VJ_SUPPORT
-#define MAX_STATES 16          /* from slcompress.h */
-
-#define IPCP_VJMODE_OLD 1      /* "old" mode (option # = 0x0037) */
-#define IPCP_VJMODE_RFC1172 2  /* "old-rfc"mode (option # = 0x002d) */
-#define IPCP_VJMODE_RFC1332 3  /* "new-rfc"mode (option # = 0x002d, */
-                                /*  maxslot and slot number compression) */
-
-#define IPCP_VJ_COMP 0x002d    /* current value for VJ compression option*/
-#define IPCP_VJ_COMP_OLD 0x0037        /* "old" (i.e, broken) value for VJ */
-                               /* compression option*/ 
-#endif /* VJ_SUPPORT */
-
-typedef struct ipcp_options {
-    unsigned int neg_addr               :1; /* Negotiate IP Address? */
-    unsigned int old_addrs              :1; /* Use old (IP-Addresses) option? */
-    unsigned int req_addr               :1; /* Ask peer to send IP address? */
-#if 0 /* UNUSED */
-    unsigned int default_route          :1; /* Assign default route through interface? */
-    unsigned int replace_default_route  :1; /* Replace default route through interface? */
-#endif /* UNUSED */
-#if 0 /* UNUSED - PROXY ARP */
-    unsigned int proxy_arp              :1; /* Make proxy ARP entry for peer? */
-#endif /* UNUSED - PROXY ARP */
-#if VJ_SUPPORT
-    unsigned int neg_vj                 :1; /* Van Jacobson Compression? */
-    unsigned int old_vj                 :1; /* use old (short) form of VJ option? */
-    unsigned int cflag                  :1;
-#endif /* VJ_SUPPORT */
-    unsigned int accept_local           :1; /* accept peer's value for ouraddr */
-    unsigned int accept_remote          :1; /* accept peer's value for hisaddr */
-#if LWIP_DNS
-    unsigned int req_dns1               :1; /* Ask peer to send primary DNS address? */
-    unsigned int req_dns2               :1; /* Ask peer to send secondary DNS address? */
-#endif /* LWIP_DNS */
-
-    u32_t ouraddr, hisaddr;    /* Addresses in NETWORK BYTE ORDER */
-#if LWIP_DNS
-    u32_t dnsaddr[2];  /* Primary and secondary MS DNS entries */
-#endif /* LWIP_DNS */
-#if 0 /* UNUSED - WINS */
-    u32_t winsaddr[2]; /* Primary and secondary MS WINS entries */
-#endif /* UNUSED - WINS */
-
-#if VJ_SUPPORT
-    u16_t vj_protocol;         /* protocol value to use in VJ option */
-    u8_t  maxslotindex;                /* values for RFC1332 VJ compression neg. */
-#endif /* VJ_SUPPORT */
-} ipcp_options;
-
-#if 0 /* UNUSED, already defined by lwIP */
-char *ip_ntoa (u32_t);
-#endif /* UNUSED, already defined by lwIP */
-
-extern const struct protent ipcp_protent;
-
-#endif /* IPCP_H */
-#endif /* PPP_SUPPORT && PPP_IPV4_SUPPORT */
diff --git a/components/lwip/include/lwip/netif/ppp/ipv6cp.h b/components/lwip/include/lwip/netif/ppp/ipv6cp.h
deleted file mode 100644 (file)
index 540a7d1..0000000
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * ipv6cp.h - PPP IPV6 Control Protocol.
- *
- * Copyright (c) 1999 Tommi Komulainen.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The name(s) of the authors of this software must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission.
- *
- * 4. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by Tommi Komulainen
- *     <Tommi.Komulainen@iki.fi>".
- *
- * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-/*  Original version, based on RFC2023 :
-
-    Copyright (c) 1995, 1996, 1997 Francis.Dupont@inria.fr, INRIA Rocquencourt,
-    Alain.Durand@imag.fr, IMAG,
-    Jean-Luc.Richier@imag.fr, IMAG-LSR.
-
-    Copyright (c) 1998, 1999 Francis.Dupont@inria.fr, GIE DYADE,
-    Alain.Durand@imag.fr, IMAG,
-    Jean-Luc.Richier@imag.fr, IMAG-LSR.
-
-    Ce travail a Ã©té fait au sein du GIE DYADE (Groupement d'Intérêt
-    Ã‰conomique ayant pour membres BULL S.A. et l'INRIA).
-
-    Ce logiciel informatique est disponible aux conditions
-    usuelles dans la recherche, c'est-à-dire qu'il peut
-    Ãªtre utilisé, copié, modifié, distribué Ã  l'unique
-    condition que ce texte soit conservé afin que
-    l'origine de ce logiciel soit reconnue.
-
-    Le nom de l'Institut National de Recherche en Informatique
-    et en Automatique (INRIA), de l'IMAG, ou d'une personne morale
-    ou physique ayant participé Ã  l'élaboration de ce logiciel ne peut
-    Ãªtre utilisé sans son accord préalable explicite.
-
-    Ce logiciel est fourni tel quel sans aucune garantie,
-    support ou responsabilité d'aucune sorte.
-    Ce logiciel est dérivé de sources d'origine
-    "University of California at Berkeley" et
-    "Digital Equipment Corporation" couvertes par des copyrights.
-
-    L'Institut d'Informatique et de Mathématiques Appliquées de Grenoble (IMAG)
-    est une fédération d'unités mixtes de recherche du CNRS, de l'Institut National
-    Polytechnique de Grenoble et de l'Université Joseph Fourier regroupant
-    sept laboratoires dont le laboratoire Logiciels, Systèmes, Réseaux (LSR).
-
-    This work has been done in the context of GIE DYADE (joint R & D venture
-    between BULL S.A. and INRIA).
-
-    This software is available with usual "research" terms
-    with the aim of retain credits of the software. 
-    Permission to use, copy, modify and distribute this software for any
-    purpose and without fee is hereby granted, provided that the above
-    copyright notice and this permission notice appear in all copies,
-    and the name of INRIA, IMAG, or any contributor not be used in advertising
-    or publicity pertaining to this material without the prior explicit
-    permission. The software is provided "as is" without any
-    warranties, support or liabilities of any kind.
-    This software is derived from source code from
-    "University of California at Berkeley" and
-    "Digital Equipment Corporation" protected by copyrights.
-
-    Grenoble's Institute of Computer Science and Applied Mathematics (IMAG)
-    is a federation of seven research units funded by the CNRS, National
-    Polytechnic Institute of Grenoble and University Joseph Fourier.
-    The research unit in Software, Systems, Networks (LSR) is member of IMAG.
-*/
-
-/*
- * Derived from :
- *
- *
- * ipcp.h - IP Control Protocol definitions.
- *
- * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The name "Carnegie Mellon University" must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission. For permission or any legal
- *    details, please contact
- *      Office of Technology Transfer
- *      Carnegie Mellon University
- *      5000 Forbes Avenue
- *      Pittsburgh, PA  15213-3890
- *      (412) 268-4387, fax: (412) 268-7395
- *      tech-transfer@andrew.cmu.edu
- *
- * 4. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by Computing Services
- *     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
- *
- * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
- * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * $Id: ipv6cp.h,v 1.7 2002/12/04 23:03:32 paulus Exp $
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && PPP_IPV6_SUPPORT  /* don't build if not configured for use in lwipopts.h */
-
-#ifndef IPV6CP_H
-#define        IPV6CP_H
-
-#include "eui64.h"
-
-/*
- * Options.
- */
-#define CI_IFACEID     1       /* Interface Identifier */
-#ifdef IPV6CP_COMP
-#define CI_COMPRESSTYPE        2       /* Compression Type     */
-#endif /* IPV6CP_COMP */
-
-/* No compression types yet defined.
- *#define IPV6CP_COMP  0x004f
- */
-typedef struct ipv6cp_options {
-    unsigned int neg_ifaceid    :1;  /* Negotiate interface identifier? */
-    unsigned int req_ifaceid    :1;  /* Ask peer to send interface identifier? */
-    unsigned int accept_local   :1;  /* accept peer's value for iface id? */
-    unsigned int opt_local      :1;  /* ourtoken set by option */
-    unsigned int opt_remote     :1;  /* histoken set by option */
-    unsigned int use_ip         :1;  /* use IP as interface identifier */
-#if 0
-    unsigned int use_persistent :1;  /* use uniquely persistent value for address */
-#endif
-#ifdef IPV6CP_COMP
-    unsigned int neg_vj         :1;  /* Van Jacobson Compression? */
-#endif /* IPV6CP_COMP */
-
-#ifdef IPV6CP_COMP
-    u_short vj_protocol;        /* protocol value to use in VJ option */
-#endif /* IPV6CP_COMP */
-    eui64_t ourid, hisid;       /* Interface identifiers */
-} ipv6cp_options;
-
-extern const struct protent ipv6cp_protent;
-
-#endif /* IPV6CP_H */
-#endif /* PPP_SUPPORT && PPP_IPV6_SUPPORT */
diff --git a/components/lwip/include/lwip/netif/ppp/lcp.h b/components/lwip/include/lwip/netif/ppp/lcp.h
deleted file mode 100644 (file)
index 0497069..0000000
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * lcp.h - Link Control Protocol definitions.
- *
- * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The name "Carnegie Mellon University" must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission. For permission or any legal
- *    details, please contact
- *      Office of Technology Transfer
- *      Carnegie Mellon University
- *      5000 Forbes Avenue
- *      Pittsburgh, PA  15213-3890
- *      (412) 268-4387, fax: (412) 268-7395
- *      tech-transfer@andrew.cmu.edu
- *
- * 4. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by Computing Services
- *     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
- *
- * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
- * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * $Id: lcp.h,v 1.20 2004/11/14 22:53:42 carlsonj Exp $
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */
-
-#ifndef LCP_H
-#define        LCP_H
-
-#include "ppp.h"
-
-/*
- * Options.
- */
-#define CI_VENDOR      0       /* Vendor Specific */
-#define CI_MRU         1       /* Maximum Receive Unit */
-#define CI_ASYNCMAP    2       /* Async Control Character Map */
-#define CI_AUTHTYPE    3       /* Authentication Type */
-#define CI_QUALITY     4       /* Quality Protocol */
-#define CI_MAGICNUMBER 5       /* Magic Number */
-#define CI_PCOMPRESSION        7       /* Protocol Field Compression */
-#define CI_ACCOMPRESSION 8     /* Address/Control Field Compression */
-#define CI_FCSALTERN   9       /* FCS-Alternatives */
-#define CI_SDP         10      /* Self-Describing-Pad */
-#define CI_NUMBERED    11      /* Numbered-Mode */
-#define CI_CALLBACK    13      /* callback */
-#define CI_MRRU                17      /* max reconstructed receive unit; multilink */
-#define CI_SSNHF       18      /* short sequence numbers for multilink */
-#define CI_EPDISC      19      /* endpoint discriminator */
-#define CI_MPPLUS      22      /* Multi-Link-Plus-Procedure */
-#define CI_LDISC       23      /* Link-Discriminator */
-#define CI_LCPAUTH     24      /* LCP Authentication */
-#define CI_COBS                25      /* Consistent Overhead Byte Stuffing */
-#define CI_PREFELIS    26      /* Prefix Elision */
-#define CI_MPHDRFMT    27      /* MP Header Format */
-#define CI_I18N                28      /* Internationalization */
-#define CI_SDL         29      /* Simple Data Link */
-
-/*
- * LCP-specific packet types (code numbers).
- */
-#define PROTREJ                8       /* Protocol Reject */
-#define ECHOREQ                9       /* Echo Request */
-#define ECHOREP                10      /* Echo Reply */
-#define DISCREQ                11      /* Discard Request */
-#define IDENTIF                12      /* Identification */
-#define TIMEREM                13      /* Time Remaining */
-
-/* Value used as data for CI_CALLBACK option */
-#define CBCP_OPT       6       /* Use callback control protocol */
-
-#if 0 /* moved to opt.h */
-#define DEFMRU 1500            /* Try for this */
-#define MINMRU 128             /* No MRUs below this */
-#define MAXMRU 16384           /* Normally limit MRU to this */
-#endif /* moved to opt.h */
-
-/* An endpoint discriminator, used with multilink. */
-#define MAX_ENDP_LEN   20      /* maximum length of discriminator value */
-struct epdisc {
-    unsigned char      class_; /* -- The word "class" is reserved in C++. */
-    unsigned char      length;
-    unsigned char      value[MAX_ENDP_LEN];
-};
-
-/*
- * The state of options is described by an lcp_options structure.
- */
-typedef struct lcp_options {
-    unsigned int passive           :1; /* Don't die if we don't get a response */
-    unsigned int silent            :1; /* Wait for the other end to start first */
-    unsigned int restart           :1; /* Restart vs. exit after close */
-    unsigned int neg_mru           :1; /* Negotiate the MRU? */
-    unsigned int neg_asyncmap      :1; /* Negotiate the async map? */
-#if PAP_SUPPORT
-    unsigned int neg_upap          :1; /* Ask for UPAP authentication? */
-#endif /* PAP_SUPPORT */
-#if CHAP_SUPPORT
-    unsigned int neg_chap          :1; /* Ask for CHAP authentication? */
-#endif /* CHAP_SUPPORT */
-#if EAP_SUPPORT
-    unsigned int neg_eap           :1; /* Ask for EAP authentication? */
-#endif /* EAP_SUPPORT */
-    unsigned int neg_magicnumber   :1; /* Ask for magic number? */
-    unsigned int neg_pcompression  :1; /* HDLC Protocol Field Compression? */
-    unsigned int neg_accompression :1; /* HDLC Address/Control Field Compression? */
-#if LQR_SUPPORT
-    unsigned int neg_lqr           :1; /* Negotiate use of Link Quality Reports */
-#endif /* LQR_SUPPORT */
-    unsigned int neg_cbcp          :1; /* Negotiate use of CBCP */
-#ifdef HAVE_MULTILINK
-    unsigned int neg_mrru          :1; /* negotiate multilink MRRU */
-#endif /* HAVE_MULTILINK */
-    unsigned int neg_ssnhf         :1; /* negotiate short sequence numbers */
-    unsigned int neg_endpoint      :1; /* negotiate endpoint discriminator */
-
-    u16_t mru;                 /* Value of MRU */
-#ifdef HAVE_MULTILINK
-    u16_t mrru;                        /* Value of MRRU, and multilink enable */
-#endif /* MULTILINK */
-#if CHAP_SUPPORT
-    u8_t chap_mdtype;          /* which MD types (hashing algorithm) */
-#endif /* CHAP_SUPPORT */
-    u32_t asyncmap;            /* Value of async map */
-    u32_t magicnumber;
-    u8_t  numloops;            /* Number of loops during magic number neg. */
-#if LQR_SUPPORT
-    u32_t lqr_period;  /* Reporting period for LQR 1/100ths second */
-#endif /* LQR_SUPPORT */
-    struct epdisc endpoint;    /* endpoint discriminator */
-} lcp_options;
-
-void lcp_open(ppp_pcb *pcb);
-void lcp_close(ppp_pcb *pcb, const char *reason);
-void lcp_lowerup(ppp_pcb *pcb);
-void lcp_lowerdown(ppp_pcb *pcb);
-void lcp_sprotrej(ppp_pcb *pcb, u_char *p, int len);    /* send protocol reject */
-
-extern const struct protent lcp_protent;
-
-#if 0 /* moved to opt.h */
-/* Default number of times we receive our magic number from the peer
-   before deciding the link is looped-back. */
-#define DEFLOOPBACKFAIL        10
-#endif /* moved to opt.h */
-
-#endif /* LCP_H */
-#endif /* PPP_SUPPORT */
diff --git a/components/lwip/include/lwip/netif/ppp/magic.h b/components/lwip/include/lwip/netif/ppp/magic.h
deleted file mode 100644 (file)
index 678ff72..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * magic.h - PPP Magic Number definitions.
- *
- * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The name "Carnegie Mellon University" must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission. For permission or any legal
- *    details, please contact
- *      Office of Technology Transfer
- *      Carnegie Mellon University
- *      5000 Forbes Avenue
- *      Pittsburgh, PA  15213-3890
- *      (412) 268-4387, fax: (412) 268-7395
- *      tech-transfer@andrew.cmu.edu
- *
- * 4. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by Computing Services
- *     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
- *
- * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
- * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * $Id: magic.h,v 1.5 2003/06/11 23:56:26 paulus Exp $
- */
-/*****************************************************************************
-* randm.h - Random number generator header file.
-*
-* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
-* Copyright (c) 1998 Global Election Systems Inc.
-*
-* The authors hereby grant permission to use, copy, modify, distribute,
-* and license this software and its documentation for any purpose, provided
-* that existing copyright notices are retained in all copies and that this
-* notice and the following disclaimer are included verbatim in any
-* distributions. No written agreement, license, or royalty fee is required
-* for any of the authorized uses.
-*
-* THIS SOFTWARE IS PROVIDED BY THE 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 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.
-*
-******************************************************************************
-* REVISION HISTORY
-*
-* 03-01-01 Marc Boucher <marc@mbsi.ca>
-*   Ported to lwIP.
-* 98-05-29 Guy Lancaster <glanca@gesn.com>, Global Election Systems Inc.
-*   Extracted from avos.
-*****************************************************************************/
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */
-
-#ifndef MAGIC_H
-#define MAGIC_H
-
-/***********************
-*** PUBLIC FUNCTIONS ***
-***********************/
-
-/*
- * Initialize the random number generator.
- */
-void magic_init(void);
-
-/*
- * Randomize our random seed value.  To be called for truely random events
- * such as user operations and network traffic.
- */
-void magic_randomize(void);
-
-/*
- * Return a new random number.
- */
-u32_t magic(void);     /* Returns the next magic number */
-
-/*
- * Fill buffer with random bytes
- *
- * Use the random pool to generate random data.  This degrades to pseudo
- * random when used faster than randomness is supplied using magic_churnrand().
- * Thus it's important to make sure that the results of this are not
- * published directly because one could predict the next result to at
- * least some degree.  Also, it's important to get a good seed before
- * the first use.
- */
-void magic_random_bytes(unsigned char *buf, u32_t buf_len);
-
-/*
- * Return a new random number between 0 and (2^pow)-1 included.
- */
-u32_t magic_pow(u8_t pow);
-
-#endif /* MAGIC_H */
-
-#endif /* PPP_SUPPORT */
diff --git a/components/lwip/include/lwip/netif/ppp/mppe.h b/components/lwip/include/lwip/netif/ppp/mppe.h
deleted file mode 100644 (file)
index 9308695..0000000
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * mppe.h - Definitions for MPPE
- *
- * Copyright (c) 2008 Paul Mackerras. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The name(s) of the authors of this software must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission.
- *
- * 4. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by Paul Mackerras
- *     <paulus@samba.org>".
- *
- * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && MPPE_SUPPORT  /* don't build if not configured for use in lwipopts.h */
-
-#ifndef MPPE_H
-#define MPPE_H
-
-#if LWIP_INCLUDED_POLARSSL_ARC4
-#include "netif/ppp/polarssl/arc4.h"
-#else
-#include "polarssl/arc4.h"
-#endif
-
-#define MPPE_PAD               4       /* MPPE growth per frame */
-#define MPPE_MAX_KEY_LEN       16      /* largest key length (128-bit) */
-
-/* option bits for ccp_options.mppe */
-#define MPPE_OPT_40            0x01    /* 40 bit */
-#define MPPE_OPT_128           0x02    /* 128 bit */
-#define MPPE_OPT_STATEFUL      0x04    /* stateful mode */
-/* unsupported opts */
-#define MPPE_OPT_56            0x08    /* 56 bit */
-#define MPPE_OPT_MPPC          0x10    /* MPPC compression */
-#define MPPE_OPT_D             0x20    /* Unknown */
-#define MPPE_OPT_UNSUPPORTED (MPPE_OPT_56|MPPE_OPT_MPPC|MPPE_OPT_D)
-#define MPPE_OPT_UNKNOWN       0x40    /* Bits !defined in RFC 3078 were set */
-
-/*
- * This is not nice ... the alternative is a bitfield struct though.
- * And unfortunately, we cannot share the same bits for the option
- * names above since C and H are the same bit.  We could do a u_int32
- * but then we have to do a htonl() all the time and/or we still need
- * to know which octet is which.
- */
-#define MPPE_C_BIT             0x01    /* MPPC */
-#define MPPE_D_BIT             0x10    /* Obsolete, usage unknown */
-#define MPPE_L_BIT             0x20    /* 40-bit */
-#define MPPE_S_BIT             0x40    /* 128-bit */
-#define MPPE_M_BIT             0x80    /* 56-bit, not supported */
-#define MPPE_H_BIT             0x01    /* Stateless (in a different byte) */
-
-/* Does not include H bit; used for least significant octet only. */
-#define MPPE_ALL_BITS (MPPE_D_BIT|MPPE_L_BIT|MPPE_S_BIT|MPPE_M_BIT|MPPE_H_BIT)
-
-/* Build a CI from mppe opts (see RFC 3078) */
-#define MPPE_OPTS_TO_CI(opts, ci)              \
-    do {                                       \
-       u_char *ptr = ci; /* u_char[4] */       \
-                                               \
-       /* H bit */                             \
-       if (opts & MPPE_OPT_STATEFUL)           \
-           *ptr++ = 0x0;                       \
-       else                                    \
-           *ptr++ = MPPE_H_BIT;                \
-       *ptr++ = 0;                             \
-       *ptr++ = 0;                             \
-                                               \
-       /* S,L bits */                          \
-       *ptr = 0;                               \
-       if (opts & MPPE_OPT_128)                \
-           *ptr |= MPPE_S_BIT;                 \
-       if (opts & MPPE_OPT_40)                 \
-           *ptr |= MPPE_L_BIT;                 \
-       /* M,D,C bits not supported */          \
-    } while (/* CONSTCOND */ 0)
-
-/* The reverse of the above */
-#define MPPE_CI_TO_OPTS(ci, opts)              \
-    do {                                       \
-       const u_char *ptr = ci; /* u_char[4] */ \
-                                               \
-       opts = 0;                               \
-                                               \
-       /* H bit */                             \
-       if (!(ptr[0] & MPPE_H_BIT))             \
-           opts |= MPPE_OPT_STATEFUL;          \
-                                               \
-       /* S,L bits */                          \
-       if (ptr[3] & MPPE_S_BIT)                \
-           opts |= MPPE_OPT_128;               \
-       if (ptr[3] & MPPE_L_BIT)                \
-           opts |= MPPE_OPT_40;                \
-                                               \
-       /* M,D,C bits */                        \
-       if (ptr[3] & MPPE_M_BIT)                \
-           opts |= MPPE_OPT_56;                \
-       if (ptr[3] & MPPE_D_BIT)                \
-           opts |= MPPE_OPT_D;                 \
-       if (ptr[3] & MPPE_C_BIT)                \
-           opts |= MPPE_OPT_MPPC;              \
-                                               \
-       /* Other bits */                        \
-       if (ptr[0] & ~MPPE_H_BIT)               \
-           opts |= MPPE_OPT_UNKNOWN;           \
-       if (ptr[1] || ptr[2])                   \
-           opts |= MPPE_OPT_UNKNOWN;           \
-       if (ptr[3] & ~MPPE_ALL_BITS)            \
-           opts |= MPPE_OPT_UNKNOWN;           \
-    } while (/* CONSTCOND */ 0)
-
-/* Shared MPPE padding between MSCHAP and MPPE */
-#define SHA1_PAD_SIZE 40
-
-static const u8_t mppe_sha1_pad1[SHA1_PAD_SIZE] = {
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
-static const u8_t mppe_sha1_pad2[SHA1_PAD_SIZE] = {
-  0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2,
-  0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2,
-  0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2,
-  0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2
-};
-
-/*
- * State for an MPPE (de)compressor.
- */
-typedef struct ppp_mppe_state {
-       arc4_context arc4;
-       u8_t master_key[MPPE_MAX_KEY_LEN];
-       u8_t session_key[MPPE_MAX_KEY_LEN];
-       u8_t keylen;                /* key length in bytes */
-       /* NB: 128-bit == 16, 40-bit == 8!
-        * If we want to support 56-bit, the unit has to change to bits
-        */
-       u8_t bits;                  /* MPPE control bits */
-       u16_t ccount;               /* 12-bit coherency count (seqno)  */
-       u16_t sanity_errors;        /* take down LCP if too many */
-       unsigned int stateful  :1;  /* stateful mode flag */
-       unsigned int discard   :1;  /* stateful mode packet loss flag */
-} ppp_mppe_state;
-
-void mppe_set_key(ppp_pcb *pcb, ppp_mppe_state *state, u8_t *key);
-void mppe_init(ppp_pcb *pcb, ppp_mppe_state *state, u8_t options);
-void mppe_comp_reset(ppp_pcb *pcb, ppp_mppe_state *state);
-err_t mppe_compress(ppp_pcb *pcb, ppp_mppe_state *state, struct pbuf **pb, u16_t protocol);
-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);
-
-#endif /* MPPE_H */
-#endif /* PPP_SUPPORT && MPPE_SUPPORT */
diff --git a/components/lwip/include/lwip/netif/ppp/polarssl/arc4.h b/components/lwip/include/lwip/netif/ppp/polarssl/arc4.h
deleted file mode 100644 (file)
index 95d9b34..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-/**
- * \file arc4.h
- *
- *  Based on XySSL: Copyright (C) 2006-2008  Christophe Devine
- *
- *  Copyright (C) 2009  Paul Bakker <polarssl_maintainer at polarssl dot org>
- *
- *  All rights reserved.
- *
- *  Redistribution and use in source and binary forms, with or without
- *  modification, are permitted provided that the following conditions
- *  are met:
- *  
- *    * Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *    * Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *    * Neither the names of PolarSSL or XySSL nor the names of its contributors
- *      may be used to endorse or promote products derived from this software
- *      without specific prior written permission.
- *  
- *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- *  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "lwip/opt.h"
-#if LWIP_INCLUDED_POLARSSL_ARC4
-
-#ifndef LWIP_INCLUDED_POLARSSL_ARC4_H
-#define LWIP_INCLUDED_POLARSSL_ARC4_H
-
-/**
- * \brief          ARC4 context structure
- */
-typedef struct
-{
-    int x;                      /*!< permutation index */
-    int y;                      /*!< permutation index */
-    unsigned char m[256];       /*!< permutation table */
-}
-arc4_context;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * \brief          ARC4 key schedule
- *
- * \param ctx      ARC4 context to be initialized
- * \param key      the secret key
- * \param keylen   length of the key
- */
-void arc4_setup( arc4_context *ctx, unsigned char *key, int keylen );
-
-/**
- * \brief          ARC4 cipher function
- *
- * \param ctx      ARC4 context
- * \param buf      buffer to be processed
- * \param buflen   amount of data in buf
- */
-void arc4_crypt( arc4_context *ctx, unsigned char *buf, int buflen );
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_INCLUDED_POLARSSL_ARC4_H */
-
-#endif /* LWIP_INCLUDED_POLARSSL_ARC4 */
diff --git a/components/lwip/include/lwip/netif/ppp/polarssl/des.h b/components/lwip/include/lwip/netif/ppp/polarssl/des.h
deleted file mode 100644 (file)
index d0858bd..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-/**
- * \file des.h
- *
- *  Based on XySSL: Copyright (C) 2006-2008  Christophe Devine
- *
- *  Copyright (C) 2009  Paul Bakker <polarssl_maintainer at polarssl dot org>
- *
- *  All rights reserved.
- *
- *  Redistribution and use in source and binary forms, with or without
- *  modification, are permitted provided that the following conditions
- *  are met:
- *  
- *    * Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *    * Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *    * Neither the names of PolarSSL or XySSL nor the names of its contributors
- *      may be used to endorse or promote products derived from this software
- *      without specific prior written permission.
- *  
- *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- *  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "lwip/opt.h"
-#if LWIP_INCLUDED_POLARSSL_DES
-
-#ifndef LWIP_INCLUDED_POLARSSL_DES_H
-#define LWIP_INCLUDED_POLARSSL_DES_H
-
-#define DES_ENCRYPT     1
-#define DES_DECRYPT     0
-
-/**
- * \brief          DES context structure
- */
-typedef struct
-{
-    int mode;                   /*!<  encrypt/decrypt   */
-    unsigned long sk[32];       /*!<  DES subkeys       */
-}
-des_context;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * \brief          DES key schedule (56-bit, encryption)
- *
- * \param ctx      DES context to be initialized
- * \param key      8-byte secret key
- */
-void des_setkey_enc( des_context *ctx, unsigned char key[8] );
-
-/**
- * \brief          DES key schedule (56-bit, decryption)
- *
- * \param ctx      DES context to be initialized
- * \param key      8-byte secret key
- */
-void des_setkey_dec( des_context *ctx, unsigned char key[8] );
-
-/**
- * \brief          DES-ECB block encryption/decryption
- *
- * \param ctx      DES context
- * \param input    64-bit input block
- * \param output   64-bit output block
- */
-void des_crypt_ecb( des_context *ctx,
-                    const unsigned char input[8],
-                    unsigned char output[8] );
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_INCLUDED_POLARSSL_DES_H */
-
-#endif /* LWIP_INCLUDED_POLARSSL_DES */
diff --git a/components/lwip/include/lwip/netif/ppp/polarssl/md4.h b/components/lwip/include/lwip/netif/ppp/polarssl/md4.h
deleted file mode 100644 (file)
index a382f85..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-/**
- * \file md4.h
- *
- *  Based on XySSL: Copyright (C) 2006-2008  Christophe Devine
- *
- *  Copyright (C) 2009  Paul Bakker <polarssl_maintainer at polarssl dot org>
- *
- *  All rights reserved.
- *
- *  Redistribution and use in source and binary forms, with or without
- *  modification, are permitted provided that the following conditions
- *  are met:
- *  
- *    * Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *    * Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *    * Neither the names of PolarSSL or XySSL nor the names of its contributors
- *      may be used to endorse or promote products derived from this software
- *      without specific prior written permission.
- *  
- *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- *  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "lwip/opt.h"
-#if LWIP_INCLUDED_POLARSSL_MD4
-
-#ifndef LWIP_INCLUDED_POLARSSL_MD4_H
-#define LWIP_INCLUDED_POLARSSL_MD4_H
-
-/**
- * \brief          MD4 context structure
- */
-typedef struct
-{
-    unsigned long total[2];     /*!< number of bytes processed  */
-    unsigned long state[4];     /*!< intermediate digest state  */
-    unsigned char buffer[64];   /*!< data block being processed */
-}
-md4_context;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * \brief          MD4 context setup
- *
- * \param ctx      context to be initialized
- */
-void md4_starts( md4_context *ctx );
-
-/**
- * \brief          MD4 process buffer
- *
- * \param ctx      MD4 context
- * \param input    buffer holding the  data
- * \param ilen     length of the input data
- */
-void md4_update( md4_context *ctx, const unsigned char *input, int ilen );
-
-/**
- * \brief          MD4 final digest
- *
- * \param ctx      MD4 context
- * \param output   MD4 checksum result
- */
-void md4_finish( md4_context *ctx, unsigned char output[16] );
-
-/**
- * \brief          Output = MD4( input buffer )
- *
- * \param input    buffer holding the  data
- * \param ilen     length of the input data
- * \param output   MD4 checksum result
- */
-void md4( unsigned char *input, int ilen, unsigned char output[16] );
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_INCLUDED_POLARSSL_MD4_H */
-
-#endif /* LWIP_INCLUDED_POLARSSL_MD4 */
diff --git a/components/lwip/include/lwip/netif/ppp/polarssl/md5.h b/components/lwip/include/lwip/netif/ppp/polarssl/md5.h
deleted file mode 100644 (file)
index a299d98..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-/**
- * \file md5.h
- *
- *  Based on XySSL: Copyright (C) 2006-2008  Christophe Devine
- *
- *  Copyright (C) 2009  Paul Bakker <polarssl_maintainer at polarssl dot org>
- *
- *  All rights reserved.
- *
- *  Redistribution and use in source and binary forms, with or without
- *  modification, are permitted provided that the following conditions
- *  are met:
- *  
- *    * Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *    * Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *    * Neither the names of PolarSSL or XySSL nor the names of its contributors
- *      may be used to endorse or promote products derived from this software
- *      without specific prior written permission.
- *  
- *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- *  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "lwip/opt.h"
-#if LWIP_INCLUDED_POLARSSL_MD5
-
-#ifndef LWIP_INCLUDED_POLARSSL_MD5_H
-#define LWIP_INCLUDED_POLARSSL_MD5_H
-
-/**
- * \brief          MD5 context structure
- */
-typedef struct
-{
-    unsigned long total[2];     /*!< number of bytes processed  */
-    unsigned long state[4];     /*!< intermediate digest state  */
-    unsigned char buffer[64];   /*!< data block being processed */
-}
-md5_context;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * \brief          MD5 context setup
- *
- * \param ctx      context to be initialized
- */
-void md5_starts( md5_context *ctx );
-
-/**
- * \brief          MD5 process buffer
- *
- * \param ctx      MD5 context
- * \param input    buffer holding the  data
- * \param ilen     length of the input data
- */
-void md5_update( md5_context *ctx, const unsigned char *input, int ilen );
-
-/**
- * \brief          MD5 final digest
- *
- * \param ctx      MD5 context
- * \param output   MD5 checksum result
- */
-void md5_finish( md5_context *ctx, unsigned char output[16] );
-
-/**
- * \brief          Output = MD5( input buffer )
- *
- * \param input    buffer holding the  data
- * \param ilen     length of the input data
- * \param output   MD5 checksum result
- */
-void md5( unsigned char *input, int ilen, unsigned char output[16] );
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_INCLUDED_POLARSSL_MD5_H */
-
-#endif /* LWIP_INCLUDED_POLARSSL_MD5 */
diff --git a/components/lwip/include/lwip/netif/ppp/polarssl/sha1.h b/components/lwip/include/lwip/netif/ppp/polarssl/sha1.h
deleted file mode 100644 (file)
index 56d947c..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-/**
- * \file sha1.h
- *
- *  Based on XySSL: Copyright (C) 2006-2008  Christophe Devine
- *
- *  Copyright (C) 2009  Paul Bakker <polarssl_maintainer at polarssl dot org>
- *
- *  All rights reserved.
- *
- *  Redistribution and use in source and binary forms, with or without
- *  modification, are permitted provided that the following conditions
- *  are met:
- *  
- *    * Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *    * Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *    * Neither the names of PolarSSL or XySSL nor the names of its contributors
- *      may be used to endorse or promote products derived from this software
- *      without specific prior written permission.
- *  
- *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- *  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "lwip/opt.h"
-#if LWIP_INCLUDED_POLARSSL_SHA1
-
-#ifndef LWIP_INCLUDED_POLARSSL_SHA1_H
-#define LWIP_INCLUDED_POLARSSL_SHA1_H
-
-/**
- * \brief          SHA-1 context structure
- */
-typedef struct
-{
-    unsigned long total[2];     /*!< number of bytes processed  */
-    unsigned long state[5];     /*!< intermediate digest state  */
-    unsigned char buffer[64];   /*!< data block being processed */
-}
-sha1_context;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * \brief          SHA-1 context setup
- *
- * \param ctx      context to be initialized
- */
-void sha1_starts( sha1_context *ctx );
-
-/**
- * \brief          SHA-1 process buffer
- *
- * \param ctx      SHA-1 context
- * \param input    buffer holding the  data
- * \param ilen     length of the input data
- */
-void sha1_update( sha1_context *ctx, const unsigned char *input, int ilen );
-
-/**
- * \brief          SHA-1 final digest
- *
- * \param ctx      SHA-1 context
- * \param output   SHA-1 checksum result
- */
-void sha1_finish( sha1_context *ctx, unsigned char output[20] );
-
-/**
- * \brief          Output = SHA-1( input buffer )
- *
- * \param input    buffer holding the  data
- * \param ilen     length of the input data
- * \param output   SHA-1 checksum result
- */
-void sha1( unsigned char *input, int ilen, unsigned char output[20] );
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_INCLUDED_POLARSSL_SHA1_H */
-
-#endif /* LWIP_INCLUDED_POLARSSL_SHA1 */
diff --git a/components/lwip/include/lwip/netif/ppp/ppp.h b/components/lwip/include/lwip/netif/ppp/ppp.h
deleted file mode 100644 (file)
index 4a50205..0000000
+++ /dev/null
@@ -1,573 +0,0 @@
-/*****************************************************************************
-* ppp.h - Network Point to Point Protocol header file.
-*
-* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
-* portions Copyright (c) 1997 Global Election Systems Inc.
-*
-* The authors hereby grant permission to use, copy, modify, distribute,
-* and license this software and its documentation for any purpose, provided
-* that existing copyright notices are retained in all copies and that this
-* notice and the following disclaimer are included verbatim in any 
-* distributions. No written agreement, license, or royalty fee is required
-* for any of the authorized uses.
-*
-* THIS SOFTWARE IS PROVIDED BY THE 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 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.
-*
-******************************************************************************
-* REVISION HISTORY
-*
-* 03-01-01 Marc Boucher <marc@mbsi.ca>
-*   Ported to lwIP.
-* 97-11-05 Guy Lancaster <glanca@gesn.com>, Global Election Systems Inc.
-*   Original derived from BSD codes.
-*****************************************************************************/
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */
-
-#ifndef PPP_H
-#define PPP_H
-
-#include "lwip/def.h"
-#include "lwip/stats.h"
-#include "lwip/mem.h"
-#include "lwip/netif.h"
-#include "lwip/sys.h"
-#include "lwip/sio.h"
-#include "lwip/timers.h"
-#if PPP_IPV6_SUPPORT
-#include "lwip/ip6_addr.h"
-#endif /* PPP_IPV6_SUPPORT */
-
-/* Disable non-working or rarely used PPP feature, so rarely that we don't want to bloat opt.h with them */
-#ifndef PPP_OPTIONS
-#define PPP_OPTIONS         0
-#endif
-
-#ifndef PPP_NOTIFY
-#define PPP_NOTIFY          0
-#endif
-
-#ifndef PPP_REMOTENAME
-#define PPP_REMOTENAME      0
-#endif
-
-#ifndef PPP_IDLETIMELIMIT
-#define PPP_IDLETIMELIMIT   0
-#endif
-
-#ifndef PPP_LCP_ADAPTIVE
-#define PPP_LCP_ADAPTIVE    0
-#endif
-
-#ifndef PPP_MAXCONNECT
-#define PPP_MAXCONNECT      0
-#endif
-
-#ifndef PPP_ALLOWED_ADDRS
-#define PPP_ALLOWED_ADDRS   0
-#endif
-
-#ifndef PPP_PROTOCOLNAME
-#define PPP_PROTOCOLNAME    0
-#endif
-
-#ifndef PPP_STATS_SUPPORT
-#define PPP_STATS_SUPPORT   0
-#endif
-
-#ifndef DEFLATE_SUPPORT
-#define DEFLATE_SUPPORT     0
-#endif
-
-#ifndef BSDCOMPRESS_SUPPORT
-#define BSDCOMPRESS_SUPPORT 0
-#endif
-
-#ifndef PREDICTOR_SUPPORT
-#define PREDICTOR_SUPPORT   0
-#endif
-
-/*************************
-*** PUBLIC DEFINITIONS ***
-*************************/
-
-/*
- * The basic PPP frame.
- */
-#define PPP_HDRLEN     4       /* octets for standard ppp header */
-#define PPP_FCSLEN     2       /* octets for FCS */
-
-/*
- * Values for phase.
- */
-#define PPP_PHASE_DEAD          0
-#define PPP_PHASE_INITIALIZE    1
-#define PPP_PHASE_SERIALCONN    2
-#define PPP_PHASE_DORMANT       3
-#define PPP_PHASE_ESTABLISH     4
-#define PPP_PHASE_AUTHENTICATE  5
-#define PPP_PHASE_CALLBACK      6
-#define PPP_PHASE_NETWORK       7
-#define PPP_PHASE_RUNNING       8
-#define PPP_PHASE_TERMINATE     9
-#define PPP_PHASE_DISCONNECT    10
-#define PPP_PHASE_HOLDOFF       11
-#define PPP_PHASE_MASTER        12
-
-/* Error codes. */
-#define PPPERR_NONE         0  /* No error. */
-#define PPPERR_PARAM        1  /* Invalid parameter. */
-#define PPPERR_OPEN         2  /* Unable to open PPP session. */
-#define PPPERR_DEVICE       3  /* Invalid I/O device for PPP. */
-#define PPPERR_ALLOC        4  /* Unable to allocate resources. */
-#define PPPERR_USER         5  /* User interrupt. */
-#define PPPERR_CONNECT      6  /* Connection lost. */
-#define PPPERR_AUTHFAIL     7  /* Failed authentication challenge. */
-#define PPPERR_PROTOCOL     8  /* Failed to meet protocol. */
-#define PPPERR_PEERDEAD     9  /* Connection timeout */
-#define PPPERR_IDLETIMEOUT  10 /* Idle Timeout */
-#define PPPERR_CONNECTTIME  11 /* Max connect time reached */
-#define PPPERR_LOOPBACK     12 /* Loopback detected */
-
-/* Whether auth support is enabled at all */
-#define PPP_AUTH_SUPPORT (PAP_SUPPORT || CHAP_SUPPORT || EAP_SUPPORT)
-
-/************************
-*** PUBLIC DATA TYPES ***
-************************/
-
-/*
- * Other headers require ppp_pcb definition for prototypes, but ppp_pcb
- * require some structure definition from other headers as well, we are
- * fixing the dependency loop here by declaring the ppp_pcb type then
- * by including headers containing necessary struct definition for ppp_pcb
- */
-typedef struct ppp_pcb_s ppp_pcb;
-
-/* Type definitions for BSD code. */
-#ifndef __u_char_defined
-typedef unsigned long  u_long;
-typedef unsigned int   u_int;
-typedef unsigned short u_short;
-typedef unsigned char  u_char;
-#endif
-
-#include "fsm.h"
-#include "lcp.h"
-#if CCP_SUPPORT
-#include "ccp.h"
-#endif /* CCP_SUPPORT */
-#if MPPE_SUPPORT
-#include "mppe.h"
-#endif /* MPPE_SUPPORT */
-#if PPP_IPV4_SUPPORT
-#include "ipcp.h"
-#endif /* PPP_IPV4_SUPPORT */
-#if PPP_IPV6_SUPPORT
-#include "ipv6cp.h"
-#endif /* PPP_IPV6_SUPPORT */
-#if PAP_SUPPORT
-#include "upap.h"
-#endif /* PAP_SUPPORT */
-#if CHAP_SUPPORT
-#include "chap-new.h"
-#endif /* CHAP_SUPPORT */
-#if EAP_SUPPORT
-#include "eap.h"
-#endif /* EAP_SUPPORT */
-#if VJ_SUPPORT
-#include "vj.h"
-#endif /* VJ_SUPPORT */
-
-/* Link status callback function prototype */
-typedef void (*ppp_link_status_cb_fn)(ppp_pcb *pcb, int err_code, void *ctx);
-
-/*
- * PPP configuration.
- */
-typedef struct ppp_settings_s {
-
-#if PPP_SERVER && PPP_AUTH_SUPPORT
-  unsigned int  auth_required       :1;      /* Peer is required to authenticate */
-  unsigned int  null_login          :1;      /* Username of "" and a password of "" are acceptable */
-#endif /* PPP_SERVER && PPP_AUTH_SUPPORT */
-#if PPP_REMOTENAME
-  unsigned int  explicit_remote     :1;      /* remote_name specified with remotename opt */
-#endif /* PPP_REMOTENAME */
-#if PAP_SUPPORT
-  unsigned int  refuse_pap          :1;      /* Don't proceed auth. with PAP */
-#endif /* PAP_SUPPORT */
-#if CHAP_SUPPORT
-  unsigned int  refuse_chap         :1;      /* Don't proceed auth. with CHAP */
-#endif /* CHAP_SUPPORT */
-#if MSCHAP_SUPPORT
-  unsigned int  refuse_mschap       :1;      /* Don't proceed auth. with MS-CHAP */
-  unsigned int  refuse_mschap_v2    :1;      /* Don't proceed auth. with MS-CHAPv2 */
-#endif /* MSCHAP_SUPPORT */
-#if EAP_SUPPORT
-  unsigned int  refuse_eap          :1;      /* Don't proceed auth. with EAP */
-#endif /* EAP_SUPPORT */
-#if LWIP_DNS
-  unsigned int  usepeerdns          :1;      /* Ask peer for DNS adds */
-#endif /* LWIP_DNS */
-  unsigned int  persist             :1;      /* Persist mode, always try to open the connection */
-#if PRINTPKT_SUPPORT
-  unsigned int  hide_password       :1;      /* Hide password in dumped packets */
-#endif /* PRINTPKT_SUPPORT */
-  unsigned int  noremoteip          :1;      /* Let him have no IP address */
-  unsigned int  lax_recv            :1;      /* accept control chars in asyncmap */
-  unsigned int  noendpoint          :1;      /* don't send/accept endpoint discriminator */
-#if PPP_LCP_ADAPTIVE
-  unsigned int lcp_echo_adaptive    :1;      /* request echo only if the link was idle */
-#endif /* PPP_LCP_ADAPTIVE */
-#if MPPE_SUPPORT
-  unsigned int require_mppe         :1;      /* Require MPPE (Microsoft Point to Point Encryption) */
-  unsigned int refuse_mppe_40       :1;      /* Allow MPPE 40-bit mode? */
-  unsigned int refuse_mppe_128      :1;      /* Allow MPPE 128-bit mode? */
-  unsigned int refuse_mppe_stateful :1;      /* Allow MPPE stateful mode? */
-#endif /* MPPE_SUPPORT */
-
-  u16_t  listen_time;                 /* time to listen first (ms), waiting for peer to send LCP packet */
-
-#if PPP_IDLETIMELIMIT
-  u16_t  idle_time_limit;             /* Disconnect if idle for this many seconds */
-#endif /* PPP_IDLETIMELIMIT */
-#if PPP_MAXCONNECT
-  u32_t  maxconnect;                  /* Maximum connect time (seconds) */
-#endif /* PPP_MAXCONNECT */
-
-#if PPP_AUTH_SUPPORT
-  /* auth data */
-  const char  *user;                   /* Username for PAP */
-  const char  *passwd;                 /* Password for PAP, secret for CHAP */
-#if PPP_REMOTENAME
-  char  remote_name[MAXNAMELEN   + 1]; /* Peer's name for authentication */
-#endif /* PPP_REMOTENAME */
-
-#if PAP_SUPPORT
-  u8_t  pap_timeout_time;        /* Timeout (seconds) for auth-req retrans. */
-  u8_t  pap_max_transmits;       /* Number of auth-reqs sent */
-#if PPP_SERVER
-  u8_t  pap_req_timeout;         /* Time to wait for auth-req from peer */
-#endif /* PPP_SERVER */
-#endif /* PAP_SUPPPORT */
-
-#if CHAP_SUPPORT
-  u8_t  chap_timeout_time;       /* Timeout (seconds) for retransmitting req */
-  u8_t  chap_max_transmits;      /* max # times to send challenge */
-#if PPP_SERVER
-  u8_t  chap_rechallenge_time;   /* Time to wait for auth-req from peer */
-#endif /* PPP_SERVER */
-#endif /* CHAP_SUPPPORT */
-
-#if EAP_SUPPORT
-  u8_t  eap_req_time;            /* Time to wait (for retransmit/fail) */
-  u8_t  eap_allow_req;           /* Max Requests allowed */
-#if PPP_SERVER
-  u8_t  eap_timeout_time;        /* Time to wait (for retransmit/fail) */
-  u8_t  eap_max_transmits;       /* Max Requests allowed */
-#endif /* PPP_SERVER */
-#endif /* EAP_SUPPORT */
-
-#endif /* PPP_AUTH_SUPPORT */
-
-  u8_t  fsm_timeout_time;            /* Timeout time in seconds */
-  u8_t  fsm_max_conf_req_transmits;  /* Maximum Configure-Request transmissions */
-  u8_t  fsm_max_term_transmits;      /* Maximum Terminate-Request transmissions */
-  u8_t  fsm_max_nak_loops;           /* Maximum number of nak loops tolerated */
-
-  u8_t  lcp_loopbackfail;     /* Number of times we receive our magic number from the peer
-                                 before deciding the link is looped-back. */
-  u8_t  lcp_echo_interval;    /* Interval between LCP echo-requests */
-  u8_t  lcp_echo_fails;       /* Tolerance to unanswered echo-requests */
-
-} ppp_settings;
-
-#if PPP_SERVER
-struct ppp_addrs {
-#if PPP_IPV4_SUPPORT
-  ip4_addr_t our_ipaddr, his_ipaddr, netmask;
-#if LWIP_DNS
-  ip4_addr_t dns1, dns2;
-#endif /* LWIP_DNS */
-#endif /* PPP_IPV4_SUPPORT */
-#if PPP_IPV6_SUPPORT
-  ip6_addr_t our6_ipaddr, his6_ipaddr;
-#endif /* PPP_IPV6_SUPPORT */
-};
-#endif /* PPP_SERVER */
-
-/*
- * PPP interface control block.
- */
-struct ppp_pcb_s {
-  /* -- below are data that will NOT be cleared between two sessions */
-  ppp_settings settings;
-  const struct link_callbacks *link_cb;
-  void *link_ctx_cb;
-  void (*link_status_cb)(ppp_pcb *pcb, int err_code, void *ctx);  /* Status change callback */
-#if PPP_NOTIFY_PHASE
-  void (*notify_phase_cb)(ppp_pcb *pcb, u8_t phase, void *ctx);   /* Notify phase callback */
-#endif /* PPP_NOTIFY_PHASE */
-  void *ctx_cb;                  /* Callbacks optional pointer */
-  struct netif *netif;           /* PPP interface */
-
-  /* -- below are data that will be cleared between two sessions */
-
-  /*
-   * phase must be the first member of cleared members, because it is used to know
-   * which part must not be cleared.
-   */
-  u8_t phase;                    /* where the link is at */
-  u8_t err_code;                 /* Code indicating why interface is down. */
-
-  /* flags */
-#if PPP_IPV4_SUPPORT
-  unsigned int ipcp_is_open            :1; /* haven't called np_finished() */
-  unsigned int ipcp_is_up              :1; /* have called ipcp_up() */
-  unsigned int if4_up                  :1; /* True when the IPv4 interface is up. */
-#if 0 /* UNUSED - PROXY ARP */
-  unsigned int proxy_arp_set           :1; /* Have created proxy arp entry */
-#endif /* UNUSED - PROXY ARP */
-#endif /* PPP_IPV4_SUPPORT */
-#if PPP_IPV6_SUPPORT
-  unsigned int ipv6cp_is_up            :1; /* have called ip6cp_up() */
-  unsigned int if6_up                  :1; /* True when the IPv6 interface is up. */
-#endif /* PPP_IPV6_SUPPORT */
-  unsigned int lcp_echo_timer_running  :1; /* set if a timer is running */
-#if VJ_SUPPORT
-  unsigned int vj_enabled              :1; /* Flag indicating VJ compression enabled. */
-#endif /* VJ_SUPPORT */
-#if CCP_SUPPORT
-  unsigned int ccp_all_rejected        :1; /* we rejected all peer's options */
-#endif /* CCP_SUPPORT */
-#if MPPE_SUPPORT
-  unsigned int mppe_keys_set           :1; /* Have the MPPE keys been set? */
-#endif /* MPPE_SUPPORT */
-
-#if PPP_AUTH_SUPPORT
-  /* auth data */
-#if PPP_SERVER && defined(HAVE_MULTILINK)
-  char peer_authname[MAXNAMELEN + 1]; /* The name by which the peer authenticated itself to us. */
-#endif /* PPP_SERVER && defined(HAVE_MULTILINK) */
-  u16_t auth_pending;        /* Records which authentication operations haven't completed yet. */
-  u16_t auth_done;           /* Records which authentication operations have been completed. */
-
-#if PAP_SUPPORT
-  upap_state upap;           /* PAP data */
-#endif /* PAP_SUPPORT */
-
-#if CHAP_SUPPORT
-  chap_client_state chap_client;  /* CHAP client data */
-#if PPP_SERVER
-  chap_server_state chap_server;  /* CHAP server data */
-#endif /* PPP_SERVER */
-#endif /* CHAP_SUPPORT */
-
-#if EAP_SUPPORT
-  eap_state eap;            /* EAP data */
-#endif /* EAP_SUPPORT */
-#endif /* PPP_AUTH_SUPPORT */
-
-  fsm lcp_fsm;                   /* LCP fsm structure */
-  lcp_options lcp_wantoptions;   /* Options that we want to request */
-  lcp_options lcp_gotoptions;    /* Options that peer ack'd */
-  lcp_options lcp_allowoptions;  /* Options we allow peer to request */
-  lcp_options lcp_hisoptions;    /* Options that we ack'd */
-  u16_t peer_mru;                /* currently negotiated peer MRU */
-  u8_t lcp_echos_pending;        /* Number of outstanding echo msgs */
-  u8_t lcp_echo_number;          /* ID number of next echo frame */
-
-  u8_t num_np_open;              /* Number of network protocols which we have opened. */
-  u8_t num_np_up;                /* Number of network protocols which have come up. */
-
-#if VJ_SUPPORT
-  struct vjcompress vj_comp;     /* Van Jacobson compression header. */
-#endif /* VJ_SUPPORT */
-
-#if CCP_SUPPORT
-  fsm ccp_fsm;                   /* CCP fsm structure */
-  ccp_options ccp_wantoptions;   /* what to request the peer to use */
-  ccp_options ccp_gotoptions;    /* what the peer agreed to do */
-  ccp_options ccp_allowoptions;  /* what we'll agree to do */
-  ccp_options ccp_hisoptions;    /* what we agreed to do */
-  u8_t ccp_localstate;           /* Local state (mainly for handling reset-reqs and reset-acks). */
-  u8_t ccp_receive_method;       /* Method chosen on receive path */
-  u8_t ccp_transmit_method;      /* Method chosen on transmit path */
-#if MPPE_SUPPORT
-  ppp_mppe_state mppe_comp;      /* MPPE "compressor" structure */
-  ppp_mppe_state mppe_decomp;    /* MPPE "decompressor" structure */
-#endif /* MPPE_SUPPORT */
-#endif /* CCP_SUPPORT */
-
-#if PPP_IPV4_SUPPORT
-  fsm ipcp_fsm;                   /* IPCP fsm structure */
-  ipcp_options ipcp_wantoptions;  /* Options that we want to request */
-  ipcp_options ipcp_gotoptions;   /* Options that peer ack'd */
-  ipcp_options ipcp_allowoptions; /* Options we allow peer to request */
-  ipcp_options ipcp_hisoptions;   /* Options that we ack'd */
-#endif /* PPP_IPV4_SUPPORT */
-
-#if PPP_IPV6_SUPPORT
-  fsm ipv6cp_fsm;                     /* IPV6CP fsm structure */
-  ipv6cp_options ipv6cp_wantoptions;  /* Options that we want to request */
-  ipv6cp_options ipv6cp_gotoptions;   /* Options that peer ack'd */
-  ipv6cp_options ipv6cp_allowoptions; /* Options we allow peer to request */
-  ipv6cp_options ipv6cp_hisoptions;   /* Options that we ack'd */
-#endif /* PPP_IPV6_SUPPORT */
-};
-
-/************************
- *** PUBLIC FUNCTIONS ***
- ************************/
-
-/*
- * Set auth helper, optional, you can either fill ppp_pcb->settings.
- *
- * Warning: Using PPPAUTHTYPE_ANY might have security consequences.
- * RFC 1994 says:
- *
- * In practice, within or associated with each PPP server, there is a
- * database which associates "user" names with authentication
- * information ("secrets").  It is not anticipated that a particular
- * named user would be authenticated by multiple methods.  This would
- * make the user vulnerable to attacks which negotiate the least secure
- * method from among a set (such as PAP rather than CHAP).  If the same
- * secret was used, PAP would reveal the secret to be used later with
- * CHAP.
- *
- * Instead, for each user name there should be an indication of exactly
- * one method used to authenticate that user name.  If a user needs to
- * make use of different authentication methods under different
- * circumstances, then distinct user names SHOULD be employed, each of
- * which identifies exactly one authentication method.
- *
- */
-#define PPPAUTHTYPE_NONE      0x00
-#define PPPAUTHTYPE_PAP       0x01
-#define PPPAUTHTYPE_CHAP      0x02
-#define PPPAUTHTYPE_MSCHAP    0x04
-#define PPPAUTHTYPE_MSCHAP_V2 0x08
-#define PPPAUTHTYPE_EAP       0x10
-#define PPPAUTHTYPE_ANY       0xff
-void ppp_set_auth(ppp_pcb *pcb, u8_t authtype, const char *user, const char *passwd);
-
-/*
- * Set a PPP interface as the default network interface
- * (used to output all packets for which no specific route is found).
- */
-#define ppp_set_default(ppp)         netif_set_default(ppp->netif)
-
-#if PPP_NOTIFY_PHASE
-/*
- * Set a PPP notify phase callback.
- *
- * This can be used for example to set a LED pattern depending on the
- * current phase of the PPP session.
- */
-typedef void (*ppp_notify_phase_cb_fn)(ppp_pcb *pcb, u8_t phase, void *ctx);
-void ppp_set_notify_phase_callback(ppp_pcb *pcb, ppp_notify_phase_cb_fn notify_phase_cb);
-#endif /* PPP_NOTIFY_PHASE */
-
-/*
- * Initiate a PPP connection.
- *
- * This can only be called if PPP is in the dead phase.
- *
- * Holdoff is the time to wait (in seconds) before initiating
- * the connection.
- *
- * If this port connects to a modem, the modem connection must be
- * established before calling this.
- */
-err_t ppp_connect(ppp_pcb *pcb, u16_t holdoff);
-
-#if PPP_SERVER
-/*
- * Listen for an incoming PPP connection.
- *
- * This can only be called if PPP is in the dead phase.
- *
- * Local and remote interface IP addresses, as well as DNS are
- * provided through a previously filled struct ppp_addrs.
- *
- * If this port connects to a modem, the modem connection must be
- * established before calling this.
- */
-err_t ppp_listen(ppp_pcb *pcb, struct ppp_addrs *addrs);
-#endif /* PPP_SERVER */
-
-/*
- * Initiate the end of a PPP connection.
- * Any outstanding packets in the queues are dropped.
- *
- * Setting nocarrier to 1 close the PPP connection without initiating the
- * shutdown procedure. Always using nocarrier = 0 is still recommended,
- * this is going to take a little longer time if your link is down, but
- * is a safer choice for the PPP state machine.
- *
- * Return 0 on success, an error code on failure.
- */
-err_t ppp_close(ppp_pcb *pcb, u8_t nocarrier);
-
-/*
- * Release the control block.
- *
- * This can only be called if PPP is in the dead phase.
- *
- * You must use ppp_close() before if you wish to terminate
- * an established PPP session.
- *
- * Return 0 on success, an error code on failure.
- */
-err_t ppp_free(ppp_pcb *pcb);
-
-/*
- * PPP IOCTL commands.
- *
- * Get the up status - 0 for down, non-zero for up.  The argument must
- * point to an int.
- */
-#define PPPCTLG_UPSTATUS 0
-
-/*
- * Get the PPP error code.  The argument must point to an int.
- * Returns a PPPERR_* value.
- */
-#define PPPCTLG_ERRCODE  1
-
-/*
- * Get the fd associated with a PPP over serial
- */
-#define PPPCTLG_FD       2
-
-/*
- * Get and set parameters for the given connection.
- * Return 0 on success, an error code on failure.
- */
-err_t ppp_ioctl(ppp_pcb *pcb, u8_t cmd, void *arg);
-
-/* Get the PPP netif interface */
-#define ppp_netif(ppp)               (ppp->netif)
-
-/* Set an lwIP-style status-callback for the selected PPP device */
-#define ppp_set_netif_statuscallback(ppp, status_cb)       \
-        netif_set_status_callback(ppp->netif, status_cb);
-
-/* Set an lwIP-style link-callback for the selected PPP device */
-#define ppp_set_netif_linkcallback(ppp, link_cb)           \
-        netif_set_link_callback(ppp->netif, link_cb);
-
-#endif /* PPP_H */
-
-#endif /* PPP_SUPPORT */
diff --git a/components/lwip/include/lwip/netif/ppp/ppp_impl.h b/components/lwip/include/lwip/netif/ppp/ppp_impl.h
deleted file mode 100644 (file)
index 324f4b0..0000000
+++ /dev/null
@@ -1,632 +0,0 @@
-/*****************************************************************************
-* ppp.h - Network Point to Point Protocol header file.
-*
-* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
-* portions Copyright (c) 1997 Global Election Systems Inc.
-*
-* The authors hereby grant permission to use, copy, modify, distribute,
-* and license this software and its documentation for any purpose, provided
-* that existing copyright notices are retained in all copies and that this
-* notice and the following disclaimer are included verbatim in any
-* distributions. No written agreement, license, or royalty fee is required
-* for any of the authorized uses.
-*
-* THIS SOFTWARE IS PROVIDED BY THE 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 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.
-*
-******************************************************************************
-* REVISION HISTORY
-*
-* 03-01-01 Marc Boucher <marc@mbsi.ca>
-*   Ported to lwIP.
-* 97-11-05 Guy Lancaster <glanca@gesn.com>, Global Election Systems Inc.
-*   Original derived from BSD codes.
-*****************************************************************************/
-#ifndef LWIP_HDR_PPP_IMPL_H
-#define LWIP_HDR_PPP_IMPL_H
-
-#include "lwip/opt.h"
-
-#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */
-
-#ifdef PPP_INCLUDE_SETTINGS_HEADER
-#include "ppp_settings.h"
-#endif
-
-#include <stdio.h> /* formats */
-#include <stdarg.h>
-#include <string.h>
-#include <stdlib.h> /* strtol() */
-
-#include "lwip/netif.h"
-#include "lwip/def.h"
-#include "lwip/timers.h"
-
-#include "ppp.h"
-#include "pppdebug.h"
-
-/*
- * Memory used for control packets.
- *
- * PPP_CTRL_PBUF_MAX_SIZE is the amount of memory we allocate when we
- * cannot figure out how much we are going to use before filling the buffer.
- */
-#if PPP_USE_PBUF_RAM
-#define PPP_CTRL_PBUF_TYPE       PBUF_RAM
-#define PPP_CTRL_PBUF_MAX_SIZE   512
-#else /* PPP_USE_PBUF_RAM */
-#define PPP_CTRL_PBUF_TYPE       PBUF_POOL
-#define PPP_CTRL_PBUF_MAX_SIZE   PBUF_POOL_BUFSIZE
-#endif /* PPP_USE_PBUF_RAM */
-
-/*
- * The basic PPP frame.
- */
-#define PPP_ADDRESS(p) (((u_char *)(p))[0])
-#define PPP_CONTROL(p) (((u_char *)(p))[1])
-#define PPP_PROTOCOL(p)        ((((u_char *)(p))[2] << 8) + ((u_char *)(p))[3])
-
-/*
- * Significant octet values.
- */
-#define        PPP_ALLSTATIONS 0xff    /* All-Stations broadcast address */
-#define        PPP_UI          0x03    /* Unnumbered Information */
-#define        PPP_FLAG        0x7e    /* Flag Sequence */
-#define        PPP_ESCAPE      0x7d    /* Asynchronous Control Escape */
-#define        PPP_TRANS       0x20    /* Asynchronous transparency modifier */
-
-/*
- * Protocol field values.
- */
-#define PPP_IP         0x21    /* Internet Protocol */
-#if 0 /* UNUSED */
-#define PPP_AT         0x29    /* AppleTalk Protocol */
-#define PPP_IPX                0x2b    /* IPX protocol */
-#endif /* UNUSED */
-#if VJ_SUPPORT
-#define        PPP_VJC_COMP    0x2d    /* VJ compressed TCP */
-#define        PPP_VJC_UNCOMP  0x2f    /* VJ uncompressed TCP */
-#endif /* VJ_SUPPORT */
-#if PPP_IPV6_SUPPORT
-#define PPP_IPV6       0x57    /* Internet Protocol Version 6 */
-#endif /* PPP_IPV6_SUPPORT */
-#if CCP_SUPPORT
-#define PPP_COMP       0xfd    /* compressed packet */
-#endif /* CCP_SUPPORT */
-#define PPP_IPCP       0x8021  /* IP Control Protocol */
-#if 0 /* UNUSED */
-#define PPP_ATCP       0x8029  /* AppleTalk Control Protocol */
-#define PPP_IPXCP      0x802b  /* IPX Control Protocol */
-#endif /* UNUSED */
-#if PPP_IPV6_SUPPORT
-#define PPP_IPV6CP     0x8057  /* IPv6 Control Protocol */
-#endif /* PPP_IPV6_SUPPORT */
-#if CCP_SUPPORT
-#define PPP_CCP                0x80fd  /* Compression Control Protocol */
-#endif /* CCP_SUPPORT */
-#if ECP_SUPPORT
-#define PPP_ECP                0x8053  /* Encryption Control Protocol */
-#endif /* ECP_SUPPORT */
-#define PPP_LCP                0xc021  /* Link Control Protocol */
-#if PAP_SUPPORT
-#define PPP_PAP                0xc023  /* Password Authentication Protocol */
-#endif /* PAP_SUPPORT */
-#if LQR_SUPPORT
-#define PPP_LQR                0xc025  /* Link Quality Report protocol */
-#endif /* LQR_SUPPORT */
-#if CHAP_SUPPORT
-#define PPP_CHAP       0xc223  /* Cryptographic Handshake Auth. Protocol */
-#endif /* CHAP_SUPPORT */
-#if CBCP_SUPPORT
-#define PPP_CBCP       0xc029  /* Callback Control Protocol */
-#endif /* CBCP_SUPPORT */
-#if EAP_SUPPORT
-#define PPP_EAP                0xc227  /* Extensible Authentication Protocol */
-#endif /* EAP_SUPPORT */
-
-/*
- * The following struct gives the addresses of procedures to call
- * for a particular lower link level protocol.
- */
-struct link_callbacks {
-  /* Start a connection (e.g. Initiate discovery phase) */
-  err_t (*connect) (ppp_pcb *pcb, void *ctx);
-#if PPP_SERVER
-  /* Listen for an incoming connection (Passive mode) */
-  err_t (*listen) (ppp_pcb *pcb, void *ctx, struct ppp_addrs *addrs);
-#endif /* PPP_SERVER */
-  /* End a connection (i.e. initiate disconnect phase) */
-  void (*disconnect) (ppp_pcb *pcb, void *ctx);
-  /* Free lower protocol control block */
-  err_t (*free) (ppp_pcb *pcb, void *ctx);
-  /* Write a pbuf to a ppp link, only used from PPP functions to send PPP packets. */
-  err_t (*write)(ppp_pcb *pcb, void *ctx, struct pbuf *p);
-  /* Send a packet from lwIP core (IPv4 or IPv6) */
-  err_t (*netif_output)(ppp_pcb *pcb, void *ctx, struct pbuf *p, u_short protocol);
-  /* configure the transmit-side characteristics of the PPP interface */
-  void (*send_config)(ppp_pcb *pcb, void *ctx, u32_t accm, int pcomp, int accomp);
-  /* confire the receive-side characteristics of the PPP interface */
-  void (*recv_config)(ppp_pcb *pcb, void *ctx, u32_t accm, int pcomp, int accomp);
-};
-
-/*
- * What to do with network protocol (NP) packets.
- */
-enum NPmode {
-    NPMODE_PASS,               /* pass the packet through */
-    NPMODE_DROP,               /* silently drop the packet */
-    NPMODE_ERROR,              /* return an error */
-    NPMODE_QUEUE               /* save it up for later. */
-};
-
-/*
- * Statistics.
- */
-#if PPP_STATS_SUPPORT
-struct pppstat {
-    unsigned int ppp_ibytes;   /* bytes received */
-    unsigned int ppp_ipackets; /* packets received */
-    unsigned int ppp_ierrors;  /* receive errors */
-    unsigned int ppp_obytes;   /* bytes sent */
-    unsigned int ppp_opackets; /* packets sent */
-    unsigned int ppp_oerrors;  /* transmit errors */
-};
-
-#if VJ_SUPPORT
-struct vjstat {
-    unsigned int vjs_packets;  /* outbound packets */
-    unsigned int vjs_compressed; /* outbound compressed packets */
-    unsigned int vjs_searches; /* searches for connection state */
-    unsigned int vjs_misses;   /* times couldn't find conn. state */
-    unsigned int vjs_uncompressedin; /* inbound uncompressed packets */
-    unsigned int vjs_compressedin; /* inbound compressed packets */
-    unsigned int vjs_errorin;  /* inbound unknown type packets */
-    unsigned int vjs_tossed;   /* inbound packets tossed because of error */
-};
-#endif /* VJ_SUPPORT */
-
-struct ppp_stats {
-    struct pppstat p;          /* basic PPP statistics */
-#if VJ_SUPPORT
-    struct vjstat vj;          /* VJ header compression statistics */
-#endif /* VJ_SUPPORT */
-};
-
-#if CCP_SUPPORT
-struct compstat {
-    unsigned int unc_bytes;    /* total uncompressed bytes */
-    unsigned int unc_packets;  /* total uncompressed packets */
-    unsigned int comp_bytes;   /* compressed bytes */
-    unsigned int comp_packets; /* compressed packets */
-    unsigned int inc_bytes;    /* incompressible bytes */
-    unsigned int inc_packets;  /* incompressible packets */
-    unsigned int ratio;                /* recent compression ratio << 8 */
-};
-
-struct ppp_comp_stats {
-    struct compstat c;         /* packet compression statistics */
-    struct compstat d;         /* packet decompression statistics */
-};
-#endif /* CCP_SUPPORT */
-
-#endif /* PPP_STATS_SUPPORT */
-
-#if PPP_IDLETIMELIMIT
-/*
- * The following structure records the time in seconds since
- * the last NP packet was sent or received.
- */
-struct ppp_idle {
-    time_t xmit_idle;          /* time since last NP packet sent */
-    time_t recv_idle;          /* time since last NP packet received */
-};
-#endif /* PPP_IDLETIMELIMIT */
-
-/* values for epdisc.class */
-#define EPD_NULL       0       /* null discriminator, no data */
-#define EPD_LOCAL      1
-#define EPD_IP         2
-#define EPD_MAC                3
-#define EPD_MAGIC      4
-#define EPD_PHONENUM   5
-
-/*
- * Global variables.
- */
-#ifdef HAVE_MULTILINK
-extern u8_t    multilink;      /* enable multilink operation */
-extern u8_t    doing_multilink;
-extern u8_t    multilink_master;
-extern u8_t    bundle_eof;
-extern u8_t    bundle_terminating;
-#endif
-
-#ifdef MAXOCTETS
-extern unsigned int maxoctets;      /* Maximum octetes per session (in bytes) */
-extern int       maxoctets_dir;      /* Direction :
-                                     0 - in+out (default)
-                                     1 - in
-                                     2 - out
-                                     3 - max(in,out) */
-extern int       maxoctets_timeout;  /* Timeout for check of octets limit */
-#define PPP_OCTETS_DIRECTION_SUM        0
-#define PPP_OCTETS_DIRECTION_IN         1
-#define PPP_OCTETS_DIRECTION_OUT        2
-#define PPP_OCTETS_DIRECTION_MAXOVERAL  3
-/* same as previos, but little different on RADIUS side */
-#define PPP_OCTETS_DIRECTION_MAXSESSION 4
-#endif
-
-/* Data input may be used by CCP and ECP, remove this entry
- * from struct protent to save some flash
- */
-#define PPP_DATAINPUT 0
-
-/*
- * The following struct gives the addresses of procedures to call
- * for a particular protocol.
- */
-struct protent {
-    u_short protocol;          /* PPP protocol number */
-    /* Initialization procedure */
-    void (*init) (ppp_pcb *pcb);
-    /* Process a received packet */
-    void (*input) (ppp_pcb *pcb, u_char *pkt, int len);
-    /* Process a received protocol-reject */
-    void (*protrej) (ppp_pcb *pcb);
-    /* Lower layer has come up */
-    void (*lowerup) (ppp_pcb *pcb);
-    /* Lower layer has gone down */
-    void (*lowerdown) (ppp_pcb *pcb);
-    /* Open the protocol */
-    void (*open) (ppp_pcb *pcb);
-    /* Close the protocol */
-    void (*close) (ppp_pcb *pcb, const char *reason);
-#if PRINTPKT_SUPPORT
-    /* Print a packet in readable form */
-    int  (*printpkt) (const u_char *pkt, int len,
-                         void (*printer) (void *, const char *, ...),
-                         void *arg);
-#endif /* PRINTPKT_SUPPORT */
-#if PPP_DATAINPUT
-    /* Process a received data packet */
-    void (*datainput) (ppp_pcb *pcb, u_char *pkt, int len);
-#endif /* PPP_DATAINPUT */
-#if PRINTPKT_SUPPORT
-    const char *name;          /* Text name of protocol */
-    const char *data_name;     /* Text name of corresponding data protocol */
-#endif /* PRINTPKT_SUPPORT */
-#if PPP_OPTIONS
-    option_t *options;         /* List of command-line options */
-    /* Check requested options, assign defaults */
-    void (*check_options) (void);
-#endif /* PPP_OPTIONS */
-#if DEMAND_SUPPORT
-    /* Configure interface for demand-dial */
-    int  (*demand_conf) (int unit);
-    /* Say whether to bring up link for this pkt */
-    int  (*active_pkt) (u_char *pkt, int len);
-#endif /* DEMAND_SUPPORT */
-};
-
-/* Table of pointers to supported protocols */
-extern const struct protent* const protocols[];
-
-
-/* Values for auth_pending, auth_done */
-#if PAP_SUPPORT
-#define PAP_WITHPEER   0x1
-#define PAP_PEER       0x2
-#endif /* PAP_SUPPORT */
-#if CHAP_SUPPORT
-#define CHAP_WITHPEER  0x4
-#define CHAP_PEER      0x8
-#endif /* CHAP_SUPPORT */
-#if EAP_SUPPORT
-#define EAP_WITHPEER   0x10
-#define EAP_PEER       0x20
-#endif /* EAP_SUPPORT */
-
-/* Values for auth_done only */
-#if CHAP_SUPPORT
-#define CHAP_MD5_WITHPEER      0x40
-#define CHAP_MD5_PEER          0x80
-#if MSCHAP_SUPPORT
-#define CHAP_MS_SHIFT          8       /* LSB position for MS auths */
-#define CHAP_MS_WITHPEER       0x100
-#define CHAP_MS_PEER           0x200
-#define CHAP_MS2_WITHPEER      0x400
-#define CHAP_MS2_PEER          0x800
-#endif /* MSCHAP_SUPPORT */
-#endif /* CHAP_SUPPORT */
-
-/* Supported CHAP protocols */
-#if CHAP_SUPPORT
-
-#if MSCHAP_SUPPORT
-#define CHAP_MDTYPE_SUPPORTED (MDTYPE_MICROSOFT_V2 | MDTYPE_MICROSOFT | MDTYPE_MD5)
-#else /* MSCHAP_SUPPORT */
-#define CHAP_MDTYPE_SUPPORTED (MDTYPE_MD5)
-#endif /* MSCHAP_SUPPORT */
-
-#else /* CHAP_SUPPORT */
-#define CHAP_MDTYPE_SUPPORTED (MDTYPE_NONE)
-#endif /* CHAP_SUPPORT */
-
-#if PPP_STATS_SUPPORT
-/*
- * PPP statistics structure
- */
-struct pppd_stats {
-    unsigned int       bytes_in;
-    unsigned int       bytes_out;
-    unsigned int       pkts_in;
-    unsigned int       pkts_out;
-};
-#endif /* PPP_STATS_SUPPORT */
-
-
-/*
- * PPP private functions
- */
-
-/*
- * Functions called from lwIP core.
- */
-
-/* initialize the PPP subsystem */
-int ppp_init(void);
-
-
-/*
- * Functions called from PPP link protocols.
- */
-
-/* Create a new PPP control block */
-ppp_pcb *ppp_new(struct netif *pppif, const struct link_callbacks *callbacks, void *link_ctx_cb,
-                 ppp_link_status_cb_fn link_status_cb, void *ctx_cb);
-
-/* Set a PPP PCB to its initial state */
-void ppp_clear(ppp_pcb *pcb);
-
-/* Initiate LCP open request */
-void ppp_start(ppp_pcb *pcb);
-
-/* Called when link failed to setup */
-void ppp_link_failed(ppp_pcb *pcb);
-
-/* Called when link is normally down (i.e. it was asked to end) */
-void ppp_link_end(ppp_pcb *pcb);
-
-/* 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.
- */
-
-/* function called by all PPP subsystems to send packets */
-err_t ppp_write(ppp_pcb *pcb, struct pbuf *p);
-
-/* functions called by auth.c link_terminated() */
-void ppp_link_terminated(ppp_pcb *pcb);
-
-void new_phase(ppp_pcb *pcb, int p);
-
-int ppp_send_config(ppp_pcb *pcb, int mtu, u32_t accm, int pcomp, int accomp);
-int ppp_recv_config(ppp_pcb *pcb, int mru, u32_t accm, int pcomp, int accomp);
-
-#if PPP_IPV4_SUPPORT
-int sifaddr(ppp_pcb *pcb, u32_t our_adr, u32_t his_adr, u32_t netmask);
-int cifaddr(ppp_pcb *pcb, u32_t our_adr, u32_t his_adr);
-#if 0 /* UNUSED - PROXY ARP */
-int sifproxyarp(ppp_pcb *pcb, u32_t his_adr);
-int cifproxyarp(ppp_pcb *pcb, u32_t his_adr);
-#endif /* UNUSED - PROXY ARP */
-#if LWIP_DNS
-int sdns(ppp_pcb *pcb, u32_t ns1, u32_t ns2);
-int cdns(ppp_pcb *pcb, u32_t ns1, u32_t ns2);
-#endif /* LWIP_DNS */
-#if VJ_SUPPORT
-int sifvjcomp(ppp_pcb *pcb, int vjcomp, int cidcomp, int maxcid);
-#endif /* VJ_SUPPORT */
-int sifup(ppp_pcb *pcb);
-int sifdown (ppp_pcb *pcb);
-u32_t get_mask(u32_t addr);
-#endif /* PPP_IPV4_SUPPORT */
-
-#if PPP_IPV6_SUPPORT
-int sif6addr(ppp_pcb *pcb, eui64_t our_eui64, eui64_t his_eui64);
-int cif6addr(ppp_pcb *pcb, eui64_t our_eui64, eui64_t his_eui64);
-int sif6up(ppp_pcb *pcb);
-int sif6down (ppp_pcb *pcb);
-#endif /* PPP_IPV6_SUPPORT */
-
-#if DEMAND_SUPPORT
-int sifnpmode(ppp_pcb *pcb, int proto, enum NPmode mode);
-#endif /* DEMAND_SUPPORt */
-
-void netif_set_mtu(ppp_pcb *pcb, int mtu);
-int netif_get_mtu(ppp_pcb *pcb);
-
-#if CCP_SUPPORT
-#if 0 /* unused */
-int ccp_test(ppp_pcb *pcb, u_char *opt_ptr, int opt_len, int for_transmit);
-#endif /* unused */
-void ccp_set(ppp_pcb *pcb, u8_t isopen, u8_t isup, u8_t receive_method, u8_t transmit_method);
-void ccp_reset_comp(ppp_pcb *pcb);
-void ccp_reset_decomp(ppp_pcb *pcb);
-#if 0 /* unused */
-int ccp_fatal_error(ppp_pcb *pcb);
-#endif /* unused */
-#endif /* CCP_SUPPORT */
-
-#if PPP_IDLETIMELIMIT
-int get_idle_time(ppp_pcb *pcb, struct ppp_idle *ip);
-#endif /* PPP_IDLETIMELIMIT */
-
-#if DEMAND_SUPPORT
-int get_loop_output(void);
-#endif /* DEMAND_SUPPORT */
-
-/* Optional protocol names list, to make our messages a little more informative. */
-#if PPP_PROTOCOLNAME
-const char * protocol_name(int proto);
-#endif /* PPP_PROTOCOLNAME  */
-
-/* Optional stats support, to get some statistics on the PPP interface */
-#if PPP_STATS_SUPPORT
-void print_link_stats(void); /* Print stats, if available */
-void reset_link_stats(int u); /* Reset (init) stats when link goes up */
-void update_link_stats(int u); /* Get stats at link termination */
-#endif /* PPP_STATS_SUPPORT */
-
-
-
-/*
- * Inline versions of get/put char/short/long.
- * Pointer is advanced; we assume that both arguments
- * are lvalues and will already be in registers.
- * cp MUST be u_char *.
- */
-#define GETCHAR(c, cp) { \
-       (c) = *(cp)++; \
-}
-#define PUTCHAR(c, cp) { \
-       *(cp)++ = (u_char) (c); \
-}
-#define GETSHORT(s, cp) { \
-       (s) = *(cp)++ << 8; \
-       (s) |= *(cp)++; \
-}
-#define PUTSHORT(s, cp) { \
-       *(cp)++ = (u_char) ((s) >> 8); \
-       *(cp)++ = (u_char) (s); \
-}
-#define GETLONG(l, cp) { \
-       (l) = *(cp)++ << 8; \
-       (l) |= *(cp)++; (l) <<= 8; \
-       (l) |= *(cp)++; (l) <<= 8; \
-       (l) |= *(cp)++; \
-}
-#define PUTLONG(l, cp) { \
-       *(cp)++ = (u_char) ((l) >> 24); \
-       *(cp)++ = (u_char) ((l) >> 16); \
-       *(cp)++ = (u_char) ((l) >> 8); \
-       *(cp)++ = (u_char) (l); \
-}
-
-#define INCPTR(n, cp)  ((cp) += (n))
-#define DECPTR(n, cp)  ((cp) -= (n))
-
-/*
- * System dependent definitions for user-level 4.3BSD UNIX implementation.
- */
-#define TIMEOUT(f, a, t)        do { sys_untimeout((f), (a)); sys_timeout((t)*1000, (f), (a)); } while(0)
-#define TIMEOUTMS(f, a, t)      do { sys_untimeout((f), (a)); sys_timeout((t), (f), (a)); } while(0)
-#define UNTIMEOUT(f, a)         sys_untimeout((f), (a))
-
-#define BZERO(s, n)            memset(s, 0, n)
-#define        BCMP(s1, s2, l)         memcmp(s1, s2, l)
-
-#define PRINTMSG(m, l)         { ppp_info("Remote message: %0.*v", l, m); }
-
-/*
- * MAKEHEADER - Add Header fields to a packet.
- */
-#define MAKEHEADER(p, t) { \
-    PUTCHAR(PPP_ALLSTATIONS, p); \
-    PUTCHAR(PPP_UI, p); \
-    PUTSHORT(t, p); }
-
-/* Procedures exported from auth.c */
-void link_required(ppp_pcb *pcb);     /* we are starting to use the link */
-void link_terminated(ppp_pcb *pcb);   /* we are finished with the link */
-void link_down(ppp_pcb *pcb);        /* the LCP layer has left the Opened state */
-void upper_layers_down(ppp_pcb *pcb); /* take all NCPs down */
-void link_established(ppp_pcb *pcb);  /* the link is up; authenticate now */
-void start_networks(ppp_pcb *pcb);    /* start all the network control protos */
-void continue_networks(ppp_pcb *pcb); /* start network [ip, etc] control protos */
-#if PPP_AUTH_SUPPORT
-#if PPP_SERVER
-int auth_check_passwd(ppp_pcb *pcb, char *auser, int userlen, char *apasswd, int passwdlen, const char **msg, int *msglen);
-                                /* check the user name and passwd against configuration */
-void auth_peer_fail(ppp_pcb *pcb, int protocol);
-                               /* peer failed to authenticate itself */
-void auth_peer_success(ppp_pcb *pcb, int protocol, int prot_flavor, const char *name, int namelen);
-                               /* peer successfully authenticated itself */
-#endif /* PPP_SERVER */
-void auth_withpeer_fail(ppp_pcb *pcb, int protocol);
-                               /* we failed to authenticate ourselves */
-void auth_withpeer_success(ppp_pcb *pcb, int protocol, int prot_flavor);
-                               /* we successfully authenticated ourselves */
-#endif /* PPP_AUTH_SUPPORT */
-void np_up(ppp_pcb *pcb, int proto);    /* a network protocol has come up */
-void np_down(ppp_pcb *pcb, int proto);  /* a network protocol has gone down */
-void np_finished(ppp_pcb *pcb, int proto); /* a network protocol no longer needs link */
-#if PPP_AUTH_SUPPORT
-int get_secret(ppp_pcb *pcb, const char *client, const char *server, char *secret, int *secret_len, int am_server);
-                               /* get "secret" for chap */
-#endif /* PPP_AUTH_SUPPORT */
-
-/* Procedures exported from ipcp.c */
-/* int parse_dotted_ip (char *, u32_t *); */
-
-/* Procedures exported from demand.c */
-#if DEMAND_SUPPORT
-void demand_conf (void);       /* config interface(s) for demand-dial */
-void demand_block (void);      /* set all NPs to queue up packets */
-void demand_unblock (void); /* set all NPs to pass packets */
-void demand_discard (void); /* set all NPs to discard packets */
-void demand_rexmit (int, u32_t); /* retransmit saved frames for an NP*/
-int  loop_chars (unsigned char *, int); /* process chars from loopback */
-int  loop_frame (unsigned char *, int); /* should we bring link up? */
-#endif /* DEMAND_SUPPORT */
-
-/* Procedures exported from multilink.c */
-#ifdef HAVE_MULTILINK
-void mp_check_options (void); /* Check multilink-related options */
-int  mp_join_bundle (void);  /* join our link to an appropriate bundle */
-void mp_exit_bundle (void);  /* have disconnected our link from bundle */
-void mp_bundle_terminated (void);
-char *epdisc_to_str (struct epdisc *); /* string from endpoint discrim. */
-int  str_to_epdisc (struct epdisc *, char *); /* endpt disc. from str */
-#else
-#define mp_bundle_terminated() /* nothing */
-#define mp_exit_bundle()       /* nothing */
-#define doing_multilink                0
-#define multilink_master       0
-#endif
-
-/* Procedures exported from utils.c. */
-void ppp_print_string(const u_char *p, int len, void (*printer) (void *, const char *, ...), void *arg);   /* Format a string for output */
-int ppp_slprintf(char *buf, int buflen, const char *fmt, ...);            /* sprintf++ */
-int ppp_vslprintf(char *buf, int buflen, const char *fmt, va_list args);  /* vsprintf++ */
-size_t ppp_strlcpy(char *dest, const char *src, size_t len);        /* safe strcpy */
-size_t ppp_strlcat(char *dest, const char *src, size_t len);        /* safe strncpy */
-void ppp_dbglog(const char *fmt, ...);    /* log a debug message */
-void ppp_info(const char *fmt, ...);      /* log an informational message */
-void ppp_notice(const char *fmt, ...);    /* log a notice-level message */
-void ppp_warn(const char *fmt, ...);      /* log a warning message */
-void ppp_error(const char *fmt, ...);     /* log an error message */
-void ppp_fatal(const char *fmt, ...);     /* log an error message and die(1) */
-#if PRINTPKT_SUPPORT
-void ppp_dump_packet(const char *tag, unsigned char *p, int len);
-                                /* dump packet to debug log if interesting */
-#endif /* PRINTPKT_SUPPORT */
-
-
-#endif /* PPP_SUPPORT */
-#endif /* LWIP_HDR_PPP_IMPL_H */
diff --git a/components/lwip/include/lwip/netif/ppp/pppcrypt.h b/components/lwip/include/lwip/netif/ppp/pppcrypt.h
deleted file mode 100644 (file)
index ef2e87d..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * pppcrypt.c - PPP/DES linkage for MS-CHAP and EAP SRP-SHA1
- *
- * Extracted from chap_ms.c by James Carlson.
- *
- * Copyright (c) 1995 Eric Rosenquist.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The name(s) of the authors of this software must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission.
- *
- * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && MSCHAP_SUPPORT /* don't build if not configured for use in lwipopts.h */
-
-#ifndef PPPCRYPT_H
-#define        PPPCRYPT_H
-
-void pppcrypt_56_to_64_bit_key(u_char *key, u_char *des_key);
-
-#endif /* PPPCRYPT_H */
-
-#endif /* PPP_SUPPORT && MSCHAP_SUPPORT */
diff --git a/components/lwip/include/lwip/netif/ppp/pppdebug.h b/components/lwip/include/lwip/netif/ppp/pppdebug.h
deleted file mode 100644 (file)
index e35c8e0..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-/*****************************************************************************
-* pppdebug.h - System debugging utilities.
-*
-* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
-* portions Copyright (c) 1998 Global Election Systems Inc.
-* portions Copyright (c) 2001 by Cognizant Pty Ltd.
-*
-* The authors hereby grant permission to use, copy, modify, distribute,
-* and license this software and its documentation for any purpose, provided
-* that existing copyright notices are retained in all copies and that this
-* notice and the following disclaimer are included verbatim in any 
-* distributions. No written agreement, license, or royalty fee is required
-* for any of the authorized uses.
-*
-* THIS SOFTWARE IS PROVIDED BY THE 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 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.
-*
-******************************************************************************
-* REVISION HISTORY (please don't use tabs!)
-*
-* 03-01-01 Marc Boucher <marc@mbsi.ca>
-*   Ported to lwIP.
-* 98-07-29 Guy Lancaster <lancasterg@acm.org>, Global Election Systems Inc.
-*   Original.
-*
-*****************************************************************************
-*/
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */
-
-#ifndef PPPDEBUG_H
-#define PPPDEBUG_H
-
-/* Trace levels. */
-#define LOG_CRITICAL  (PPP_DEBUG | LWIP_DBG_LEVEL_SEVERE)
-#define LOG_ERR       (PPP_DEBUG | LWIP_DBG_LEVEL_SEVERE)
-#define LOG_NOTICE    (PPP_DEBUG | LWIP_DBG_LEVEL_WARNING)
-#define LOG_WARNING   (PPP_DEBUG | LWIP_DBG_LEVEL_WARNING)
-#define LOG_INFO      (PPP_DEBUG)
-#define LOG_DETAIL    (PPP_DEBUG)
-#define LOG_DEBUG     (PPP_DEBUG)
-
-#if PPP_DEBUG
-
-#define MAINDEBUG(a)    LWIP_DEBUGF(LWIP_DBG_LEVEL_WARNING, a)
-#define SYSDEBUG(a)     LWIP_DEBUGF(LWIP_DBG_LEVEL_WARNING, a)
-#define FSMDEBUG(a)     LWIP_DEBUGF(LWIP_DBG_LEVEL_WARNING, a)
-#define LCPDEBUG(a)     LWIP_DEBUGF(LWIP_DBG_LEVEL_WARNING, a)
-#define IPCPDEBUG(a)    LWIP_DEBUGF(LWIP_DBG_LEVEL_WARNING, a)
-#define IPV6CPDEBUG(a)  LWIP_DEBUGF(LWIP_DBG_LEVEL_WARNING, a)
-#define UPAPDEBUG(a)    LWIP_DEBUGF(LWIP_DBG_LEVEL_WARNING, a)
-#define CHAPDEBUG(a)    LWIP_DEBUGF(LWIP_DBG_LEVEL_WARNING, a)
-#define PPPDEBUG(a, b)  LWIP_DEBUGF(a, b)
-
-#else /* PPP_DEBUG */
-
-#define MAINDEBUG(a)
-#define SYSDEBUG(a)
-#define FSMDEBUG(a)
-#define LCPDEBUG(a)
-#define IPCPDEBUG(a)
-#define IPV6CPDEBUG(a)
-#define UPAPDEBUG(a)
-#define CHAPDEBUG(a)
-#define PPPDEBUG(a, b)
-
-#endif /* PPP_DEBUG */
-
-#endif /* PPPDEBUG_H */
-
-#endif /* PPP_SUPPORT */
diff --git a/components/lwip/include/lwip/netif/ppp/pppoe.h b/components/lwip/include/lwip/netif/ppp/pppoe.h
deleted file mode 100644 (file)
index b1dd2fd..0000000
+++ /dev/null
@@ -1,179 +0,0 @@
-/*****************************************************************************
-* pppoe.h - PPP Over Ethernet implementation for lwIP.
-*
-* Copyright (c) 2006 by Marc Boucher, Services Informatiques (MBSI) inc.
-*
-* The authors hereby grant permission to use, copy, modify, distribute,
-* and license this software and its documentation for any purpose, provided
-* that existing copyright notices are retained in all copies and that this
-* notice and the following disclaimer are included verbatim in any 
-* distributions. No written agreement, license, or royalty fee is required
-* for any of the authorized uses.
-*
-* THIS SOFTWARE IS PROVIDED BY THE 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 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.
-*
-******************************************************************************
-* REVISION HISTORY
-*
-* 06-01-01 Marc Boucher <marc@mbsi.ca>
-*   Ported to lwIP.
-*****************************************************************************/
-
-
-
-/* based on NetBSD: if_pppoe.c,v 1.64 2006/01/31 23:50:15 martin Exp */
-
-/*-
- * Copyright (c) 2002 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Martin Husemann <martin@NetBSD.org>.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *        This product includes software developed by the NetBSD
- *        Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-#include "lwip/opt.h"
-#if PPP_SUPPORT && PPPOE_SUPPORT /* don't build if not configured for use in lwipopts.h */
-
-#ifndef PPP_OE_H
-#define PPP_OE_H
-
-#include "ppp.h"
-#include "netif/etharp.h"
-
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct pppoehdr {
-  PACK_STRUCT_FLD_8(u8_t vertype);
-  PACK_STRUCT_FLD_8(u8_t code);
-  PACK_STRUCT_FIELD(u16_t session);
-  PACK_STRUCT_FIELD(u16_t plen);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct pppoetag {
-  PACK_STRUCT_FIELD(u16_t tag);
-  PACK_STRUCT_FIELD(u16_t len);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-
-
-#define PPPOE_STATE_INITIAL   0
-#define PPPOE_STATE_PADI_SENT 1
-#define PPPOE_STATE_PADR_SENT 2
-#define PPPOE_STATE_SESSION   3
-/* passive */
-#define PPPOE_STATE_PADO_SENT 1
-
-#define PPPOE_HEADERLEN       sizeof(struct pppoehdr)
-#define PPPOE_VERTYPE         0x11    /* VER=1, TYPE = 1 */
-
-#define PPPOE_TAG_EOL         0x0000  /* end of list */
-#define PPPOE_TAG_SNAME       0x0101  /* service name */
-#define PPPOE_TAG_ACNAME      0x0102  /* access concentrator name */
-#define PPPOE_TAG_HUNIQUE     0x0103  /* host unique */
-#define PPPOE_TAG_ACCOOKIE    0x0104  /* AC cookie */
-#define PPPOE_TAG_VENDOR      0x0105  /* vendor specific */
-#define PPPOE_TAG_RELAYSID    0x0110  /* relay session id */
-#define PPPOE_TAG_SNAME_ERR   0x0201  /* service name error */
-#define PPPOE_TAG_ACSYS_ERR   0x0202  /* AC system error */
-#define PPPOE_TAG_GENERIC_ERR 0x0203  /* gerneric error */
-
-#define PPPOE_CODE_PADI       0x09    /* Active Discovery Initiation */
-#define PPPOE_CODE_PADO       0x07    /* Active Discovery Offer */
-#define PPPOE_CODE_PADR       0x19    /* Active Discovery Request */
-#define PPPOE_CODE_PADS       0x65    /* Active Discovery Session confirmation */
-#define PPPOE_CODE_PADT       0xA7    /* Active Discovery Terminate */
-
-#ifndef PPPOE_MAX_AC_COOKIE_LEN
-#define PPPOE_MAX_AC_COOKIE_LEN   64
-#endif
-
-struct pppoe_softc {
-  struct pppoe_softc *next;
-  struct netif *sc_ethif;      /* ethernet interface we are using */
-  ppp_pcb *pcb;                /* PPP PCB */
-
-  struct eth_addr sc_dest;     /* hardware address of concentrator */
-  u16_t sc_session;            /* PPPoE session id */
-  u8_t sc_state;               /* discovery phase or session connected */
-
-#ifdef PPPOE_TODO
-  u8_t *sc_service_name;       /* if != NULL: requested name of service */
-  u8_t *sc_concentrator_name;  /* if != NULL: requested concentrator id */
-#endif /* PPPOE_TODO */
-  u8_t sc_ac_cookie[PPPOE_MAX_AC_COOKIE_LEN]; /* content of AC cookie we must echo back */
-  u8_t sc_ac_cookie_len;       /* length of cookie data */
-#ifdef PPPOE_SERVER
-  u8_t *sc_hunique;            /* content of host unique we must echo back */
-  u8_t sc_hunique_len;         /* length of host unique */
-#endif
-  u8_t sc_padi_retried;        /* number of PADI retries already done */
-  u8_t sc_padr_retried;        /* number of PADR retries already done */
-};
-
-
-#define pppoe_init() /* compatibility define, no initialization needed */
-
-ppp_pcb *pppoe_create(struct netif *pppif,
-       struct netif *ethif,
-       const char *service_name, const char *concentrator_name,
-       ppp_link_status_cb_fn link_status_cb, void *ctx_cb);
-
-/*
- * Functions called from lwIP
- * DO NOT CALL FROM lwIP USER APPLICATION.
- */
-void pppoe_disc_input(struct netif *netif, struct pbuf *p);
-void pppoe_data_input(struct netif *netif, struct pbuf *p);
-
-#endif /* PPP_OE_H */
-
-#endif /* PPP_SUPPORT && PPPOE_SUPPORT */
diff --git a/components/lwip/include/lwip/netif/ppp/pppol2tp.h b/components/lwip/include/lwip/netif/ppp/pppol2tp.h
deleted file mode 100644 (file)
index 097b4d1..0000000
+++ /dev/null
@@ -1,201 +0,0 @@
-/**
- * @file
- * Network Point to Point Protocol over Layer 2 Tunneling Protocol header file.
- *
- */
-
-/*
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && PPPOL2TP_SUPPORT /* don't build if not configured for use in lwipopts.h */
-
-#ifndef PPPOL2TP_H_
-#define PPPOL2TP_H_
-
-#include "ppp.h"
-
-/* Timeout */
-#define PPPOL2TP_CONTROL_TIMEOUT         (5*1000)  /* base for quick timeout calculation */
-#define PPPOL2TP_SLOW_RETRY              (60*1000) /* persistent retry interval */
-
-#define PPPOL2TP_MAXSCCRQ                4         /* retry SCCRQ four times (quickly) */
-#define PPPOL2TP_MAXICRQ                 4         /* retry IRCQ four times */
-#define PPPOL2TP_MAXICCN                 4         /* retry ICCN four times */
-
-/* L2TP header flags */
-#define PPPOL2TP_HEADERFLAG_CONTROL      0x8000
-#define PPPOL2TP_HEADERFLAG_LENGTH       0x4000
-#define PPPOL2TP_HEADERFLAG_SEQUENCE     0x0800
-#define PPPOL2TP_HEADERFLAG_OFFSET       0x0200
-#define PPPOL2TP_HEADERFLAG_PRIORITY     0x0100
-#define PPPOL2TP_HEADERFLAG_VERSION      0x0002
-
-/* Mandatory bits for control: Control, Length, Sequence, Version 2 */
-#define PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY     (PPPOL2TP_HEADERFLAG_CONTROL|PPPOL2TP_HEADERFLAG_LENGTH|PPPOL2TP_HEADERFLAG_SEQUENCE|PPPOL2TP_HEADERFLAG_VERSION)
-/* Forbidden bits for control: Offset, Priority */
-#define PPPOL2TP_HEADERFLAG_CONTROL_FORBIDDEN     (PPPOL2TP_HEADERFLAG_OFFSET|PPPOL2TP_HEADERFLAG_PRIORITY)
-
-/* Mandatory bits for data: Version 2 */
-#define PPPOL2TP_HEADERFLAG_DATA_MANDATORY        (PPPOL2TP_HEADERFLAG_VERSION)
-
-/* AVP (Attribute Value Pair) header */
-#define PPPOL2TP_AVPHEADERFLAG_MANDATORY  0x8000
-#define PPPOL2TP_AVPHEADERFLAG_HIDDEN     0x4000
-#define PPPOL2TP_AVPHEADERFLAG_LENGTHMASK 0x03ff
-
-/* -- AVP - Message type */
-#define PPPOL2TP_AVPTYPE_MESSAGE      0 /* Message type */
-
-/* Control Connection Management */
-#define PPPOL2TP_MESSAGETYPE_SCCRQ    1 /* Start Control Connection Request */
-#define PPPOL2TP_MESSAGETYPE_SCCRP    2 /* Start Control Connection Reply */
-#define PPPOL2TP_MESSAGETYPE_SCCCN    3 /* Start Control Connection Connected */
-#define PPPOL2TP_MESSAGETYPE_STOPCCN  4 /* Stop Control Connection Notification */
-#define PPPOL2TP_MESSAGETYPE_HELLO    6 /* Hello */
-/* Call Management */
-#define PPPOL2TP_MESSAGETYPE_OCRQ     7 /* Outgoing Call Request */
-#define PPPOL2TP_MESSAGETYPE_OCRP     8 /* Outgoing Call Reply */
-#define PPPOL2TP_MESSAGETYPE_OCCN     9 /* Outgoing Call Connected */
-#define PPPOL2TP_MESSAGETYPE_ICRQ    10 /* Incoming Call Request */
-#define PPPOL2TP_MESSAGETYPE_ICRP    11 /* Incoming Call Reply */
-#define PPPOL2TP_MESSAGETYPE_ICCN    12 /* Incoming Call Connected */
-#define PPPOL2TP_MESSAGETYPE_CDN     14 /* Call Disconnect Notify */
-/* Error reporting */
-#define PPPOL2TP_MESSAGETYPE_WEN     15 /* WAN Error Notify */
-/* PPP Session Control */
-#define PPPOL2TP_MESSAGETYPE_SLI     16 /* Set Link Info */
-
-/* -- AVP - Result code */
-#define PPPOL2TP_AVPTYPE_RESULTCODE   1 /* Result code */
-#define PPPOL2TP_RESULTCODE           1 /* General request to clear control connection */
-
-/* -- AVP - Protocol version (!= L2TP Header version) */
-#define PPPOL2TP_AVPTYPE_VERSION      2
-#define PPPOL2TP_VERSION         0x0100 /* L2TP Protocol version 1, revision 0 */
-
-/* -- AVP - Framing capabilities */
-#define PPPOL2TP_AVPTYPE_FRAMINGCAPABILITIES           3 /* Bearer capabilities */
-#define PPPOL2TP_FRAMINGCAPABILITIES          0x00000003 /* Async + Sync framing */
-
-/* -- AVP - Bearer capabilities */
-#define PPPOL2TP_AVPTYPE_BEARERCAPABILITIES           4 /* Bearer capabilities */
-#define PPPOL2TP_BEARERCAPABILITIES          0x00000003 /* Analog + Digital Access */
-
-/* -- AVP - Tie breaker */
-#define PPPOL2TP_AVPTYPE_TIEBREAKER   5
-
-/* -- AVP - Host name */
-#define PPPOL2TP_AVPTYPE_HOSTNAME     7 /* Host name */
-#define PPPOL2TP_HOSTNAME        "lwIP" /* FIXME: make it configurable */
-
-/* -- AVP - Vendor name */
-#define PPPOL2TP_AVPTYPE_VENDORNAME   8 /* Vendor name */
-#define PPPOL2TP_VENDORNAME      "lwIP" /* FIXME: make it configurable */
-
-/* -- AVP - Assign tunnel ID */
-#define PPPOL2TP_AVPTYPE_TUNNELID     9 /* Assign Tunnel ID */
-
-/* -- AVP - Receive window size */
-#define PPPOL2TP_AVPTYPE_RECEIVEWINDOWSIZE  10 /* Receive window size */
-#define PPPOL2TP_RECEIVEWINDOWSIZE           8 /* FIXME: make it configurable */
-
-/* -- AVP - Challenge */
-#define PPPOL2TP_AVPTYPE_CHALLENGE   11 /* Challenge */
-
-/* -- AVP - Cause code */
-#define PPPOL2TP_AVPTYPE_CAUSECODE   12 /* Cause code*/
-
-/* -- AVP - Challenge response */
-#define PPPOL2TP_AVPTYPE_CHALLENGERESPONSE   13 /* Challenge response */
-#define PPPOL2TP_AVPTYPE_CHALLENGERESPONSE_SIZE  16
-
-/* -- AVP - Assign session ID */
-#define PPPOL2TP_AVPTYPE_SESSIONID   14 /* Assign Session ID */
-
-/* -- AVP - Call serial number */
-#define PPPOL2TP_AVPTYPE_CALLSERIALNUMBER   15 /* Call Serial Number */
-
-/* -- AVP - Framing type */
-#define PPPOL2TP_AVPTYPE_FRAMINGTYPE         19 /* Framing Type */
-#define PPPOL2TP_FRAMINGTYPE         0x00000001 /* Sync framing */
-
-/* -- AVP - TX Connect Speed */
-#define PPPOL2TP_AVPTYPE_TXCONNECTSPEED      24 /* TX Connect Speed */
-#define PPPOL2TP_TXCONNECTSPEED       100000000 /* Connect speed: 100 Mbits/s */
-
-/* L2TP Session state */
-#define PPPOL2TP_STATE_INITIAL     0
-#define PPPOL2TP_STATE_SCCRQ_SENT  1
-#define PPPOL2TP_STATE_ICRQ_SENT   2
-#define PPPOL2TP_STATE_ICCN_SENT   3
-#define PPPOL2TP_STATE_DATA        4
-
-#define PPPOL2TP_OUTPUT_DATA_HEADER_LEN   6 /* Our data header len */
-
-/*
- * PPPoL2TP interface control block.
- */
-typedef struct pppol2tp_pcb_s pppol2tp_pcb;
-struct pppol2tp_pcb_s {
-  ppp_pcb *ppp;                /* PPP PCB */
-  u8_t phase;                  /* L2TP phase */
-  struct udp_pcb *udp;         /* UDP L2TP Socket */
-  struct netif *netif;         /* Output interface, used as a default route */
-  ip_addr_t remote_ip;         /* LNS IP Address */
-  u16_t remote_port;           /* LNS port */
-#if PPPOL2TP_AUTH_SUPPORT
-  const u8_t *secret;          /* Secret string */
-  u8_t secret_len;             /* Secret string length */
-  u8_t secret_rv[16];          /* Random vector */
-  u8_t challenge_hash[16];     /* Challenge response */
-  u8_t send_challenge;         /* Boolean whether the next sent packet should contains a challenge response */
-#endif /* PPPOL2TP_AUTH_SUPPORT */
-
-  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 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 */
-  u16_t remote_session_id;     /* Session ID assigned to peer */
-
-  u8_t sccrq_retried;          /* number of SCCRQ retries already done */
-  u8_t icrq_retried;           /* number of ICRQ retries already done */
-  u8_t iccn_retried;           /* number of ICCN retries already done */
-};
-
-
-/* Create a new L2TP session. */
-ppp_pcb *pppol2tp_create(struct netif *pppif,
-       struct netif *netif, ip_addr_t *ipaddr, u16_t port,
-       const u8_t *secret, u8_t secret_len,
-       ppp_link_status_cb_fn link_status_cb, void *ctx_cb);
-
-#endif /* PPPOL2TP_H_ */
-#endif /* PPP_SUPPORT && PPPOL2TP_SUPPORT */
diff --git a/components/lwip/include/lwip/netif/ppp/pppos.h b/components/lwip/include/lwip/netif/ppp/pppos.h
deleted file mode 100644 (file)
index 39b2b7d..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-/**
- * @file
- * Network Point to Point Protocol over Serial header file.
- *
- */
-
-/*
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && PPPOS_SUPPORT /* don't build if not configured for use in lwipopts.h */
-
-#ifndef PPPOS_H
-#define PPPOS_H
-
-#include "lwip/sys.h"
-#include "lwip/sio.h"
-
-#include "ppp.h"
-#include "vj.h"
-
-/* PPP packet parser states.  Current state indicates operation yet to be
- * completed. */
-enum {
-  PDIDLE = 0,  /* Idle state - waiting. */
-  PDSTART,     /* Process start flag. */
-  PDADDRESS,   /* Process address field. */
-  PDCONTROL,   /* Process control field. */
-  PDPROTOCOL1, /* Process protocol field 1. */
-  PDPROTOCOL2, /* Process protocol field 2. */
-  PDDATA       /* Process data byte. */
-};
-
-/* PPPoS serial output callback function prototype */
-typedef u32_t (*pppos_output_cb_fn)(ppp_pcb *pcb, u8_t *data, u32_t len, void *ctx);
-
-/*
- * Extended asyncmap - allows any character to be escaped.
- */
-typedef u8_t ext_accm[32];
-
-/*
- * PPPoS interface control block.
- */
-typedef struct pppos_pcb_s pppos_pcb;
-struct pppos_pcb_s {
-  /* -- below are data that will NOT be cleared between two sessions */
-  ppp_pcb *ppp;                    /* PPP PCB */
-  pppos_output_cb_fn output_cb;    /* PPP serial output callback */
-
-  /* -- below are data that will be cleared between two sessions
-   *
-   * last_xmit must be the first member of cleared members, because it is
-   * used to know which part must not be cleared.
-   */
-  u32_t last_xmit;                 /* Time of last transmission. */
-  ext_accm out_accm;               /* Async-Ctl-Char-Map for output. */
-
-  /* flags */
-  unsigned int open            :1; /* Set if PPPoS is open */
-  unsigned int pcomp           :1; /* Does peer accept protocol compression? */
-  unsigned int accomp          :1; /* Does peer accept addr/ctl compression? */
-
-  /* PPPoS rx */
-  ext_accm in_accm;                /* Async-Ctl-Char-Map for input. */
-  struct pbuf *in_head, *in_tail;  /* The input packet. */
-  u16_t in_protocol;               /* The input protocol code. */
-  u16_t in_fcs;                    /* Input Frame Check Sequence value. */
-  u8_t in_state;                   /* The input process state. */
-  u8_t in_escaped;                 /* Escape next character. */
-};
-
-/* Create a new PPPoS session. */
-ppp_pcb *pppos_create(struct netif *pppif, pppos_output_cb_fn output_cb,
-       ppp_link_status_cb_fn link_status_cb, void *ctx_cb);
-
-#if !NO_SYS && !PPP_INPROC_IRQ_SAFE
-/* Pass received raw characters to PPPoS to be decoded through lwIP TCPIP thread. */
-err_t pppos_input_tcpip(ppp_pcb *ppp, u8_t *s, int l);
-#endif /* !NO_SYS && !PPP_INPROC_IRQ_SAFE */
-
-/* PPP over Serial: this is the input function to be called for received data. */
-void pppos_input(ppp_pcb *ppp, u8_t* data, int len);
-
-
-/*
- * Functions called from lwIP
- * DO NOT CALL FROM lwIP USER APPLICATION.
- */
-#if !NO_SYS && !PPP_INPROC_IRQ_SAFE
-err_t pppos_input_sys(struct pbuf *p, struct netif *inp);
-#endif /* !NO_SYS && !PPP_INPROC_IRQ_SAFE */
-
-#endif /* PPPOS_H */
-#endif /* PPP_SUPPORT && PPPOL2TP_SUPPORT */
diff --git a/components/lwip/include/lwip/netif/ppp/upap.h b/components/lwip/include/lwip/netif/ppp/upap.h
deleted file mode 100644 (file)
index bb9309b..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * upap.h - User/Password Authentication Protocol definitions.
- *
- * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The name "Carnegie Mellon University" must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission. For permission or any legal
- *    details, please contact
- *      Office of Technology Transfer
- *      Carnegie Mellon University
- *      5000 Forbes Avenue
- *      Pittsburgh, PA  15213-3890
- *      (412) 268-4387, fax: (412) 268-7395
- *      tech-transfer@andrew.cmu.edu
- *
- * 4. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by Computing Services
- *     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
- *
- * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
- * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * $Id: upap.h,v 1.8 2002/12/04 23:03:33 paulus Exp $
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && PAP_SUPPORT  /* don't build if not configured for use in lwipopts.h */
-
-#ifndef UPAP_H
-#define UPAP_H
-
-#include "ppp.h"
-
-/*
- * Packet header = Code, id, length.
- */
-#define UPAP_HEADERLEN 4
-
-
-/*
- * UPAP codes.
- */
-#define UPAP_AUTHREQ   1       /* Authenticate-Request */
-#define UPAP_AUTHACK   2       /* Authenticate-Ack */
-#define UPAP_AUTHNAK   3       /* Authenticate-Nak */
-
-
-/*
- * Client states.
- */
-#define UPAPCS_INITIAL 0       /* Connection down */
-#define UPAPCS_CLOSED  1       /* Connection up, haven't requested auth */
-#define UPAPCS_PENDING 2       /* Connection down, have requested auth */
-#define UPAPCS_AUTHREQ 3       /* We've sent an Authenticate-Request */
-#define UPAPCS_OPEN    4       /* We've received an Ack */
-#define UPAPCS_BADAUTH 5       /* We've received a Nak */
-
-/*
- * Server states.
- */
-#define UPAPSS_INITIAL 0       /* Connection down */
-#define UPAPSS_CLOSED  1       /* Connection up, haven't requested auth */
-#define UPAPSS_PENDING 2       /* Connection down, have requested auth */
-#define UPAPSS_LISTEN  3       /* Listening for an Authenticate */
-#define UPAPSS_OPEN    4       /* We've sent an Ack */
-#define UPAPSS_BADAUTH 5       /* We've sent a Nak */
-
-
-/*
- * Timeouts.
- */
-#if 0 /* moved to opt.h */
-#define UPAP_DEFTIMEOUT        3       /* Timeout (seconds) for retransmitting req */
-#define UPAP_DEFREQTIME        30      /* Time to wait for auth-req from peer */
-#endif /* moved to opt.h */
-
-/*
- * Each interface is described by upap structure.
- */
-#if PAP_SUPPORT
-typedef struct upap_state {
-    const char *us_user;       /* User */
-    u8_t us_userlen;           /* User length */
-    const char *us_passwd;     /* Password */
-    u8_t us_passwdlen;         /* Password length */
-    u8_t us_clientstate;       /* Client state */
-#if PPP_SERVER
-    u8_t us_serverstate;       /* Server state */
-#endif /* PPP_SERVER */
-    u8_t us_id;                        /* Current id */
-    u8_t us_transmits;         /* Number of auth-reqs sent */
-} upap_state;
-#endif /* PAP_SUPPORT */
-
-
-void upap_authwithpeer(ppp_pcb *pcb, const char *user, const char *password);
-#if PPP_SERVER
-void upap_authpeer(ppp_pcb *pcb);
-#endif /* PPP_SERVER */
-
-extern const struct protent pap_protent;
-
-#endif /* UPAP_H */
-#endif /* PPP_SUPPORT && PAP_SUPPORT */
diff --git a/components/lwip/include/lwip/netif/ppp/vj.h b/components/lwip/include/lwip/netif/ppp/vj.h
deleted file mode 100644 (file)
index f2e1f8b..0000000
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Definitions for tcp compression routines.
- *
- * $Id: vj.h,v 1.7 2010/02/22 17:52:09 goldsimon Exp $
- *
- * Copyright (c) 1989 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley.  The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Van Jacobson (van@helios.ee.lbl.gov), Dec 31, 1989:
- * - Initial distribution.
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && VJ_SUPPORT /* don't build if not configured for use in lwipopts.h */
-
-#ifndef VJ_H
-#define VJ_H
-
-#include "lwip/ip.h"
-#include "lwip/priv/tcp_priv.h"
-
-#define MAX_SLOTS 16 /* must be > 2 and < 256 */
-#define MAX_HDR   128
-
-/*
- * Compressed packet format:
- *
- * The first octet contains the packet type (top 3 bits), TCP
- * 'push' bit, and flags that indicate which of the 4 TCP sequence
- * numbers have changed (bottom 5 bits).  The next octet is a
- * conversation number that associates a saved IP/TCP header with
- * the compressed packet.  The next two octets are the TCP checksum
- * from the original datagram.  The next 0 to 15 octets are
- * sequence number changes, one change per bit set in the header
- * (there may be no changes and there are two special cases where
- * the receiver implicitly knows what changed -- see below).
- *
- * There are 5 numbers which can change (they are always inserted
- * in the following order): TCP urgent pointer, window,
- * acknowlegement, sequence number and IP ID.  (The urgent pointer
- * is different from the others in that its value is sent, not the
- * change in value.)  Since typical use of SLIP links is biased
- * toward small packets (see comments on MTU/MSS below), changes
- * use a variable length coding with one octet for numbers in the
- * range 1 - 255 and 3 octets (0, MSB, LSB) for numbers in the
- * range 256 - 65535 or 0.  (If the change in sequence number or
- * ack is more than 65535, an uncompressed packet is sent.)
- */
-
-/*
- * Packet types (must not conflict with IP protocol version)
- *
- * The top nibble of the first octet is the packet type.  There are
- * three possible types: IP (not proto TCP or tcp with one of the
- * control flags set); uncompressed TCP (a normal IP/TCP packet but
- * with the 8-bit protocol field replaced by an 8-bit connection id --
- * this type of packet syncs the sender & receiver); and compressed
- * TCP (described above).
- *
- * LSB of 4-bit field is TCP "PUSH" bit (a worthless anachronism) and
- * is logically part of the 4-bit "changes" field that follows.  Top
- * three bits are actual packet type.  For backward compatibility
- * and in the interest of conserving bits, numbers are chosen so the
- * IP protocol version number (4) which normally appears in this nibble
- * means "IP packet".
- */
-
-/* packet types */
-#define TYPE_IP               0x40
-#define TYPE_UNCOMPRESSED_TCP 0x70
-#define TYPE_COMPRESSED_TCP   0x80
-#define TYPE_ERROR            0x00
-
-/* Bits in first octet of compressed packet */
-#define NEW_C 0x40 /* flag bits for what changed in a packet */
-#define NEW_I 0x20
-#define NEW_S 0x08
-#define NEW_A 0x04
-#define NEW_W 0x02
-#define NEW_U 0x01
-
-/* reserved, special-case values of above */
-#define SPECIAL_I (NEW_S|NEW_W|NEW_U) /* echoed interactive traffic */
-#define SPECIAL_D (NEW_S|NEW_A|NEW_W|NEW_U) /* unidirectional data */
-#define SPECIALS_MASK (NEW_S|NEW_A|NEW_W|NEW_U)
-
-#define TCP_PUSH_BIT 0x10
-
-
-/*
- * "state" data for each active tcp conversation on the wire.  This is
- * basically a copy of the entire IP/TCP header from the last packet
- * we saw from the conversation together with a small identifier
- * the transmit & receive ends of the line use to locate saved header.
- */
-struct cstate {
-  struct cstate *cs_next; /* next most recently used state (xmit only) */
-  u16_t cs_hlen;        /* size of hdr (receive only) */
-  u8_t cs_id;           /* connection # associated with this state */
-  u8_t cs_filler;
-  union {
-    char csu_hdr[MAX_HDR];
-    struct ip_hdr csu_ip;     /* ip/tcp hdr from most recent packet */
-  } vjcs_u;
-};
-#define cs_ip vjcs_u.csu_ip
-#define cs_hdr vjcs_u.csu_hdr
-
-
-struct vjstat {
-  u32_t vjs_packets;        /* outbound packets */
-  u32_t vjs_compressed;     /* outbound compressed packets */
-  u32_t vjs_searches;       /* searches for connection state */
-  u32_t vjs_misses;         /* times couldn't find conn. state */
-  u32_t vjs_uncompressedin; /* inbound uncompressed packets */
-  u32_t vjs_compressedin;   /* inbound compressed packets */
-  u32_t vjs_errorin;        /* inbound unknown type packets */
-  u32_t vjs_tossed;         /* inbound packets tossed because of error */
-};
-
-/*
- * all the state data for one serial line (we need one of these per line).
- */
-struct vjcompress {
-  struct cstate *last_cs;          /* most recently used tstate */
-  u8_t last_recv;                /* last rcvd conn. id */
-  u8_t last_xmit;                /* last sent conn. id */
-  u16_t flags;
-  u8_t maxSlotIndex;
-  u8_t compressSlot;             /* Flag indicating OK to compress slot ID. */
-#if LINK_STATS
-  struct vjstat stats;
-#endif
-  struct cstate tstate[MAX_SLOTS]; /* xmit connection states */
-  struct cstate rstate[MAX_SLOTS]; /* receive connection states */
-};
-
-/* flag values */
-#define VJF_TOSS 1U /* tossing rcvd frames because of input err */
-
-extern void  vj_compress_init    (struct vjcompress *comp);
-extern u8_t  vj_compress_tcp     (struct vjcompress *comp, struct pbuf **pb);
-extern void  vj_uncompress_err   (struct vjcompress *comp);
-extern int   vj_uncompress_uncomp(struct pbuf *nb, struct vjcompress *comp);
-extern int   vj_uncompress_tcp   (struct pbuf **nb, struct vjcompress *comp);
-
-#endif /* VJ_H */
-
-#endif /* PPP_SUPPORT && VJ_SUPPORT */
diff --git a/components/lwip/include/lwip/netif/slipif.h b/components/lwip/include/lwip/netif/slipif.h
deleted file mode 100644 (file)
index d164d44..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (c) 2001, Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the Institute nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam@sics.se>
- *
- */
-#ifndef LWIP_HDR_NETIF_SLIPIF_H
-#define LWIP_HDR_NETIF_SLIPIF_H
-
-#include "lwip/opt.h"
-#include "lwip/netif.h"
-
-/** Set this to 1 to start a thread that blocks reading on the serial line
- * (using sio_read()).
- */
-#ifndef SLIP_USE_RX_THREAD
-#define SLIP_USE_RX_THREAD !NO_SYS
-#endif
-
-/** 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 slipif_poll().
- * If disabled, slipif_poll() polls the serial line (using sio_tryread()).
- */
-#ifndef SLIP_RX_FROM_ISR
-#define SLIP_RX_FROM_ISR 0
-#endif
-
-/** 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.
- */
-#ifndef SLIP_RX_QUEUE
-#define SLIP_RX_QUEUE SLIP_RX_FROM_ISR
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-err_t slipif_init(struct netif * netif);
-void slipif_poll(struct netif *netif);
-#if SLIP_RX_FROM_ISR
-void slipif_process_rxqueue(struct netif *netif);
-void slipif_received_byte(struct netif *netif, u8_t data);
-void slipif_received_bytes(struct netif *netif, u8_t *data, u8_t len);
-#endif /* SLIP_RX_FROM_ISR */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LWIP_HDR_NETIF_SLIPIF_H */
-
diff --git a/components/lwip/lwip b/components/lwip/lwip
new file mode 160000 (submodule)
index 0000000..18548d1
--- /dev/null
@@ -0,0 +1 @@
+Subproject commit 18548d1e256f7651fb4da48dbd770556e0eca8ce
diff --git a/components/lwip/netif/FILES b/components/lwip/netif/FILES
deleted file mode 100644 (file)
index 501edac..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-This directory contains generic network interface device drivers that
-do not contain any hardware or architecture specific code. The files
-are:
-
-etharp.c
-          Implements the ARP (Address Resolution Protocol) over
-          Ethernet. The code in this file should be used together with
-          Ethernet device drivers. Note that this module has been
-          largely made Ethernet independent so you should be able to
-          adapt this for other link layers (such as Firewire).
-
-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.
-
-loopif.c
-          A "loopback" network interface driver. It requires configuration
-          through the define LWIP_LOOPIF_MULTITHREADING (see opt.h).
-
-slipif.c
-          A generic implementation of the SLIP (Serial Line IP)
-          protocol. It requires a sio (serial I/O) module to work.
-
-lowpan6.c
-          6LoWPAN implementation
-
-ppp/      Point-to-Point Protocol stack
-          The lwIP PPP support is based from pppd (http://ppp.samba.org) with
-          huge changes to match code size and memory requirements for embedded
-          devices. Please read ppp/PPPD_FOLLOWUP for a detailed explanation.
diff --git a/components/lwip/netif/etharp.c b/components/lwip/netif/etharp.c
deleted file mode 100644 (file)
index 54f7487..0000000
+++ /dev/null
@@ -1,1397 +0,0 @@
-/**
- * @file
- * Address Resolution Protocol module for IP over Ethernet
- *
- * 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.
- *
- * 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 etharp_gratuitous(our_netif) upon address change.
- */
-
-/*
- * Copyright (c) 2001-2003 Swedish Institute of Computer Science.
- * Copyright (c) 2003-2004 Leon Woestenberg <leon.woestenberg@axon.tv>
- * Copyright (c) 2003-2004 Axon Digital Design B.V., The Netherlands.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- */
-
-#include "lwip/opt.h"
-
-#if LWIP_ARP || LWIP_ETHERNET
-
-#include "netif/etharp.h"
-#include "lwip/stats.h"
-#include "lwip/snmp.h"
-#include "lwip/dhcp.h"
-#include "lwip/autoip.h"
-
-#include <string.h>
-
-#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)
-#define ARP_AGE_REREQUEST_USED_BROADCAST (ARP_MAXAGE - 15)
-
-/** the time an ARP entry stays pending after first request,
- *  for ARP_TMR_INTERVAL = 1000, this is
- *  10 seconds.
- *
- *  @internal Keep this number at least 2, otherwise it might
- *  run out instantly if the timeout occurs directly after a request.
- */
-#define ARP_MAXPENDING 5
-
-#define HWTYPE_ETHERNET 1
-
-enum etharp_state {
-  ETHARP_STATE_EMPTY = 0,
-  ETHARP_STATE_PENDING,
-  ETHARP_STATE_STABLE,
-  ETHARP_STATE_STABLE_REREQUESTING_1,
-  ETHARP_STATE_STABLE_REREQUESTING_2
-#if ETHARP_SUPPORT_STATIC_ENTRIES
-  ,ETHARP_STATE_STATIC
-#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
-};
-
-struct etharp_entry {
-#if ARP_QUEUEING
-  /** Pointer to queue of pending outgoing packets on this ARP entry. */
-  struct etharp_q_entry *q;
-#else /* ARP_QUEUEING */
-  /** Pointer to a single pending outgoing packet on this ARP entry. */
-  struct pbuf *q;
-#endif /* ARP_QUEUEING */
-  ip4_addr_t ipaddr;
-  struct netif *netif;
-  struct eth_addr ethaddr;
-  u16_t ctime;
-  u8_t state;
-};
-
-static struct etharp_entry arp_table[ARP_TABLE_SIZE];
-
-#if !LWIP_NETIF_HWADDRHINT
-static u8_t etharp_cached_entry;
-#endif /* !LWIP_NETIF_HWADDRHINT */
-
-/** 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). */
-#define ETHARP_FLAG_TRY_HARD     1
-#define ETHARP_FLAG_FIND_ONLY    2
-#if ETHARP_SUPPORT_STATIC_ENTRIES
-#define ETHARP_FLAG_STATIC_ENTRY 4
-#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);
-#else /* LWIP_NETIF_HWADDRHINT */
-#define ETHARP_SET_HINT(netif, hint)  (etharp_cached_entry = (hint))
-#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"
-#endif
-
-
-static err_t etharp_request_dst(struct netif *netif, const ip4_addr_t *ipaddr, const struct eth_addr* hw_dst_addr);
-
-
-#if ARP_QUEUEING
-/**
- * Free a complete queue of etharp entries
- *
- * @param q a qeueue of etharp_q_entry's to free
- */
-static void
-free_etharp_q(struct etharp_q_entry *q)
-{
-  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;
-    LWIP_ASSERT("r->p != NULL", (r->p != NULL));
-    pbuf_free(r->p);
-    memp_free(MEMP_ARP_QUEUE, r);
-  }
-}
-#else /* ARP_QUEUEING */
-
-/** Compatibility define: free the queued pbuf */
-#define free_etharp_q(q) pbuf_free(q)
-
-#endif /* ARP_QUEUEING */
-
-/** Clean up ARP table entries */
-static void
-etharp_free_entry(int i)
-{
-  /* remove from SNMP ARP index tree */
-  mib2_remove_arp_entry(arp_table[i].netif, &arp_table[i].ipaddr);
-  /* and empty packet queue */
-  if (arp_table[i].q != NULL) {
-    /* remove all queued packets */
-    LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_free_entry: freeing entry %"U16_F", packet queue %p.\n", (u16_t)i, (void *)(arp_table[i].q)));
-    free_etharp_q(arp_table[i].q);
-    arp_table[i].q = NULL;
-  }
-  /* recycle entry for re-use */
-  arp_table[i].state = ETHARP_STATE_EMPTY;
-#ifdef LWIP_DEBUG
-  /* for debugging, clean out the complete entry */
-  arp_table[i].ctime = 0;
-  arp_table[i].netif = NULL;
-  ip4_addr_set_zero(&arp_table[i].ipaddr);
-  arp_table[i].ethaddr = ethzero;
-#endif /* LWIP_DEBUG */
-}
-
-/**
- * Clears expired entries in the ARP table.
- *
- * This function should be called every ARP_TMR_INTERVAL milliseconds (1 second),
- * in order to expire entries in the ARP table.
- */
-void
-etharp_tmr(void)
-{
-  u8_t i;
-
-  LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer\n"));
-  /* remove expired entries from the ARP table */
-  for (i = 0; i < ARP_TABLE_SIZE; ++i) {
-    u8_t state = arp_table[i].state;
-    if (state != ETHARP_STATE_EMPTY
-#if ETHARP_SUPPORT_STATIC_ENTRIES
-      && (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));
-        /* clean up entries that have just been expired */
-        etharp_free_entry(i);
-      } else if (arp_table[i].state == ETHARP_STATE_STABLE_REREQUESTING_1) {
-        /* Don't send more than one request every 2 seconds. */
-        arp_table[i].state = ETHARP_STATE_STABLE_REREQUESTING_2;
-      } else if (arp_table[i].state == ETHARP_STATE_STABLE_REREQUESTING_2) {
-        /* Reset state to stable, so that the next transmitted packet will
-           re-send an ARP request. */
-        arp_table[i].state = ETHARP_STATE_STABLE;
-      } else if (arp_table[i].state == ETHARP_STATE_PENDING) {
-        /* still pending, resend an ARP query */
-        etharp_request(arp_table[i].netif, &arp_table[i].ipaddr);
-      }
-    }
-  }
-}
-
-/**
- * Search the ARP table for a matching or new entry.
- *
- * If an IP address is given, return a pending or stable ARP entry that matches
- * the address. If no match is found, create a new entry with this address set,
- * but in state ETHARP_EMPTY. The caller must check and possibly change the
- * state of the returned entry.
- *
- * If ipaddr is NULL, return a initialized new entry in state ETHARP_EMPTY.
- *
- * In all cases, attempt to create new entries from an empty entry. If no
- * empty entries are available and ETHARP_FLAG_TRY_HARD flag is set, recycle
- * old entries. Heuristic choose the least important entry for recycling.
- *
- * @param ipaddr IP address to find in ARP cache, or to add if not found.
- * @param flags @see definition of ETHARP_FLAG_*
- * @param netif netif related to this address (used for NETIF_HWADDRHINT)
- *
- * @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)
-{
-  s8_t old_pending = ARP_TABLE_SIZE, old_stable = ARP_TABLE_SIZE;
-  s8_t empty = ARP_TABLE_SIZE;
-  u8_t i = 0;
-  /* oldest entry with packets on queue */
-  s8_t old_queue = ARP_TABLE_SIZE;
-  /* its age */
-  u16_t age_queue = 0, age_pending = 0, age_stable = 0;
-
-  LWIP_UNUSED_ARG(netif);
-
-  /**
-   * a) do a search through the cache, remember candidates
-   * b) select candidate entry
-   * c) create new entry
-   */
-
-  /* a) in a single search sweep, do all of this
-   * 1) remember the first empty entry (if any)
-   * 2) remember the oldest stable entry (if any)
-   * 3) remember the oldest pending entry without queued packets (if any)
-   * 4) remember the oldest pending entry with queued packets (if any)
-   * 5) search for a matching IP entry, either pending or stable
-   *    until 5 matches, or all entries are searched for.
-   */
-
-  for (i = 0; i < ARP_TABLE_SIZE; ++i) {
-    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));
-      /* 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);
-      /* 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));
-        /* found exact IP address match, simply bail out */
-        return i;
-      }
-      /* pending entry? */
-      if (state == ETHARP_STATE_PENDING) {
-        /* pending with queued packets? */
-        if (arp_table[i].q != NULL) {
-          if (arp_table[i].ctime >= age_queue) {
-            old_queue = i;
-            age_queue = arp_table[i].ctime;
-          }
-        } else
-        /* pending without queued packets? */
-        {
-          if (arp_table[i].ctime >= age_pending) {
-            old_pending = i;
-            age_pending = arp_table[i].ctime;
-          }
-        }
-      /* 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 */
-        if (state < ETHARP_STATE_STATIC)
-#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
-        {
-          /* remember entry with oldest stable entry in oldest, its age in maxtime */
-          if (arp_table[i].ctime >= age_stable) {
-            old_stable = i;
-            age_stable = arp_table[i].ctime;
-          }
-        }
-      }
-    }
-  }
-  /* { we have no match } => try to create a new entry */
-
-  /* don't create new entry, only search? */
-  if (((flags & ETHARP_FLAG_FIND_ONLY) != 0) ||
-      /* 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;
-  }
-
-  /* b) choose the least destructive entry to recycle:
-   * 1) empty entry
-   * 2) oldest stable entry
-   * 3) oldest pending entry without queued packets
-   * 4) oldest pending entry with queued packets
-   *
-   * { ETHARP_FLAG_TRY_HARD is set at this point }
-   */
-
-  /* 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));
-  } 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));
-      /* 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? */
-    } 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? */
-    } 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)));
-      /* 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;
-    }
-
-    /* { empty or recyclable entry found } */
-    LWIP_ASSERT("i < ARP_TABLE_SIZE", i < ARP_TABLE_SIZE);
-    etharp_free_entry(i);
-  }
-
-  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);
-
-  /* IP address given? */
-  if (ipaddr != NULL) {
-    /* set IP address */
-    ip4_addr_copy(arp_table[i].ipaddr, *ipaddr);
-  }
-  arp_table[i].ctime = 0;
-#if ETHARP_TABLE_MATCH_NETIF
-  arp_table[i].netif = netif;
-#endif /* ETHARP_TABLE_MATCH_NETIF*/
-  return (err_t)i;
-}
-
-/**
- * Send an IP packet on the network using netif->linkoutput
- * The ethernet header is filled in before sending.
- *
- * @params netif the lwIP network interface on which to send the packet
- * @params p the packet to send, p->payload pointing to the (uninitialized) ethernet header
- * @params src the source MAC address to be copied into the ethernet header
- * @params dst the destination MAC address to be copied into the ethernet header
- * @return ERR_OK if the packet was sent, any other err_t on failure
- */
-static err_t ESP_IRAM_ATTR
-etharp_send_ip(struct netif *netif, struct pbuf *p, struct eth_addr *src, const struct eth_addr *dst)
-{
-  struct eth_hdr *ethhdr = (struct eth_hdr *)p->payload;
-#if ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET)
-  struct eth_vlan_hdr *vlanhdr;
-#endif /* ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET) */
-
-  LWIP_ASSERT("netif->hwaddr_len must be the same as ETH_HWADDR_LEN for etharp!",
-              (netif->hwaddr_len == ETH_HWADDR_LEN));
-#if ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET)
-  ethhdr->type = PP_HTONS(ETHTYPE_VLAN);
-  vlanhdr = (struct eth_vlan_hdr*)(((u8_t*)ethhdr) + SIZEOF_ETH_HDR);
-  vlanhdr->prio_vid = 0;
-  vlanhdr->tpid = PP_HTONS(ETHTYPE_IP);
-  if (!LWIP_HOOK_VLAN_SET(netif, ethhdr, vlanhdr)) {
-    /* packet shall not contain VLAN header, so hide it and set correct ethertype */
-    pbuf_header(p, -SIZEOF_VLAN_HDR);
-    ethhdr = (struct eth_hdr *)p->payload;
-#endif /* ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET) */
-    ethhdr->type = PP_HTONS(ETHTYPE_IP);
-#if ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET)
-  }
-#endif /* ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET) */
-  ETHADDR32_COPY(&ethhdr->dest, dst);
-  ETHADDR16_COPY(&ethhdr->src, src);
-  LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_send_ip: sending packet %p\n", (void *)p));
-  /* send the packet */
-  return netif->linkoutput(netif, p);
-}
-
-/**
- * Update (or insert) a IP/MAC address pair in the ARP cache.
- *
- * If a pending entry is resolved, any queued packets will be sent
- * at this point.
- *
- * @param netif netif related to this entry (used for NETIF_ADDRHINT)
- * @param ipaddr IP address of the inserted ARP entry.
- * @param ethaddr Ethernet address of the inserted ARP entry.
- * @param flags @see definition of ETHARP_FLAG_*
- *
- * @return
- * - ERR_OK Successfully updated ARP cache.
- * - ERR_MEM If we could not add a new ARP entry when ETHARP_FLAG_TRY_HARD was set.
- * - ERR_ARG Non-unicast address given, those will not appear in ARP cache.
- *
- * @see pbuf_free()
- */
-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;
-  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),
-    ethaddr->addr[0], ethaddr->addr[1], ethaddr->addr[2],
-    ethaddr->addr[3], ethaddr->addr[4], ethaddr->addr[5]));
-  /* non-unicast address? */
-  if (ip4_addr_isany(ipaddr) ||
-      ip4_addr_isbroadcast(ipaddr, netif) ||
-      ip4_addr_ismulticast(ipaddr)) {
-    LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_update_arp_entry: will not add non-unicast IP address to ARP cache\n"));
-    return ERR_ARG;
-  }
-  /* find or create ARP entry */
-  i = etharp_find_entry(ipaddr, flags, netif);
-  /* bail out if no entry could be found */
-  if (i < 0) {
-    return (err_t)i;
-  }
-
-#if ETHARP_SUPPORT_STATIC_ENTRIES
-  if (flags & ETHARP_FLAG_STATIC_ENTRY) {
-    /* record static type */
-    arp_table[i].state = ETHARP_STATE_STATIC;
-  } else
-#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
-  {
-    /* mark it stable */
-    arp_table[i].state = ETHARP_STATE_STABLE;
-  }
-
-  /* record network interface */
-  arp_table[i].netif = netif;
-  /* 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));
-  /* update address */
-  ETHADDR32_COPY(&arp_table[i].ethaddr, ethaddr);
-  /* reset time stamp */
-  arp_table[i].ctime = 0;
-  /* this is where we will send out queued packets! */
-#if ARP_QUEUEING
-  while (arp_table[i].q != NULL) {
-    struct pbuf *p;
-    /* remember remainder of queue */
-    struct etharp_q_entry *q = arp_table[i].q;
-    /* pop first item off the queue */
-    arp_table[i].q = q->next;
-    /* get the packet pointer */
-    p = q->p;
-    /* now queue entry can be freed */
-    memp_free(MEMP_ARP_QUEUE, q);
-#else /* ARP_QUEUEING */
-  if (arp_table[i].q != NULL) {
-    struct pbuf *p = arp_table[i].q;
-    arp_table[i].q = NULL;
-#endif /* ARP_QUEUEING */
-    /* send the queued IP packet */
-    etharp_send_ip(netif, p, (struct eth_addr*)(netif->hwaddr), ethaddr);
-    /* free the queued IP packet */
-    pbuf_free(p);
-  }
-  return ERR_OK;
-}
-
-#if ETHARP_SUPPORT_STATIC_ENTRIES
-/** Add a new static entry to the ARP table. If an entry exists for the
- * specified IP address, this entry is overwritten.
- * If packets are queued for the specified IP address, they are sent out.
- *
- * @param ipaddr IP address for the new static entry
- * @param ethaddr ethernet address for the new static entry
- * @return @see return values of etharp_add_static_entry
- */
-err_t
-etharp_add_static_entry(const ip4_addr_t *ipaddr, struct eth_addr *ethaddr)
-{
-  struct netif *netif;
-  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),
-    ethaddr->addr[0], ethaddr->addr[1], ethaddr->addr[2],
-    ethaddr->addr[3], ethaddr->addr[4], ethaddr->addr[5]));
-
-  netif = ip4_route(ipaddr);
-  if (netif == NULL) {
-    return ERR_RTE;
-  }
-
-  return etharp_update_arp_entry(netif, ipaddr, ethaddr, ETHARP_FLAG_TRY_HARD | ETHARP_FLAG_STATIC_ENTRY);
-}
-
-/** Remove a static entry from the ARP table previously added with a call to
- * etharp_add_static_entry.
- *
- * @param ipaddr IP address of the static entry to remove
- * @return ERR_OK: entry removed
- *         ERR_MEM: entry wasn't found
- *         ERR_ARG: entry wasn't a static entry but a dynamic one
- */
-err_t
-etharp_remove_static_entry(const ip4_addr_t *ipaddr)
-{
-  s8_t i;
-  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)));
-
-  /* find or create ARP entry */
-  i = etharp_find_entry(ipaddr, ETHARP_FLAG_FIND_ONLY, NULL);
-  /* bail out if no entry could be found */
-  if (i < 0) {
-    return (err_t)i;
-  }
-
-  if (arp_table[i].state != ETHARP_STATE_STATIC) {
-    /* entry wasn't a static entry, cannot remove it */
-    return ERR_ARG;
-  }
-  /* entry found, free it */
-  etharp_free_entry(i);
-  return ERR_OK;
-}
-#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
-
-/**
- * Remove all ARP table entries of the specified netif.
- *
- * @param netif points to a network interface
- */
-void etharp_cleanup_netif(struct netif *netif)
-{
-  u8_t i;
-
-  for (i = 0; i < ARP_TABLE_SIZE; ++i) {
-    u8_t state = arp_table[i].state;
-    if ((state != ETHARP_STATE_EMPTY) && (arp_table[i].netif == netif)) {
-      etharp_free_entry(i);
-    }
-  }
-}
-
-/**
- * Finds (stable) ethernet/IP address pair from ARP table
- * using interface and IP address index.
- * @note the addresses in the ARP table are in network order!
- *
- * @param netif points to interface index
- * @param ipaddr points to the (network order) IP address index
- * @param eth_ret points to return pointer
- * @param ip_ret points to return pointer
- * @return table index if found, -1 otherwise
- */
-s8_t
-etharp_find_addr(struct netif *netif, const ip4_addr_t *ipaddr,
-         struct eth_addr **eth_ret, const ip4_addr_t **ip_ret)
-{
-  s8_t i;
-
-  LWIP_ASSERT("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;
-  }
-  return -1;
-}
-
-/**
- * Possibility to iterate over stable ARP table entries
- *
- * @param i entry number, 0 to ARP_TABLE_SIZE
- * @param ipaddr return value: IP address
- * @param netif return value: points to interface
- * @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)
-{
-  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)) {
-    *ipaddr  = &arp_table[i].ipaddr;
-    *netif   = arp_table[i].netif;
-    *eth_ret = &arp_table[i].ethaddr;
-    return 1;
-  } else {
-    return 0;
-  }
-}
-
-#if ETHARP_TRUST_IP_MAC
-/**
- * Updates the ARP table using the given IP packet.
- *
- * Uses the incoming IP packet's source address to update the
- * ARP cache for the local network. The function does not alter
- * or free the packet. This function must be called before the
- * packet p is passed to the IP layer.
- *
- * @param netif The lwIP network interface on which the IP packet pbuf arrived.
- * @param p The IP packet that arrived on netif.
- *
- * @return NULL
- *
- * @see pbuf_free()
- */
-void etharp_ip_input(struct netif *netif, struct pbuf *p)
-{
-  struct eth_hdr *ethhdr;
-  struct ip_hdr *iphdr;
-  ip4_addr_t iphdr_src;
-  LWIP_ERROR("netif != NULL", (netif != NULL), return;);
-
-  /* Only insert an entry if the source IP address of the
-     incoming IP packet comes from a host on the local network. */
-  ethhdr = (struct eth_hdr *)p->payload;
-  iphdr = (struct ip_hdr *)((u8_t*)ethhdr + SIZEOF_ETH_HDR);
-#if ETHARP_SUPPORT_VLAN
-  if (ethhdr->type == PP_HTONS(ETHTYPE_VLAN)) {
-    iphdr = (struct ip_hdr *)((u8_t*)ethhdr + SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR);
-  }
-#endif /* ETHARP_SUPPORT_VLAN */
-
-  ip4_addr_copy(iphdr_src, iphdr->src);
-
-  /* source is not on the local network? */
-  if (!ip4_addr_netcmp(&iphdr_src, netif_ip4_addr(netif), netif_ip4_netmask(netif))) {
-    /* do nothing */
-    return;
-  }
-
-  LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_ip_input: updating ETHARP table.\n"));
-  /* update the source IP address in the cache, if present */
-  /* @todo We could use ETHARP_FLAG_TRY_HARD if we think we are going to talk
-   * back soon (for example, if the destination IP address is ours. */
-  etharp_update_arp_entry(netif, &iphdr_src, &(ethhdr->src), ETHARP_FLAG_FIND_ONLY);
-}
-#endif /* ETHARP_TRUST_IP_MAC */
-
-/**
- * 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.
- *
- * Should be called for incoming ARP packets. The pbuf in the argument
- * is freed by this function.
- *
- * @param netif The lwIP network interface on which the ARP packet pbuf arrived.
- * @param ethaddr Ethernet address of netif.
- * @param p The ARP packet that arrived on netif. Is freed by this function.
- *
- * @return NULL
- *
- * @see pbuf_free()
- */
-void
-etharp_arp_input(struct netif *netif, struct eth_addr *ethaddr, struct pbuf *p)
-{
-  struct etharp_hdr *hdr;
-  struct eth_hdr *ethhdr;
-  /* these are aligned properly, whereas the ARP header fields might not be */
-  ip4_addr_t sipaddr, dipaddr;
-  u8_t for_us;
-#if LWIP_AUTOIP
-  const u8_t * ethdst_hwaddr;
-#endif /* LWIP_AUTOIP */
-
-  LWIP_ERROR("netif != NULL", (netif != NULL), return;);
-
-  /* drop short ARP packets: we have to check for p->len instead of p->tot_len here
-     since a struct etharp_hdr is pointed to p->payload, so it musn't be chained! */
-  if (p->len < SIZEOF_ETHARP_PACKET) {
-    LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING,
-      ("etharp_arp_input: packet dropped, too short (%"S16_F"/%"S16_F")\n", p->tot_len,
-      (s16_t)SIZEOF_ETHARP_PACKET));
-    ETHARP_STATS_INC(etharp.lenerr);
-    ETHARP_STATS_INC(etharp.drop);
-    pbuf_free(p);
-    return;
-  }
-
-  ethhdr = (struct eth_hdr *)p->payload;
-  hdr = (struct etharp_hdr *)((u8_t*)ethhdr + SIZEOF_ETH_HDR);
-#if ETHARP_SUPPORT_VLAN
-  if (ethhdr->type == PP_HTONS(ETHTYPE_VLAN)) {
-    hdr = (struct etharp_hdr *)(((u8_t*)ethhdr) + SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR);
-  }
-#endif /* ETHARP_SUPPORT_VLAN */
-
-  /* RFC 826 "Packet Reception": */
-  if ((hdr->hwtype != PP_HTONS(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_arp_input: packet dropped, wrong hw type, hwlen, proto, protolen or ethernet type (%"U16_F"/%"U16_F"/%"U16_F"/%"U16_F")\n",
-      hdr->hwtype, hdr->hwlen, hdr->proto, hdr->protolen));
-    ETHARP_STATS_INC(etharp.proterr);
-    ETHARP_STATS_INC(etharp.drop);
-    pbuf_free(p);
-    return;
-  }
-  ETHARP_STATS_INC(etharp.recv);
-
-#if LWIP_AUTOIP
-  /* We have to check if a host already has configured our random
-   * created link local address and continuously check if there is
-   * a host with this IP-address so we can detect collisions */
-  autoip_arp_reply(netif, hdr);
-#endif /* LWIP_AUTOIP */
-
-  /* Copy struct ip4_addr2 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);
-
-  /* this interface is not configured? */
-  if (ip4_addr_isany_val(*netif_ip4_addr(netif))) {
-    for_us = 0;
-  } else {
-    /* ARP packet directed to us? */
-    for_us = (u8_t)ip4_addr_cmp(&dipaddr, netif_ip4_addr(netif));
-  }
-
-  /* ARP message directed to us?
-      -> add IP address in ARP cache; assume requester wants to talk to us,
-         can result in directly sending the queued packets for this host.
-     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);
-
-  /* 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. */
-
-    LWIP_DEBUGF (ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_arp_input: incoming ARP request\n"));
-    /* ARP request for our address? */
-    if (for_us) {
-
-      LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_arp_input: replying to ARP request for our IP address\n"));
-      /* Re-use pbuf to send ARP reply.
-         Since we are re-using an existing pbuf, we can't call etharp_raw since
-         that would allocate a new pbuf. */
-      hdr->opcode = htons(ARP_REPLY);
-
-      IPADDR2_COPY(&hdr->dipaddr, &hdr->sipaddr);
-      IPADDR2_COPY(&hdr->sipaddr, netif_ip4_addr(netif));
-
-      LWIP_ASSERT("netif->hwaddr_len must be the same as ETH_HWADDR_LEN for etharp!",
-                  (netif->hwaddr_len == ETH_HWADDR_LEN));
-#if LWIP_AUTOIP
-      /* 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) */
-      ethdst_hwaddr = ip4_addr_islinklocal(netif_ip4_addr(netif)) ? (const u8_t*)(ethbroadcast.addr) : hdr->shwaddr.addr;
-#endif /* LWIP_AUTOIP */
-
-      ETHADDR16_COPY(&hdr->dhwaddr, &hdr->shwaddr);
-#if LWIP_AUTOIP
-      ETHADDR16_COPY(&ethhdr->dest, ethdst_hwaddr);
-#else  /* LWIP_AUTOIP */
-      ETHADDR16_COPY(&ethhdr->dest, &hdr->shwaddr);
-#endif /* LWIP_AUTOIP */
-      ETHADDR16_COPY(&hdr->shwaddr, ethaddr);
-      ETHADDR16_COPY(&ethhdr->src, ethaddr);
-
-      /* hwtype, hwaddr_len, proto, protolen and the type in the ethernet header
-         are already correct, we tested that before */
-
-      /* return ARP reply */
-      netif->linkoutput(netif, p);
-    /* 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_arp_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_arp_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_arp_input: incoming ARP reply\n"));
-#if (LWIP_DHCP && DHCP_DOES_ARP_CHECK)
-    /* DHCP wants to know about ARP replies from any host with an
-     * IP address also offered to us by the DHCP server. We do not
-     * want to take a duplicate IP address on a single network.
-     * @todo How should we handle redundant (fail-over) interfaces? */
-    dhcp_arp_reply(netif, &sipaddr);
-#endif /* (LWIP_DHCP && DHCP_DOES_ARP_CHECK) */
-    break;
-  default:
-    LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_arp_input: ARP unknown opcode type %"S16_F"\n", htons(hdr->opcode)));
-    ETHARP_STATS_INC(etharp.err);
-    break;
-  }
-  /* free ARP packet */
-  pbuf_free(p);
-}
-
-/** Just a small helper function that sends a pbuf to an ethernet address
- * in the arp_table specified by the index 'arp_idx'.
- */
-static err_t ESP_IRAM_ATTR
-etharp_output_to_arp_index(struct netif *netif, struct pbuf *q, u8_t arp_idx)
-{
-  LWIP_ASSERT("arp_table[arp_idx].state >= ETHARP_STATE_STABLE",
-              arp_table[arp_idx].state >= ETHARP_STATE_STABLE);
-  /* if arp table entry is about to expire: re-request it,
-     but only if its state is ETHARP_STATE_STABLE to prevent flooding the
-     network with ARP requests if this address is used frequently. */
-  if (arp_table[arp_idx].state == ETHARP_STATE_STABLE) {
-    if (arp_table[arp_idx].ctime >= ARP_AGE_REREQUEST_USED_BROADCAST) {
-      /* issue a standard request using broadcast */
-      if (etharp_request(netif, &arp_table[arp_idx].ipaddr) == ERR_OK) {
-        arp_table[arp_idx].state = ETHARP_STATE_STABLE_REREQUESTING_1;
-      }
-    } else if (arp_table[arp_idx].ctime >= ARP_AGE_REREQUEST_USED_UNICAST) {
-      /* issue a unicast request (for 15 seconds) to prevent unnecessary broadcast */
-      if (etharp_request_dst(netif, &arp_table[arp_idx].ipaddr, &arp_table[arp_idx].ethaddr) == ERR_OK) {
-        arp_table[arp_idx].state = ETHARP_STATE_STABLE_REREQUESTING_1;
-      }
-    }
-  }
-
-  return etharp_send_ip(netif, q, (struct eth_addr*)(netif->hwaddr),
-    &arp_table[arp_idx].ethaddr);
-}
-
-/**
- * Resolve and fill-in Ethernet address header for outgoing IP packet.
- *
- * For IP multicast and broadcast, corresponding Ethernet addresses
- * are selected and the packet is transmitted on the link.
- *
- * For unicast addresses, the packet is submitted to etharp_query(). In
- * case the IP address is outside the local network, the IP address of
- * the gateway is used.
- *
- * @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 ipaddr The IP address of the packet destination.
- *
- * @return
- * - ERR_RTE No route to destination (no gateway to external networks),
- * or the return type of either etharp_query() or etharp_send_ip().
- */
-err_t ESP_IRAM_ATTR
-etharp_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr)
-{
-  const struct eth_addr *dest;
-  struct eth_addr mcastaddr;
-  const ip4_addr_t *dst_addr = ipaddr;
-
-  LWIP_ASSERT("netif != NULL", netif != NULL);
-  LWIP_ASSERT("q != NULL", q != NULL);
-  LWIP_ASSERT("ipaddr != NULL", ipaddr != NULL);
-
-  /* make room for Ethernet header - should not fail */
-#if ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET)
-  if (pbuf_header(q, sizeof(struct eth_hdr) + SIZEOF_VLAN_HDR) != 0) {
-#else /* ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET) */
-  if (pbuf_header(q, sizeof(struct eth_hdr)) != 0) {
-#endif /* ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET) */
-    /* bail out */
-    LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,
-      ("etharp_output: could not allocate room for header.\n"));
-    LINK_STATS_INC(link.lenerr);
-    return ERR_BUF;
-  }
-
-  /* Determine on destination hardware address. Broadcasts and multicasts
-   * are special, other IP addresses are looked up in the ARP table. */
-
-  /* broadcast destination IP address? */
-  if (ip4_addr_isbroadcast(ipaddr, netif)) {
-    /* broadcast on Ethernet also */
-    dest = (const struct eth_addr *)&ethbroadcast;
-  /* 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;
-    mcastaddr.addr[1] = LL_IP4_MULTICAST_ADDR_1;
-    mcastaddr.addr[2] = LL_IP4_MULTICAST_ADDR_2;
-    mcastaddr.addr[3] = ip4_addr2(ipaddr) & 0x7f;
-    mcastaddr.addr[4] = ip4_addr3(ipaddr);
-    mcastaddr.addr[5] = ip4_addr4(ipaddr);
-    /* destination Ethernet address is multicast */
-    dest = &mcastaddr;
-  /* unicast destination IP address? */
-  } else {
-    s8_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 = (struct ip_hdr*)((u8_t*)q->payload +
-#if ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET)
-        SIZEOF_VLAN_HDR +
-#endif /* ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET) */
-        sizeof(struct eth_hdr));
-      /* 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
-         router for forwarding". */
-      if (!ip4_addr_islinklocal(&iphdr->src))
-#endif /* LWIP_AUTOIP */
-      {
-#ifdef LWIP_HOOK_ETHARP_GET_GW
-        /* For advanced routing, a single default gateway might not be enough, so get
-           the IP address of the gateway to handle the current destination address. */
-        dst_addr = LWIP_HOOK_ETHARP_GET_GW(netif, ipaddr);
-        if (dst_addr == NULL)
-#endif /* LWIP_HOOK_ETHARP_GET_GW */
-        {
-          /* interface has default gateway? */
-          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 */
-          } else {
-            /* no route to destination error (default gateway missing) */
-            return ERR_RTE;
-          }
-        }
-      }
-    }
-#if LWIP_NETIF_HWADDRHINT
-    if (netif->addr_hint != NULL) {
-      /* per-pcb cached entry was given */
-      u8_t etharp_cached_entry = *(netif->addr_hint);
-      if (etharp_cached_entry < ARP_TABLE_SIZE) {
-#endif /* LWIP_NETIF_HWADDRHINT */
-        if ((arp_table[etharp_cached_entry].state >= ETHARP_STATE_STABLE) &&
-            (ip4_addr_cmp(dst_addr, &arp_table[etharp_cached_entry].ipaddr))) {
-          /* the per-pcb-cached entry is stable and the right one! */
-          ETHARP_STATS_INC(etharp.cachehit);
-          return etharp_output_to_arp_index(netif, q, etharp_cached_entry);
-        }
-#if LWIP_NETIF_HWADDRHINT
-      }
-    }
-#endif /* LWIP_NETIF_HWADDRHINT */
-
-    /* find stable entry: do this here since this is a critical path for
-       throughput and etharp_find_entry() is kind of slow */
-    for (i = 0; i < ARP_TABLE_SIZE; i++) {
-      if ((arp_table[i].state >= ETHARP_STATE_STABLE) &&
-          (ip4_addr_cmp(dst_addr, &arp_table[i].ipaddr))) {
-        /* found an existing, stable entry */
-        ETHARP_SET_HINT(netif, i);
-        return etharp_output_to_arp_index(netif, q, i);
-      }
-    }
-    /* no stable entry found, use the (slower) query function:
-       queue on destination Ethernet address belonging to ipaddr */
-    return etharp_query(netif, dst_addr, q);
-  }
-
-  /* continuation for multicast/broadcast destinations */
-  /* obtain source Ethernet address of the given interface */
-  /* send packet directly on the link */
-  return etharp_send_ip(netif, q, (struct eth_addr*)(netif->hwaddr), dest);
-}
-
-/**
- * Send an ARP request for the given IP address and/or queue a packet.
- *
- * 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.
- *
- * 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.
- *
- * 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.
- *
- * If the IP address was already stable in the cache, and no packet is
- * given, an ARP request is sent out.
- *
- * @param netif The lwIP network interface on which ipaddr
- * must be queried for.
- * @param ipaddr The IP address to be resolved.
- * @param q If non-NULL, a pbuf that must be delivered to the IP address.
- * q is not freed by this function.
- *
- * @note q must only be ONE packet, not a packet queue!
- *
- * @return
- * - ERR_BUF Could not make room for Ethernet header.
- * - ERR_MEM Hardware address unknown, and no more ARP entries available
- *   to query for address or queue the packet.
- * - ERR_MEM Could not queue packet due to memory shortage.
- * - ERR_RTE No route to destination (no gateway to external networks).
- * - ERR_ARG Non-unicast address given, those will not appear in ARP cache.
- *
- */
-err_t
-etharp_query(struct netif *netif, const ip4_addr_t *ipaddr, struct pbuf *q)
-{
-  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 */
-
-  /* non-unicast address? */
-  if (ip4_addr_isbroadcast(ipaddr, netif) ||
-      ip4_addr_ismulticast(ipaddr) ||
-      ip4_addr_isany(ipaddr)) {
-    LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: will not add non-unicast IP address to ARP cache\n"));
-    return ERR_ARG;
-  }
-
-  /* find entry in ARP cache, ask to create entry if queueing packet */
-  i = etharp_find_entry(ipaddr, ETHARP_FLAG_TRY_HARD, netif);
-
-  /* could not find or create entry? */
-  if (i < 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;
-  }
-
-  /* mark a fresh entry as pending (we just sent a request) */
-  if (arp_table[i].state == ETHARP_STATE_EMPTY) {
-    is_new_entry = 1;
-    arp_table[i].state = ETHARP_STATE_PENDING;
-    /* record network interface for re-sending arp request in etharp_tmr */
-    arp_table[i].netif = netif;
-  }
-
-  /* { 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)));
-
-  /* do we have a new entry? or an implicit query request? */
-  if (is_new_entry || (q == NULL)) {
-    /* try to resolve it; send out ARP request */
-    result = etharp_request(netif, ipaddr);
-    if (result != ERR_OK) {
-      /* ARP request couldn't be sent */
-      /* We don't re-send arp request in etharp_tmr, but we still queue packets,
-         since this failure could be temporary, and the next packet calling
-         etharp_query again could lead to sending the queued packets. */
-    }
-    if (q == NULL) {
-      return result;
-    }
-  }
-
-  /* packet given? */
-  LWIP_ASSERT("q != NULL", q != NULL);
-  /* stable entry? */
-  if (arp_table[i].state >= ETHARP_STATE_STABLE) {
-    /* we have a valid IP->Ethernet address mapping */
-    ETHARP_SET_HINT(netif, i);
-    /* send the packet */
-    result = etharp_send_ip(netif, q, srcaddr, &(arp_table[i].ethaddr));
-  /* 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. */
-    p = q;
-    while (p) {
-      LWIP_ASSERT("no packet queues allowed!", (p->len != p->tot_len) || (p->next == 0));
-      if (p->type != PBUF_ROM) {
-        copy_needed = 1;
-        break;
-      }
-      p = p->next;
-    }
-    if (copy_needed) {
-      /* copy the whole packet into new pbufs */
-      p = pbuf_alloc(PBUF_RAW_TX, p->tot_len, PBUF_RAM);
-      if (p != NULL) {
-        if (pbuf_copy(p, q) != ERR_OK) {
-          pbuf_free(p);
-          p = NULL;
-        }
-      }
-    } else {
-      /* referencing the old pbuf is enough */
-      p = q;
-      pbuf_ref(p);
-    }
-    /* packet could be taken over? */
-    if (p != NULL) {
-      /* queue packet ... */
-#if ARP_QUEUEING
-      struct etharp_q_entry *new_entry;
-      /* allocate a new arp queue entry */
-      new_entry = (struct etharp_q_entry *)memp_malloc(MEMP_ARP_QUEUE);
-      if (new_entry != NULL) {
-        unsigned int qlen = 0;
-        new_entry->next = 0;
-        new_entry->p = p;
-        if (arp_table[i].q != NULL) {
-          /* queue was already existent, append the new entry to the end */
-          struct etharp_q_entry *r;
-          r = arp_table[i].q;
-          qlen++;
-          while (r->next != NULL) {
-            r = r->next;
-            qlen++;
-          }
-          r->next = new_entry;
-        } else {
-          /* queue did not exist, first item in queue */
-          arp_table[i].q = new_entry;
-        }
-#if ARP_QUEUE_LEN
-        if (qlen >= ARP_QUEUE_LEN) {
-#if ESP_LWIP_ARP
-          int l;
-          struct etharp_q_entry *r;
-
-          l = qlen - 1;
-          r = arp_table[i].q;
-          while (l--)
-            r = r->next;
-          r->next = NULL;
-
-          pbuf_free(new_entry->p);
-          memp_free(MEMP_ARP_QUEUE, new_entry);
-
-          LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: could not queue the packet %p (queue is full)\n", (void *)q));
-          return ERR_MEM;
-#else
-          struct etharp_q_entry *old;
-          old = arp_table[i].q;
-          arp_table[i].q = arp_table[i].q->next;
-          pbuf_free(old->p);
-          memp_free(MEMP_ARP_QUEUE, old);
-#endif
-        }
-#endif
-        LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: queued packet %p on ARP entry %"S16_F"\n", (void *)q, (s16_t)i));
-        result = ERR_OK;
-      } else {
-        /* the pool MEMP_ARP_QUEUE is empty */
-        pbuf_free(p);
-        LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: could not queue a copy of PBUF_REF packet %p (out of memory)\n", (void *)q));
-        result = ERR_MEM;
-      }
-#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));
-        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));
-#endif /* ARP_QUEUEING */
-    } else {
-      ETHARP_STATS_INC(etharp.memerr);
-      LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: could not queue a copy of PBUF_REF packet %p (out of memory)\n", (void *)q));
-      result = ERR_MEM;
-    }
-  }
-  return result;
-}
-
-/**
- * Send a raw ARP packet (opcode and all addresses can be modified)
- *
- * @param netif the lwip network interface on which to send the ARP packet
- * @param ethsrc_addr the source MAC address for the ethernet header
- * @param ethdst_addr the destination MAC address for the ethernet header
- * @param hwsrc_addr the source MAC address for the ARP protocol header
- * @param ipsrc_addr the source IP address for the ARP protocol header
- * @param hwdst_addr the destination MAC address for the ARP protocol header
- * @param ipdst_addr the destination IP address for the ARP protocol header
- * @param opcode the type of the ARP packet
- * @return ERR_OK if the ARP packet has been sent
- *         ERR_MEM if the ARP packet couldn't be allocated
- *         any other err_t on failure
- */
-#if !LWIP_AUTOIP
-static
-#endif /* LWIP_AUTOIP */
-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,
-           const struct eth_addr *hwdst_addr, const ip4_addr_t *ipdst_addr,
-           const u16_t opcode)
-{
-  struct pbuf *p;
-  err_t result = ERR_OK;
-  struct eth_hdr *ethhdr;
-#if ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET)
-  struct eth_vlan_hdr *vlanhdr;
-#endif /* ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET) */
-  struct etharp_hdr *hdr;
-#if LWIP_AUTOIP
-  const u8_t * ethdst_hwaddr;
-#endif /* LWIP_AUTOIP */
-
-  LWIP_ASSERT("netif != NULL", netif != NULL);
-
-  /* allocate a pbuf for the outgoing ARP request packet */
-  p = pbuf_alloc(PBUF_RAW_TX, SIZEOF_ETHARP_PACKET_TX, PBUF_RAM);
-  /* 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_STATS_INC(etharp.memerr);
-    return ERR_MEM;
-  }
-  LWIP_ASSERT("check that first pbuf can hold struct etharp_hdr",
-              (p->len >= SIZEOF_ETHARP_PACKET_TX));
-
-  ethhdr = (struct eth_hdr *)p->payload;
-#if ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET)
-  vlanhdr = (struct eth_vlan_hdr*)(((u8_t*)ethhdr) + SIZEOF_ETH_HDR);
-  hdr = (struct etharp_hdr *)((u8_t*)ethhdr + SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR);
-#else /* ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET) */
-  hdr = (struct etharp_hdr *)((u8_t*)ethhdr + SIZEOF_ETH_HDR);
-#endif /* ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET) */
-  LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_raw: sending raw ARP packet.\n"));
-  hdr->opcode = htons(opcode);
-
-  LWIP_ASSERT("netif->hwaddr_len must be the same as ETH_HWADDR_LEN for etharp!",
-              (netif->hwaddr_len == ETH_HWADDR_LEN));
-#if LWIP_AUTOIP
-  /* 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) */
-  ethdst_hwaddr = ip4_addr_islinklocal(ipsrc_addr) ? (const u8_t*)(ethbroadcast.addr) : ethdst_addr->addr;
-#endif /* LWIP_AUTOIP */
-  /* 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
-   * structure packing. */
-  IPADDR2_COPY(&hdr->sipaddr, ipsrc_addr);
-  IPADDR2_COPY(&hdr->dipaddr, ipdst_addr);
-
-  hdr->hwtype = PP_HTONS(HWTYPE_ETHERNET);
-  hdr->proto = PP_HTONS(ETHTYPE_IP);
-  /* set hwlen and protolen */
-  hdr->hwlen = ETH_HWADDR_LEN;
-  hdr->protolen = sizeof(ip4_addr_t);
-
-#if ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET)
-  ethhdr->type = PP_HTONS(ETHTYPE_VLAN);
-  vlanhdr->tpid = PP_HTONS(ETHTYPE_ARP);
-  vlanhdr->prio_vid = 0;
-  if (!LWIP_HOOK_VLAN_SET(netif, ethhdr, vlanhdr)) {
-    /* packet shall not contain VLAN header, so hide it and set correct ethertype */
-    pbuf_header(p, -SIZEOF_VLAN_HDR);
-    ethhdr = (struct eth_hdr *)p->payload;
-#endif /* ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET) */
-    ethhdr->type = PP_HTONS(ETHTYPE_ARP);
-#if ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET)
-  }
-#endif /* ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET) */
-
-  /* Write the Ethernet MAC-Addresses */
-#if LWIP_AUTOIP
-  ETHADDR16_COPY(&ethhdr->dest, ethdst_hwaddr);
-#else  /* LWIP_AUTOIP */
-  ETHADDR16_COPY(&ethhdr->dest, ethdst_addr);
-#endif /* LWIP_AUTOIP */
-  ETHADDR16_COPY(&ethhdr->src, ethsrc_addr);
-
-  /* send ARP query */
-  result = netif->linkoutput(netif, p);
-  ETHARP_STATS_INC(etharp.xmit);
-  /* free ARP query packet */
-  pbuf_free(p);
-  p = NULL;
-  /* could not allocate pbuf for ARP request */
-
-  return result;
-}
-
-/**
- * Send an ARP request packet asking for ipaddr to a specific eth address.
- * Used to send unicast request to refresh the ARP table just before an entry
- * times out
- *
- * @param netif the lwip network interface on which to send the request
- * @param ipaddr the IP address for which to ask
- * @param hw_dst_addr the ethernet address to send this packet to
- * @return ERR_OK if the request has been sent
- *         ERR_MEM if the ARP packet couldn't be allocated
- *         any other err_t on failure
- */
-static err_t
-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,
-                    ipaddr, ARP_REQUEST);
-}
-
-/**
- * Send an ARP request packet asking for ipaddr.
- *
- * @param netif the lwip network interface on which to send the request
- * @param ipaddr the IP address for which to ask
- * @return ERR_OK if the request has been sent
- *         ERR_MEM if the ARP packet couldn't be allocated
- *         any other err_t on failure
- */
-err_t
-etharp_request(struct netif *netif, const ip4_addr_t *ipaddr)
-{
-  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 */
diff --git a/components/lwip/netif/ethernet.c b/components/lwip/netif/ethernet.c
deleted file mode 100644 (file)
index 340ce0a..0000000
+++ /dev/null
@@ -1,228 +0,0 @@
-/**
- * @file
- * Ethernet common functions
- */
-
-/*
- * Copyright (c) 2001-2003 Swedish Institute of Computer Science.
- * Copyright (c) 2003-2004 Leon Woestenberg <leon.woestenberg@axon.tv>
- * Copyright (c) 2003-2004 Axon Digital Design B.V., The Netherlands.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- */
-
-#include "lwip/opt.h"
-
-#if LWIP_ARP || LWIP_ETHERNET
-
-#include "netif/ethernet.h"
-#include "lwip/def.h"
-#include "lwip/stats.h"
-#include "netif/etharp.h"
-#include "lwip/ip.h"
-#include "lwip/snmp.h"
-
-#include <string.h>
-
-#if PPPOE_SUPPORT
-#include "netif/ppp/pppoe.h"
-#endif /* PPPOE_SUPPORT */
-
-const struct eth_addr ethbroadcast = {{0xff,0xff,0xff,0xff,0xff,0xff}};
-const struct eth_addr ethzero = {{0,0,0,0,0,0}};
-
-/**
- * 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.
- *
- * @param p the received packet, p->payload pointing to the ethernet header
- * @param netif the network interface on which the packet was received
- */
-err_t ESP_IRAM_ATTR
-ethernet_input(struct pbuf *p, struct netif *netif)
-{
-  struct eth_hdr* ethhdr;
-  u16_t type;
-#if LWIP_ARP || ETHARP_SUPPORT_VLAN || LWIP_IPV6
-  s16_t ip_hdr_offset = SIZEOF_ETH_HDR;
-#endif /* LWIP_ARP || ETHARP_SUPPORT_VLAN */
-
-#if ESP_PERF
-  if (p->len > DBG_PERF_FILTER_LEN) {
-    DBG_PERF_PATH_SET(DBG_PERF_DIR_RX, DBG_PERF_POINT_LWIP_IN);
-  }
-#endif
-
-  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);
-    ETHARP_STATS_INC(etharp.drop);
-    MIB2_STATS_NETIF_INC(netif, ifinerrors);
-    goto free_and_return;
-  }
-
-  /* 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],
-     (unsigned)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);
-    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);
-      ETHARP_STATS_INC(etharp.drop);
-      MIB2_STATS_NETIF_INC(netif, ifinerrors);
-      goto free_and_return;
-    }
-#if defined(LWIP_HOOK_VLAN_CHECK) || defined(ETHARP_VLAN_CHECK) || defined(ETHARP_VLAN_CHECK_FN) /* if not, allow all VLANs */
-#ifdef LWIP_HOOK_VLAN_CHECK
-    if (!LWIP_HOOK_VLAN_CHECK(netif, ethhdr, vlan)) {
-#elif defined(ETHARP_VLAN_CHECK_FN)
-    if (!ETHARP_VLAN_CHECK_FN(ethhdr, vlan)) {
-#elif defined(ETHARP_VLAN_CHECK)
-    if (VLAN_ID(vlan) != ETHARP_VLAN_CHECK) {
-#endif
-      /* silently ignore this packet: not for our VLAN */
-      pbuf_free(p);
-      return ERR_OK;
-    }
-#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 */
-
-#if LWIP_ARP_FILTER_NETIF
-  netif = LWIP_ARP_FILTER_NETIF_FN(p, netif, htons(type));
-#endif /* LWIP_ARP_FILTER_NETIF*/
-
-  if (ethhdr->dest.addr[0] & 1) {
-    /* this might be a multicast or broadcast packet */
-    if (ethhdr->dest.addr[0] == LL_IP4_MULTICAST_ADDR_0) {
-#if LWIP_IPV4
-      if ((ethhdr->dest.addr[1] == LL_IP4_MULTICAST_ADDR_1) &&
-          (ethhdr->dest.addr[2] == LL_IP4_MULTICAST_ADDR_2)) {
-        /* mark the pbuf as link-layer multicast */
-        p->flags |= PBUF_FLAG_LLMCAST;
-      }
-#endif /* LWIP_IPV4 */
-    }
-#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;
-    }
-#endif /* LWIP_IPV6 */
-    else if (eth_addr_cmp(&ethhdr->dest, &ethbroadcast)) {
-      /* mark the pbuf as link-layer broadcast */
-      p->flags |= PBUF_FLAG_LLBCAST;
-    }
-  }
-
-  switch (type) {
-#if LWIP_IPV4 && LWIP_ARP
-    /* IP packet? */
-    case PP_HTONS(ETHTYPE_IP):
-      if (!(netif->flags & NETIF_FLAG_ETHARP)) {
-        goto free_and_return;
-      }
-#if ETHARP_TRUST_IP_MAC
-      /* update ARP table */
-      etharp_ip_input(netif, p);
-#endif /* ETHARP_TRUST_IP_MAC */
-      /* skip Ethernet header */
-      if ((p->len < ip_hdr_offset) || pbuf_header(p, (s16_t)-ip_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));
-        LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("Can't move over header in packet"));
-        goto free_and_return;
-      } else {
-        /* pass to IP layer */
-        ip4_input(p, netif);
-      }
-      break;
-
-    case PP_HTONS(ETHTYPE_ARP):
-      if (!(netif->flags & NETIF_FLAG_ETHARP)) {
-        goto free_and_return;
-      }
-      /* pass p to ARP module */
-      etharp_arp_input(netif, (struct eth_addr*)(netif->hwaddr), p);
-      break;
-#endif /* LWIP_IPV4 && LWIP_ARP */
-#if PPPOE_SUPPORT
-    case PP_HTONS(ETHTYPE_PPPOEDISC): /* PPP Over Ethernet Discovery Stage */
-      pppoe_disc_input(netif, p);
-      break;
-
-    case PP_HTONS(ETHTYPE_PPPOE): /* PPP Over Ethernet Session Stage */
-      pppoe_data_input(netif, p);
-      break;
-#endif /* PPPOE_SUPPORT */
-
-#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)) {
-        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));
-        goto free_and_return;
-      } else {
-        /* pass to IPv6 layer */
-        ip6_input(p, netif);
-      }
-      break;
-#endif /* LWIP_IPV6 */
-
-    default:
-      ETHARP_STATS_INC(etharp.proterr);
-      ETHARP_STATS_INC(etharp.drop);
-      MIB2_STATS_NETIF_INC(netif, ifinunknownprotos);
-      goto free_and_return;
-  }
-
-  /* This means the pbuf is freed or consumed,
-     so the caller doesn't have to free it again */
-  return ERR_OK;
-
-free_and_return:
-  pbuf_free(p);
-  return ERR_OK;
-}
-#endif /* LWIP_ARP || LWIP_ETHERNET */
diff --git a/components/lwip/netif/ethernetif.c b/components/lwip/netif/ethernetif.c
deleted file mode 100644 (file)
index b424838..0000000
+++ /dev/null
@@ -1,339 +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 "netif/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_IGMP
-       netif->flags |= NETIF_FLAG_IGMP;
-#endif
-  
-#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, MLD6_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();
-
-#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();
-
-#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);
-  }
-
-  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);
-  /* no packet could be read, silently ignore this */
-  if (p == NULL) return;
-  /* points to packet payload, which starts with an Ethernet header */
-  ethhdr = p->payload;
-
-  switch (htons(ethhdr->type)) {
-  /* IP or ARP packet? */
-  case ETHTYPE_IP:
-  case ETHTYPE_IPV6:
-  case ETHTYPE_ARP:
-#if PPPOE_SUPPORT
-  /* PPPoE packet? */
-  case ETHTYPE_PPPOEDISC:
-  case ETHTYPE_PPPOE:
-#endif /* PPPOE_SUPPORT */
-    /* full packet send to tcpip_thread to process */
-    if (netif->input(p, netif)!=ERR_OK)
-     { LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
-       pbuf_free(p);
-       p = NULL;
-     }
-    break;
-
-  default:
-    pbuf_free(p);
-    p = NULL;
-    break;
-  }
-}
-
-/**
- * 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/components/lwip/netif/lowpan6.c b/components/lwip/netif/lowpan6.c
deleted file mode 100644 (file)
index 15d1027..0000000
+++ /dev/null
@@ -1,1196 +0,0 @@
-/**
-  * @file
- *
- * 6LowPAN output 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>
- */
-
-#include "netif/lowpan6.h"
-
-#if LWIP_IPV6 && LWIP_6LOWPAN
-
-#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>
-
-struct ieee_802154_addr {
-  u8_t addr_len;
-  u8_t addr[8];
-};
-
-/** This is a helper struct.
- */
-struct lowpan6_reass_helper {
-  struct pbuf *pbuf;
-  struct lowpan6_reass_helper *next_packet;
-  u8_t timer;
-  struct ieee_802154_addr sender_addr;
-  u16_t datagram_size;
-  u16_t datagram_tag;
-};
-
-static struct lowpan6_reass_helper * reass_list;
-
-#if LWIP_6LOWPAN_NUM_CONTEXTS > 0
-static ip6_addr_t lowpan6_context[LWIP_6LOWPAN_NUM_CONTEXTS];
-#endif
-
-static u16_t ieee_802154_pan_id;
-
-static const struct ieee_802154_addr ieee_802154_broadcast = {2, {0xff, 0xff}};
-
-#if LWIP_6LOWPAN_INFER_SHORT_ADDRESS
-static struct ieee_802154_addr short_mac_addr = {2, {0,0}};
-#endif /* LWIP_6LOWPAN_INFER_SHORT_ADDRESS */
-
-static err_t dequeue_datagram(struct lowpan6_reass_helper *lrh);
-
-/**
- * Periodic timer for 6LowPAN functions:
- *
- * - Remove incomplete/old packets
- */
-void
-lowpan6_tmr(void)
-{
-  struct lowpan6_reass_helper *lrh, *lrh_temp;
-
-  lrh = reass_list;
-  while (lrh != NULL) {
-    lrh_temp = lrh->next_packet;
-    if ((--lrh->timer) == 0) {
-      dequeue_datagram(lrh);
-      pbuf_free(lrh->pbuf);
-      mem_free(lrh);
-    }
-    lrh = lrh_temp;
-  }
-}
-
-/**
- * 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)) == ntohl((mac_addr->addr[0] << 8) | mac_addr->addr[1])) {
-        return 3;
-      }
-    }
-  } else if (mac_addr->addr_len == 8) {
-    if ((ip6addr->addr[2] == ntohl(((mac_addr->addr[0] ^ 2) << 24) | (mac_addr->addr[1] << 16) | mac_addr->addr[2] << 8 | mac_addr->addr[3])) &&
-      (ip6addr->addr[3] == 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)
-{
-  struct pbuf * p_frag;
-  u16_t frag_len, remaining_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;
-  u16_t datagram_offset;
-  err_t err = ERR_IF;
-
-  /* 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;
-  }
-
-  /* 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];
-  }
-
-#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);
-    }
-  }
-
-#else /* LWIP_6LOWPAN_HC */
-  /* Send uncompressed IPv6 header with appropriate dispatch byte. */
-  lowpan6_header_len = 1;
-  buffer[ieee_header_len] = 0x41; /* IPv6 dispatch */
-#endif /* LWIP_6LOWPAN_HC */
-
-  /* Calculate remaining packet length */
-  remaining_len = p->tot_len;
-
-  if (remaining_len > 0x7FF) {
-    MIB2_STATS_NETIF_INC(netif, ifoutdiscards);
-    /* datagram_size must fit into 11 bit */
-    pbuf_free(p_frag);
-    return ERR_VAL;
-  }
-
-  /* Fragment, or 1 packet? */
-  if (remaining_len > (127 - ieee_header_len - lowpan6_header_len - 3)) { /* 127 - header - 1 byte dispatch - 2 bytes CRC */
-    /* 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];
-    }
-
-    /* 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;
-
-    datagram_tag++;
-    buffer[ieee_header_len + 2] = datagram_tag & 0xff;
-    buffer[ieee_header_len + 3] = (datagram_tag >> 8) & 0xff;
-
-    /* Fragment follows. */
-    frag_len = (127 - ieee_header_len - 4 - 2) & 0xf8;
-
-    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 */
-
-    /* Calculate frame length */
-    p_frag->len = p_frag->tot_len = ieee_header_len + 4 + frag_len + 2; /* add 2 dummy bytes for crc*/
-
-    /* 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));
-    err = netif->linkoutput(netif, p_frag);
-
-    while ((remaining_len > 0) && (err == ERR_OK)) {
-      /* new frame, new seq num for ACK */
-      buffer[2] = frame_seq_num++;
-
-      buffer[ieee_header_len] |= 0x20; /* Change FRAG1 to FRAGN */
-
-      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;
-      if (frag_len > remaining_len) {
-        frag_len = remaining_len;
-      }
-
-      pbuf_copy_partial(p, buffer + ieee_header_len + 5, frag_len, p->tot_len - remaining_len);
-      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;
-
-      /* 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));
-      err = netif->linkoutput(netif, p_frag);
-    }
-  } else {
-    /* It fits in one frame. */
-    frag_len = remaining_len;
-
-    /* Copy IPv6 packet */
-    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;
-
-    /* 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));
-    err = netif->linkoutput(netif, p_frag);
-  }
-
-  pbuf_free(p_frag);
-
-  return err;
-}
-
-err_t
-lowpan6_set_context(u8_t idx, const ip6_addr_t * context)
-{
-  if (idx >= LWIP_6LOWPAN_NUM_CONTEXTS) {
-    return ERR_ARG;
-  }
-
-  ip6_addr_set(&lowpan6_context[idx], context);
-
-  return ERR_OK;
-}
-
-#if LWIP_6LOWPAN_INFER_SHORT_ADDRESS
-err_t
-lowpan6_set_short_addr(u8_t addr_high, u8_t addr_low)
-{
-  short_mac_addr.addr[0] = addr_high;
-  short_mac_addr.addr[1] = addr_low;
-
-  return ERR_OK;
-}
-#endif /* LWIP_6LOWPAN_INFER_SHORT_ADDRESS */
-
-#if LWIP_IPV4
-err_t
-lowpan4_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr)
-{
-  (void)netif;
-  (void)q;
-  (void)ipaddr;
-
-  return ERR_IF;
-}
-#endif /* LWIP_IPV4 */
-
-/**
- * Resolve and fill-in IEEE 802.15.4 address header for outgoing IPv6 packet.
- *
- * Perform Header Compression and fragment if necessary.
- *
- * @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
- */
-err_t
-lowpan6_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr)
-{
-  s8_t i;
-  struct ieee_802154_addr src, dest;
-#if LWIP_6LOWPAN_INFER_SHORT_ADDRESS
-  ip6_addr_t ip6_src;
-  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);
-  if (lowpan6_get_address_mode(&ip6_src, &short_mac_addr) == 3) {
-    src.addr_len = 2;
-    src.addr[0] = short_mac_addr.addr[0];
-    src.addr[1] = short_mac_addr.addr[1];
-  } else
-#endif /* LWIP_6LOWPAN_INFER_SHORT_ADDRESS */
-  {
-    src.addr_len = netif->hwaddr_len;
-    SMEMCPY(src.addr, netif->hwaddr, netif->hwaddr_len);
-  }
-
-  /* multicast destination IP address? */
-  if (ip6_addr_ismulticast(ip6addr)) {
-    MIB2_STATS_NETIF_INC(netif, ifoutnucastpkts);
-    /* We need to send to the broadcast address.*/
-    return lowpan6_frag(netif, q, &src, &ieee_802154_broadcast);
-  }
-
-  /* We have a unicast destination IP address */
-  /* TODO anycast? */
-
-#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. */
-    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)) &&
-        (lowpan6_get_address_mode(ip6addr, &dest) == 3)) {
-      MIB2_STATS_NETIF_INC(netif, ifoutucastpkts);
-      return lowpan6_frag(netif, q, &src, &dest);
-    }
-  }
-#endif /* LWIP_6LOWPAN_INFER_SHORT_ADDRESS */
-
-
-  /* Get next hop record. */
-  i = nd6_get_next_hop_entry(ip6addr, netif);
-  if (i < 0) {
-    MIB2_STATS_NETIF_INC(netif, ifoutdiscards);
-    /* failed to get a next hop neighbor record. */
-    return ERR_MEM;
-  }
-
-  /* Now that we have a destination record, send or queue the packet. */
-  if (neighbor_cache[i].state == ND6_STALE) {
-    /* Switch to delay state. */
-    neighbor_cache[i].state = ND6_DELAY;
-    neighbor_cache[i].counter.delay_time = LWIP_ND6_DELAY_FIRST_PROBE_TIME;
-  }
-  /* TODO should we send or queue if PROBE? send for now, to let unicast NS pass. */
-  if ((neighbor_cache[i].state == ND6_REACHABLE) ||
-      (neighbor_cache[i].state == ND6_DELAY) ||
-      (neighbor_cache[i].state == ND6_PROBE)) {
-
-    /* Send out. */
-    dest.addr_len = netif->hwaddr_len;
-    SMEMCPY(dest.addr, neighbor_cache[i].lladdr, netif->hwaddr_len);
-    MIB2_STATS_NETIF_INC(netif, ifoutucastpkts);
-    return lowpan6_frag(netif, q, &src, &dest);
-  }
-
-  /* We should queue packet on this interface. */
-  return nd6_queue_packet(i, q);
-}
-
-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(&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(&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] = 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] = htonl(0xfe000000UL | (src->addr[0] << 8) | src->addr[1]);
-      } else {
-        ip6hdr->src.addr[2] = htonl(((src->addr[0] ^ 2) << 24) | (src->addr[1] << 16) |
-                                    (src->addr[2] << 8) | src->addr[3]);
-        ip6hdr->src.addr[3] = 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(&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] = 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] = htonl(0xfe000000UL | (src->addr[0] << 8) | src->addr[1]);
-      } else {
-        ip6hdr->src.addr[2] = htonl(((src->addr[0] ^ 2) << 24) | (src->addr[1] << 16) | (src->addr[2] << 8) | src->addr[3]);
-        ip6hdr->src.addr[3] = 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(&ip6hdr->dest.addr[0], lowpan6_buffer + lowpan6_offset, 16);
-      lowpan6_offset += 16;
-    } else if ((lowpan6_buffer[1] & 0x03) == 0x01) {
-      ip6hdr->dest.addr[0] = htonl(0xff000000UL | (lowpan6_buffer[lowpan6_offset++] << 16));
-      ip6hdr->dest.addr[1] = 0;
-      ip6hdr->dest.addr[2] = htonl(lowpan6_buffer[lowpan6_offset++]);
-      ip6hdr->dest.addr[3] = 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] = htonl(0xff000000UL | lowpan6_buffer[lowpan6_offset++]);
-      ip6hdr->dest.addr[1] = 0;
-      ip6hdr->dest.addr[2] = 0;
-      ip6hdr->dest.addr[3] = 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] = 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(&ip6hdr->dest.addr[0], lowpan6_buffer + lowpan6_offset, 16);
-      lowpan6_offset += 16;
-    } else if ((lowpan6_buffer[1] & 0x03) == 0x01) {
-      MEMCPY(&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] = 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] = htonl(0xfe000000UL | (dest->addr[0] << 8) | dest->addr[1]);
-      } else {
-        ip6hdr->dest.addr[2] = htonl(((dest->addr[0] ^ 2) << 24) | (dest->addr[1] << 16) | dest->addr[2] << 8 | dest->addr[3]);
-        ip6hdr->dest.addr[3] = 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 = htons(lowpan6_buffer[lowpan6_offset] << 8 | lowpan6_buffer[lowpan6_offset + 1]);
-        udphdr->dest = htons(lowpan6_buffer[lowpan6_offset + 2] << 8 | lowpan6_buffer[lowpan6_offset + 3]);
-        lowpan6_offset += 4;
-      } else if (i == 0x01) {
-        udphdr->src = htons(lowpan6_buffer[lowpan6_offset] << 8 | lowpan6_buffer[lowpan6_offset + 1]);
-        udphdr->dest = htons(0xf000 | lowpan6_buffer[lowpan6_offset + 2]);
-        lowpan6_offset += 3;
-      } else if (i == 0x02) {
-        udphdr->src = htons(0xf000 | lowpan6_buffer[lowpan6_offset]);
-        udphdr->dest = htons(lowpan6_buffer[lowpan6_offset + 1] << 8 | lowpan6_buffer[lowpan6_offset + 2]);
-        lowpan6_offset += 3;
-      } else if (i == 0x03) {
-        udphdr->src = htons(0xf0b0 | ((lowpan6_buffer[lowpan6_offset] >> 4) & 0x0f));
-        udphdr->dest = htons(0xf0b0 | (lowpan6_buffer[lowpan6_offset] & 0x0f));
-        lowpan6_offset += 1;
-      }
-
-      udphdr->chksum = htons(lowpan6_buffer[lowpan6_offset] << 8 | lowpan6_buffer[lowpan6_offset + 1]);
-      lowpan6_offset += 2;
-      udphdr->len = 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;
-}
-
-err_t
-lowpan6_input(struct pbuf * p, struct netif *netif)
-{
-  u8_t * puc;
-  s8_t i;
-  struct ieee_802154_addr src, dest;
-  u16_t datagram_size, datagram_offset, datagram_tag;
-  struct lowpan6_reass_helper *lrh, *lrh_temp;
-
-  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;
-  }
-
-  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;
-  }
-
-  pbuf_header(p, -datagram_offset); /* hide IEEE802.15.4 header. */
-
-  /* Check dispatch. */
-  puc = (u8_t*)p->payload;
-
-  if ((*puc & 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;
-    while (lrh != NULL) {
-      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;
-        } 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;
-        }
-      } else {
-        /* Check next datagram in queue. */
-        lrh = lrh->next_packet;
-      }
-    }
-
-    pbuf_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;
-    }
-
-    lrh->sender_addr.addr_len = src.addr_len;
-    for (i = 0; i < src.addr_len; i++) {
-      lrh->sender_addr.addr[i] = src.addr[i];
-    }
-    lrh->datagram_size = datagram_size;
-    lrh->datagram_tag = datagram_tag;
-    lrh->pbuf = p;
-    lrh->next_packet = reass_list;
-    lrh->timer = 2;
-    reass_list = lrh;
-
-    return ERR_OK;
-  } else if ((*puc & 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 */
-
-    for (lrh = reass_list; lrh != NULL; 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) &&
-          (datagram_size == lrh->datagram_size)) {
-        break;
-      }
-    }
-    if (lrh == NULL) {
-      /* rogue fragment */
-      MIB2_STATS_NETIF_INC(netif, ifindiscards);
-      pbuf_free(p);
-      return ERR_OK;
-    }
-
-    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;
-    }
-    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);
-    } else {
-      return ERR_OK;
-    }
-  }
-
-  if (p == NULL) {
-    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;
-  }
-
-  /* @todo: distinguish unicast/multicast */
-  MIB2_STATS_NETIF_INC(netif, ifinucastpkts);
-
-  return ip6_input(p, netif);
-}
-
-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);
-
-  /* maximum transfer unit */
-  netif->mtu = 1280;
-
-  /* broadcast capability */
-  netif->flags = NETIF_FLAG_BROADCAST /* | NETIF_FLAG_LOWPAN6 */;
-
-  return ERR_OK;
-}
-
-err_t
-lowpan6_set_pan_id(u16_t pan_id)
-{
-  ieee_802154_pan_id = pan_id;
-
-  return ERR_OK;
-}
-
-/**
- * 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
- */
-err_t
-tcpip_6lowpan_input(struct pbuf *p, struct netif *inp)
-{
-  return tcpip_inpkt(p, inp, lowpan6_input);
-}
-
-#endif /* LWIP_IPV6 && LWIP_6LOWPAN */
diff --git a/components/lwip/netif/ppp/PPPD_FOLLOWUP b/components/lwip/netif/ppp/PPPD_FOLLOWUP
deleted file mode 100644 (file)
index 4a82915..0000000
+++ /dev/null
@@ -1,382 +0,0 @@
-The lwIP PPP support is based from pppd 2.4.5 (http://ppp.samba.org) with
-huge changes to match code size and memory requirements for embedded devices.
-
-Anyway, pppd has a mature codebase for years and the average commit count
-is getting low on their Git repositories, meaning that we can follow what
-is happening on their side and merge what is relevant for lwIP.
-
-So, here is the pppd follow up, so that we don't get away too far from pppd.
-
-
-== Patch fetched from from pppd Debian packages ==
-
-This has nothing to do with pppd, but we merged some good patch from
-Debian and this is a good place to be.
-
-- LCP adaptive echo, so that we don't send LCP echo request if we
-  are receiving data from peer, can be enabled by setting PPP_LCP_ADAPTIVE
-  to true.
-- IPCP no/replace default route option, were added in the early stage of
-  the ppp port, but it wasn't really helpful and was disabled when adding
-  the new API ppp_set_default() call, which gives the lwIP user control over
-  which one is the default interface, it was actually a requirement if you
-  are doing PPP over PPP (i.e. PPPoL2TP, VPN link, over PPPoE, ADSL link).
-
-- using rp-pppoe pppd exits with EXIT_OK after receiving a timeout waiting
-  for PADO due to no modem attached, bug reported to pppd bug tracker, fixed
-  in Debian but not in the latest (at the time when the port were started)
-  pppd release.
-
-
-== Commits on pppd ==
-
-2010-03-06 - Document +ipv6 and ipv6cp-accept-local
-  e7537958aee79b3f653c601e903cb31d78fb7dcc
-
-Don't care.
-
-
-2010-03-06 - Install pppol2tp plugins with sane permissions
-  406215672cfadc03017341fe03802d1c7294b903
-
-Don't care.
-
-
-2010-03-07 - pppd: Terminate correctly if lcp_lowerup delayed calling
-             fsm_lowerup
-  3eb9e810cfa515543655659b72dde30c54fea0a5
-
-Merged 2012-05-17.
-
-
-2010-03-07 - rp_pppoe: Copy acName and pppd_pppoe_service after option parsing
-  cab58617fd9d328029fffabc788020264b4fa91f
-
-Don't care, is a patch for pppd/plugins/rp-pppoe/plugin.c which is not part
-of the port.
-
-
-2010-08-23 - set and reset options to control environment variables
-             for scripts.
-  2b6310fd24dba8e0fca8999916a162f0a1842a84
-
-We can't fork processes in embedded, therefore all the pppd process run
-feature is disabled in the port, so we don't care about the new
-"environment variables" pppd feature.
-
-
-2010-08-23 - Nit: use _exit when exec fails and restrict values to 0-255
-             per POSIX.
-  2b4ea140432eeba5a007c0d4e6236bd0e0c12ba4
-
-Again, we are not running as a heavy process, so all exit() or _exit() calls
-were removed.
-
-
-2010-08-23 - Fix quote handling in configuration files to be more like shell
-             quoting.
-  3089132cdf5b58dbdfc2daf08ec5c08eb47f8aca
-
-We are not parsing config file, all the filesystem I/O stuff were disabled
-in our port.
-
-
-2010-08-24 - rp-pppoe: allow MTU to be increased up to 1500
-  fd1dcdf758418f040da3ed801ab001b5e46854e7
-
-Only concern changes on RP-PPPoE plugin, which we don't use.
-
-
-2010-09-11 - chat: Allow TIMEOUT value to come from environment variable
-  ae80bf833e48a6202f44a935a68083ae52ad3824
-
-See 2b6310fd24dba8e0fca8999916a162f0a1842a84.
-
-
-2011-03-05 - pppdump: Fix printfs with insufficient arguments
-  7b8db569642c83ba3283745034f2e2c95e459423
-
-pppdump is a ppp tool outside pppd source tree.
-
-
-2012-05-06 - pppd: Don't unconditionally disable VJ compression under Linux
-  d8a66adf98a0e525cf38031b42098d539da6eeb6
-
-Patch for sys-linux.c, which we don't use.
-
-
-2012-05-20 - Remove old version of Linux if_pppol2tp.h
-  c41092dd4c49267f232f6cba3d31c6c68bfdf68d
-
-Not in the port.
-
-
-2012-05-20 - pppd: Make MSCHAP-v2 cope better with packet loss
-  08ef47ca532294eb428238c831616748940e24a2
-
-This is an interesting patch. However it consumes much more memory for
-MSCHAP and I am not sure if the benefit worth it. The PPP client can
-always start the authentication again if it failed for whatever reason.
-
-
-2012-05-20 - scripts: Make poff ignore extra arguments to pppd
-  18f515f32c9f5723a9c2c912601e04335106534b
-
-Again, we are not running scripts.
-
-
-2012-05-20 - rp-pppoe plugin: Print leading zeros in MAC address
-  f5dda0cfc220c4b52e26144096d729e27b30f0f7
-
-Again, we are not using the RP-PPPoE plugin.
-
-
-2012-05-20 - pppd: Notify IPv6 up/down as we do for IPv4
-  845cda8fa18939cf56e60b073f63a7efa65336fc
-
-This is just a patch that adds plugins hooks for IPv6, the plugin interface
-was disabled because we don't have .so plugins in embedded.
-
-
-2012-05-20 - pppd: Enable IPV6 by default and fix some warnings
-  0b6118239615e98959f7e0b4e746bdd197533248
-
-Change on Makefile for IPv6, warnings were already cleared during port.
-
-
-2012-05-20 - contrib: Fix pppgetpass.gtk compilation
-  80a8e2ce257ca12cce723519a0f20ea1d663b14a
-
-Change on Makefile, don't care.
-
-
-2012-05-20 - pppd: Don't crash if crypt() returns NULL
-  04c4348108d847e034dd91066cc6843f60d71731
-
-We are using the PolarSSL DES implementation that does not return NULL.
-
-
-2012-05-20 - pppd: Eliminate some warnings
-  c44ae5e6a7338c96eb463881fe709b2dfaffe568
-
-Again, we are handling compilation warnings on our own.
-
-
-2012-05-20 - rp-pppoe plugin: Import some fixes from rp-pppoe-3.10
-  1817d83e51a411044e730ba89ebdb0480e1c8cd4
-
-Once more, we are not using the RP-PPPoE plugin.
-
-
-2013-01-23 - pppd: Clarify circumstances where DNS1/DNS2 environment variables are set
-  cf2f5c9538b9400ade23446a194729b0a4113b3a
-
-Documentation only.
-
-
-2013-02-03 - ppp: ignore unrecognised radiusclient configuration directives
-  7f736dde0da3c19855997d9e67370e351e15e923
-
-Radius plugin, not in the port.
-
-
-2013-02-03 - pppd: Take out unused %r conversion completely
-  356d8d558d844412119aa18c8e5a113bc6459c7b
-
-Merged 2014-04-15.
-
-
-2013-02-03 - pppd: Arrange to use logwtmp from libutil on Linux
-  9617a7eb137f4fee62799a677a9ecf8d834db3f5
-
-Patch for sys-linux.c, which we don't use.
-
-
-2013-02-03 - pppdump: Eliminate some compiler warnings
-  3e3acf1ba2b3046c072a42c19164788a9e419bd1
-
-pppdump is a ppp tool outside pppd source tree.
-
-
-2013-02-03 - chat: Correct spelling errors in the man page
-  8dea1b969d266ccbf6f3a8c5474eb6dcd8838e3b
-
-Documentation only.
-
-
-2013-02-03 - pppd: Fix spelling errors in man page
-  9e05a25d76b3f83096c661678010320df673df6b
-
-Documentation only.
-
-
-2013-02-03 - plugins/passprompt: Fix potential out-of-bounds array reference
-  8edb889b753056a691a3e4b217a110a35f9fdedb
-
-Plugin patch, we do not have plugins.
-
-
-2013-02-03 - chat: Fix *roff errors in the man page
-  a7c3489eeaf44e83ce592143c7c8a5b5c29f4c48
-
-Documentation only.
-
-
-2013-03-02 - pppd: Fix man page description of case when remote IP address isn't known
-  224841f4799f4f1e2e71bc490c54448d66740f4f
-
-Documentation only.
-
-
-2013-03-02 - pppd: Add master_detach option
-  398ed2585640d198c53e736ee5bbd67f7ce8168e
-
-Option for multilink support, we do not support multilink and this option
-is about detaching from the terminal, which is out of the embedded scope.
-
-
-2013-03-11 - pppd: Default exit status to EXIT_CONNECT_FAILED during connection phase
-  225361d64ae737afdc8cb57579a2f33525461bc9
-
-Commented out in our port, and already fixed by a previously applied Debian patch.
-
-
-2013-03-11 - pppstats: Fix undefined macro in man page
-  d16a3985eade5280b8e171f5dd0670a91cba0d39
-
-Documentation only.
-
-
-2013-05-11 - plugins/radius: Handle bindaddr keyword in radiusclient.conf
-  d883b2dbafeed3ebd9d7a56ab1469373bd001a3b
-
-Radius plugin, not in the port.
-
-
-2013-06-09 - pppoatm: Remove explicit loading of pppoatm kernel module
-  52cd43a84bea524033b918b603698104f221bbb7
-
-PPPoATM plugin, not in the port.
-
-
-2013-06-09 - pppd: Fix segfault in update_db_entry()
-  37476164f15a45015310b9d4b197c2d7db1f7f8f
-
-We do not use the samba db.
-
-
-2013-06-09 - chat: Fix some text that was intended to be literal
-  cd9683676618adcee8add2c3cfa3382341b5a1f6
-
-Documentation only.
-
-
-2013-06-09 - README.pppoe: Minor semantic fix
-  b5b8898af6fd3d44e873cfc66810ace5f1f47e17
-
-Documentation only.
-
-
-2013-06-10 - radius: Handle additional attributes
-  2f581cd986a56f2ec4a95abad4f8297a1b10d7e2
-
-Radius plugin, not in the port.
-
-
-2013-06-10 - chat, pppd: Use \e instead of \\ in man pages
-  8d6942415d22f6ca4377340ca26e345c3f5fa5db
-
-Documentation only.
-
-
-2014-01-02 - pppd: Don't crash if NULL pointer passed to vslprintf for %q or %v
-  906814431bddeb2061825fa1ebad1a967b6d87a9
-
-Merged 2014-04-15.
-
-
-2014-01-02 - pppd: Accept IPCP ConfAck packets containing MS-WINS options
-  a243f217f1c6ac1aa7793806bc88590d077f490a
-
-Merged 2014-04-15.
-
-
-2014-01-02 - config: Update Solaris compiler options and enable CHAPMS and IPV6
-  99c46caaed01b7edba87962aa52b77fad61bfd7b
-
-Solaris port, don't care.
-
-
-2014-01-02 - Update README and patchlevel for 2.4.6 release
-  4043750fca36e7e0eb90d702e048ad1da4929418
-
-Just release stuff.
-
-
-2014-02-18 - pppd: Add option "stop-bits" to set number of serial port stop bits.
-  ad993a20ee485f0d0e2ac4105221641b200da6e2
-
-Low level serial port, not in the port.
-
-
-2014-03-09 - pppd: Separate IPv6 handling for sifup/sifdown
-  b04d2dc6df5c6b5650fea44250d58757ee3dac4a
-
-Reimplemented.
-
-
-2014-03-09 - pppol2tp: Connect up/down events to notifiers and add IPv6 ones
-  fafbe50251efc7d6b4a8be652d085316e112b34f
-
-Not in the port.
-
-
-2014-03-09 - pppd: Add declarations to eliminate compile warnings
-  50967962addebe15c7a7e63116ff46a0441dc464
-
-We are handling compilation warnings on our own
-
-
-2014-03-09 - pppd: Eliminate some unnecessary ifdefs
-  de8da14d845ee6db9236ccfddabf1d8ebf045ddb
-
-We mostly did that previously. Anyway, merged 2014-12-24.
-
-
-2014-08-01 - radius: Fix realms-config-file option
-  880a81be7c8e0fe8567227bc17a1bff3ea035943
-
-Radius plugin, not in the port.
-
-
-2014-08-01 - pppd: Eliminate potential integer overflow in option parsing
-  7658e8257183f062dc01f87969c140707c7e52cb
-
-pppd config file parser, not in the port.
-
-
-2014-08-01 - pppd: Eliminate memory leak with multiple instances of a string option
-  b94b7fbbaa0589aa6ec5fdc733aeb9ff294d2656
-
-pppd config file parser, not in the port.
-
-
-2014-08-01 - pppd: Fix a stack variable overflow in MSCHAP-v2
-  36733a891fb56594fcee580f667b33a64b990981
-
-This fixes a bug introduced in 08ef47ca ("pppd: Make MSCHAP-v2 cope better with packet loss").
-
-We didn't merge 08ef47ca ;-)
-
-
-2014-08-01 - winbind plugin: Add -DMPPE=1 to eliminate compiler warnings
-  2b05e22c62095e97dd0a97e4b5588402c2185071
-
-Linux plugin, not in the port.
-
-
-2014-08-09 - Update README and patchlevel for 2.4.7 release
-  6e8eaa7a78b31cdab2edf140a9c8afdb02ffaca5
-
-Just release stuff.
diff --git a/components/lwip/netif/ppp/auth.c b/components/lwip/netif/ppp/auth.c
deleted file mode 100644 (file)
index 382201e..0000000
+++ /dev/null
@@ -1,2497 +0,0 @@
-/*
- * auth.c - PPP authentication and phase control.
- *
- * Copyright (c) 1993-2002 Paul Mackerras. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. The name(s) of the authors of this software must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission.
- *
- * 3. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by Paul Mackerras
- *     <paulus@samba.org>".
- *
- * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * Derived from main.c, which is:
- *
- * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The name "Carnegie Mellon University" must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission. For permission or any legal
- *    details, please contact
- *      Office of Technology Transfer
- *      Carnegie Mellon University
- *      5000 Forbes Avenue
- *      Pittsburgh, PA  15213-3890
- *      (412) 268-4387, fax: (412) 268-7395
- *      tech-transfer@andrew.cmu.edu
- *
- * 4. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by Computing Services
- *     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
- *
- * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
- * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */
-
-#if 0 /* UNUSED */
-#include <stdio.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <errno.h>
-#include <pwd.h>
-#include <grp.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/socket.h>
-#include <utmp.h>
-#include <fcntl.h>
-#if defined(_PATH_LASTLOG) && defined(__linux__)
-#include <lastlog.h>
-#endif
-
-#include <netdb.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-
-#ifdef HAS_SHADOW
-#include <shadow.h>
-#ifndef PW_PPP
-#define PW_PPP PW_LOGIN
-#endif
-#endif
-
-#include <time.h>
-#endif /* UNUSED */
-
-#include "netif/ppp/ppp_impl.h"
-
-#include "netif/ppp/fsm.h"
-#include "netif/ppp/lcp.h"
-#if CCP_SUPPORT
-#include "netif/ppp/ccp.h"
-#endif /* CCP_SUPPORT */
-#if ECP_SUPPORT
-#include "netif/ppp/ecp.h"
-#endif /* ECP_SUPPORT */
-#include "netif/ppp/ipcp.h"
-#if PAP_SUPPORT
-#include "netif/ppp/upap.h"
-#endif /* PAP_SUPPORT */
-#if CHAP_SUPPORT
-#include "netif/ppp/chap-new.h"
-#endif /* CHAP_SUPPORT */
-#if EAP_SUPPORT
-#include "netif/ppp/eap.h"
-#endif /* EAP_SUPPORT */
-#if CBCP_SUPPORT
-#include "netif/ppp/cbcp.h"
-#endif
-
-#if 0 /* UNUSED */
-#include "session.h"
-#endif /* UNUSED */
-
-#if 0 /* UNUSED */
-/* Bits in scan_authfile return value */
-#define NONWILD_SERVER 1
-#define NONWILD_CLIENT 2
-
-#define ISWILD(word)   (word[0] == '*' && word[1] == 0)
-#endif /* UNUSED */
-
-#if 0 /* UNUSED */
-/* List of addresses which the peer may use. */
-static struct permitted_ip *addresses[NUM_PPP];
-
-/* Wordlist giving addresses which the peer may use
-   without authenticating itself. */
-static struct wordlist *noauth_addrs;
-
-/* Remote telephone number, if available */
-char remote_number[MAXNAMELEN];
-
-/* Wordlist giving remote telephone numbers which may connect. */
-static struct wordlist *permitted_numbers;
-
-/* Extra options to apply, from the secrets file entry for the peer. */
-static struct wordlist *extra_options;
-#endif /* UNUSED */
-
-#if 0 /* UNUSED */
-/* Set if we require authentication only because we have a default route. */
-static bool default_auth;
-
-/* Hook to enable a plugin to control the idle time limit */
-int (*idle_time_hook) (struct ppp_idle *) = NULL;
-
-/* Hook for a plugin to say whether we can possibly authenticate any peer */
-int (*pap_check_hook) (void) = NULL;
-
-/* Hook for a plugin to check the PAP user and password */
-int (*pap_auth_hook) (char *user, char *passwd, char **msgp,
-                         struct wordlist **paddrs,
-                         struct wordlist **popts) = NULL;
-
-/* Hook for a plugin to know about the PAP user logout */
-void (*pap_logout_hook) (void) = NULL;
-
-/* Hook for a plugin to get the PAP password for authenticating us */
-int (*pap_passwd_hook) (char *user, char *passwd) = NULL;
-
-/* Hook for a plugin to say if we can possibly authenticate a peer using CHAP */
-int (*chap_check_hook) (void) = NULL;
-
-/* Hook for a plugin to get the CHAP password for authenticating us */
-int (*chap_passwd_hook) (char *user, char *passwd) = NULL;
-
-/* Hook for a plugin to say whether it is OK if the peer
-   refuses to authenticate. */
-int (*null_auth_hook) (struct wordlist **paddrs,
-                          struct wordlist **popts) = NULL;
-
-int (*allowed_address_hook) (u32_t addr) = NULL;
-#endif /* UNUSED */
-
-#ifdef HAVE_MULTILINK
-/* Hook for plugin to hear when an interface joins a multilink bundle */
-void (*multilink_join_hook) (void) = NULL;
-#endif
-
-#if PPP_NOTIFY
-/* A notifier for when the peer has authenticated itself,
-   and we are proceeding to the network phase. */
-struct notifier *auth_up_notifier = NULL;
-
-/* A notifier for when the link goes down. */
-struct notifier *link_down_notifier = NULL;
-#endif /* PPP_NOTIFY */
-
-/*
- * Option variables.
- */
-#if 0 /* MOVED TO ppp_settings */
-bool uselogin = 0;             /* Use /etc/passwd for checking PAP */
-bool session_mgmt = 0;         /* Do session management (login records) */
-bool cryptpap = 0;             /* Passwords in pap-secrets are encrypted */
-bool refuse_pap = 0;           /* Don't wanna auth. ourselves with PAP */
-bool refuse_chap = 0;          /* Don't wanna auth. ourselves with CHAP */
-bool refuse_eap = 0;           /* Don't wanna auth. ourselves with EAP */
-#if MSCHAP_SUPPORT
-bool refuse_mschap = 0;                /* Don't wanna auth. ourselves with MS-CHAP */
-bool refuse_mschap_v2 = 0;     /* Don't wanna auth. ourselves with MS-CHAPv2 */
-#else /* MSCHAP_SUPPORT */
-bool refuse_mschap = 1;                /* Don't wanna auth. ourselves with MS-CHAP */
-bool refuse_mschap_v2 = 1;     /* Don't wanna auth. ourselves with MS-CHAPv2 */
-#endif /* MSCHAP_SUPPORT */
-bool usehostname = 0;          /* Use hostname for our_name */
-bool auth_required = 0;                /* Always require authentication from peer */
-bool allow_any_ip = 0;         /* Allow peer to use any IP address */
-bool explicit_remote = 0;      /* User specified explicit remote name */
-bool explicit_user = 0;                /* Set if "user" option supplied */
-bool explicit_passwd = 0;      /* Set if "password" option supplied */
-char remote_name[MAXNAMELEN];  /* Peer's name for authentication */
-static char *uafname;          /* name of most recent +ua file */
-
-extern char *crypt (const char *, const char *);
-#endif /* UNUSED */
-/* Prototypes for procedures local to this file. */
-
-static void network_phase(ppp_pcb *pcb);
-#if PPP_IDLETIMELIMIT
-static void check_idle(void *arg);
-#endif /* PPP_IDLETIMELIMIT */
-#if PPP_MAXCONNECT
-static void connect_time_expired(void *arg);
-#endif /* PPP_MAXCONNECT */
-#if 0 /* UNUSED */
-static int  null_login (int);
-/* static int  get_pap_passwd (char *); */
-static int  have_pap_secret (int *);
-static int  have_chap_secret (char *, char *, int, int *);
-static int  have_srp_secret (char *client, char *server, int need_ip,
-    int *lacks_ipp);
-static int  ip_addr_check (u32_t, struct permitted_ip *);
-static int  scan_authfile (FILE *, char *, char *, char *,
-                              struct wordlist **, struct wordlist **,
-                              char *, int);
-static void free_wordlist (struct wordlist *);
-static void set_allowed_addrs (int, struct wordlist *, struct wordlist *);
-static int  some_ip_ok (struct wordlist *);
-static int  setupapfile (char **);
-static int  privgroup (char **);
-static int  set_noauth_addr (char **);
-static int  set_permitted_number (char **);
-static void check_access (FILE *, char *);
-static int  wordlist_count (struct wordlist *);
-#endif /* UNUSED */
-
-#ifdef MAXOCTETS
-static void check_maxoctets (void *);
-#endif
-
-#if PPP_OPTIONS
-/*
- * Authentication-related options.
- */
-option_t auth_options[] = {
-    { "auth", o_bool, &auth_required,
-      "Require authentication from peer", OPT_PRIO | 1 },
-    { "noauth", o_bool, &auth_required,
-      "Don't require peer to authenticate", OPT_PRIOSUB | OPT_PRIV,
-      &allow_any_ip },
-    { "require-pap", o_bool, &lcp_wantoptions[0].neg_upap,
-      "Require PAP authentication from peer",
-      OPT_PRIOSUB | 1, &auth_required },
-    { "+pap", o_bool, &lcp_wantoptions[0].neg_upap,
-      "Require PAP authentication from peer",
-      OPT_ALIAS | OPT_PRIOSUB | 1, &auth_required },
-    { "require-chap", o_bool, &auth_required,
-      "Require CHAP authentication from peer",
-      OPT_PRIOSUB | OPT_A2OR | MDTYPE_MD5,
-      &lcp_wantoptions[0].chap_mdtype },
-    { "+chap", o_bool, &auth_required,
-      "Require CHAP authentication from peer",
-      OPT_ALIAS | OPT_PRIOSUB | OPT_A2OR | MDTYPE_MD5,
-      &lcp_wantoptions[0].chap_mdtype },
-#if MSCHAP_SUPPORT
-    { "require-mschap", o_bool, &auth_required,
-      "Require MS-CHAP authentication from peer",
-      OPT_PRIOSUB | OPT_A2OR | MDTYPE_MICROSOFT,
-      &lcp_wantoptions[0].chap_mdtype },
-    { "+mschap", o_bool, &auth_required,
-      "Require MS-CHAP authentication from peer",
-      OPT_ALIAS | OPT_PRIOSUB | OPT_A2OR | MDTYPE_MICROSOFT,
-      &lcp_wantoptions[0].chap_mdtype },
-    { "require-mschap-v2", o_bool, &auth_required,
-      "Require MS-CHAPv2 authentication from peer",
-      OPT_PRIOSUB | OPT_A2OR | MDTYPE_MICROSOFT_V2,
-      &lcp_wantoptions[0].chap_mdtype },
-    { "+mschap-v2", o_bool, &auth_required,
-      "Require MS-CHAPv2 authentication from peer",
-      OPT_ALIAS | OPT_PRIOSUB | OPT_A2OR | MDTYPE_MICROSOFT_V2,
-      &lcp_wantoptions[0].chap_mdtype },
-#endif /* MSCHAP_SUPPORT */
-#if 0
-    { "refuse-pap", o_bool, &refuse_pap,
-      "Don't agree to auth to peer with PAP", 1 },
-    { "-pap", o_bool, &refuse_pap,
-      "Don't allow PAP authentication with peer", OPT_ALIAS | 1 },
-    { "refuse-chap", o_bool, &refuse_chap,
-      "Don't agree to auth to peer with CHAP",
-      OPT_A2CLRB | MDTYPE_MD5,
-      &lcp_allowoptions[0].chap_mdtype },
-    { "-chap", o_bool, &refuse_chap,
-      "Don't allow CHAP authentication with peer",
-      OPT_ALIAS | OPT_A2CLRB | MDTYPE_MD5,
-      &lcp_allowoptions[0].chap_mdtype },
-#endif
-#if MSCHAP_SUPPORT
-#if 0
-    { "refuse-mschap", o_bool, &refuse_mschap,
-      "Don't agree to auth to peer with MS-CHAP",
-      OPT_A2CLRB | MDTYPE_MICROSOFT,
-      &lcp_allowoptions[0].chap_mdtype },
-    { "-mschap", o_bool, &refuse_mschap,
-      "Don't allow MS-CHAP authentication with peer",
-      OPT_ALIAS | OPT_A2CLRB | MDTYPE_MICROSOFT,
-      &lcp_allowoptions[0].chap_mdtype },
-    { "refuse-mschap-v2", o_bool, &refuse_mschap_v2,
-      "Don't agree to auth to peer with MS-CHAPv2",
-      OPT_A2CLRB | MDTYPE_MICROSOFT_V2,
-      &lcp_allowoptions[0].chap_mdtype },
-    { "-mschap-v2", o_bool, &refuse_mschap_v2,
-      "Don't allow MS-CHAPv2 authentication with peer",
-      OPT_ALIAS | OPT_A2CLRB | MDTYPE_MICROSOFT_V2,
-      &lcp_allowoptions[0].chap_mdtype },
-#endif
-#endif /* MSCHAP_SUPPORT*/
-#if EAP_SUPPORT
-    { "require-eap", o_bool, &lcp_wantoptions[0].neg_eap,
-      "Require EAP authentication from peer", OPT_PRIOSUB | 1,
-      &auth_required },
-#if 0
-    { "refuse-eap", o_bool, &refuse_eap,
-      "Don't agree to authenticate to peer with EAP", 1 },
-#endif
-#endif /* EAP_SUPPORT */
-    { "name", o_string, our_name,
-      "Set local name for authentication",
-      OPT_PRIO | OPT_PRIV | OPT_STATIC, NULL, MAXNAMELEN },
-
-    { "+ua", o_special, (void *)setupapfile,
-      "Get PAP user and password from file",
-      OPT_PRIO | OPT_A2STRVAL, &uafname },
-
-#if 0
-    { "user", o_string, user,
-      "Set name for auth with peer", OPT_PRIO | OPT_STATIC,
-      &explicit_user, MAXNAMELEN },
-
-    { "password", o_string, passwd,
-      "Password for authenticating us to the peer",
-      OPT_PRIO | OPT_STATIC | OPT_HIDE,
-      &explicit_passwd, MAXSECRETLEN },
-#endif
-
-    { "usehostname", o_bool, &usehostname,
-      "Must use hostname for authentication", 1 },
-
-    { "remotename", o_string, remote_name,
-      "Set remote name for authentication", OPT_PRIO | OPT_STATIC,
-      &explicit_remote, MAXNAMELEN },
-
-    { "login", o_bool, &uselogin,
-      "Use system password database for PAP", OPT_A2COPY | 1 ,
-      &session_mgmt },
-    { "enable-session", o_bool, &session_mgmt,
-      "Enable session accounting for remote peers", OPT_PRIV | 1 },
-
-    { "papcrypt", o_bool, &cryptpap,
-      "PAP passwords are encrypted", 1 },
-
-    { "privgroup", o_special, (void *)privgroup,
-      "Allow group members to use privileged options", OPT_PRIV | OPT_A2LIST },
-
-    { "allow-ip", o_special, (void *)set_noauth_addr,
-      "Set IP address(es) which can be used without authentication",
-      OPT_PRIV | OPT_A2LIST },
-
-    { "remotenumber", o_string, remote_number,
-      "Set remote telephone number for authentication", OPT_PRIO | OPT_STATIC,
-      NULL, MAXNAMELEN },
-
-    { "allow-number", o_special, (void *)set_permitted_number,
-      "Set telephone number(s) which are allowed to connect",
-      OPT_PRIV | OPT_A2LIST },
-
-    { NULL }
-};
-#endif /* PPP_OPTIONS */
-
-#if 0 /* UNUSED */
-/*
- * setupapfile - specifies UPAP info for authenticating with peer.
- */
-static int
-setupapfile(argv)
-    char **argv;
-{
-    FILE *ufile;
-    int l;
-    uid_t euid;
-    char u[MAXNAMELEN], p[MAXSECRETLEN];
-    char *fname;
-
-    lcp_allowoptions[0].neg_upap = 1;
-
-    /* open user info file */
-    fname = strdup(*argv);
-    if (fname == NULL)
-       novm("+ua file name");
-    euid = geteuid();
-    if (seteuid(getuid()) == -1) {
-       option_error("unable to reset uid before opening %s: %m", fname);
-       return 0;
-    }
-    ufile = fopen(fname, "r");
-    if (seteuid(euid) == -1)
-       fatal("unable to regain privileges: %m");
-    if (ufile == NULL) {
-       option_error("unable to open user login data file %s", fname);
-       return 0;
-    }
-    check_access(ufile, fname);
-    uafname = fname;
-
-    /* get username */
-    if (fgets(u, MAXNAMELEN - 1, ufile) == NULL
-       || fgets(p, MAXSECRETLEN - 1, ufile) == NULL) {
-       fclose(ufile);
-       option_error("unable to read user login data file %s", fname);
-       return 0;
-    }
-    fclose(ufile);
-
-    /* get rid of newlines */
-    l = strlen(u);
-    if (l > 0 && u[l-1] == '\n')
-       u[l-1] = 0;
-    l = strlen(p);
-    if (l > 0 && p[l-1] == '\n')
-       p[l-1] = 0;
-
-    if (override_value("user", option_priority, fname)) {
-       strlcpy(ppp_settings.user, u, sizeof(ppp_settings.user));
-       explicit_user = 1;
-    }
-    if (override_value("passwd", option_priority, fname)) {
-       strlcpy(ppp_settings.passwd, p, sizeof(ppp_settings.passwd));
-       explicit_passwd = 1;
-    }
-
-    return (1);
-}
-
-/*
- * privgroup - allow members of the group to have privileged access.
- */
-static int
-privgroup(argv)
-    char **argv;
-{
-    struct group *g;
-    int i;
-
-    g = getgrnam(*argv);
-    if (g == 0) {
-       option_error("group %s is unknown", *argv);
-       return 0;
-    }
-    for (i = 0; i < ngroups; ++i) {
-       if (groups[i] == g->gr_gid) {
-           privileged = 1;
-           break;
-       }
-    }
-    return 1;
-}
-
-
-/*
- * set_noauth_addr - set address(es) that can be used without authentication.
- * Equivalent to specifying an entry like `"" * "" addr' in pap-secrets.
- */
-static int
-set_noauth_addr(argv)
-    char **argv;
-{
-    char *addr = *argv;
-    int l = strlen(addr) + 1;
-    struct wordlist *wp;
-
-    wp = (struct wordlist *) mem_malloc(sizeof(struct wordlist) + l);
-    if (wp == NULL)
-       novm("allow-ip argument");
-    wp->word = (char *) (wp + 1);
-    wp->next = noauth_addrs;
-    MEMCPY(wp->word, addr, l);
-    noauth_addrs = wp;
-    return 1;
-}
-
-
-/*
- * set_permitted_number - set remote telephone number(s) that may connect.
- */
-static int
-set_permitted_number(argv)
-    char **argv;
-{
-    char *number = *argv;
-    int l = strlen(number) + 1;
-    struct wordlist *wp;
-
-    wp = (struct wordlist *) mem_malloc(sizeof(struct wordlist) + l);
-    if (wp == NULL)
-       novm("allow-number argument");
-    wp->word = (char *) (wp + 1);
-    wp->next = permitted_numbers;
-    MEMCPY(wp->word, number, l);
-    permitted_numbers = wp;
-    return 1;
-}
-#endif
-
-/*
- * An Open on LCP has requested a change from Dead to Establish phase.
- */
-void link_required(ppp_pcb *pcb) {
-    LWIP_UNUSED_ARG(pcb);
-}
-
-#if 0
-/*
- * Bring the link up to the point of being able to do ppp.
- */
-void start_link(unit)
-    int unit;
-{
-    ppp_pcb *pcb = &ppp_pcb_list[unit];
-    char *msg;
-
-    status = EXIT_NEGOTIATION_FAILED;
-    new_phase(pcb, PPP_PHASE_SERIALCONN);
-
-    hungup = 0;
-    devfd = the_channel->connect();
-    msg = "Connect script failed";
-    if (devfd < 0)
-       goto fail;
-
-    /* set up the serial device as a ppp interface */
-    /*
-     * N.B. we used to do tdb_writelock/tdb_writeunlock around this
-     * (from establish_ppp to set_ifunit).  However, we won't be
-     * doing the set_ifunit in multilink mode, which is the only time
-     * we need the atomicity that the tdb_writelock/tdb_writeunlock
-     * gives us.  Thus we don't need the tdb_writelock/tdb_writeunlock.
-     */
-    fd_ppp = the_channel->establish_ppp(devfd);
-    msg = "ppp establishment failed";
-    if (fd_ppp < 0) {
-       status = EXIT_FATAL_ERROR;
-       goto disconnect;
-    }
-
-    if (!demand && ifunit >= 0)
-       set_ifunit(1);
-
-    /*
-     * Start opening the connection and wait for
-     * incoming events (reply, timeout, etc.).
-     */
-    if (ifunit >= 0)
-       ppp_notice("Connect: %s <--> %s", ifname, ppp_devnam);
-    else
-       ppp_notice("Starting negotiation on %s", ppp_devnam);
-    add_fd(fd_ppp);
-
-    new_phase(pcb, PPP_PHASE_ESTABLISH);
-
-    lcp_lowerup(pcb);
-    return;
-
- disconnect:
-    new_phase(pcb, PPP_PHASE_DISCONNECT);
-    if (the_channel->disconnect)
-       the_channel->disconnect();
-
- fail:
-    new_phase(pcb, PPP_PHASE_DEAD);
-    if (the_channel->cleanup)
-       (*the_channel->cleanup)();
-}
-#endif
-
-/*
- * LCP has terminated the link; go to the Dead phase and take the
- * physical layer down.
- */
-void link_terminated(ppp_pcb *pcb) {
-    if (pcb->phase == PPP_PHASE_DEAD || pcb->phase == PPP_PHASE_MASTER)
-       return;
-    new_phase(pcb, PPP_PHASE_DISCONNECT);
-
-#if 0 /* UNUSED */
-    if (pap_logout_hook) {
-       pap_logout_hook();
-    }
-    session_end(devnam);
-#endif /* UNUSED */
-
-    if (!doing_multilink) {
-       ppp_notice("Connection terminated.");
-#if PPP_STATS_SUPPORT
-       print_link_stats();
-#endif /* PPP_STATS_SUPPORT */
-    } else
-       ppp_notice("Link terminated.");
-
-    lcp_lowerdown(pcb);
-
-    new_phase(pcb, PPP_PHASE_DEAD);
-    ppp_link_terminated(pcb);
-#if 0
-    /*
-     * Delete pid files before disestablishing ppp.  Otherwise it
-     * can happen that another pppd gets the same unit and then
-     * we delete its pid file.
-     */
-    if (!doing_multilink && !demand)
-       remove_pidfiles();
-
-    /*
-     * If we may want to bring the link up again, transfer
-     * the ppp unit back to the loopback.  Set the
-     * real serial device back to its normal mode of operation.
-     */
-    if (fd_ppp >= 0) {
-       remove_fd(fd_ppp);
-       clean_check();
-       the_channel->disestablish_ppp(devfd);
-       if (doing_multilink)
-           mp_exit_bundle();
-       fd_ppp = -1;
-    }
-    if (!hungup)
-       lcp_lowerdown(pcb);
-    if (!doing_multilink && !demand)
-       script_unsetenv("IFNAME");
-
-    /*
-     * Run disconnector script, if requested.
-     * XXX we may not be able to do this if the line has hung up!
-     */
-    if (devfd >= 0 && the_channel->disconnect) {
-       the_channel->disconnect();
-       devfd = -1;
-    }
-    if (the_channel->cleanup)
-       (*the_channel->cleanup)();
-
-    if (doing_multilink && multilink_master) {
-       if (!bundle_terminating)
-           new_phase(pcb, PPP_PHASE_MASTER);
-       else
-           mp_bundle_terminated();
-    } else
-       new_phase(pcb, PPP_PHASE_DEAD);
-#endif
-}
-
-/*
- * LCP has gone down; it will either die or try to re-establish.
- */
-void link_down(ppp_pcb *pcb) {
-#if PPP_NOTIFY
-    notify(link_down_notifier, 0);
-#endif /* PPP_NOTIFY */
-
-    if (!doing_multilink) {
-       upper_layers_down(pcb);
-       if (pcb->phase != PPP_PHASE_DEAD && pcb->phase != PPP_PHASE_MASTER)
-           new_phase(pcb, PPP_PHASE_ESTABLISH);
-    }
-    /* XXX if doing_multilink, should do something to stop
-       network-layer traffic on the link */
-}
-
-void upper_layers_down(ppp_pcb *pcb) {
-    int i;
-    const struct protent *protp;
-
-    for (i = 0; (protp = protocols[i]) != NULL; ++i) {
-        if (protp->protocol != PPP_LCP && protp->lowerdown != NULL)
-           (*protp->lowerdown)(pcb);
-        if (protp->protocol < 0xC000 && protp->close != NULL)
-           (*protp->close)(pcb, "LCP down");
-    }
-    pcb->num_np_open = 0;
-    pcb->num_np_up = 0;
-}
-
-/*
- * The link is established.
- * Proceed to the Dead, Authenticate or Network phase as appropriate.
- */
-void link_established(ppp_pcb *pcb) {
-#if PPP_AUTH_SUPPORT
-    int auth;
-#if PPP_SERVER
-    lcp_options *wo = &pcb->lcp_wantoptions;
-    lcp_options *go = &pcb->lcp_gotoptions;
-#endif /* PPP_SERVER */
-    lcp_options *ho = &pcb->lcp_hisoptions;
-#endif /* PPP_AUTH_SUPPORT */
-    int i;
-    const struct protent *protp;
-
-    /*
-     * Tell higher-level protocols that LCP is up.
-     */
-    if (!doing_multilink) {
-       for (i = 0; (protp = protocols[i]) != NULL; ++i)
-           if (protp->protocol != PPP_LCP
-               && protp->lowerup != NULL)
-               (*protp->lowerup)(pcb);
-    }
-
-#if PPP_AUTH_SUPPORT
-#if PPP_SERVER
-#if PPP_ALLOWED_ADDRS
-    if (!auth_required && noauth_addrs != NULL)
-       set_allowed_addrs(unit, NULL, NULL);
-#endif /* PPP_ALLOWED_ADDRS */
-
-    if (pcb->settings.auth_required && !(0
-#if PAP_SUPPORT
-       || go->neg_upap
-#endif /* PAP_SUPPORT */
-#if CHAP_SUPPORT
-       || go->neg_chap
-#endif /* CHAP_SUPPORT */
-#if EAP_SUPPORT
-       || go->neg_eap
-#endif /* EAP_SUPPORT */
-       )) {
-
-#if PPP_ALLOWED_ADDRS
-       /*
-        * We wanted the peer to authenticate itself, and it refused:
-        * if we have some address(es) it can use without auth, fine,
-        * otherwise treat it as though it authenticated with PAP using
-        * a username of "" and a password of "".  If that's not OK,
-        * boot it out.
-        */
-       if (noauth_addrs != NULL) {
-           set_allowed_addrs(unit, NULL, NULL);
-       } else
-#endif /* PPP_ALLOWED_ADDRS */
-       if (!wo->neg_upap || !pcb->settings.null_login) {
-           ppp_warn("peer refused to authenticate: terminating link");
-#if 0 /* UNUSED */
-           status = EXIT_PEER_AUTH_FAILED;
-#endif /* UNUSED */
-           pcb->err_code = PPPERR_AUTHFAIL;
-           lcp_close(pcb, "peer refused to authenticate");
-           return;
-       }
-    }
-#endif /* PPP_SERVER */
-
-    new_phase(pcb, PPP_PHASE_AUTHENTICATE);
-    auth = 0;
-#if PPP_SERVER
-#if EAP_SUPPORT
-    if (go->neg_eap) {
-       eap_authpeer(pcb, PPP_OUR_NAME);
-       auth |= EAP_PEER;
-    } else
-#endif /* EAP_SUPPORT */
-#if CHAP_SUPPORT
-    if (go->neg_chap) {
-       chap_auth_peer(pcb, PPP_OUR_NAME, CHAP_DIGEST(go->chap_mdtype));
-       auth |= CHAP_PEER;
-    } else
-#endif /* CHAP_SUPPORT */
-#if PAP_SUPPORT
-    if (go->neg_upap) {
-       upap_authpeer(pcb);
-       auth |= PAP_PEER;
-    } else
-#endif /* PAP_SUPPORT */
-    {}
-#endif /* PPP_SERVER */
-
-#if EAP_SUPPORT
-    if (ho->neg_eap) {
-       eap_authwithpeer(pcb, pcb->settings.user);
-       auth |= EAP_WITHPEER;
-    } else
-#endif /* EAP_SUPPORT */
-#if CHAP_SUPPORT
-    if (ho->neg_chap) {
-       chap_auth_with_peer(pcb, pcb->settings.user, CHAP_DIGEST(ho->chap_mdtype));
-       auth |= CHAP_WITHPEER;
-    } else
-#endif /* CHAP_SUPPORT */
-#if PAP_SUPPORT
-    if (ho->neg_upap) {
-       upap_authwithpeer(pcb, pcb->settings.user, pcb->settings.passwd);
-       auth |= PAP_WITHPEER;
-    } else
-#endif /* PAP_SUPPORT */
-    {}
-
-    pcb->auth_pending = auth;
-    pcb->auth_done = 0;
-
-    if (!auth)
-#endif /* PPP_AUTH_SUPPORT */
-       network_phase(pcb);
-}
-
-/*
- * Proceed to the network phase.
- */
-static void network_phase(ppp_pcb *pcb) {
-#if CBCP_SUPPORT
-    ppp_pcb *pcb = &ppp_pcb_list[unit];
-#endif
-#if 0 /* UNUSED */
-    lcp_options *go = &lcp_gotoptions[unit];
-#endif /* UNUSED */
-
-#if 0 /* UNUSED */
-    /* Log calling number. */
-    if (*remote_number)
-       ppp_notice("peer from calling number %q authorized", remote_number);
-#endif /* UNUSED */
-
-#if PPP_NOTIFY
-    /*
-     * If the peer had to authenticate, notify it now.
-     */
-    if (0
-#if CHAP_SUPPORT
-       || go->neg_chap
-#endif /* CHAP_SUPPORT */
-#if PAP_SUPPORT
-       || go->neg_upap
-#endif /* PAP_SUPPORT */
-#if EAP_SUPPORT
-       || go->neg_eap
-#endif /* EAP_SUPPORT */
-       ) {
-       notify(auth_up_notifier, 0);
-    }
-#endif /* PPP_NOTIFY */
-
-#if CBCP_SUPPORT
-    /*
-     * If we negotiated callback, do it now.
-     */
-    if (go->neg_cbcp) {
-       new_phase(pcb, PPP_PHASE_CALLBACK);
-       (*cbcp_protent.open)(pcb);
-       return;
-    }
-#endif
-
-#if PPP_OPTIONS
-    /*
-     * Process extra options from the secrets file
-     */
-    if (extra_options) {
-       options_from_list(extra_options, 1);
-       free_wordlist(extra_options);
-       extra_options = 0;
-    }
-#endif /* PPP_OPTIONS */
-    start_networks(pcb);
-}
-
-void start_networks(ppp_pcb *pcb) {
-#if CCP_SUPPORT || ECP_SUPPORT
-    int i;
-    const struct protent *protp;
-#endif /* CCP_SUPPORT || ECP_SUPPORT */
-
-    new_phase(pcb, PPP_PHASE_NETWORK);
-
-#ifdef HAVE_MULTILINK
-    if (multilink) {
-       if (mp_join_bundle()) {
-           if (multilink_join_hook)
-               (*multilink_join_hook)();
-           if (updetach && !nodetach)
-               detach();
-           return;
-       }
-    }
-#endif /* HAVE_MULTILINK */
-
-#ifdef PPP_FILTER
-    if (!demand)
-       set_filters(&pass_filter, &active_filter);
-#endif
-#if CCP_SUPPORT || ECP_SUPPORT
-    /* Start CCP and ECP */
-    for (i = 0; (protp = protocols[i]) != NULL; ++i)
-       if (
-           (0
-#if ECP_SUPPORT
-           || protp->protocol == PPP_ECP
-#endif /* ECP_SUPPORT */
-#if CCP_SUPPORT
-           || protp->protocol == PPP_CCP
-#endif /* CCP_SUPPORT */
-           )
-           && protp->open != NULL)
-           (*protp->open)(pcb);
-#endif /* CCP_SUPPORT || ECP_SUPPORT */
-
-    /*
-     * Bring up other network protocols iff encryption is not required.
-     */
-    if (1
-#if ECP_SUPPORT
-        && !ecp_gotoptions[unit].required
-#endif /* ECP_SUPPORT */
-#if MPPE_SUPPORT
-        && !pcb->ccp_gotoptions.mppe
-#endif /* MPPE_SUPPORT */
-        )
-       continue_networks(pcb);
-}
-
-void continue_networks(ppp_pcb *pcb) {
-    int i;
-    const struct protent *protp;
-
-    /*
-     * Start the "real" network protocols.
-     */
-    for (i = 0; (protp = protocols[i]) != NULL; ++i)
-       if (protp->protocol < 0xC000
-#if CCP_SUPPORT
-           && protp->protocol != PPP_CCP
-#endif /* CCP_SUPPORT */
-#if ECP_SUPPORT
-           && protp->protocol != PPP_ECP
-#endif /* ECP_SUPPORT */
-           && protp->open != NULL) {
-           (*protp->open)(pcb);
-           ++pcb->num_np_open;
-       }
-
-    if (pcb->num_np_open == 0)
-       /* nothing to do */
-       lcp_close(pcb, "No network protocols running");
-}
-
-#if PPP_AUTH_SUPPORT
-#if PPP_SERVER
-/*
- * auth_check_passwd - Check the user name and passwd against configuration.
- *
- * returns:
- *      0: Authentication failed.
- *      1: Authentication succeeded.
- * In either case, msg points to an appropriate message and msglen to the message len.
- */
-int auth_check_passwd(ppp_pcb *pcb, char *auser, int userlen, char *apasswd, int passwdlen, const char **msg, int *msglen) {
-  int secretuserlen;
-  int secretpasswdlen;
-
-  if (pcb->settings.user && pcb->settings.passwd) {
-    secretuserlen = (int)strlen(pcb->settings.user);
-    secretpasswdlen = (int)strlen(pcb->settings.passwd);
-    if (secretuserlen == userlen
-        && secretpasswdlen == passwdlen
-        && !memcmp(auser, pcb->settings.user, userlen)
-        && !memcmp(apasswd, pcb->settings.passwd, passwdlen) ) {
-      *msg = "Login ok";
-      *msglen = sizeof("Login ok")-1;
-      return 1;
-    }
-  }
-
-  *msg = "Login incorrect";
-  *msglen = sizeof("Login incorrect")-1;
-  return 0;
-}
-
-/*
- * The peer has failed to authenticate himself using `protocol'.
- */
-void auth_peer_fail(ppp_pcb *pcb, int protocol) {
-    LWIP_UNUSED_ARG(protocol);
-    /*
-     * Authentication failure: take the link down
-     */
-#if 0 /* UNUSED */
-    status = EXIT_PEER_AUTH_FAILED;
-#endif /* UNUSED */
-    pcb->err_code = PPPERR_AUTHFAIL;
-    lcp_close(pcb, "Authentication failed");
-}
-
-/*
- * The peer has been successfully authenticated using `protocol'.
- */
-void auth_peer_success(ppp_pcb *pcb, int protocol, int prot_flavor, const char *name, int namelen) {
-    int bit;
-#ifndef HAVE_MULTILINK
-    LWIP_UNUSED_ARG(name);
-    LWIP_UNUSED_ARG(namelen);
-#endif /* HAVE_MULTILINK */
-
-    switch (protocol) {
-#if CHAP_SUPPORT
-    case PPP_CHAP:
-       bit = CHAP_PEER;
-       switch (prot_flavor) {
-       case CHAP_MD5:
-           bit |= CHAP_MD5_PEER;
-           break;
-#if MSCHAP_SUPPORT
-       case CHAP_MICROSOFT:
-           bit |= CHAP_MS_PEER;
-           break;
-       case CHAP_MICROSOFT_V2:
-           bit |= CHAP_MS2_PEER;
-           break;
-#endif /* MSCHAP_SUPPORT */
-       default:
-           break;
-       }
-       break;
-#endif /* CHAP_SUPPORT */
-#if PAP_SUPPORT
-    case PPP_PAP:
-       bit = PAP_PEER;
-       break;
-#endif /* PAP_SUPPORT */
-#if EAP_SUPPORT
-    case PPP_EAP:
-       bit = EAP_PEER;
-       break;
-#endif /* EAP_SUPPORT */
-    default:
-       ppp_warn("auth_peer_success: unknown protocol %x", protocol);
-       return;
-    }
-
-#ifdef HAVE_MULTILINK
-    /*
-     * Save the authenticated name of the peer for later.
-     */
-    if (namelen > (int)sizeof(pcb->peer_authname) - 1)
-       namelen = (int)sizeof(pcb->peer_authname) - 1;
-    MEMCPY(pcb->peer_authname, name, namelen);
-    pcb->peer_authname[namelen] = 0;
-#endif /* HAVE_MULTILINK */
-#if 0 /* UNUSED */
-    script_setenv("PEERNAME", , 0);
-#endif /* UNUSED */
-
-    /* Save the authentication method for later. */
-    pcb->auth_done |= bit;
-
-    /*
-     * If there is no more authentication still to be done,
-     * proceed to the network (or callback) phase.
-     */
-    if ((pcb->auth_pending &= ~bit) == 0)
-        network_phase(pcb);
-}
-#endif /* PPP_SERVER */
-
-/*
- * We have failed to authenticate ourselves to the peer using `protocol'.
- */
-void auth_withpeer_fail(ppp_pcb *pcb, int protocol) {
-    LWIP_UNUSED_ARG(protocol);
-    /*
-     * We've failed to authenticate ourselves to our peer.
-     *
-     * Some servers keep sending CHAP challenges, but there
-     * is no point in persisting without any way to get updated
-     * authentication secrets.
-     *
-     * He'll probably take the link down, and there's not much
-     * we can do except wait for that.
-     */
-    pcb->err_code = PPPERR_AUTHFAIL;
-    lcp_close(pcb, "Failed to authenticate ourselves to peer");
-}
-
-/*
- * We have successfully authenticated ourselves with the peer using `protocol'.
- */
-void auth_withpeer_success(ppp_pcb *pcb, int protocol, int prot_flavor) {
-    int bit;
-    const char *prot = "";
-
-    switch (protocol) {
-#if CHAP_SUPPORT
-    case PPP_CHAP:
-       bit = CHAP_WITHPEER;
-       prot = "CHAP";
-       switch (prot_flavor) {
-       case CHAP_MD5:
-           bit |= CHAP_MD5_WITHPEER;
-           break;
-#if MSCHAP_SUPPORT
-       case CHAP_MICROSOFT:
-           bit |= CHAP_MS_WITHPEER;
-           break;
-       case CHAP_MICROSOFT_V2:
-           bit |= CHAP_MS2_WITHPEER;
-           break;
-#endif /* MSCHAP_SUPPORT */
-       default:
-           break;
-       }
-       break;
-#endif /* CHAP_SUPPORT */
-#if PAP_SUPPORT
-    case PPP_PAP:
-       bit = PAP_WITHPEER;
-       prot = "PAP";
-       break;
-#endif /* PAP_SUPPORT */
-#if EAP_SUPPORT
-    case PPP_EAP:
-       bit = EAP_WITHPEER;
-       prot = "EAP";
-       break;
-#endif /* EAP_SUPPORT */
-    default:
-       ppp_warn("auth_withpeer_success: unknown protocol %x", protocol);
-       bit = 0;
-       /* no break */
-    }
-
-    ppp_notice("%s authentication succeeded", prot);
-
-    /* Save the authentication method for later. */
-    pcb->auth_done |= bit;
-
-    /*
-     * If there is no more authentication still being done,
-     * proceed to the network (or callback) phase.
-     */
-    if ((pcb->auth_pending &= ~bit) == 0)
-       network_phase(pcb);
-}
-#endif /* PPP_AUTH_SUPPORT */
-
-
-/*
- * np_up - a network protocol has come up.
- */
-void np_up(ppp_pcb *pcb, int proto) {
-#if PPP_IDLETIMELIMIT
-    int tlim;
-#endif /* PPP_IDLETIMELIMIT */
-    LWIP_UNUSED_ARG(proto);
-
-    if (pcb->num_np_up == 0) {
-       /*
-        * At this point we consider that the link has come up successfully.
-        */
-       new_phase(pcb, PPP_PHASE_RUNNING);
-
-#if PPP_IDLETIMELIMIT
-#if 0 /* UNUSED */
-       if (idle_time_hook != 0)
-           tlim = (*idle_time_hook)(NULL);
-       else
-#endif /* UNUSED */
-           tlim = pcb->settings.idle_time_limit;
-       if (tlim > 0)
-           TIMEOUT(check_idle, (void*)pcb, tlim);
-#endif /* PPP_IDLETIMELIMIT */
-
-#if PPP_MAXCONNECT
-       /*
-        * Set a timeout to close the connection once the maximum
-        * connect time has expired.
-        */
-       if (pcb->settings.maxconnect > 0)
-           TIMEOUT(connect_time_expired, (void*)pcb, pcb->settings.maxconnect);
-#endif /* PPP_MAXCONNECT */
-
-#ifdef MAXOCTETS
-       if (maxoctets > 0)
-           TIMEOUT(check_maxoctets, NULL, maxoctets_timeout);
-#endif
-
-#if 0 /* Unused */
-       /*
-        * Detach now, if the updetach option was given.
-        */
-       if (updetach && !nodetach)
-           detach();
-#endif /* Unused */
-    }
-    ++pcb->num_np_up;
-}
-
-/*
- * np_down - a network protocol has gone down.
- */
-void np_down(ppp_pcb *pcb, int proto) {
-    LWIP_UNUSED_ARG(proto);
-    if (--pcb->num_np_up == 0) {
-#if PPP_IDLETIMELIMIT
-       UNTIMEOUT(check_idle, (void*)pcb);
-#endif /* PPP_IDLETIMELIMIT */
-#if PPP_MAXCONNECT
-       UNTIMEOUT(connect_time_expired, NULL);
-#endif /* PPP_MAXCONNECT */
-#ifdef MAXOCTETS
-       UNTIMEOUT(check_maxoctets, NULL);
-#endif
-       new_phase(pcb, PPP_PHASE_NETWORK);
-    }
-}
-
-/*
- * np_finished - a network protocol has finished using the link.
- */
-void np_finished(ppp_pcb *pcb, int proto) {
-    LWIP_UNUSED_ARG(proto);
-    if (--pcb->num_np_open <= 0) {
-       /* no further use for the link: shut up shop. */
-       lcp_close(pcb, "No network protocols running");
-    }
-}
-
-#ifdef MAXOCTETS
-static void
-check_maxoctets(arg)
-    void *arg;
-{
-#if PPP_STATS_SUPPORT
-    unsigned int used;
-
-    update_link_stats(ifunit);
-    link_stats_valid=0;
-
-    switch(maxoctets_dir) {
-       case PPP_OCTETS_DIRECTION_IN:
-           used = link_stats.bytes_in;
-           break;
-       case PPP_OCTETS_DIRECTION_OUT:
-           used = link_stats.bytes_out;
-           break;
-       case PPP_OCTETS_DIRECTION_MAXOVERAL:
-       case PPP_OCTETS_DIRECTION_MAXSESSION:
-           used = (link_stats.bytes_in > link_stats.bytes_out) ? link_stats.bytes_in : link_stats.bytes_out;
-           break;
-       default:
-           used = link_stats.bytes_in+link_stats.bytes_out;
-           break;
-    }
-    if (used > maxoctets) {
-       ppp_notice("Traffic limit reached. Limit: %u Used: %u", maxoctets, used);
-       status = EXIT_TRAFFIC_LIMIT;
-       lcp_close(pcb, "Traffic limit");
-#if 0 /* UNUSED */
-       need_holdoff = 0;
-#endif /* UNUSED */
-    } else {
-        TIMEOUT(check_maxoctets, NULL, maxoctets_timeout);
-    }
-#endif /* PPP_STATS_SUPPORT */
-}
-#endif /* MAXOCTETS */
-
-#if PPP_IDLETIMELIMIT
-/*
- * check_idle - check whether the link has been idle for long
- * enough that we can shut it down.
- */
-static void check_idle(void *arg) {
-    ppp_pcb *pcb = (ppp_pcb*)arg;
-    struct ppp_idle idle;
-    time_t itime;
-    int tlim;
-
-    if (!get_idle_time(pcb, &idle))
-       return;
-#if 0 /* UNUSED */
-    if (idle_time_hook != 0) {
-       tlim = idle_time_hook(&idle);
-    } else {
-#endif /* UNUSED */
-       itime = LWIP_MIN(idle.xmit_idle, idle.recv_idle);
-       tlim = pcb->settings.idle_time_limit - itime;
-#if 0 /* UNUSED */
-    }
-#endif /* UNUSED */
-    if (tlim <= 0) {
-       /* link is idle: shut it down. */
-       ppp_notice("Terminating connection due to lack of activity.");
-       pcb->err_code = PPPERR_IDLETIMEOUT;
-       lcp_close(pcb, "Link inactive");
-#if 0 /* UNUSED */
-       need_holdoff = 0;
-#endif /* UNUSED */
-    } else {
-       TIMEOUT(check_idle, (void*)pcb, tlim);
-    }
-}
-#endif /* PPP_IDLETIMELIMIT */
-
-#if PPP_MAXCONNECT
-/*
- * connect_time_expired - log a message and close the connection.
- */
-static void connect_time_expired(void *arg) {
-    ppp_pcb *pcb = (ppp_pcb*)arg;
-    ppp_info("Connect time expired");
-    pcb->err_code = PPPERR_CONNECTTIME;
-    lcp_close(pcb, "Connect time expired");    /* Close connection */
-}
-#endif /* PPP_MAXCONNECT */
-
-#if PPP_OPTIONS
-/*
- * auth_check_options - called to check authentication options.
- */
-void
-auth_check_options()
-{
-    lcp_options *wo = &lcp_wantoptions[0];
-    int can_auth;
-    int lacks_ip;
-
-    /* Default our_name to hostname, and user to our_name */
-    if (our_name[0] == 0 || usehostname)
-       strlcpy(our_name, hostname, sizeof(our_name));
-    /* If a blank username was explicitly given as an option, trust
-       the user and don't use our_name */
-    if (ppp_settings.user[0] == 0 && !explicit_user)
-       strlcpy(ppp_settings.user, our_name, sizeof(ppp_settings.user));
-
-    /*
-     * If we have a default route, require the peer to authenticate
-     * unless the noauth option was given or the real user is root.
-     */
-    if (!auth_required && !allow_any_ip && have_route_to(0) && !privileged) {
-       auth_required = 1;
-       default_auth = 1;
-    }
-
-#if CHAP_SUPPORT
-    /* If we selected any CHAP flavors, we should probably negotiate it. :-) */
-    if (wo->chap_mdtype)
-       wo->neg_chap = 1;
-#endif /* CHAP_SUPPORT */
-
-    /* If authentication is required, ask peer for CHAP, PAP, or EAP. */
-    if (auth_required) {
-       allow_any_ip = 0;
-       if (1
-#if CHAP_SUPPORT
-           && !wo->neg_chap
-#endif /* CHAP_SUPPORT */
-#if PAP_SUPPORT
-           && !wo->neg_upap
-#endif /* PAP_SUPPORT */
-#if EAP_SUPPORT
-           && !wo->neg_eap
-#endif /* EAP_SUPPORT */
-           ) {
-#if CHAP_SUPPORT
-           wo->neg_chap = CHAP_MDTYPE_SUPPORTED != MDTYPE_NONE;
-           wo->chap_mdtype = CHAP_MDTYPE_SUPPORTED;
-#endif /* CHAP_SUPPORT */
-#if PAP_SUPPORT
-           wo->neg_upap = 1;
-#endif /* PAP_SUPPORT */
-#if EAP_SUPPORT
-           wo->neg_eap = 1;
-#endif /* EAP_SUPPORT */
-       }
-    } else {
-#if CHAP_SUPPORT
-       wo->neg_chap = 0;
-       wo->chap_mdtype = MDTYPE_NONE;
-#endif /* CHAP_SUPPORT */
-#if PAP_SUPPORT
-       wo->neg_upap = 0;
-#endif /* PAP_SUPPORT */
-#if EAP_SUPPORT
-       wo->neg_eap = 0;
-#endif /* EAP_SUPPORT */
-    }
-
-    /*
-     * Check whether we have appropriate secrets to use
-     * to authenticate the peer.  Note that EAP can authenticate by way
-     * of a CHAP-like exchanges as well as SRP.
-     */
-    lacks_ip = 0;
-#if PAP_SUPPORT
-    can_auth = wo->neg_upap && (uselogin || have_pap_secret(&lacks_ip));
-#else
-    can_auth = 0;
-#endif /* PAP_SUPPORT */
-    if (!can_auth && (0
-#if CHAP_SUPPORT
-       || wo->neg_chap
-#endif /* CHAP_SUPPORT */
-#if EAP_SUPPORT
-       || wo->neg_eap
-#endif /* EAP_SUPPORT */
-       )) {
-#if CHAP_SUPPORT
-       can_auth = have_chap_secret((explicit_remote? remote_name: NULL),
-                                   our_name, 1, &lacks_ip);
-#else
-       can_auth = 0;
-#endif
-    }
-    if (!can_auth
-#if EAP_SUPPORT
-       && wo->neg_eap
-#endif /* EAP_SUPPORT */
-       ) {
-       can_auth = have_srp_secret((explicit_remote? remote_name: NULL),
-                                   our_name, 1, &lacks_ip);
-    }
-
-    if (auth_required && !can_auth && noauth_addrs == NULL) {
-       if (default_auth) {
-           option_error(
-"By default the remote system is required to authenticate itself");
-           option_error(
-"(because this system has a default route to the internet)");
-       } else if (explicit_remote)
-           option_error(
-"The remote system (%s) is required to authenticate itself",
-                        remote_name);
-       else
-           option_error(
-"The remote system is required to authenticate itself");
-       option_error(
-"but I couldn't find any suitable secret (password) for it to use to do so.");
-       if (lacks_ip)
-           option_error(
-"(None of the available passwords would let it use an IP address.)");
-
-       exit(1);
-    }
-
-    /*
-     * Early check for remote number authorization.
-     */
-    if (!auth_number()) {
-       ppp_warn("calling number %q is not authorized", remote_number);
-       exit(EXIT_CNID_AUTH_FAILED);
-    }
-}
-#endif /* PPP_OPTIONS */
-
-#if 0 /* UNUSED */
-/*
- * auth_reset - called when LCP is starting negotiations to recheck
- * authentication options, i.e. whether we have appropriate secrets
- * to use for authenticating ourselves and/or the peer.
- */
-void
-auth_reset(unit)
-    int unit;
-{
-    lcp_options *go = &lcp_gotoptions[unit];
-    lcp_options *ao = &lcp_allowoptions[unit];
-    int hadchap;
-
-    hadchap = -1;
-    ao->neg_upap = !refuse_pap && (passwd[0] != 0 || get_pap_passwd(NULL));
-    ao->neg_chap = (!refuse_chap || !refuse_mschap || !refuse_mschap_v2)
-       && (passwd[0] != 0 ||
-           (hadchap = have_chap_secret(user, (explicit_remote? remote_name:
-                                              NULL), 0, NULL)));
-    ao->neg_eap = !refuse_eap && (
-       passwd[0] != 0 ||
-       (hadchap == 1 || (hadchap == -1 && have_chap_secret(user,
-           (explicit_remote? remote_name: NULL), 0, NULL))) ||
-       have_srp_secret(user, (explicit_remote? remote_name: NULL), 0, NULL));
-
-    hadchap = -1;
-    if (go->neg_upap && !uselogin && !have_pap_secret(NULL))
-       go->neg_upap = 0;
-    if (go->neg_chap) {
-       if (!(hadchap = have_chap_secret((explicit_remote? remote_name: NULL),
-                             our_name, 1, NULL)))
-           go->neg_chap = 0;
-    }
-    if (go->neg_eap &&
-       (hadchap == 0 || (hadchap == -1 &&
-           !have_chap_secret((explicit_remote? remote_name: NULL), our_name,
-               1, NULL))) &&
-       !have_srp_secret((explicit_remote? remote_name: NULL), our_name, 1,
-           NULL))
-       go->neg_eap = 0;
-}
-
-/*
- * check_passwd - Check the user name and passwd against the PAP secrets
- * file.  If requested, also check against the system password database,
- * and login the user if OK.
- *
- * returns:
- *     UPAP_AUTHNAK: Authentication failed.
- *     UPAP_AUTHACK: Authentication succeeded.
- * In either case, msg points to an appropriate message.
- */
-int
-check_passwd(unit, auser, userlen, apasswd, passwdlen, msg)
-    int unit;
-    char *auser;
-    int userlen;
-    char *apasswd;
-    int passwdlen;
-    char **msg;
-{
-  return UPAP_AUTHNAK;
-    int ret;
-    char *filename;
-    FILE *f;
-    struct wordlist *addrs = NULL, *opts = NULL;
-    char passwd[256], user[256];
-    char secret[MAXWORDLEN];
-    static int attempts = 0;
-
-    /*
-     * Make copies of apasswd and auser, then null-terminate them.
-     * If there are unprintable characters in the password, make
-     * them visible.
-     */
-    slprintf(ppp_settings.passwd, sizeof(ppp_settings.passwd), "%.*v", passwdlen, apasswd);
-    slprintf(ppp_settings.user, sizeof(ppp_settings.user), "%.*v", userlen, auser);
-    *msg = "";
-
-    /*
-     * Check if a plugin wants to handle this.
-     */
-    if (pap_auth_hook) {
-       ret = (*pap_auth_hook)(ppp_settings.user, ppp_settings.passwd, msg, &addrs, &opts);
-       if (ret >= 0) {
-           /* note: set_allowed_addrs() saves opts (but not addrs):
-              don't free it! */
-           if (ret)
-               set_allowed_addrs(unit, addrs, opts);
-           else if (opts != 0)
-               free_wordlist(opts);
-           if (addrs != 0)
-               free_wordlist(addrs);
-           BZERO(ppp_settings.passwd, sizeof(ppp_settings.passwd));
-           return ret? UPAP_AUTHACK: UPAP_AUTHNAK;
-       }
-    }
-
-    /*
-     * Open the file of pap secrets and scan for a suitable secret
-     * for authenticating this user.
-     */
-    filename = _PATH_UPAPFILE;
-    addrs = opts = NULL;
-    ret = UPAP_AUTHNAK;
-    f = fopen(filename, "r");
-    if (f == NULL) {
-       ppp_error("Can't open PAP password file %s: %m", filename);
-
-    } else {
-       check_access(f, filename);
-       if (scan_authfile(f, ppp_settings.user, our_name, secret, &addrs, &opts, filename, 0) < 0) {
-           ppp_warn("no PAP secret found for %s", user);
-       } else {
-           /*
-            * If the secret is "@login", it means to check
-            * the password against the login database.
-            */
-           int login_secret = strcmp(secret, "@login") == 0;
-           ret = UPAP_AUTHACK;
-           if (uselogin || login_secret) {
-               /* login option or secret is @login */
-               if (session_full(ppp_settings.user, ppp_settings.passwd, devnam, msg) == 0) {
-                   ret = UPAP_AUTHNAK;
-               }
-           } else if (session_mgmt) {
-               if (session_check(ppp_settings.user, NULL, devnam, NULL) == 0) {
-                   ppp_warn("Peer %q failed PAP Session verification", user);
-                   ret = UPAP_AUTHNAK;
-               }
-           }
-           if (secret[0] != 0 && !login_secret) {
-               /* password given in pap-secrets - must match */
-               if ((cryptpap || strcmp(ppp_settings.passwd, secret) != 0)
-                   && strcmp(crypt(ppp_settings.passwd, secret), secret) != 0)
-                   ret = UPAP_AUTHNAK;
-           }
-       }
-       fclose(f);
-    }
-
-    if (ret == UPAP_AUTHNAK) {
-        if (**msg == 0)
-           *msg = "Login incorrect";
-       /*
-        * XXX can we ever get here more than once??
-        * Frustrate passwd stealer programs.
-        * Allow 10 tries, but start backing off after 3 (stolen from login).
-        * On 10'th, drop the connection.
-        */
-       if (attempts++ >= 10) {
-           ppp_warn("%d LOGIN FAILURES ON %s, %s", attempts, devnam, user);
-           lcp_close(pcb, "login failed");
-       }
-       if (attempts > 3)
-           sleep((u_int) (attempts - 3) * 5);
-       if (opts != NULL)
-           free_wordlist(opts);
-
-    } else {
-       attempts = 0;                   /* Reset count */
-       if (**msg == 0)
-           *msg = "Login ok";
-       set_allowed_addrs(unit, addrs, opts);
-    }
-
-    if (addrs != NULL)
-       free_wordlist(addrs);
-    BZERO(ppp_settings.passwd, sizeof(ppp_settings.passwd));
-    BZERO(secret, sizeof(secret));
-
-    return ret;
-}
-
-/*
- * null_login - Check if a username of "" and a password of "" are
- * acceptable, and iff so, set the list of acceptable IP addresses
- * and return 1.
- */
-static int
-null_login(unit)
-    int unit;
-{
-    char *filename;
-    FILE *f;
-    int i, ret;
-    struct wordlist *addrs, *opts;
-    char secret[MAXWORDLEN];
-
-    /*
-     * Check if a plugin wants to handle this.
-     */
-    ret = -1;
-    if (null_auth_hook)
-       ret = (*null_auth_hook)(&addrs, &opts);
-
-    /*
-     * Open the file of pap secrets and scan for a suitable secret.
-     */
-    if (ret <= 0) {
-       filename = _PATH_UPAPFILE;
-       addrs = NULL;
-       f = fopen(filename, "r");
-       if (f == NULL)
-           return 0;
-       check_access(f, filename);
-
-       i = scan_authfile(f, "", our_name, secret, &addrs, &opts, filename, 0);
-       ret = i >= 0 && secret[0] == 0;
-       BZERO(secret, sizeof(secret));
-       fclose(f);
-    }
-
-    if (ret)
-       set_allowed_addrs(unit, addrs, opts);
-    else if (opts != 0)
-       free_wordlist(opts);
-    if (addrs != 0)
-       free_wordlist(addrs);
-
-    return ret;
-}
-
-/*
- * get_pap_passwd - get a password for authenticating ourselves with
- * our peer using PAP.  Returns 1 on success, 0 if no suitable password
- * could be found.
- * Assumes passwd points to MAXSECRETLEN bytes of space (if non-null).
- */
-static int
-get_pap_passwd(passwd)
-    char *passwd;
-{
-    char *filename;
-    FILE *f;
-    int ret;
-    char secret[MAXWORDLEN];
-
-    /*
-     * Check whether a plugin wants to supply this.
-     */
-    if (pap_passwd_hook) {
-       ret = (*pap_passwd_hook)(ppp_settings,user, ppp_settings.passwd);
-       if (ret >= 0)
-           return ret;
-    }
-
-    filename = _PATH_UPAPFILE;
-    f = fopen(filename, "r");
-    if (f == NULL)
-       return 0;
-    check_access(f, filename);
-    ret = scan_authfile(f, user,
-                       (remote_name[0]? remote_name: NULL),
-                       secret, NULL, NULL, filename, 0);
-    fclose(f);
-    if (ret < 0)
-       return 0;
-    if (passwd != NULL)
-       strlcpy(passwd, secret, MAXSECRETLEN);
-    BZERO(secret, sizeof(secret));
-    return 1;
-}
-
-/*
- * have_pap_secret - check whether we have a PAP file with any
- * secrets that we could possibly use for authenticating the peer.
- */
-static int
-have_pap_secret(lacks_ipp)
-    int *lacks_ipp;
-{
-    FILE *f;
-    int ret;
-    char *filename;
-    struct wordlist *addrs;
-
-    /* let the plugin decide, if there is one */
-    if (pap_check_hook) {
-       ret = (*pap_check_hook)();
-       if (ret >= 0)
-           return ret;
-    }
-
-    filename = _PATH_UPAPFILE;
-    f = fopen(filename, "r");
-    if (f == NULL)
-       return 0;
-
-    ret = scan_authfile(f, (explicit_remote? remote_name: NULL), our_name,
-                       NULL, &addrs, NULL, filename, 0);
-    fclose(f);
-    if (ret >= 0 && !some_ip_ok(addrs)) {
-       if (lacks_ipp != 0)
-           *lacks_ipp = 1;
-       ret = -1;
-    }
-    if (addrs != 0)
-       free_wordlist(addrs);
-
-    return ret >= 0;
-}
-
-/*
- * have_chap_secret - check whether we have a CHAP file with a
- * secret that we could possibly use for authenticating `client'
- * on `server'.  Either can be the null string, meaning we don't
- * know the identity yet.
- */
-static int
-have_chap_secret(client, server, need_ip, lacks_ipp)
-    char *client;
-    char *server;
-    int need_ip;
-    int *lacks_ipp;
-{
-    FILE *f;
-    int ret;
-    char *filename;
-    struct wordlist *addrs;
-
-    if (chap_check_hook) {
-       ret = (*chap_check_hook)();
-       if (ret >= 0) {
-           return ret;
-       }
-    }
-
-    filename = _PATH_CHAPFILE;
-    f = fopen(filename, "r");
-    if (f == NULL)
-       return 0;
-
-    if (client != NULL && client[0] == 0)
-       client = NULL;
-    else if (server != NULL && server[0] == 0)
-       server = NULL;
-
-    ret = scan_authfile(f, client, server, NULL, &addrs, NULL, filename, 0);
-    fclose(f);
-    if (ret >= 0 && need_ip && !some_ip_ok(addrs)) {
-       if (lacks_ipp != 0)
-           *lacks_ipp = 1;
-       ret = -1;
-    }
-    if (addrs != 0)
-       free_wordlist(addrs);
-
-    return ret >= 0;
-}
-
-/*
- * have_srp_secret - check whether we have a SRP file with a
- * secret that we could possibly use for authenticating `client'
- * on `server'.  Either can be the null string, meaning we don't
- * know the identity yet.
- */
-static int
-have_srp_secret(client, server, need_ip, lacks_ipp)
-    char *client;
-    char *server;
-    int need_ip;
-    int *lacks_ipp;
-{
-    FILE *f;
-    int ret;
-    char *filename;
-    struct wordlist *addrs;
-
-    filename = _PATH_SRPFILE;
-    f = fopen(filename, "r");
-    if (f == NULL)
-       return 0;
-
-    if (client != NULL && client[0] == 0)
-       client = NULL;
-    else if (server != NULL && server[0] == 0)
-       server = NULL;
-
-    ret = scan_authfile(f, client, server, NULL, &addrs, NULL, filename, 0);
-    fclose(f);
-    if (ret >= 0 && need_ip && !some_ip_ok(addrs)) {
-       if (lacks_ipp != 0)
-           *lacks_ipp = 1;
-       ret = -1;
-    }
-    if (addrs != 0)
-       free_wordlist(addrs);
-
-    return ret >= 0;
-}
-#endif /* UNUSED */
-
-#if PPP_AUTH_SUPPORT
-/*
- * get_secret - open the CHAP secret file and return the secret
- * for authenticating the given client on the given server.
- * (We could be either client or server).
- */
-int get_secret(ppp_pcb *pcb, const char *client, const char *server, char *secret, int *secret_len, int am_server) {
-  int len;
-  LWIP_UNUSED_ARG(server);
-  LWIP_UNUSED_ARG(am_server);
-
-  if (!client || !client[0] || !pcb->settings.user || !pcb->settings.passwd || strcmp(client, pcb->settings.user)) {
-    return 0;
-  }
-
-  len = (int)strlen(pcb->settings.passwd);
-  if (len > MAXSECRETLEN) {
-    ppp_error("Secret for %s on %s is too long", client, server);
-    len = MAXSECRETLEN;
-  }
-
-  MEMCPY(secret, pcb->settings.passwd, len);
-  *secret_len = len;
-  return 1;
-
-#if 0 /* UNUSED */
-    FILE *f;
-    int ret, len;
-    char *filename;
-    struct wordlist *addrs, *opts;
-    char secbuf[MAXWORDLEN];
-    struct wordlist *addrs;
-    addrs = NULL;
-
-    if (!am_server && ppp_settings.passwd[0] != 0) {
-       strlcpy(secbuf, ppp_settings.passwd, sizeof(secbuf));
-    } else if (!am_server && chap_passwd_hook) {
-       if ( (*chap_passwd_hook)(client, secbuf) < 0) {
-           ppp_error("Unable to obtain CHAP password for %s on %s from plugin",
-                 client, server);
-           return 0;
-       }
-    } else {
-       filename = _PATH_CHAPFILE;
-       addrs = NULL;
-       secbuf[0] = 0;
-
-       f = fopen(filename, "r");
-       if (f == NULL) {
-           ppp_error("Can't open chap secret file %s: %m", filename);
-           return 0;
-       }
-       check_access(f, filename);
-
-       ret = scan_authfile(f, client, server, secbuf, &addrs, &opts, filename, 0);
-       fclose(f);
-       if (ret < 0)
-           return 0;
-
-       if (am_server)
-           set_allowed_addrs(unit, addrs, opts);
-       else if (opts != 0)
-           free_wordlist(opts);
-       if (addrs != 0)
-           free_wordlist(addrs);
-    }
-
-    len = strlen(secbuf);
-    if (len > MAXSECRETLEN) {
-       ppp_error("Secret for %s on %s is too long", client, server);
-       len = MAXSECRETLEN;
-    }
-    MEMCPY(secret, secbuf, len);
-    BZERO(secbuf, sizeof(secbuf));
-    *secret_len = len;
-
-    return 1;
-#endif /* UNUSED */
-}
-#endif /* PPP_AUTH_SUPPORT */
-
-
-#if 0 /* UNUSED */
-/*
- * get_srp_secret - open the SRP secret file and return the secret
- * for authenticating the given client on the given server.
- * (We could be either client or server).
- */
-int
-get_srp_secret(unit, client, server, secret, am_server)
-    int unit;
-    char *client;
-    char *server;
-    char *secret;
-    int am_server;
-{
-    FILE *fp;
-    int ret;
-    char *filename;
-    struct wordlist *addrs, *opts;
-
-    if (!am_server && ppp_settings.passwd[0] != '\0') {
-       strlcpy(secret, ppp_settings.passwd, MAXWORDLEN);
-    } else {
-       filename = _PATH_SRPFILE;
-       addrs = NULL;
-
-       fp = fopen(filename, "r");
-       if (fp == NULL) {
-           ppp_error("Can't open srp secret file %s: %m", filename);
-           return 0;
-       }
-       check_access(fp, filename);
-
-       secret[0] = '\0';
-       ret = scan_authfile(fp, client, server, secret, &addrs, &opts,
-           filename, am_server);
-       fclose(fp);
-       if (ret < 0)
-           return 0;
-
-       if (am_server)
-           set_allowed_addrs(unit, addrs, opts);
-       else if (opts != NULL)
-           free_wordlist(opts);
-       if (addrs != NULL)
-           free_wordlist(addrs);
-    }
-
-    return 1;
-}
-
-/*
- * set_allowed_addrs() - set the list of allowed addresses.
- * Also looks for `--' indicating options to apply for this peer
- * and leaves the following words in extra_options.
- */
-static void
-set_allowed_addrs(unit, addrs, opts)
-    int unit;
-    struct wordlist *addrs;
-    struct wordlist *opts;
-{
-    int n;
-    struct wordlist *ap, **plink;
-    struct permitted_ip *ip;
-    char *ptr_word, *ptr_mask;
-    struct hostent *hp;
-    struct netent *np;
-    u32_t a, mask, ah, offset;
-    struct ipcp_options *wo = &ipcp_wantoptions[unit];
-    u32_t suggested_ip = 0;
-
-    if (addresses[unit] != NULL)
-       free(addresses[unit]);
-    addresses[unit] = NULL;
-    if (extra_options != NULL)
-       free_wordlist(extra_options);
-    extra_options = opts;
-
-    /*
-     * Count the number of IP addresses given.
-     */
-    n = wordlist_count(addrs) + wordlist_count(noauth_addrs);
-    if (n == 0)
-       return;
-    ip = (struct permitted_ip *) mem_malloc((n + 1) * sizeof(struct permitted_ip));
-    if (ip == 0)
-       return;
-
-    /* temporarily append the noauth_addrs list to addrs */
-    for (plink = &addrs; *plink != NULL; plink = &(*plink)->next)
-       ;
-    *plink = noauth_addrs;
-
-    n = 0;
-    for (ap = addrs; ap != NULL; ap = ap->next) {
-       /* "-" means no addresses authorized, "*" means any address allowed */
-       ptr_word = ap->word;
-       if (strcmp(ptr_word, "-") == 0)
-           break;
-       if (strcmp(ptr_word, "*") == 0) {
-           ip[n].permit = 1;
-           ip[n].base = ip[n].mask = 0;
-           ++n;
-           break;
-       }
-
-       ip[n].permit = 1;
-       if (*ptr_word == '!') {
-           ip[n].permit = 0;
-           ++ptr_word;
-       }
-
-       mask = ~ (u32_t) 0;
-       offset = 0;
-       ptr_mask = strchr (ptr_word, '/');
-       if (ptr_mask != NULL) {
-           int bit_count;
-           char *endp;
-
-           bit_count = (int) strtol (ptr_mask+1, &endp, 10);
-           if (bit_count <= 0 || bit_count > 32) {
-               ppp_warn("invalid address length %v in auth. address list",
-                    ptr_mask+1);
-               continue;
-           }
-           bit_count = 32 - bit_count; /* # bits in host part */
-           if (*endp == '+') {
-               offset = ifunit + 1;
-               ++endp;
-           }
-           if (*endp != 0) {
-               ppp_warn("invalid address length syntax: %v", ptr_mask+1);
-               continue;
-           }
-           *ptr_mask = '\0';
-           mask <<= bit_count;
-       }
-
-       hp = gethostbyname(ptr_word);
-       if (hp != NULL && hp->h_addrtype == AF_INET) {
-           a = *(u32_t *)hp->h_addr;
-       } else {
-           np = getnetbyname (ptr_word);
-           if (np != NULL && np->n_addrtype == AF_INET) {
-               a = htonl ((u32_t)np->n_net);
-               if (ptr_mask == NULL) {
-                   /* calculate appropriate mask for net */
-                   ah = ntohl(a);
-                   if (IN_CLASSA(ah))
-                       mask = IN_CLASSA_NET;
-                   else if (IN_CLASSB(ah))
-                       mask = IN_CLASSB_NET;
-                   else if (IN_CLASSC(ah))
-                       mask = IN_CLASSC_NET;
-               }
-           } else {
-               a = inet_addr (ptr_word);
-           }
-       }
-
-       if (ptr_mask != NULL)
-           *ptr_mask = '/';
-
-       if (a == (u32_t)-1L) {
-           ppp_warn("unknown host %s in auth. address list", ap->word);
-           continue;
-       }
-       if (offset != 0) {
-           if (offset >= ~mask) {
-               ppp_warn("interface unit %d too large for subnet %v",
-                    ifunit, ptr_word);
-               continue;
-           }
-           a = htonl((ntohl(a) & mask) + offset);
-           mask = ~(u32_t)0;
-       }
-       ip[n].mask = htonl(mask);
-       ip[n].base = a & ip[n].mask;
-       ++n;
-       if (~mask == 0 && suggested_ip == 0)
-           suggested_ip = a;
-    }
-    *plink = NULL;
-
-    ip[n].permit = 0;          /* make the last entry forbid all addresses */
-    ip[n].base = 0;            /* to terminate the list */
-    ip[n].mask = 0;
-
-    addresses[unit] = ip;
-
-    /*
-     * If the address given for the peer isn't authorized, or if
-     * the user hasn't given one, AND there is an authorized address
-     * which is a single host, then use that if we find one.
-     */
-    if (suggested_ip != 0
-       && (wo->hisaddr == 0 || !auth_ip_addr(unit, wo->hisaddr))) {
-       wo->hisaddr = suggested_ip;
-       /*
-        * Do we insist on this address?  No, if there are other
-        * addresses authorized than the suggested one.
-        */
-       if (n > 1)
-           wo->accept_remote = 1;
-    }
-}
-
-/*
- * auth_ip_addr - check whether the peer is authorized to use
- * a given IP address.  Returns 1 if authorized, 0 otherwise.
- */
-int
-auth_ip_addr(unit, addr)
-    int unit;
-    u32_t addr;
-{
-    int ok;
-
-    /* don't allow loopback or multicast address */
-    if (bad_ip_adrs(addr))
-       return 0;
-
-    if (allowed_address_hook) {
-       ok = allowed_address_hook(addr);
-       if (ok >= 0) return ok;
-    }
-
-    if (addresses[unit] != NULL) {
-       ok = ip_addr_check(addr, addresses[unit]);
-       if (ok >= 0)
-           return ok;
-    }
-
-    if (auth_required)
-       return 0;               /* no addresses authorized */
-    return allow_any_ip || privileged || !have_route_to(addr);
-}
-
-static int
-ip_addr_check(addr, addrs)
-    u32_t addr;
-    struct permitted_ip *addrs;
-{
-    for (; ; ++addrs)
-       if ((addr & addrs->mask) == addrs->base)
-           return addrs->permit;
-}
-
-/*
- * bad_ip_adrs - return 1 if the IP address is one we don't want
- * to use, such as an address in the loopback net or a multicast address.
- * addr is in network byte order.
- */
-int
-bad_ip_adrs(addr)
-    u32_t addr;
-{
-    addr = ntohl(addr);
-    return (addr >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET
-       || IN_MULTICAST(addr) || IN_BADCLASS(addr);
-}
-
-/*
- * some_ip_ok - check a wordlist to see if it authorizes any
- * IP address(es).
- */
-static int
-some_ip_ok(addrs)
-    struct wordlist *addrs;
-{
-    for (; addrs != 0; addrs = addrs->next) {
-       if (addrs->word[0] == '-')
-           break;
-       if (addrs->word[0] != '!')
-           return 1;           /* some IP address is allowed */
-    }
-    return 0;
-}
-
-/*
- * auth_number - check whether the remote number is allowed to connect.
- * Returns 1 if authorized, 0 otherwise.
- */
-int
-auth_number()
-{
-    struct wordlist *wp = permitted_numbers;
-    int l;
-
-    /* Allow all if no authorization list. */
-    if (!wp)
-       return 1;
-
-    /* Allow if we have a match in the authorization list. */
-    while (wp) {
-       /* trailing '*' wildcard */
-       l = strlen(wp->word);
-       if ((wp->word)[l - 1] == '*')
-           l--;
-       if (!strncasecmp(wp->word, remote_number, l))
-           return 1;
-       wp = wp->next;
-    }
-
-    return 0;
-}
-
-/*
- * check_access - complain if a secret file has too-liberal permissions.
- */
-static void
-check_access(f, filename)
-    FILE *f;
-    char *filename;
-{
-    struct stat sbuf;
-
-    if (fstat(fileno(f), &sbuf) < 0) {
-       ppp_warn("cannot stat secret file %s: %m", filename);
-    } else if ((sbuf.st_mode & (S_IRWXG | S_IRWXO)) != 0) {
-       ppp_warn("Warning - secret file %s has world and/or group access",
-            filename);
-    }
-}
-
-/*
- * scan_authfile - Scan an authorization file for a secret suitable
- * for authenticating `client' on `server'.  The return value is -1
- * if no secret is found, otherwise >= 0.  The return value has
- * NONWILD_CLIENT set if the secret didn't have "*" for the client, and
- * NONWILD_SERVER set if the secret didn't have "*" for the server.
- * Any following words on the line up to a "--" (i.e. address authorization
- * info) are placed in a wordlist and returned in *addrs.  Any
- * following words (extra options) are placed in a wordlist and
- * returned in *opts.
- * We assume secret is NULL or points to MAXWORDLEN bytes of space.
- * Flags are non-zero if we need two colons in the secret in order to
- * match.
- */
-static int
-scan_authfile(f, client, server, secret, addrs, opts, filename, flags)
-    FILE *f;
-    char *client;
-    char *server;
-    char *secret;
-    struct wordlist **addrs;
-    struct wordlist **opts;
-    char *filename;
-    int flags;
-{
-    int newline, xxx;
-    int got_flag, best_flag;
-    FILE *sf;
-    struct wordlist *ap, *addr_list, *alist, **app;
-    char word[MAXWORDLEN];
-    char atfile[MAXWORDLEN];
-    char lsecret[MAXWORDLEN];
-    char *cp;
-
-    if (addrs != NULL)
-       *addrs = NULL;
-    if (opts != NULL)
-       *opts = NULL;
-    addr_list = NULL;
-    if (!getword(f, word, &newline, filename))
-       return -1;              /* file is empty??? */
-    newline = 1;
-    best_flag = -1;
-    for (;;) {
-       /*
-        * Skip until we find a word at the start of a line.
-        */
-       while (!newline && getword(f, word, &newline, filename))
-           ;
-       if (!newline)
-           break;              /* got to end of file */
-
-       /*
-        * Got a client - check if it's a match or a wildcard.
-        */
-       got_flag = 0;
-       if (client != NULL && strcmp(word, client) != 0 && !ISWILD(word)) {
-           newline = 0;
-           continue;
-       }
-       if (!ISWILD(word))
-           got_flag = NONWILD_CLIENT;
-
-       /*
-        * Now get a server and check if it matches.
-        */
-       if (!getword(f, word, &newline, filename))
-           break;
-       if (newline)
-           continue;
-       if (!ISWILD(word)) {
-           if (server != NULL && strcmp(word, server) != 0)
-               continue;
-           got_flag |= NONWILD_SERVER;
-       }
-
-       /*
-        * Got some sort of a match - see if it's better than what
-        * we have already.
-        */
-       if (got_flag <= best_flag)
-           continue;
-
-       /*
-        * Get the secret.
-        */
-       if (!getword(f, word, &newline, filename))
-           break;
-       if (newline)
-           continue;
-
-       /*
-        * SRP-SHA1 authenticator should never be reading secrets from
-        * a file.  (Authenticatee may, though.)
-        */
-       if (flags && ((cp = strchr(word, ':')) == NULL ||
-           strchr(cp + 1, ':') == NULL))
-           continue;
-
-       if (secret != NULL) {
-           /*
-            * Special syntax: @/pathname means read secret from file.
-            */
-           if (word[0] == '@' && word[1] == '/') {
-               strlcpy(atfile, word+1, sizeof(atfile));
-               if ((sf = fopen(atfile, "r")) == NULL) {
-                   ppp_warn("can't open indirect secret file %s", atfile);
-                   continue;
-               }
-               check_access(sf, atfile);
-               if (!getword(sf, word, &xxx, atfile)) {
-                   ppp_warn("no secret in indirect secret file %s", atfile);
-                   fclose(sf);
-                   continue;
-               }
-               fclose(sf);
-           }
-           strlcpy(lsecret, word, sizeof(lsecret));
-       }
-
-       /*
-        * Now read address authorization info and make a wordlist.
-        */
-       app = &alist;
-       for (;;) {
-           if (!getword(f, word, &newline, filename) || newline)
-               break;
-           ap = (struct wordlist *)
-                   mem_malloc(sizeof(struct wordlist) + strlen(word) + 1);
-           if (ap == NULL)
-               novm("authorized addresses");
-           ap->word = (char *) (ap + 1);
-           strcpy(ap->word, word);
-           *app = ap;
-           app = &ap->next;
-       }
-       *app = NULL;
-
-       /*
-        * This is the best so far; remember it.
-        */
-       best_flag = got_flag;
-       if (addr_list)
-           free_wordlist(addr_list);
-       addr_list = alist;
-       if (secret != NULL)
-           strlcpy(secret, lsecret, MAXWORDLEN);
-
-       if (!newline)
-           break;
-    }
-
-    /* scan for a -- word indicating the start of options */
-    for (app = &addr_list; (ap = *app) != NULL; app = &ap->next)
-       if (strcmp(ap->word, "--") == 0)
-           break;
-    /* ap = start of options */
-    if (ap != NULL) {
-       ap = ap->next;          /* first option */
-       free(*app);                     /* free the "--" word */
-       *app = NULL;            /* terminate addr list */
-    }
-    if (opts != NULL)
-       *opts = ap;
-    else if (ap != NULL)
-       free_wordlist(ap);
-    if (addrs != NULL)
-       *addrs = addr_list;
-    else if (addr_list != NULL)
-       free_wordlist(addr_list);
-
-    return best_flag;
-}
-
-/*
- * wordlist_count - return the number of items in a wordlist
- */
-static int
-wordlist_count(wp)
-    struct wordlist *wp;
-{
-    int n;
-
-    for (n = 0; wp != NULL; wp = wp->next)
-       ++n;
-    return n;
-}
-
-/*
- * free_wordlist - release memory allocated for a wordlist.
- */
-static void
-free_wordlist(wp)
-    struct wordlist *wp;
-{
-    struct wordlist *next;
-
-    while (wp != NULL) {
-       next = wp->next;
-       free(wp);
-       wp = next;
-    }
-}
-#endif /* UNUSED */
-
-#endif /* PPP_SUPPORT */
diff --git a/components/lwip/netif/ppp/ccp.c b/components/lwip/netif/ppp/ccp.c
deleted file mode 100644 (file)
index 873cd68..0000000
+++ /dev/null
@@ -1,1741 +0,0 @@
-/*
- * ccp.c - PPP Compression Control Protocol.
- *
- * Copyright (c) 1994-2002 Paul Mackerras. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. The name(s) of the authors of this software must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission.
- *
- * 3. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by Paul Mackerras
- *     <paulus@samba.org>".
- *
- * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && CCP_SUPPORT  /* don't build if not configured for use in lwipopts.h */
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "netif/ppp/ppp_impl.h"
-
-#include "netif/ppp/fsm.h"
-#include "netif/ppp/ccp.h"
-
-#if MPPE_SUPPORT
-#include "netif/ppp/lcp.h"     /* lcp_close(), lcp_fsm */
-#include "netif/ppp/mppe.h"    /* mppe_init() */
-#endif /* MPPE_SUPPORT */
-
-/*
- * Unfortunately there is a bug in zlib which means that using a
- * size of 8 (window size = 256) for Deflate compression will cause
- * buffer overruns and kernel crashes in the deflate module.
- * Until this is fixed we only accept sizes in the range 9 .. 15.
- * Thanks to James Carlson for pointing this out.
- */
-#define DEFLATE_MIN_WORKS      9
-
-/*
- * Command-line options.
- */
-#if PPP_OPTIONS
-static int setbsdcomp (char **);
-static int setdeflate (char **);
-static char bsd_value[8];
-static char deflate_value[8];
-
-/*
- * Option variables.
- */
-#if MPPE_SUPPORT
-bool refuse_mppe_stateful = 1;         /* Allow stateful mode? */
-#endif /* MPPE_SUPPORT */
-
-static option_t ccp_option_list[] = {
-    { "noccp", o_bool, &ccp_protent.enabled_flag,
-      "Disable CCP negotiation" },
-    { "-ccp", o_bool, &ccp_protent.enabled_flag,
-      "Disable CCP negotiation", OPT_ALIAS },
-
-    { "bsdcomp", o_special, (void *)setbsdcomp,
-      "Request BSD-Compress packet compression",
-      OPT_PRIO | OPT_A2STRVAL | OPT_STATIC, bsd_value },
-    { "nobsdcomp", o_bool, &ccp_wantoptions[0].bsd_compress,
-      "don't allow BSD-Compress", OPT_PRIOSUB | OPT_A2CLR,
-      &ccp_allowoptions[0].bsd_compress },
-    { "-bsdcomp", o_bool, &ccp_wantoptions[0].bsd_compress,
-      "don't allow BSD-Compress", OPT_ALIAS | OPT_PRIOSUB | OPT_A2CLR,
-      &ccp_allowoptions[0].bsd_compress },
-
-    { "deflate", o_special, (void *)setdeflate,
-      "request Deflate compression",
-      OPT_PRIO | OPT_A2STRVAL | OPT_STATIC, deflate_value },
-    { "nodeflate", o_bool, &ccp_wantoptions[0].deflate,
-      "don't allow Deflate compression", OPT_PRIOSUB | OPT_A2CLR,
-      &ccp_allowoptions[0].deflate },
-    { "-deflate", o_bool, &ccp_wantoptions[0].deflate,
-      "don't allow Deflate compression", OPT_ALIAS | OPT_PRIOSUB | OPT_A2CLR,
-      &ccp_allowoptions[0].deflate },
-
-    { "nodeflatedraft", o_bool, &ccp_wantoptions[0].deflate_draft,
-      "don't use draft deflate #", OPT_A2COPY,
-      &ccp_allowoptions[0].deflate_draft },
-
-    { "predictor1", o_bool, &ccp_wantoptions[0].predictor_1,
-      "request Predictor-1", OPT_PRIO | 1 },
-    { "nopredictor1", o_bool, &ccp_wantoptions[0].predictor_1,
-      "don't allow Predictor-1", OPT_PRIOSUB | OPT_A2CLR,
-      &ccp_allowoptions[0].predictor_1 },
-    { "-predictor1", o_bool, &ccp_wantoptions[0].predictor_1,
-      "don't allow Predictor-1", OPT_ALIAS | OPT_PRIOSUB | OPT_A2CLR,
-      &ccp_allowoptions[0].predictor_1 },
-
-#if MPPE_SUPPORT
-    /* MPPE options are symmetrical ... we only set wantoptions here */
-    { "require-mppe", o_bool, &ccp_wantoptions[0].mppe,
-      "require MPPE encryption",
-      OPT_PRIO | MPPE_OPT_40 | MPPE_OPT_128 },
-    { "+mppe", o_bool, &ccp_wantoptions[0].mppe,
-      "require MPPE encryption",
-      OPT_ALIAS | OPT_PRIO | MPPE_OPT_40 | MPPE_OPT_128 },
-    { "nomppe", o_bool, &ccp_wantoptions[0].mppe,
-      "don't allow MPPE encryption", OPT_PRIO },
-    { "-mppe", o_bool, &ccp_wantoptions[0].mppe,
-      "don't allow MPPE encryption", OPT_ALIAS | OPT_PRIO },
-
-    /* We use ccp_allowoptions[0].mppe as a junk var ... it is reset later */
-    { "require-mppe-40", o_bool, &ccp_allowoptions[0].mppe,
-      "require MPPE 40-bit encryption", OPT_PRIO | OPT_A2OR | MPPE_OPT_40,
-      &ccp_wantoptions[0].mppe },
-    { "+mppe-40", o_bool, &ccp_allowoptions[0].mppe,
-      "require MPPE 40-bit encryption", OPT_PRIO | OPT_A2OR | MPPE_OPT_40,
-      &ccp_wantoptions[0].mppe },
-    { "nomppe-40", o_bool, &ccp_allowoptions[0].mppe,
-      "don't allow MPPE 40-bit encryption",
-      OPT_PRIOSUB | OPT_A2CLRB | MPPE_OPT_40, &ccp_wantoptions[0].mppe },
-    { "-mppe-40", o_bool, &ccp_allowoptions[0].mppe,
-      "don't allow MPPE 40-bit encryption",
-      OPT_ALIAS | OPT_PRIOSUB | OPT_A2CLRB | MPPE_OPT_40,
-      &ccp_wantoptions[0].mppe },
-
-    { "require-mppe-128", o_bool, &ccp_allowoptions[0].mppe,
-      "require MPPE 128-bit encryption", OPT_PRIO | OPT_A2OR | MPPE_OPT_128,
-      &ccp_wantoptions[0].mppe },
-    { "+mppe-128", o_bool, &ccp_allowoptions[0].mppe,
-      "require MPPE 128-bit encryption",
-      OPT_ALIAS | OPT_PRIO | OPT_A2OR | MPPE_OPT_128,
-      &ccp_wantoptions[0].mppe },
-    { "nomppe-128", o_bool, &ccp_allowoptions[0].mppe,
-      "don't allow MPPE 128-bit encryption",
-      OPT_PRIOSUB | OPT_A2CLRB | MPPE_OPT_128, &ccp_wantoptions[0].mppe },
-    { "-mppe-128", o_bool, &ccp_allowoptions[0].mppe,
-      "don't allow MPPE 128-bit encryption",
-      OPT_ALIAS | OPT_PRIOSUB | OPT_A2CLRB | MPPE_OPT_128,
-      &ccp_wantoptions[0].mppe },
-
-    /* strange one; we always request stateless, but will we allow stateful? */
-    { "mppe-stateful", o_bool, &refuse_mppe_stateful,
-      "allow MPPE stateful mode", OPT_PRIO },
-    { "nomppe-stateful", o_bool, &refuse_mppe_stateful,
-      "disallow MPPE stateful mode", OPT_PRIO | 1 },
-#endif /* MPPE_SUPPORT */
-
-    { NULL }
-};
-#endif /* PPP_OPTIONS */
-
-/*
- * Protocol entry points from main code.
- */
-static void ccp_init(ppp_pcb *pcb);
-static void ccp_open(ppp_pcb *pcb);
-static void ccp_close(ppp_pcb *pcb, const char *reason);
-static void ccp_lowerup(ppp_pcb *pcb);
-static void ccp_lowerdown(ppp_pcb *pcb);
-static void ccp_input(ppp_pcb *pcb, u_char *pkt, int len);
-static void ccp_protrej(ppp_pcb *pcb);
-#if PRINTPKT_SUPPORT
-static int ccp_printpkt(const u_char *p, int plen, void (*printer) (void *, const char *, ...), void *arg);
-#endif /* PRINTPKT_SUPPORT */
-#if PPP_DATAINPUT
-static void ccp_datainput(ppp_pcb *pcb, u_char *pkt, int len);
-#endif /* PPP_DATAINPUT */
-
-const struct protent ccp_protent = {
-    PPP_CCP,
-    ccp_init,
-    ccp_input,
-    ccp_protrej,
-    ccp_lowerup,
-    ccp_lowerdown,
-    ccp_open,
-    ccp_close,
-#if PRINTPKT_SUPPORT
-    ccp_printpkt,
-#endif /* PRINTPKT_SUPPORT */
-#if PPP_DATAINPUT
-    ccp_datainput,
-#endif /* PPP_DATAINPUT */
-#if PRINTPKT_SUPPORT
-    "CCP",
-    "Compressed",
-#endif /* PRINTPKT_SUPPORT */
-#if PPP_OPTIONS
-    ccp_option_list,
-    NULL,
-#endif /* PPP_OPTIONS */
-#if DEMAND_SUPPORT
-    NULL,
-    NULL
-#endif /* DEMAND_SUPPORT */
-};
-
-/*
- * Callbacks for fsm code.
- */
-static void ccp_resetci (fsm *);
-static int  ccp_cilen (fsm *);
-static void ccp_addci (fsm *, u_char *, int *);
-static int  ccp_ackci (fsm *, u_char *, int);
-static int  ccp_nakci (fsm *, u_char *, int, int);
-static int  ccp_rejci (fsm *, u_char *, int);
-static int  ccp_reqci (fsm *, u_char *, int *, int);
-static void ccp_up (fsm *);
-static void ccp_down (fsm *);
-static int  ccp_extcode (fsm *, int, int, u_char *, int);
-static void ccp_rack_timeout (void *);
-static const char *method_name (ccp_options *, ccp_options *);
-
-static const fsm_callbacks ccp_callbacks = {
-    ccp_resetci,
-    ccp_cilen,
-    ccp_addci,
-    ccp_ackci,
-    ccp_nakci,
-    ccp_rejci,
-    ccp_reqci,
-    ccp_up,
-    ccp_down,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    ccp_extcode,
-    "CCP"
-};
-
-/*
- * Do we want / did we get any compression?
- */
-static int ccp_anycompress(ccp_options *opt) {
-    return (0
-#if DEFLATE_SUPPORT
-       || (opt)->deflate
-#endif /* DEFLATE_SUPPORT */
-#if BSDCOMPRESS_SUPPORT
-       || (opt)->bsd_compress
-#endif /* BSDCOMPRESS_SUPPORT */
-#if PREDICTOR_SUPPORT
-       || (opt)->predictor_1 || (opt)->predictor_2
-#endif /* PREDICTOR_SUPPORT */
-#if MPPE_SUPPORT
-       || (opt)->mppe
-#endif /* MPPE_SUPPORT */
-       );
-}
-
-/*
- * Local state (mainly for handling reset-reqs and reset-acks).
- */
-#define RACK_PENDING   1       /* waiting for reset-ack */
-#define RREQ_REPEAT    2       /* send another reset-req if no reset-ack */
-
-#define RACKTIMEOUT    1       /* second */
-
-#if PPP_OPTIONS
-/*
- * Option parsing
- */
-static int
-setbsdcomp(argv)
-    char **argv;
-{
-    int rbits, abits;
-    char *str, *endp;
-
-    str = *argv;
-    abits = rbits = strtol(str, &endp, 0);
-    if (endp != str && *endp == ',') {
-       str = endp + 1;
-       abits = strtol(str, &endp, 0);
-    }
-    if (*endp != 0 || endp == str) {
-       option_error("invalid parameter '%s' for bsdcomp option", *argv);
-       return 0;
-    }
-    if ((rbits != 0 && (rbits < BSD_MIN_BITS || rbits > BSD_MAX_BITS))
-       || (abits != 0 && (abits < BSD_MIN_BITS || abits > BSD_MAX_BITS))) {
-       option_error("bsdcomp option values must be 0 or %d .. %d",
-                    BSD_MIN_BITS, BSD_MAX_BITS);
-       return 0;
-    }
-    if (rbits > 0) {
-       ccp_wantoptions[0].bsd_compress = 1;
-       ccp_wantoptions[0].bsd_bits = rbits;
-    } else
-       ccp_wantoptions[0].bsd_compress = 0;
-    if (abits > 0) {
-       ccp_allowoptions[0].bsd_compress = 1;
-       ccp_allowoptions[0].bsd_bits = abits;
-    } else
-       ccp_allowoptions[0].bsd_compress = 0;
-    ppp_slprintf(bsd_value, sizeof(bsd_value),
-            rbits == abits? "%d": "%d,%d", rbits, abits);
-
-    return 1;
-}
-
-static int
-setdeflate(argv)
-    char **argv;
-{
-    int rbits, abits;
-    char *str, *endp;
-
-    str = *argv;
-    abits = rbits = strtol(str, &endp, 0);
-    if (endp != str && *endp == ',') {
-       str = endp + 1;
-       abits = strtol(str, &endp, 0);
-    }
-    if (*endp != 0 || endp == str) {
-       option_error("invalid parameter '%s' for deflate option", *argv);
-       return 0;
-    }
-    if ((rbits != 0 && (rbits < DEFLATE_MIN_SIZE || rbits > DEFLATE_MAX_SIZE))
-       || (abits != 0 && (abits < DEFLATE_MIN_SIZE
-                         || abits > DEFLATE_MAX_SIZE))) {
-       option_error("deflate option values must be 0 or %d .. %d",
-                    DEFLATE_MIN_SIZE, DEFLATE_MAX_SIZE);
-       return 0;
-    }
-    if (rbits == DEFLATE_MIN_SIZE || abits == DEFLATE_MIN_SIZE) {
-       if (rbits == DEFLATE_MIN_SIZE)
-           rbits = DEFLATE_MIN_WORKS;
-       if (abits == DEFLATE_MIN_SIZE)
-           abits = DEFLATE_MIN_WORKS;
-       warn("deflate option value of %d changed to %d to avoid zlib bug",
-            DEFLATE_MIN_SIZE, DEFLATE_MIN_WORKS);
-    }
-    if (rbits > 0) {
-       ccp_wantoptions[0].deflate = 1;
-       ccp_wantoptions[0].deflate_size = rbits;
-    } else
-       ccp_wantoptions[0].deflate = 0;
-    if (abits > 0) {
-       ccp_allowoptions[0].deflate = 1;
-       ccp_allowoptions[0].deflate_size = abits;
-    } else
-       ccp_allowoptions[0].deflate = 0;
-    ppp_slprintf(deflate_value, sizeof(deflate_value),
-            rbits == abits? "%d": "%d,%d", rbits, abits);
-
-    return 1;
-}
-#endif /* PPP_OPTIONS */
-
-/*
- * ccp_init - initialize CCP.
- */
-static void ccp_init(ppp_pcb *pcb) {
-    fsm *f = &pcb->ccp_fsm;
-    ccp_options *wo = &pcb->ccp_wantoptions;
-    ccp_options *ao = &pcb->ccp_allowoptions;
-
-    f->pcb = pcb;
-    f->protocol = PPP_CCP;
-    f->callbacks = &ccp_callbacks;
-    fsm_init(f);
-
-#if 0 /* Not necessary, everything is cleared in ppp_clear() */
-    memset(wo, 0, sizeof(*wo));
-    memset(go, 0, sizeof(*go));
-    memset(ao, 0, sizeof(*ao));
-    memset(ho, 0, sizeof(*ho));
-#endif /* 0 */
-
-#if DEFLATE_SUPPORT
-    wo->deflate = 1;
-    wo->deflate_size = DEFLATE_MAX_SIZE;
-    wo->deflate_correct = 1;
-    wo->deflate_draft = 1;
-    ao->deflate = 1;
-    ao->deflate_size = DEFLATE_MAX_SIZE;
-    ao->deflate_correct = 1;
-    ao->deflate_draft = 1;
-#endif /* DEFLATE_SUPPORT */
-
-#if BSDCOMPRESS_SUPPORT
-    wo->bsd_compress = 1;
-    wo->bsd_bits = BSD_MAX_BITS;
-    ao->bsd_compress = 1;
-    ao->bsd_bits = BSD_MAX_BITS;
-#endif /* BSDCOMPRESS_SUPPORT */
-
-#if PREDICTOR_SUPPORT
-    ao->predictor_1 = 1;
-#endif /* PREDICTOR_SUPPORT */
-
-#if MPPE_SUPPORT
-    if (pcb->settings.require_mppe) {
-       wo->mppe = ao->mppe =
-                   (pcb->settings.refuse_mppe_40 ? 0 : MPPE_OPT_40)
-                 | (pcb->settings.refuse_mppe_128 ? 0 : MPPE_OPT_128);
-    }
-#endif /* MPPE_SUPPORT */
-}
-
-/*
- * ccp_open - CCP is allowed to come up.
- */
-static void ccp_open(ppp_pcb *pcb) {
-    fsm *f = &pcb->ccp_fsm;
-    ccp_options *go = &pcb->ccp_gotoptions;
-
-    if (f->state != PPP_FSM_OPENED)
-       ccp_set(pcb, 1, 0, 0, 0);
-
-    /*
-     * Find out which compressors the kernel supports before
-     * deciding whether to open in silent mode.
-     */
-    ccp_resetci(f);
-    if (!ccp_anycompress(go))
-       f->flags |= OPT_SILENT;
-
-    fsm_open(f);
-}
-
-/*
- * ccp_close - Terminate CCP.
- */
-static void ccp_close(ppp_pcb *pcb, const char *reason) {
-    fsm *f = &pcb->ccp_fsm;
-    ccp_set(pcb, 0, 0, 0, 0);
-    fsm_close(f, reason);
-}
-
-/*
- * ccp_lowerup - we may now transmit CCP packets.
- */
-static void ccp_lowerup(ppp_pcb *pcb) {
-    fsm *f = &pcb->ccp_fsm;
-    fsm_lowerup(f);
-}
-
-/*
- * ccp_lowerdown - we may not transmit CCP packets.
- */
-static void ccp_lowerdown(ppp_pcb *pcb) {
-    fsm *f = &pcb->ccp_fsm;
-    fsm_lowerdown(f);
-}
-
-/*
- * ccp_input - process a received CCP packet.
- */
-static void ccp_input(ppp_pcb *pcb, u_char *p, int len) {
-    fsm *f = &pcb->ccp_fsm;
-    ccp_options *go = &pcb->ccp_gotoptions;
-    int oldstate;
-
-    /*
-     * Check for a terminate-request so we can print a message.
-     */
-    oldstate = f->state;
-    fsm_input(f, p, len);
-    if (oldstate == PPP_FSM_OPENED && p[0] == TERMREQ && f->state != PPP_FSM_OPENED) {
-       ppp_notice("Compression disabled by peer.");
-#if MPPE_SUPPORT
-       if (go->mppe) {
-           ppp_error("MPPE disabled, closing LCP");
-           lcp_close(pcb, "MPPE disabled by peer");
-       }
-#endif /* MPPE_SUPPORT */
-    }
-
-    /*
-     * If we get a terminate-ack and we're not asking for compression,
-     * close CCP.
-     */
-    if (oldstate == PPP_FSM_REQSENT && p[0] == TERMACK
-       && !ccp_anycompress(go))
-       ccp_close(pcb, "No compression negotiated");
-}
-
-/*
- * Handle a CCP-specific code.
- */
-static int ccp_extcode(fsm *f, int code, int id, u_char *p, int len) {
-    ppp_pcb *pcb = f->pcb;
-    LWIP_UNUSED_ARG(p);
-    LWIP_UNUSED_ARG(len);
-
-    switch (code) {
-    case CCP_RESETREQ:
-       if (f->state != PPP_FSM_OPENED)
-           break;
-       ccp_reset_comp(pcb);
-       /* send a reset-ack, which the transmitter will see and
-          reset its compression state. */
-       fsm_sdata(f, CCP_RESETACK, id, NULL, 0);
-       break;
-
-    case CCP_RESETACK:
-       if ((pcb->ccp_localstate & RACK_PENDING) && id == f->reqid) {
-           pcb->ccp_localstate &= ~(RACK_PENDING | RREQ_REPEAT);
-           UNTIMEOUT(ccp_rack_timeout, f);
-           ccp_reset_decomp(pcb);
-       }
-       break;
-
-    default:
-       return 0;
-    }
-
-    return 1;
-}
-
-/*
- * ccp_protrej - peer doesn't talk CCP.
- */
-static void ccp_protrej(ppp_pcb *pcb) {
-    fsm *f = &pcb->ccp_fsm;
-#if MPPE_SUPPORT
-    ccp_options *go = &pcb->ccp_gotoptions;
-#endif /* MPPE_SUPPORT */
-
-    ccp_set(pcb, 0, 0, 0, 0);
-    fsm_lowerdown(f);
-
-#if MPPE_SUPPORT
-    if (go->mppe) {
-       ppp_error("MPPE required but peer negotiation failed");
-       lcp_close(pcb, "MPPE required but peer negotiation failed");
-    }
-#endif /* MPPE_SUPPORT */
-
-}
-
-/*
- * ccp_resetci - initialize at start of negotiation.
- */
-static void ccp_resetci(fsm *f) {
-    ppp_pcb *pcb = f->pcb;
-    ccp_options *go = &pcb->ccp_gotoptions;
-    ccp_options *wo = &pcb->ccp_wantoptions;
-#if DEFLATE_SUPPORT || BSDCOMPRESS_SUPPORT || PREDICTOR_SUPPORT
-    u_char opt_buf[CCP_MAX_OPTION_LENGTH];
-#endif /* DEFLATE_SUPPORT || BSDCOMPRESS_SUPPORT || PREDICTOR_SUPPORT */
-#if DEFLATE_SUPPORT || BSDCOMPRESS_SUPPORT
-    int res;
-#endif /* DEFLATE_SUPPORT || BSDCOMPRESS_SUPPORT */
-
-    *go = *wo;
-    pcb->ccp_all_rejected = 0;
-
-#if MPPE_SUPPORT
-    if (go->mppe) {
-       ccp_options *ao = &pcb->ccp_allowoptions;
-       int auth_mschap_bits = pcb->auth_done;
-       int numbits;
-
-       /*
-        * Start with a basic sanity check: mschap[v2] auth must be in
-        * exactly one direction.  RFC 3079 says that the keys are
-        * 'derived from the credentials of the peer that initiated the call',
-        * however the PPP protocol doesn't have such a concept, and pppd
-        * cannot get this info externally.  Instead we do the best we can.
-        * NB: If MPPE is required, all other compression opts are invalid.
-        *     So, we return right away if we can't do it.
-        */
-
-       /* Leave only the mschap auth bits set */
-       auth_mschap_bits &= (CHAP_MS_WITHPEER  | CHAP_MS_PEER |
-                            CHAP_MS2_WITHPEER | CHAP_MS2_PEER);
-       /* Count the mschap auths */
-       auth_mschap_bits >>= CHAP_MS_SHIFT;
-       numbits = 0;
-       do {
-           numbits += auth_mschap_bits & 1;
-           auth_mschap_bits >>= 1;
-       } while (auth_mschap_bits);
-       if (numbits > 1) {
-           ppp_error("MPPE required, but auth done in both directions.");
-           lcp_close(pcb, "MPPE required but not available");
-           return;
-       }
-       if (!numbits) {
-           ppp_error("MPPE required, but MS-CHAP[v2] auth not performed.");
-           lcp_close(pcb, "MPPE required but not available");
-           return;
-       }
-
-       /* A plugin (eg radius) may not have obtained key material. */
-       if (!pcb->mppe_keys_set) {
-           ppp_error("MPPE required, but keys are not available.  "
-                 "Possible plugin problem?");
-           lcp_close(pcb, "MPPE required but not available");
-           return;
-       }
-
-       /* LM auth not supported for MPPE */
-       if (pcb->auth_done & (CHAP_MS_WITHPEER | CHAP_MS_PEER)) {
-           /* This might be noise */
-           if (go->mppe & MPPE_OPT_40) {
-               ppp_notice("Disabling 40-bit MPPE; MS-CHAP LM not supported");
-               go->mppe &= ~MPPE_OPT_40;
-               wo->mppe &= ~MPPE_OPT_40;
-           }
-       }
-
-       /* Last check: can we actually negotiate something? */
-       if (!(go->mppe & (MPPE_OPT_40 | MPPE_OPT_128))) {
-           /* Could be misconfig, could be 40-bit disabled above. */
-           ppp_error("MPPE required, but both 40-bit and 128-bit disabled.");
-           lcp_close(pcb, "MPPE required but not available");
-           return;
-       }
-
-       /* sync options */
-       ao->mppe = go->mppe;
-       /* MPPE is not compatible with other compression types */
-#if BSDCOMPRESS_SUPPORT
-       ao->bsd_compress = go->bsd_compress = 0;
-#endif /* BSDCOMPRESS_SUPPORT */
-#if PREDICTOR_SUPPORT
-       ao->predictor_1  = go->predictor_1  = 0;
-       ao->predictor_2  = go->predictor_2  = 0;
-#endif /* PREDICTOR_SUPPORT */
-#if DEFLATE_SUPPORT
-       ao->deflate      = go->deflate      = 0;
-#endif /* DEFLATE_SUPPORT */
-    }
-#endif /* MPPE_SUPPORT */
-
-    /*
-     * Check whether the kernel knows about the various
-     * compression methods we might request.
-     */
-#if BSDCOMPRESS_SUPPORT
-    /* FIXME: we don't need to test if BSD compress is available
-     * if BSDCOMPRESS_SUPPORT is set, it is.
-     */
-    if (go->bsd_compress) {
-       opt_buf[0] = CI_BSD_COMPRESS;
-       opt_buf[1] = CILEN_BSD_COMPRESS;
-       for (;;) {
-           if (go->bsd_bits < BSD_MIN_BITS) {
-               go->bsd_compress = 0;
-               break;
-           }
-           opt_buf[2] = BSD_MAKE_OPT(BSD_CURRENT_VERSION, go->bsd_bits);
-           res = ccp_test(pcb, opt_buf, CILEN_BSD_COMPRESS, 0);
-           if (res > 0) {
-               break;
-           } else if (res < 0) {
-               go->bsd_compress = 0;
-               break;
-           }
-           go->bsd_bits--;
-       }
-    }
-#endif /* BSDCOMPRESS_SUPPORT */
-#if DEFLATE_SUPPORT
-    /* FIXME: we don't need to test if deflate is available
-     * if DEFLATE_SUPPORT is set, it is.
-     */
-    if (go->deflate) {
-       if (go->deflate_correct) {
-           opt_buf[0] = CI_DEFLATE;
-           opt_buf[1] = CILEN_DEFLATE;
-           opt_buf[3] = DEFLATE_CHK_SEQUENCE;
-           for (;;) {
-               if (go->deflate_size < DEFLATE_MIN_WORKS) {
-                   go->deflate_correct = 0;
-                   break;
-               }
-               opt_buf[2] = DEFLATE_MAKE_OPT(go->deflate_size);
-               res = ccp_test(pcb, opt_buf, CILEN_DEFLATE, 0);
-               if (res > 0) {
-                   break;
-               } else if (res < 0) {
-                   go->deflate_correct = 0;
-                   break;
-               }
-               go->deflate_size--;
-           }
-       }
-       if (go->deflate_draft) {
-           opt_buf[0] = CI_DEFLATE_DRAFT;
-           opt_buf[1] = CILEN_DEFLATE;
-           opt_buf[3] = DEFLATE_CHK_SEQUENCE;
-           for (;;) {
-               if (go->deflate_size < DEFLATE_MIN_WORKS) {
-                   go->deflate_draft = 0;
-                   break;
-               }
-               opt_buf[2] = DEFLATE_MAKE_OPT(go->deflate_size);
-               res = ccp_test(pcb, opt_buf, CILEN_DEFLATE, 0);
-               if (res > 0) {
-                   break;
-               } else if (res < 0) {
-                   go->deflate_draft = 0;
-                   break;
-               }
-               go->deflate_size--;
-           }
-       }
-       if (!go->deflate_correct && !go->deflate_draft)
-           go->deflate = 0;
-    }
-#endif /* DEFLATE_SUPPORT */
-#if PREDICTOR_SUPPORT
-    /* FIXME: we don't need to test if predictor is available,
-     * if PREDICTOR_SUPPORT is set, it is.
-     */
-    if (go->predictor_1) {
-       opt_buf[0] = CI_PREDICTOR_1;
-       opt_buf[1] = CILEN_PREDICTOR_1;
-       if (ccp_test(pcb, opt_buf, CILEN_PREDICTOR_1, 0) <= 0)
-           go->predictor_1 = 0;
-    }
-    if (go->predictor_2) {
-       opt_buf[0] = CI_PREDICTOR_2;
-       opt_buf[1] = CILEN_PREDICTOR_2;
-       if (ccp_test(pcb, opt_buf, CILEN_PREDICTOR_2, 0) <= 0)
-           go->predictor_2 = 0;
-    }
-#endif /* PREDICTOR_SUPPORT */
-}
-
-/*
- * ccp_cilen - Return total length of our configuration info.
- */
-static int ccp_cilen(fsm *f) {
-    ppp_pcb *pcb = f->pcb;
-    ccp_options *go = &pcb->ccp_gotoptions;
-
-    return 0
-#if BSDCOMPRESS_SUPPORT
-       + (go->bsd_compress? CILEN_BSD_COMPRESS: 0)
-#endif /* BSDCOMPRESS_SUPPORT */
-#if DEFLATE_SUPPORT
-       + (go->deflate && go->deflate_correct? CILEN_DEFLATE: 0)
-       + (go->deflate && go->deflate_draft? CILEN_DEFLATE: 0)
-#endif /* DEFLATE_SUPPORT */
-#if PREDICTOR_SUPPORT
-       + (go->predictor_1? CILEN_PREDICTOR_1: 0)
-       + (go->predictor_2? CILEN_PREDICTOR_2: 0)
-#endif /* PREDICTOR_SUPPORT */
-#if MPPE_SUPPORT
-       + (go->mppe? CILEN_MPPE: 0)
-#endif /* MPPE_SUPPORT */
-       ;
-}
-
-/*
- * ccp_addci - put our requests in a packet.
- */
-static void ccp_addci(fsm *f, u_char *p, int *lenp) {
-    ppp_pcb *pcb = f->pcb;
-    ccp_options *go = &pcb->ccp_gotoptions;
-    u_char *p0 = p;
-
-    /*
-     * Add the compression types that we can receive, in decreasing
-     * preference order.
-     */
-#if MPPE_SUPPORT
-    if (go->mppe) {
-       p[0] = CI_MPPE;
-       p[1] = CILEN_MPPE;
-       MPPE_OPTS_TO_CI(go->mppe, &p[2]);
-       mppe_init(pcb, &pcb->mppe_decomp, go->mppe);
-       p += CILEN_MPPE;
-    }
-#endif /* MPPE_SUPPORT */
-#if DEFLATE_SUPPORT
-    if (go->deflate) {
-       if (go->deflate_correct) {
-           p[0] = CI_DEFLATE;
-           p[1] = CILEN_DEFLATE;
-           p[2] = DEFLATE_MAKE_OPT(go->deflate_size);
-           p[3] = DEFLATE_CHK_SEQUENCE;
-           p += CILEN_DEFLATE;
-       }
-       if (go->deflate_draft) {
-           p[0] = CI_DEFLATE_DRAFT;
-           p[1] = CILEN_DEFLATE;
-           p[2] = p[2 - CILEN_DEFLATE];
-           p[3] = DEFLATE_CHK_SEQUENCE;
-           p += CILEN_DEFLATE;
-       }
-    }
-#endif /* DEFLATE_SUPPORT */
-#if BSDCOMPRESS_SUPPORT
-    if (go->bsd_compress) {
-       p[0] = CI_BSD_COMPRESS;
-       p[1] = CILEN_BSD_COMPRESS;
-       p[2] = BSD_MAKE_OPT(BSD_CURRENT_VERSION, go->bsd_bits);
-       p += CILEN_BSD_COMPRESS;
-    }
-#endif /* BSDCOMPRESS_SUPPORT */
-#if PREDICTOR_SUPPORT
-    /* XXX Should Predictor 2 be preferable to Predictor 1? */
-    if (go->predictor_1) {
-       p[0] = CI_PREDICTOR_1;
-       p[1] = CILEN_PREDICTOR_1;
-       p += CILEN_PREDICTOR_1;
-    }
-    if (go->predictor_2) {
-       p[0] = CI_PREDICTOR_2;
-       p[1] = CILEN_PREDICTOR_2;
-       p += CILEN_PREDICTOR_2;
-    }
-#endif /* PREDICTOR_SUPPORT */
-
-    go->method = (p > p0)? p0[0]: 0;
-
-    *lenp = p - p0;
-}
-
-/*
- * ccp_ackci - process a received configure-ack, and return
- * 1 iff the packet was OK.
- */
-static int ccp_ackci(fsm *f, u_char *p, int len) {
-    ppp_pcb *pcb = f->pcb;
-    ccp_options *go = &pcb->ccp_gotoptions;
-#if BSDCOMPRESS_SUPPORT || PREDICTOR_SUPPORT
-    u_char *p0 = p;
-#endif /* BSDCOMPRESS_SUPPORT || PREDICTOR_SUPPORT */
-
-#if MPPE_SUPPORT
-    if (go->mppe) {
-       u_char opt_buf[CILEN_MPPE];
-
-       opt_buf[0] = CI_MPPE;
-       opt_buf[1] = CILEN_MPPE;
-       MPPE_OPTS_TO_CI(go->mppe, &opt_buf[2]);
-       if (len < CILEN_MPPE || memcmp(opt_buf, p, CILEN_MPPE))
-           return 0;
-       p += CILEN_MPPE;
-       len -= CILEN_MPPE;
-       /* XXX Cope with first/fast ack */
-       if (len == 0)
-           return 1;
-    }
-#endif /* MPPE_SUPPORT */
-#if DEFLATE_SUPPORT
-    if (go->deflate) {
-       if (len < CILEN_DEFLATE
-           || p[0] != (go->deflate_correct? CI_DEFLATE: CI_DEFLATE_DRAFT)
-           || p[1] != CILEN_DEFLATE
-           || p[2] != DEFLATE_MAKE_OPT(go->deflate_size)
-           || p[3] != DEFLATE_CHK_SEQUENCE)
-           return 0;
-       p += CILEN_DEFLATE;
-       len -= CILEN_DEFLATE;
-       /* XXX Cope with first/fast ack */
-       if (len == 0)
-           return 1;
-       if (go->deflate_correct && go->deflate_draft) {
-           if (len < CILEN_DEFLATE
-               || p[0] != CI_DEFLATE_DRAFT
-               || p[1] != CILEN_DEFLATE
-               || p[2] != DEFLATE_MAKE_OPT(go->deflate_size)
-               || p[3] != DEFLATE_CHK_SEQUENCE)
-               return 0;
-           p += CILEN_DEFLATE;
-           len -= CILEN_DEFLATE;
-       }
-    }
-#endif /* DEFLATE_SUPPORT */
-#if BSDCOMPRESS_SUPPORT
-    if (go->bsd_compress) {
-       if (len < CILEN_BSD_COMPRESS
-           || p[0] != CI_BSD_COMPRESS || p[1] != CILEN_BSD_COMPRESS
-           || p[2] != BSD_MAKE_OPT(BSD_CURRENT_VERSION, go->bsd_bits))
-           return 0;
-       p += CILEN_BSD_COMPRESS;
-       len -= CILEN_BSD_COMPRESS;
-       /* XXX Cope with first/fast ack */
-       if (p == p0 && len == 0)
-           return 1;
-    }
-#endif /* BSDCOMPRESS_SUPPORT */
-#if PREDICTOR_SUPPORT
-    if (go->predictor_1) {
-       if (len < CILEN_PREDICTOR_1
-           || p[0] != CI_PREDICTOR_1 || p[1] != CILEN_PREDICTOR_1)
-           return 0;
-       p += CILEN_PREDICTOR_1;
-       len -= CILEN_PREDICTOR_1;
-       /* XXX Cope with first/fast ack */
-       if (p == p0 && len == 0)
-           return 1;
-    }
-    if (go->predictor_2) {
-       if (len < CILEN_PREDICTOR_2
-           || p[0] != CI_PREDICTOR_2 || p[1] != CILEN_PREDICTOR_2)
-           return 0;
-       p += CILEN_PREDICTOR_2;
-       len -= CILEN_PREDICTOR_2;
-       /* XXX Cope with first/fast ack */
-       if (p == p0 && len == 0)
-           return 1;
-    }
-#endif /* PREDICTOR_SUPPORT */
-
-    if (len != 0)
-       return 0;
-    return 1;
-}
-
-/*
- * ccp_nakci - process received configure-nak.
- * Returns 1 iff the nak was OK.
- */
-static int ccp_nakci(fsm *f, u_char *p, int len, int treat_as_reject) {
-    ppp_pcb *pcb = f->pcb;
-    ccp_options *go = &pcb->ccp_gotoptions;
-    ccp_options no;            /* options we've seen already */
-    ccp_options try_;          /* options to ask for next time */
-    LWIP_UNUSED_ARG(treat_as_reject);
-#if !MPPE_SUPPORT && !DEFLATE_SUPPORT && !BSDCOMPRESS_SUPPORT
-    LWIP_UNUSED_ARG(p);
-    LWIP_UNUSED_ARG(len);
-#endif /* !MPPE_SUPPORT && !DEFLATE_SUPPORT && !BSDCOMPRESS_SUPPORT */
-
-    memset(&no, 0, sizeof(no));
-    try_ = *go;
-
-#if MPPE_SUPPORT
-    if (go->mppe && len >= CILEN_MPPE
-       && p[0] == CI_MPPE && p[1] == CILEN_MPPE) {
-       no.mppe = 1;
-       /*
-        * Peer wants us to use a different strength or other setting.
-        * Fail if we aren't willing to use his suggestion.
-        */
-       MPPE_CI_TO_OPTS(&p[2], try_.mppe);
-       if ((try_.mppe & MPPE_OPT_STATEFUL) && pcb->settings.refuse_mppe_stateful) {
-           ppp_error("Refusing MPPE stateful mode offered by peer");
-           try_.mppe = 0;
-       } else if (((go->mppe | MPPE_OPT_STATEFUL) & try_.mppe) != try_.mppe) {
-           /* Peer must have set options we didn't request (suggest) */
-           try_.mppe = 0;
-       }
-
-       if (!try_.mppe) {
-           ppp_error("MPPE required but peer negotiation failed");
-           lcp_close(pcb, "MPPE required but peer negotiation failed");
-       }
-    }
-#endif /* MPPE_SUPPORT */
-#if DEFLATE_SUPPORT
-    if (go->deflate && len >= CILEN_DEFLATE
-       && p[0] == (go->deflate_correct? CI_DEFLATE: CI_DEFLATE_DRAFT)
-       && p[1] == CILEN_DEFLATE) {
-       no.deflate = 1;
-       /*
-        * Peer wants us to use a different code size or something.
-        * Stop asking for Deflate if we don't understand his suggestion.
-        */
-       if (DEFLATE_METHOD(p[2]) != DEFLATE_METHOD_VAL
-           || DEFLATE_SIZE(p[2]) < DEFLATE_MIN_WORKS
-           || p[3] != DEFLATE_CHK_SEQUENCE)
-           try_.deflate = 0;
-       else if (DEFLATE_SIZE(p[2]) < go->deflate_size)
-           try_.deflate_size = DEFLATE_SIZE(p[2]);
-       p += CILEN_DEFLATE;
-       len -= CILEN_DEFLATE;
-       if (go->deflate_correct && go->deflate_draft
-           && len >= CILEN_DEFLATE && p[0] == CI_DEFLATE_DRAFT
-           && p[1] == CILEN_DEFLATE) {
-           p += CILEN_DEFLATE;
-           len -= CILEN_DEFLATE;
-       }
-    }
-#endif /* DEFLATE_SUPPORT */
-#if BSDCOMPRESS_SUPPORT
-    if (go->bsd_compress && len >= CILEN_BSD_COMPRESS
-       && p[0] == CI_BSD_COMPRESS && p[1] == CILEN_BSD_COMPRESS) {
-       no.bsd_compress = 1;
-       /*
-        * Peer wants us to use a different number of bits
-        * or a different version.
-        */
-       if (BSD_VERSION(p[2]) != BSD_CURRENT_VERSION)
-           try_.bsd_compress = 0;
-       else if (BSD_NBITS(p[2]) < go->bsd_bits)
-           try_.bsd_bits = BSD_NBITS(p[2]);
-       p += CILEN_BSD_COMPRESS;
-       len -= CILEN_BSD_COMPRESS;
-    }
-#endif /* BSDCOMPRESS_SUPPORT */
-
-    /*
-     * Predictor-1 and 2 have no options, so they can't be Naked.
-     *
-     * There may be remaining options but we ignore them.
-     */
-
-    if (f->state != PPP_FSM_OPENED)
-       *go = try_;
-    return 1;
-}
-
-/*
- * ccp_rejci - reject some of our suggested compression methods.
- */
-static int ccp_rejci(fsm *f, u_char *p, int len) {
-    ppp_pcb *pcb = f->pcb;
-    ccp_options *go = &pcb->ccp_gotoptions;
-    ccp_options try_;          /* options to request next time */
-
-    try_ = *go;
-
-    /*
-     * Cope with empty configure-rejects by ceasing to send
-     * configure-requests.
-     */
-    if (len == 0 && pcb->ccp_all_rejected)
-       return -1;
-
-#if MPPE_SUPPORT
-    if (go->mppe && len >= CILEN_MPPE
-       && p[0] == CI_MPPE && p[1] == CILEN_MPPE) {
-       ppp_error("MPPE required but peer refused");
-       lcp_close(pcb, "MPPE required but peer refused");
-       p += CILEN_MPPE;
-       len -= CILEN_MPPE;
-    }
-#endif /* MPPE_SUPPORT */
-#if DEFLATE_SUPPORT
-    if (go->deflate_correct && len >= CILEN_DEFLATE
-       && p[0] == CI_DEFLATE && p[1] == CILEN_DEFLATE) {
-       if (p[2] != DEFLATE_MAKE_OPT(go->deflate_size)
-           || p[3] != DEFLATE_CHK_SEQUENCE)
-           return 0;           /* Rej is bad */
-       try_.deflate_correct = 0;
-       p += CILEN_DEFLATE;
-       len -= CILEN_DEFLATE;
-    }
-    if (go->deflate_draft && len >= CILEN_DEFLATE
-       && p[0] == CI_DEFLATE_DRAFT && p[1] == CILEN_DEFLATE) {
-       if (p[2] != DEFLATE_MAKE_OPT(go->deflate_size)
-           || p[3] != DEFLATE_CHK_SEQUENCE)
-           return 0;           /* Rej is bad */
-       try_.deflate_draft = 0;
-       p += CILEN_DEFLATE;
-       len -= CILEN_DEFLATE;
-    }
-    if (!try_.deflate_correct && !try_.deflate_draft)
-       try_.deflate = 0;
-#endif /* DEFLATE_SUPPORT */
-#if BSDCOMPRESS_SUPPORT
-    if (go->bsd_compress && len >= CILEN_BSD_COMPRESS
-       && p[0] == CI_BSD_COMPRESS && p[1] == CILEN_BSD_COMPRESS) {
-       if (p[2] != BSD_MAKE_OPT(BSD_CURRENT_VERSION, go->bsd_bits))
-           return 0;
-       try_.bsd_compress = 0;
-       p += CILEN_BSD_COMPRESS;
-       len -= CILEN_BSD_COMPRESS;
-    }
-#endif /* BSDCOMPRESS_SUPPORT */
-#if PREDICTOR_SUPPORT
-    if (go->predictor_1 && len >= CILEN_PREDICTOR_1
-       && p[0] == CI_PREDICTOR_1 && p[1] == CILEN_PREDICTOR_1) {
-       try_.predictor_1 = 0;
-       p += CILEN_PREDICTOR_1;
-       len -= CILEN_PREDICTOR_1;
-    }
-    if (go->predictor_2 && len >= CILEN_PREDICTOR_2
-       && p[0] == CI_PREDICTOR_2 && p[1] == CILEN_PREDICTOR_2) {
-       try_.predictor_2 = 0;
-       p += CILEN_PREDICTOR_2;
-       len -= CILEN_PREDICTOR_2;
-    }
-#endif /* PREDICTOR_SUPPORT */
-
-    if (len != 0)
-       return 0;
-
-    if (f->state != PPP_FSM_OPENED)
-       *go = try_;
-
-    return 1;
-}
-
-/*
- * ccp_reqci - processed a received configure-request.
- * Returns CONFACK, CONFNAK or CONFREJ and the packet modified
- * appropriately.
- */
-static int ccp_reqci(fsm *f, u_char *p, int *lenp, int dont_nak) {
-    ppp_pcb *pcb = f->pcb;
-    ccp_options *ho = &pcb->ccp_hisoptions;
-    ccp_options *ao = &pcb->ccp_allowoptions;
-    int ret, newret;
-#if DEFLATE_SUPPORT || BSDCOMPRESS_SUPPORT
-    int res;
-    int nb;
-#endif /* DEFLATE_SUPPORT || BSDCOMPRESS_SUPPORT */
-    u_char *p0, *retp;
-    int len, clen, type;
-#if MPPE_SUPPORT
-    u8_t rej_for_ci_mppe = 1;  /* Are we rejecting based on a bad/missing */
-                               /* CI_MPPE, or due to other options?       */
-#endif /* MPPE_SUPPORT */
-
-    ret = CONFACK;
-    retp = p0 = p;
-    len = *lenp;
-
-    memset(ho, 0, sizeof(ccp_options));
-    ho->method = (len > 0)? p[0]: 0;
-
-    while (len > 0) {
-       newret = CONFACK;
-       if (len < 2 || p[1] < 2 || p[1] > len) {
-           /* length is bad */
-           clen = len;
-           newret = CONFREJ;
-
-       } else {
-           type = p[0];
-           clen = p[1];
-
-           switch (type) {
-#if MPPE_SUPPORT
-           case CI_MPPE:
-               if (!ao->mppe || clen != CILEN_MPPE) {
-                   newret = CONFREJ;
-                   break;
-               }
-               MPPE_CI_TO_OPTS(&p[2], ho->mppe);
-
-               /* Nak if anything unsupported or unknown are set. */
-               if (ho->mppe & MPPE_OPT_UNSUPPORTED) {
-                   newret = CONFNAK;
-                   ho->mppe &= ~MPPE_OPT_UNSUPPORTED;
-               }
-               if (ho->mppe & MPPE_OPT_UNKNOWN) {
-                   newret = CONFNAK;
-                   ho->mppe &= ~MPPE_OPT_UNKNOWN;
-               }
-
-               /* Check state opt */
-               if (ho->mppe & MPPE_OPT_STATEFUL) {
-                   /*
-                    * We can Nak and request stateless, but it's a
-                    * lot easier to just assume the peer will request
-                    * it if he can do it; stateful mode is bad over
-                    * the Internet -- which is where we expect MPPE.
-                    */
-                  if (pcb->settings.refuse_mppe_stateful) {
-                       ppp_error("Refusing MPPE stateful mode offered by peer");
-                       newret = CONFREJ;
-                       break;
-                   }
-               }
-
-               /* Find out which of {S,L} are set. */
-               if ((ho->mppe & MPPE_OPT_128)
-                    && (ho->mppe & MPPE_OPT_40)) {
-                   /* Both are set, negotiate the strongest. */
-                   newret = CONFNAK;
-                   if (ao->mppe & MPPE_OPT_128)
-                       ho->mppe &= ~MPPE_OPT_40;
-                   else if (ao->mppe & MPPE_OPT_40)
-                       ho->mppe &= ~MPPE_OPT_128;
-                   else {
-                       newret = CONFREJ;
-                       break;
-                   }
-               } else if (ho->mppe & MPPE_OPT_128) {
-                   if (!(ao->mppe & MPPE_OPT_128)) {
-                       newret = CONFREJ;
-                       break;
-                   }
-               } else if (ho->mppe & MPPE_OPT_40) {
-                   if (!(ao->mppe & MPPE_OPT_40)) {
-                       newret = CONFREJ;
-                       break;
-                   }
-               } else {
-                   /* Neither are set. */
-                   /* We cannot accept this.  */
-                   newret = CONFNAK;
-                   /* Give the peer our idea of what can be used,
-                      so it can choose and confirm */
-                   ho->mppe = ao->mppe;
-               }
-
-               /* rebuild the opts */
-               MPPE_OPTS_TO_CI(ho->mppe, &p[2]);
-               if (newret == CONFACK) {
-                   int mtu;
-
-                   mppe_init(pcb, &pcb->mppe_comp, ho->mppe);
-                   /*
-                    * We need to decrease the interface MTU by MPPE_PAD
-                    * because MPPE frames **grow**.  The kernel [must]
-                    * allocate MPPE_PAD extra bytes in xmit buffers.
-                    */
-                   mtu = netif_get_mtu(pcb);
-                   if (mtu)
-                       netif_set_mtu(pcb, mtu - MPPE_PAD);
-                   else
-                       newret = CONFREJ;
-               }
-
-               /*
-                * We have accepted MPPE or are willing to negotiate
-                * MPPE parameters.  A CONFREJ is due to subsequent
-                * (non-MPPE) processing.
-                */
-               rej_for_ci_mppe = 0;
-               break;
-#endif /* MPPE_SUPPORT */
-#if DEFLATE_SUPPORT
-           case CI_DEFLATE:
-           case CI_DEFLATE_DRAFT:
-               if (!ao->deflate || clen != CILEN_DEFLATE
-                   || (!ao->deflate_correct && type == CI_DEFLATE)
-                   || (!ao->deflate_draft && type == CI_DEFLATE_DRAFT)) {
-                   newret = CONFREJ;
-                   break;
-               }
-
-               ho->deflate = 1;
-               ho->deflate_size = nb = DEFLATE_SIZE(p[2]);
-               if (DEFLATE_METHOD(p[2]) != DEFLATE_METHOD_VAL
-                   || p[3] != DEFLATE_CHK_SEQUENCE
-                   || nb > ao->deflate_size || nb < DEFLATE_MIN_WORKS) {
-                   newret = CONFNAK;
-                   if (!dont_nak) {
-                       p[2] = DEFLATE_MAKE_OPT(ao->deflate_size);
-                       p[3] = DEFLATE_CHK_SEQUENCE;
-                       /* fall through to test this #bits below */
-                   } else
-                       break;
-               }
-
-               /*
-                * Check whether we can do Deflate with the window
-                * size they want.  If the window is too big, reduce
-                * it until the kernel can cope and nak with that.
-                * We only check this for the first option.
-                */
-               if (p == p0) {
-                   for (;;) {
-                       res = ccp_test(pcb, p, CILEN_DEFLATE, 1);
-                       if (res > 0)
-                           break;              /* it's OK now */
-                       if (res < 0 || nb == DEFLATE_MIN_WORKS || dont_nak) {
-                           newret = CONFREJ;
-                           p[2] = DEFLATE_MAKE_OPT(ho->deflate_size);
-                           break;
-                       }
-                       newret = CONFNAK;
-                       --nb;
-                       p[2] = DEFLATE_MAKE_OPT(nb);
-                   }
-               }
-               break;
-#endif /* DEFLATE_SUPPORT */
-#if BSDCOMPRESS_SUPPORT
-           case CI_BSD_COMPRESS:
-               if (!ao->bsd_compress || clen != CILEN_BSD_COMPRESS) {
-                   newret = CONFREJ;
-                   break;
-               }
-
-               ho->bsd_compress = 1;
-               ho->bsd_bits = nb = BSD_NBITS(p[2]);
-               if (BSD_VERSION(p[2]) != BSD_CURRENT_VERSION
-                   || nb > ao->bsd_bits || nb < BSD_MIN_BITS) {
-                   newret = CONFNAK;
-                   if (!dont_nak) {
-                       p[2] = BSD_MAKE_OPT(BSD_CURRENT_VERSION, ao->bsd_bits);
-                       /* fall through to test this #bits below */
-                   } else
-                       break;
-               }
-
-               /*
-                * Check whether we can do BSD-Compress with the code
-                * size they want.  If the code size is too big, reduce
-                * it until the kernel can cope and nak with that.
-                * We only check this for the first option.
-                */
-               if (p == p0) {
-                   for (;;) {
-                       res = ccp_test(pcb, p, CILEN_BSD_COMPRESS, 1);
-                       if (res > 0)
-                           break;
-                       if (res < 0 || nb == BSD_MIN_BITS || dont_nak) {
-                           newret = CONFREJ;
-                           p[2] = BSD_MAKE_OPT(BSD_CURRENT_VERSION,
-                                               ho->bsd_bits);
-                           break;
-                       }
-                       newret = CONFNAK;
-                       --nb;
-                       p[2] = BSD_MAKE_OPT(BSD_CURRENT_VERSION, nb);
-                   }
-               }
-               break;
-#endif /* BSDCOMPRESS_SUPPORT */
-#if PREDICTOR_SUPPORT
-           case CI_PREDICTOR_1:
-               if (!ao->predictor_1 || clen != CILEN_PREDICTOR_1) {
-                   newret = CONFREJ;
-                   break;
-               }
-
-               ho->predictor_1 = 1;
-               if (p == p0
-                   && ccp_test(pcb, p, CILEN_PREDICTOR_1, 1) <= 0) {
-                   newret = CONFREJ;
-               }
-               break;
-
-           case CI_PREDICTOR_2:
-               if (!ao->predictor_2 || clen != CILEN_PREDICTOR_2) {
-                   newret = CONFREJ;
-                   break;
-               }
-
-               ho->predictor_2 = 1;
-               if (p == p0
-                   && ccp_test(pcb, p, CILEN_PREDICTOR_2, 1) <= 0) {
-                   newret = CONFREJ;
-               }
-               break;
-#endif /* PREDICTOR_SUPPORT */
-
-           default:
-               newret = CONFREJ;
-           }
-       }
-
-       if (newret == CONFNAK && dont_nak)
-           newret = CONFREJ;
-       if (!(newret == CONFACK || (newret == CONFNAK && ret == CONFREJ))) {
-           /* we're returning this option */
-           if (newret == CONFREJ && ret == CONFNAK)
-               retp = p0;
-           ret = newret;
-           if (p != retp)
-               MEMCPY(retp, p, clen);
-           retp += clen;
-       }
-
-       p += clen;
-       len -= clen;
-    }
-
-    if (ret != CONFACK) {
-       if (ret == CONFREJ && *lenp == retp - p0)
-           pcb->ccp_all_rejected = 1;
-       else
-           *lenp = retp - p0;
-    }
-#if MPPE_SUPPORT
-    if (ret == CONFREJ && ao->mppe && rej_for_ci_mppe) {
-       ppp_error("MPPE required but peer negotiation failed");
-       lcp_close(pcb, "MPPE required but peer negotiation failed");
-    }
-#endif /* MPPE_SUPPORT */
-    return ret;
-}
-
-/*
- * Make a string name for a compression method (or 2).
- */
-static const char *method_name(ccp_options *opt, ccp_options *opt2) {
-    static char result[64];
-#if !DEFLATE_SUPPORT && !BSDCOMPRESS_SUPPORT
-    LWIP_UNUSED_ARG(opt2);
-#endif /* !DEFLATE_SUPPORT && !BSDCOMPRESS_SUPPORT */
-
-    if (!ccp_anycompress(opt))
-       return "(none)";
-    switch (opt->method) {
-#if MPPE_SUPPORT
-    case CI_MPPE:
-    {
-       char *p = result;
-       char *q = result + sizeof(result); /* 1 past result */
-
-       ppp_slprintf(p, q - p, "MPPE ");
-       p += 5;
-       if (opt->mppe & MPPE_OPT_128) {
-           ppp_slprintf(p, q - p, "128-bit ");
-           p += 8;
-       }
-       if (opt->mppe & MPPE_OPT_40) {
-           ppp_slprintf(p, q - p, "40-bit ");
-           p += 7;
-       }
-       if (opt->mppe & MPPE_OPT_STATEFUL)
-           ppp_slprintf(p, q - p, "stateful");
-       else
-           ppp_slprintf(p, q - p, "stateless");
-
-       break;
-    }
-#endif /* MPPE_SUPPORT */
-#if DEFLATE_SUPPORT
-    case CI_DEFLATE:
-    case CI_DEFLATE_DRAFT:
-       if (opt2 != NULL && opt2->deflate_size != opt->deflate_size)
-           ppp_slprintf(result, sizeof(result), "Deflate%s (%d/%d)",
-                    (opt->method == CI_DEFLATE_DRAFT? "(old#)": ""),
-                    opt->deflate_size, opt2->deflate_size);
-       else
-           ppp_slprintf(result, sizeof(result), "Deflate%s (%d)",
-                    (opt->method == CI_DEFLATE_DRAFT? "(old#)": ""),
-                    opt->deflate_size);
-       break;
-#endif /* DEFLATE_SUPPORT */
-#if BSDCOMPRESS_SUPPORT
-    case CI_BSD_COMPRESS:
-       if (opt2 != NULL && opt2->bsd_bits != opt->bsd_bits)
-           ppp_slprintf(result, sizeof(result), "BSD-Compress (%d/%d)",
-                    opt->bsd_bits, opt2->bsd_bits);
-       else
-           ppp_slprintf(result, sizeof(result), "BSD-Compress (%d)",
-                    opt->bsd_bits);
-       break;
-#endif /* BSDCOMPRESS_SUPPORT */
-#if PREDICTOR_SUPPORT
-    case CI_PREDICTOR_1:
-       return "Predictor 1";
-    case CI_PREDICTOR_2:
-       return "Predictor 2";
-#endif /* PREDICTOR_SUPPORT */
-    default:
-       ppp_slprintf(result, sizeof(result), "Method %d", opt->method);
-    }
-    return result;
-}
-
-/*
- * CCP has come up - inform the kernel driver and log a message.
- */
-static void ccp_up(fsm *f) {
-    ppp_pcb *pcb = f->pcb;
-    ccp_options *go = &pcb->ccp_gotoptions;
-    ccp_options *ho = &pcb->ccp_hisoptions;
-    char method1[64];
-
-    ccp_set(pcb, 1, 1, go->method, ho->method);
-    if (ccp_anycompress(go)) {
-       if (ccp_anycompress(ho)) {
-           if (go->method == ho->method) {
-               ppp_notice("%s compression enabled", method_name(go, ho));
-           } else {
-               ppp_strlcpy(method1, method_name(go, NULL), sizeof(method1));
-               ppp_notice("%s / %s compression enabled",
-                      method1, method_name(ho, NULL));
-           }
-       } else
-           ppp_notice("%s receive compression enabled", method_name(go, NULL));
-    } else if (ccp_anycompress(ho))
-       ppp_notice("%s transmit compression enabled", method_name(ho, NULL));
-#if MPPE_SUPPORT
-    if (go->mppe) {
-       continue_networks(pcb);         /* Bring up IP et al */
-    }
-#endif /* MPPE_SUPPORT */
-}
-
-/*
- * CCP has gone down - inform the kernel driver.
- */
-static void ccp_down(fsm *f) {
-    ppp_pcb *pcb = f->pcb;
-#if MPPE_SUPPORT
-    ccp_options *go = &pcb->ccp_gotoptions;
-#endif /* MPPE_SUPPORT */
-
-    if (pcb->ccp_localstate & RACK_PENDING)
-       UNTIMEOUT(ccp_rack_timeout, f);
-    pcb->ccp_localstate = 0;
-    ccp_set(pcb, 1, 0, 0, 0);
-#if MPPE_SUPPORT
-    if (go->mppe) {
-       go->mppe = 0;
-       if (pcb->lcp_fsm.state == PPP_FSM_OPENED) {
-           /* If LCP is not already going down, make sure it does. */
-           ppp_error("MPPE disabled");
-           lcp_close(pcb, "MPPE disabled");
-       }
-    }
-#endif /* MPPE_SUPPORT */
-}
-
-#if PRINTPKT_SUPPORT
-/*
- * Print the contents of a CCP packet.
- */
-static const char* const ccp_codenames[] = {
-    "ConfReq", "ConfAck", "ConfNak", "ConfRej",
-    "TermReq", "TermAck", "CodeRej",
-    NULL, NULL, NULL, NULL, NULL, NULL,
-    "ResetReq", "ResetAck",
-};
-
-static int ccp_printpkt(const u_char *p, int plen, void (*printer) (void *, const char *, ...), void *arg) {
-    const u_char *p0, *optend;
-    int code, id, len;
-    int optlen;
-
-    p0 = p;
-    if (plen < HEADERLEN)
-       return 0;
-    code = p[0];
-    id = p[1];
-    len = (p[2] << 8) + p[3];
-    if (len < HEADERLEN || len > plen)
-       return 0;
-
-    if (code >= 1 && code <= (int)(sizeof(ccp_codenames) / sizeof(char *))
-       && ccp_codenames[code-1] != NULL)
-       printer(arg, " %s", ccp_codenames[code-1]);
-    else
-       printer(arg, " code=0x%x", code);
-    printer(arg, " id=0x%x", id);
-    len -= HEADERLEN;
-    p += HEADERLEN;
-
-    switch (code) {
-    case CONFREQ:
-    case CONFACK:
-    case CONFNAK:
-    case CONFREJ:
-       /* print list of possible compression methods */
-       while (len >= 2) {
-           code = p[0];
-           optlen = p[1];
-           if (optlen < 2 || optlen > len)
-               break;
-           printer(arg, " <");
-           len -= optlen;
-           optend = p + optlen;
-           switch (code) {
-#if MPPE_SUPPORT
-           case CI_MPPE:
-               if (optlen >= CILEN_MPPE) {
-                   u_char mppe_opts;
-
-                   MPPE_CI_TO_OPTS(&p[2], mppe_opts);
-                   printer(arg, "mppe %s %s %s %s %s %s%s",
-                           (p[2] & MPPE_H_BIT)? "+H": "-H",
-                           (p[5] & MPPE_M_BIT)? "+M": "-M",
-                           (p[5] & MPPE_S_BIT)? "+S": "-S",
-                           (p[5] & MPPE_L_BIT)? "+L": "-L",
-                           (p[5] & MPPE_D_BIT)? "+D": "-D",
-                           (p[5] & MPPE_C_BIT)? "+C": "-C",
-                           (mppe_opts & MPPE_OPT_UNKNOWN)? " +U": "");
-                   if (mppe_opts & MPPE_OPT_UNKNOWN)
-                       printer(arg, " (%.2x %.2x %.2x %.2x)",
-                               p[2], p[3], p[4], p[5]);
-                   p += CILEN_MPPE;
-               }
-               break;
-#endif /* MPPE_SUPPORT */
-#if DEFLATE_SUPPORT
-           case CI_DEFLATE:
-           case CI_DEFLATE_DRAFT:
-               if (optlen >= CILEN_DEFLATE) {
-                   printer(arg, "deflate%s %d",
-                           (code == CI_DEFLATE_DRAFT? "(old#)": ""),
-                           DEFLATE_SIZE(p[2]));
-                   if (DEFLATE_METHOD(p[2]) != DEFLATE_METHOD_VAL)
-                       printer(arg, " method %d", DEFLATE_METHOD(p[2]));
-                   if (p[3] != DEFLATE_CHK_SEQUENCE)
-                       printer(arg, " check %d", p[3]);
-                   p += CILEN_DEFLATE;
-               }
-               break;
-#endif /* DEFLATE_SUPPORT */
-#if BSDCOMPRESS_SUPPORT
-           case CI_BSD_COMPRESS:
-               if (optlen >= CILEN_BSD_COMPRESS) {
-                   printer(arg, "bsd v%d %d", BSD_VERSION(p[2]),
-                           BSD_NBITS(p[2]));
-                   p += CILEN_BSD_COMPRESS;
-               }
-               break;
-#endif /* BSDCOMPRESS_SUPPORT */
-#if PREDICTOR_SUPPORT
-           case CI_PREDICTOR_1:
-               if (optlen >= CILEN_PREDICTOR_1) {
-                   printer(arg, "predictor 1");
-                   p += CILEN_PREDICTOR_1;
-               }
-               break;
-           case CI_PREDICTOR_2:
-               if (optlen >= CILEN_PREDICTOR_2) {
-                   printer(arg, "predictor 2");
-                   p += CILEN_PREDICTOR_2;
-               }
-               break;
-#endif /* PREDICTOR_SUPPORT */
-           default:
-                break;
-           }
-           while (p < optend)
-               printer(arg, " %.2x", *p++);
-           printer(arg, ">");
-       }
-       break;
-
-    case TERMACK:
-    case TERMREQ:
-       if (len > 0 && *p >= ' ' && *p < 0x7f) {
-           ppp_print_string(p, len, printer, arg);
-           p += len;
-           len = 0;
-       }
-       break;
-    default:
-        break;
-    }
-
-    /* dump out the rest of the packet in hex */
-    while (--len >= 0)
-       printer(arg, " %.2x", *p++);
-
-    return p - p0;
-}
-#endif /* PRINTPKT_SUPPORT */
-
-#if PPP_DATAINPUT
-/*
- * We have received a packet that the decompressor failed to
- * decompress.  Here we would expect to issue a reset-request, but
- * Motorola has a patent on resetting the compressor as a result of
- * detecting an error in the decompressed data after decompression.
- * (See US patent 5,130,993; international patent publication number
- * WO 91/10289; Australian patent 73296/91.)
- *
- * So we ask the kernel whether the error was detected after
- * decompression; if it was, we take CCP down, thus disabling
- * compression :-(, otherwise we issue the reset-request.
- */
-static void ccp_datainput(ppp_pcb *pcb, u_char *pkt, int len) {
-    fsm *f;
-#if MPPE_SUPPORT
-    ccp_options *go = &pcb->ccp_gotoptions;
-#endif /* MPPE_SUPPORT */
-    LWIP_UNUSED_ARG(pkt);
-    LWIP_UNUSED_ARG(len);
-
-    f = &pcb->ccp_fsm;
-    if (f->state == PPP_FSM_OPENED) {
-       if (ccp_fatal_error(pcb)) {
-           /*
-            * Disable compression by taking CCP down.
-            */
-           ppp_error("Lost compression sync: disabling compression");
-           ccp_close(pcb, "Lost compression sync");
-#if MPPE_SUPPORT
-           /*
-            * If we were doing MPPE, we must also take the link down.
-            */
-           if (go->mppe) {
-               ppp_error("Too many MPPE errors, closing LCP");
-               lcp_close(pcb, "Too many MPPE errors");
-           }
-#endif /* MPPE_SUPPORT */
-       } else {
-           /*
-            * Send a reset-request to reset the peer's compressor.
-            * We don't do that if we are still waiting for an
-            * acknowledgement to a previous reset-request.
-            */
-           if (!(pcb->ccp_localstate & RACK_PENDING)) {
-               fsm_sdata(f, CCP_RESETREQ, f->reqid = ++f->id, NULL, 0);
-               TIMEOUT(ccp_rack_timeout, f, RACKTIMEOUT);
-               pcb->ccp_localstate |= RACK_PENDING;
-           } else
-               pcb->ccp_localstate |= RREQ_REPEAT;
-       }
-    }
-}
-#endif /* PPP_DATAINPUT */
-
-/*
- * We have received a packet that the decompressor failed to
- * decompress. Issue a reset-request.
- */
-void ccp_resetrequest(ppp_pcb *pcb) {
-    fsm *f = &pcb->ccp_fsm;
-
-    if (f->state != PPP_FSM_OPENED)
-       return;
-
-    /*
-     * Send a reset-request to reset the peer's compressor.
-     * We don't do that if we are still waiting for an
-     * acknowledgement to a previous reset-request.
-     */
-    if (!(pcb->ccp_localstate & RACK_PENDING)) {
-       fsm_sdata(f, CCP_RESETREQ, f->reqid = ++f->id, NULL, 0);
-       TIMEOUT(ccp_rack_timeout, f, RACKTIMEOUT);
-       pcb->ccp_localstate |= RACK_PENDING;
-    } else
-       pcb->ccp_localstate |= RREQ_REPEAT;
-}
-
-/*
- * Timeout waiting for reset-ack.
- */
-static void ccp_rack_timeout(void *arg) {
-    fsm *f = (fsm*)arg;
-    ppp_pcb *pcb = f->pcb;
-
-    if (f->state == PPP_FSM_OPENED && (pcb->ccp_localstate & RREQ_REPEAT)) {
-       fsm_sdata(f, CCP_RESETREQ, f->reqid, NULL, 0);
-       TIMEOUT(ccp_rack_timeout, f, RACKTIMEOUT);
-       pcb->ccp_localstate &= ~RREQ_REPEAT;
-    } else
-       pcb->ccp_localstate &= ~RACK_PENDING;
-}
-
-#endif /* PPP_SUPPORT && CCP_SUPPORT */
diff --git a/components/lwip/netif/ppp/chap-md5.c b/components/lwip/netif/ppp/chap-md5.c
deleted file mode 100644 (file)
index 6e3a9d7..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * chap-md5.c - New CHAP/MD5 implementation.
- *
- * Copyright (c) 2003 Paul Mackerras. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. The name(s) of the authors of this software must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission.
- *
- * 3. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by Paul Mackerras
- *     <paulus@samba.org>".
- *
- * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && CHAP_SUPPORT  /* don't build if not configured for use in lwipopts.h */
-
-#if 0 /* UNUSED */
-#include <stdlib.h>
-#include <string.h>
-#endif /* UNUSED */
-
-#include "netif/ppp/ppp_impl.h"
-
-#include "netif/ppp/chap-new.h"
-#include "netif/ppp/chap-md5.h"
-#include "netif/ppp/magic.h"
-
-#if LWIP_INCLUDED_POLARSSL_MD5
-#include "netif/ppp/polarssl/md5.h"
-#else
-#include "polarssl/md5.h"
-#endif
-
-#define MD5_HASH_SIZE          16
-#define MD5_MIN_CHALLENGE      17
-#define MD5_MAX_CHALLENGE      24
-#define MD5_MIN_MAX_POWER_OF_TWO_CHALLENGE     3   /* 2^3-1 = 7, 17+7 = 24 */
-
-#if PPP_SERVER
-static void chap_md5_generate_challenge(ppp_pcb *pcb, unsigned char *cp) {
-       int clen;
-       LWIP_UNUSED_ARG(pcb);
-
-       clen = MD5_MIN_CHALLENGE + magic_pow(MD5_MIN_MAX_POWER_OF_TWO_CHALLENGE);
-       *cp++ = clen;
-       magic_random_bytes(cp, clen);
-}
-
-static int chap_md5_verify_response(ppp_pcb *pcb, int id, const char *name,
-                        const unsigned char *secret, int secret_len,
-                        const unsigned char *challenge, const unsigned char *response,
-                        char *message, int message_space) {
-       md5_context ctx;
-       unsigned char idbyte = id;
-       unsigned char hash[MD5_HASH_SIZE];
-       int challenge_len, response_len;
-       LWIP_UNUSED_ARG(name);
-       LWIP_UNUSED_ARG(pcb);
-
-       challenge_len = *challenge++;
-       response_len = *response++;
-       if (response_len == MD5_HASH_SIZE) {
-               /* Generate hash of ID, secret, challenge */
-               md5_starts(&ctx);
-               md5_update(&ctx, &idbyte, 1);
-               md5_update(&ctx, secret, secret_len);
-               md5_update(&ctx, challenge, challenge_len);
-               md5_finish(&ctx, hash);
-
-               /* Test if our hash matches the peer's response */
-               if (memcmp(hash, response, MD5_HASH_SIZE) == 0) {
-                       ppp_slprintf(message, message_space, "Access granted");
-                       return 1;
-               }
-       }
-       ppp_slprintf(message, message_space, "Access denied");
-       return 0;
-}
-#endif /* PPP_SERVER */
-
-static void chap_md5_make_response(ppp_pcb *pcb, unsigned char *response, int id, const char *our_name,
-                      const unsigned char *challenge, const char *secret, int secret_len,
-                      unsigned char *private_) {
-       md5_context ctx;
-       unsigned char idbyte = id;
-       int challenge_len = *challenge++;
-       LWIP_UNUSED_ARG(our_name);
-       LWIP_UNUSED_ARG(private_);
-       LWIP_UNUSED_ARG(pcb);
-
-       md5_starts(&ctx);
-       md5_update(&ctx, &idbyte, 1);
-       md5_update(&ctx, (const u_char *)secret, secret_len);
-       md5_update(&ctx, challenge, challenge_len);
-       md5_finish(&ctx, &response[1]);
-       response[0] = MD5_HASH_SIZE;
-}
-
-const struct chap_digest_type md5_digest = {
-       CHAP_MD5,               /* code */
-#if PPP_SERVER
-       chap_md5_generate_challenge,
-       chap_md5_verify_response,
-#endif /* PPP_SERVER */
-       chap_md5_make_response,
-       NULL,                   /* check_success */
-       NULL,                   /* handle_failure */
-};
-
-#endif /* PPP_SUPPORT && CHAP_SUPPORT */
diff --git a/components/lwip/netif/ppp/chap-new.c b/components/lwip/netif/ppp/chap-new.c
deleted file mode 100644 (file)
index f075397..0000000
+++ /dev/null
@@ -1,677 +0,0 @@
-/*
- * chap-new.c - New CHAP implementation.
- *
- * Copyright (c) 2003 Paul Mackerras. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. The name(s) of the authors of this software must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission.
- *
- * 3. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by Paul Mackerras
- *     <paulus@samba.org>".
- *
- * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && CHAP_SUPPORT  /* don't build if not configured for use in lwipopts.h */
-
-#if 0 /* UNUSED */
-#include <stdlib.h>
-#include <string.h>
-#endif /* UNUSED */
-
-#include "netif/ppp/ppp_impl.h"
-
-#if 0 /* UNUSED */
-#include "session.h"
-#endif /* UNUSED */
-
-#include "netif/ppp/chap-new.h"
-#include "netif/ppp/chap-md5.h"
-#if MSCHAP_SUPPORT
-#include "netif/ppp/chap_ms.h"
-#endif
-#include "netif/ppp/magic.h"
-
-#if 0 /* UNUSED */
-/* Hook for a plugin to validate CHAP challenge */
-int (*chap_verify_hook)(const char *name, const char *ourname, int id,
-                       const struct chap_digest_type *digest,
-                       const unsigned char *challenge, const unsigned char *response,
-                       char *message, int message_space) = NULL;
-#endif /* UNUSED */
-
-#if PPP_OPTIONS
-/*
- * Command-line options.
- */
-static option_t chap_option_list[] = {
-       { "chap-restart", o_int, &chap_timeout_time,
-         "Set timeout for CHAP", OPT_PRIO },
-       { "chap-max-challenge", o_int, &pcb->settings.chap_max_transmits,
-         "Set max #xmits for challenge", OPT_PRIO },
-       { "chap-interval", o_int, &pcb->settings.chap_rechallenge_time,
-         "Set interval for rechallenge", OPT_PRIO },
-       { NULL }
-};
-#endif /* PPP_OPTIONS */
-
-
-/* Values for flags in chap_client_state and chap_server_state */
-#define LOWERUP                        1
-#define AUTH_STARTED           2
-#define AUTH_DONE              4
-#define AUTH_FAILED            8
-#define TIMEOUT_PENDING                0x10
-#define CHALLENGE_VALID                0x20
-
-/*
- * Prototypes.
- */
-static void chap_init(ppp_pcb *pcb);
-static void chap_lowerup(ppp_pcb *pcb);
-static void chap_lowerdown(ppp_pcb *pcb);
-#if PPP_SERVER
-static void chap_timeout(void *arg);
-static void chap_generate_challenge(ppp_pcb *pcb);
-static void chap_handle_response(ppp_pcb *pcb, int code,
-               unsigned char *pkt, int len);
-static int chap_verify_response(ppp_pcb *pcb, const char *name, const char *ourname, int id,
-               const struct chap_digest_type *digest,
-               const unsigned char *challenge, const unsigned char *response,
-               char *message, int message_space);
-#endif /* PPP_SERVER */
-static void chap_respond(ppp_pcb *pcb, int id,
-               unsigned char *pkt, int len);
-static void chap_handle_status(ppp_pcb *pcb, int code, int id,
-               unsigned char *pkt, int len);
-static void chap_protrej(ppp_pcb *pcb);
-static void chap_input(ppp_pcb *pcb, unsigned char *pkt, int pktlen);
-#if PRINTPKT_SUPPORT
-static int chap_print_pkt(const unsigned char *p, int plen,
-               void (*printer) (void *, const char *, ...), void *arg);
-#endif /* PRINTPKT_SUPPORT */
-
-/* List of digest types that we know about */
-static const struct chap_digest_type* const chap_digests[] = {
-    &md5_digest,
-#if MSCHAP_SUPPORT
-    &chapms_digest,
-    &chapms2_digest,
-#endif /* MSCHAP_SUPPORT */
-    NULL
-};
-
-/*
- * chap_init - reset to initial state.
- */
-static void chap_init(ppp_pcb *pcb) {
-       LWIP_UNUSED_ARG(pcb);
-
-#if 0 /* Not necessary, everything is cleared in ppp_clear() */
-       memset(&pcb->chap_client, 0, sizeof(chap_client_state));
-#if PPP_SERVER
-       memset(&pcb->chap_server, 0, sizeof(chap_server_state));
-#endif /* PPP_SERVER */
-#endif /* 0 */
-}
-
-/*
- * chap_lowerup - we can start doing stuff now.
- */
-static void chap_lowerup(ppp_pcb *pcb) {
-
-       pcb->chap_client.flags |= LOWERUP;
-#if PPP_SERVER
-       pcb->chap_server.flags |= LOWERUP;
-       if (pcb->chap_server.flags & AUTH_STARTED)
-               chap_timeout(pcb);
-#endif /* PPP_SERVER */
-}
-
-static void chap_lowerdown(ppp_pcb *pcb) {
-
-       pcb->chap_client.flags = 0;
-#if PPP_SERVER
-       if (pcb->chap_server.flags & TIMEOUT_PENDING)
-               UNTIMEOUT(chap_timeout, pcb);
-       pcb->chap_server.flags = 0;
-#endif /* PPP_SERVER */
-}
-
-#if PPP_SERVER
-/*
- * chap_auth_peer - Start authenticating the peer.
- * If the lower layer is already up, we start sending challenges,
- * otherwise we wait for the lower layer to come up.
- */
-void chap_auth_peer(ppp_pcb *pcb, const char *our_name, int digest_code) {
-       const struct chap_digest_type *dp;
-       int i;
-
-       if (pcb->chap_server.flags & AUTH_STARTED) {
-               ppp_error("CHAP: peer authentication already started!");
-               return;
-       }
-       for (i = 0; (dp = chap_digests[i]) != NULL; ++i)
-               if (dp->code == digest_code)
-                       break;
-       if (dp == NULL)
-               ppp_fatal("CHAP digest 0x%x requested but not available",
-                     digest_code);
-
-       pcb->chap_server.digest = dp;
-       pcb->chap_server.name = our_name;
-       /* Start with a random ID value */
-       pcb->chap_server.id = magic();
-       pcb->chap_server.flags |= AUTH_STARTED;
-       if (pcb->chap_server.flags & LOWERUP)
-               chap_timeout(pcb);
-}
-#endif /* PPP_SERVER */
-
-/*
- * chap_auth_with_peer - Prepare to authenticate ourselves to the peer.
- * There isn't much to do until we receive a challenge.
- */
-void chap_auth_with_peer(ppp_pcb *pcb, const char *our_name, int digest_code) {
-       const struct chap_digest_type *dp;
-       int i;
-
-       if(NULL == our_name)
-               return;
-
-       if (pcb->chap_client.flags & AUTH_STARTED) {
-               ppp_error("CHAP: authentication with peer already started!");
-               return;
-       }
-       for (i = 0; (dp = chap_digests[i]) != NULL; ++i)
-               if (dp->code == digest_code)
-                       break;
-
-       if (dp == NULL)
-               ppp_fatal("CHAP digest 0x%x requested but not available",
-                     digest_code);
-
-       pcb->chap_client.digest = dp;
-       pcb->chap_client.name = our_name;
-       pcb->chap_client.flags |= AUTH_STARTED;
-}
-
-#if PPP_SERVER
-/*
- * chap_timeout - It's time to send another challenge to the peer.
- * This could be either a retransmission of a previous challenge,
- * or a new challenge to start re-authentication.
- */
-static void chap_timeout(void *arg) {
-       ppp_pcb *pcb = (ppp_pcb*)arg;
-       struct pbuf *p;
-
-       pcb->chap_server.flags &= ~TIMEOUT_PENDING;
-       if ((pcb->chap_server.flags & CHALLENGE_VALID) == 0) {
-               pcb->chap_server.challenge_xmits = 0;
-               chap_generate_challenge(pcb);
-               pcb->chap_server.flags |= CHALLENGE_VALID;
-       } else if (pcb->chap_server.challenge_xmits >= pcb->settings.chap_max_transmits) {
-               pcb->chap_server.flags &= ~CHALLENGE_VALID;
-               pcb->chap_server.flags |= AUTH_DONE | AUTH_FAILED;
-               auth_peer_fail(pcb, PPP_CHAP);
-               return;
-       }
-
-       p = pbuf_alloc(PBUF_RAW, (u16_t)(pcb->chap_server.challenge_pktlen), PPP_CTRL_PBUF_TYPE);
-       if(NULL == p)
-               return;
-       if(p->tot_len != p->len) {
-               pbuf_free(p);
-               return;
-       }
-       MEMCPY(p->payload, pcb->chap_server.challenge, pcb->chap_server.challenge_pktlen);
-       ppp_write(pcb, p);
-       ++pcb->chap_server.challenge_xmits;
-       pcb->chap_server.flags |= TIMEOUT_PENDING;
-       TIMEOUT(chap_timeout, arg, pcb->settings.chap_timeout_time);
-}
-
-/*
- * chap_generate_challenge - generate a challenge string and format
- * the challenge packet in pcb->chap_server.challenge_pkt.
- */
-static void chap_generate_challenge(ppp_pcb *pcb) {
-       int clen = 1, nlen, len;
-       unsigned char *p;
-
-       p = pcb->chap_server.challenge;
-       MAKEHEADER(p, PPP_CHAP);
-       p += CHAP_HDRLEN;
-       pcb->chap_server.digest->generate_challenge(pcb, p);
-       clen = *p;
-       nlen = strlen(pcb->chap_server.name);
-       memcpy(p + 1 + clen, pcb->chap_server.name, nlen);
-
-       len = CHAP_HDRLEN + 1 + clen + nlen;
-       pcb->chap_server.challenge_pktlen = PPP_HDRLEN + len;
-
-       p = pcb->chap_server.challenge + PPP_HDRLEN;
-       p[0] = CHAP_CHALLENGE;
-       p[1] = ++pcb->chap_server.id;
-       p[2] = len >> 8;
-       p[3] = len;
-}
-
-/*
- * chap_handle_response - check the response to our challenge.
- */
-static void  chap_handle_response(ppp_pcb *pcb, int id,
-                    unsigned char *pkt, int len) {
-       int response_len, ok, mlen;
-       const unsigned char *response;
-       unsigned char *outp;
-       struct pbuf *p;
-       const char *name = NULL;        /* initialized to shut gcc up */
-#if 0 /* UNUSED */
-       int (*verifier)(const char *, const char *, int, const struct chap_digest_type *,
-               const unsigned char *, const unsigned char *, char *, int);
-#endif /* UNUSED */
-       char rname[MAXNAMELEN+1];
-       char message[256];
-
-       if ((pcb->chap_server.flags & LOWERUP) == 0)
-               return;
-       if (id != pcb->chap_server.challenge[PPP_HDRLEN+1] || len < 2)
-               return;
-       if (pcb->chap_server.flags & CHALLENGE_VALID) {
-               response = pkt;
-               GETCHAR(response_len, pkt);
-               len -= response_len + 1;        /* length of name */
-               name = (char *)pkt + response_len;
-               if (len < 0)
-                       return;
-
-               if (pcb->chap_server.flags & TIMEOUT_PENDING) {
-                       pcb->chap_server.flags &= ~TIMEOUT_PENDING;
-                       UNTIMEOUT(chap_timeout, pcb);
-               }
-#if PPP_REMOTENAME
-               if (pcb->settings.explicit_remote) {
-                       name = pcb->remote_name;
-               } else
-#endif /* PPP_REMOTENAME */
-               {
-                       /* Null terminate and clean remote name. */
-                       ppp_slprintf(rname, sizeof(rname), "%.*v", len, name);
-                       name = rname;
-               }
-
-#if 0 /* UNUSED */
-               if (chap_verify_hook)
-                       verifier = chap_verify_hook;
-               else
-                       verifier = chap_verify_response;
-               ok = (*verifier)(name, pcb->chap_server.name, id, pcb->chap_server.digest,
-                                pcb->chap_server.challenge + PPP_HDRLEN + CHAP_HDRLEN,
-                                response, pcb->chap_server.message, sizeof(pcb->chap_server.message));
-#endif /* UNUSED */
-               ok = chap_verify_response(pcb, name, pcb->chap_server.name, id, pcb->chap_server.digest,
-                    pcb->chap_server.challenge + PPP_HDRLEN + CHAP_HDRLEN,
-                    response, message, sizeof(message));
-#if 0 /* UNUSED */
-               if (!ok || !auth_number()) {
-#endif /* UNUSED */
-               if (!ok) {
-                       pcb->chap_server.flags |= AUTH_FAILED;
-                       ppp_warn("Peer %q failed CHAP authentication", name);
-               }
-       } else if ((pcb->chap_server.flags & AUTH_DONE) == 0)
-               return;
-
-       /* send the response */
-       mlen = strlen(message);
-       len = CHAP_HDRLEN + mlen;
-       p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN +len), PPP_CTRL_PBUF_TYPE);
-       if(NULL == p)
-               return;
-       if(p->tot_len != p->len) {
-               pbuf_free(p);
-               return;
-       }
-
-       outp = (unsigned char *)p->payload;
-       MAKEHEADER(outp, PPP_CHAP);
-
-       outp[0] = (pcb->chap_server.flags & AUTH_FAILED)? CHAP_FAILURE: CHAP_SUCCESS;
-       outp[1] = id;
-       outp[2] = len >> 8;
-       outp[3] = len;
-       if (mlen > 0)
-               memcpy(outp + CHAP_HDRLEN, message, mlen);
-       ppp_write(pcb, p);
-
-       if (pcb->chap_server.flags & CHALLENGE_VALID) {
-               pcb->chap_server.flags &= ~CHALLENGE_VALID;
-               if (!(pcb->chap_server.flags & AUTH_DONE) && !(pcb->chap_server.flags & AUTH_FAILED)) {
-
-#if 0 /* UNUSED */
-                   /*
-                    * Auth is OK, so now we need to check session restrictions
-                    * to ensure everything is OK, but only if we used a
-                    * plugin, and only if we're configured to check.  This
-                    * allows us to do PAM checks on PPP servers that
-                    * authenticate against ActiveDirectory, and use AD for
-                    * account info (like when using Winbind integrated with
-                    * PAM).
-                    */
-                   if (session_mgmt &&
-                       session_check(name, NULL, devnam, NULL) == 0) {
-                       pcb->chap_server.flags |= AUTH_FAILED;
-                       ppp_warn("Peer %q failed CHAP Session verification", name);
-                   }
-#endif /* UNUSED */
-
-               }
-               if (pcb->chap_server.flags & AUTH_FAILED) {
-                       auth_peer_fail(pcb, PPP_CHAP);
-               } else {
-                       if ((pcb->chap_server.flags & AUTH_DONE) == 0)
-                               auth_peer_success(pcb, PPP_CHAP,
-                                                 pcb->chap_server.digest->code,
-                                                 name, strlen(name));
-                       if (pcb->settings.chap_rechallenge_time) {
-                               pcb->chap_server.flags |= TIMEOUT_PENDING;
-                               TIMEOUT(chap_timeout, pcb,
-                                       pcb->settings.chap_rechallenge_time);
-                       }
-               }
-               pcb->chap_server.flags |= AUTH_DONE;
-       }
-}
-
-/*
- * chap_verify_response - check whether the peer's response matches
- * what we think it should be.  Returns 1 if it does (authentication
- * succeeded), or 0 if it doesn't.
- */
-static int chap_verify_response(ppp_pcb *pcb, const char *name, const char *ourname, int id,
-                    const struct chap_digest_type *digest,
-                    const unsigned char *challenge, const unsigned char *response,
-                    char *message, int message_space) {
-       int ok;
-       unsigned char secret[MAXSECRETLEN];
-       int secret_len;
-
-       /* Get the secret that the peer is supposed to know */
-       if (!get_secret(pcb, name, ourname, (char *)secret, &secret_len, 1)) {
-               ppp_error("No CHAP secret found for authenticating %q", name);
-               return 0;
-       }
-       ok = digest->verify_response(pcb, id, name, secret, secret_len, challenge,
-                                    response, message, message_space);
-       memset(secret, 0, sizeof(secret));
-
-       return ok;
-}
-#endif /* PPP_SERVER */
-
-/*
- * chap_respond - Generate and send a response to a challenge.
- */
-static void chap_respond(ppp_pcb *pcb, int id,
-            unsigned char *pkt, int len) {
-       int clen, nlen;
-       int secret_len;
-       struct pbuf *p;
-       u_char *outp;
-       char rname[MAXNAMELEN+1];
-       char secret[MAXSECRETLEN+1];
-
-       p = pbuf_alloc(PBUF_RAW, (u16_t)(RESP_MAX_PKTLEN), PPP_CTRL_PBUF_TYPE);
-       if(NULL == p)
-               return;
-       if(p->tot_len != p->len) {
-               pbuf_free(p);
-               return;
-       }
-
-       if ((pcb->chap_client.flags & (LOWERUP | AUTH_STARTED)) != (LOWERUP | AUTH_STARTED))
-               return;         /* not ready */
-       if (len < 2 || len < pkt[0] + 1)
-               return;         /* too short */
-       clen = pkt[0];
-       nlen = len - (clen + 1);
-
-       /* Null terminate and clean remote name. */
-       ppp_slprintf(rname, sizeof(rname), "%.*v", nlen, pkt + clen + 1);
-
-#if PPP_REMOTENAME
-       /* Microsoft doesn't send their name back in the PPP packet */
-       if (pcb->settings.explicit_remote || (pcb->settings.remote_name[0] != 0 && rname[0] == 0))
-               strlcpy(rname, pcb->settings.remote_name, sizeof(rname));
-#endif /* PPP_REMOTENAME */
-
-       /* get secret for authenticating ourselves with the specified host */
-       if (!get_secret(pcb, pcb->chap_client.name, rname, secret, &secret_len, 0)) {
-               secret_len = 0; /* assume null secret if can't find one */
-               ppp_warn("No CHAP secret found for authenticating us to %q", rname);
-       }
-
-       outp = (u_char*)p->payload;
-       MAKEHEADER(outp, PPP_CHAP);
-       outp += CHAP_HDRLEN;
-
-       pcb->chap_client.digest->make_response(pcb, outp, id, pcb->chap_client.name, pkt,
-                                 secret, secret_len, pcb->chap_client.priv);
-       memset(secret, 0, secret_len);
-
-       clen = *outp;
-       nlen = strlen(pcb->chap_client.name);
-       memcpy(outp + clen + 1, pcb->chap_client.name, nlen);
-
-       outp = (u_char*)p->payload + PPP_HDRLEN;
-       len = CHAP_HDRLEN + clen + 1 + nlen;
-       outp[0] = CHAP_RESPONSE;
-       outp[1] = id;
-       outp[2] = len >> 8;
-       outp[3] = len;
-
-       pbuf_realloc(p, PPP_HDRLEN + len);
-       ppp_write(pcb, p);
-}
-
-static void chap_handle_status(ppp_pcb *pcb, int code, int id,
-                  unsigned char *pkt, int len) {
-       const char *msg = NULL;
-       LWIP_UNUSED_ARG(id);
-
-       if ((pcb->chap_client.flags & (AUTH_DONE|AUTH_STARTED|LOWERUP))
-           != (AUTH_STARTED|LOWERUP))
-               return;
-       pcb->chap_client.flags |= AUTH_DONE;
-
-       if (code == CHAP_SUCCESS) {
-               /* used for MS-CHAP v2 mutual auth, yuck */
-               if (pcb->chap_client.digest->check_success != NULL) {
-                       if (!(*pcb->chap_client.digest->check_success)(pcb, pkt, len, pcb->chap_client.priv))
-                               code = CHAP_FAILURE;
-               } else
-                       msg = "CHAP authentication succeeded";
-       } else {
-               if (pcb->chap_client.digest->handle_failure != NULL)
-                       (*pcb->chap_client.digest->handle_failure)(pcb, pkt, len);
-               else
-                       msg = "CHAP authentication failed";
-       }
-       if (msg) {
-               if (len > 0)
-                       ppp_info("%s: %.*v", msg, len, pkt);
-               else
-                       ppp_info("%s", msg);
-       }
-       if (code == CHAP_SUCCESS)
-               auth_withpeer_success(pcb, PPP_CHAP, pcb->chap_client.digest->code);
-       else {
-               pcb->chap_client.flags |= AUTH_FAILED;
-               ppp_error("CHAP authentication failed");
-               auth_withpeer_fail(pcb, PPP_CHAP);
-       }
-}
-
-static void chap_input(ppp_pcb *pcb, unsigned char *pkt, int pktlen) {
-       unsigned char code, id;
-       int len;
-
-       if (pktlen < CHAP_HDRLEN)
-               return;
-       GETCHAR(code, pkt);
-       GETCHAR(id, pkt);
-       GETSHORT(len, pkt);
-       if (len < CHAP_HDRLEN || len > pktlen)
-               return;
-       len -= CHAP_HDRLEN;
-
-       switch (code) {
-       case CHAP_CHALLENGE:
-               chap_respond(pcb, id, pkt, len);
-               break;
-#if PPP_SERVER
-       case CHAP_RESPONSE:
-               chap_handle_response(pcb, id, pkt, len);
-               break;
-#endif /* PPP_SERVER */
-       case CHAP_FAILURE:
-       case CHAP_SUCCESS:
-               chap_handle_status(pcb, code, id, pkt, len);
-               break;
-       default:
-               break;
-       }
-}
-
-static void chap_protrej(ppp_pcb *pcb) {
-
-#if PPP_SERVER
-       if (pcb->chap_server.flags & TIMEOUT_PENDING) {
-               pcb->chap_server.flags &= ~TIMEOUT_PENDING;
-               UNTIMEOUT(chap_timeout, pcb);
-       }
-       if (pcb->chap_server.flags & AUTH_STARTED) {
-               pcb->chap_server.flags = 0;
-               auth_peer_fail(pcb, PPP_CHAP);
-       }
-#endif /* PPP_SERVER */
-       if ((pcb->chap_client.flags & (AUTH_STARTED|AUTH_DONE)) == AUTH_STARTED) {
-               pcb->chap_client.flags &= ~AUTH_STARTED;
-               ppp_error("CHAP authentication failed due to protocol-reject");
-               auth_withpeer_fail(pcb, PPP_CHAP);
-       }
-}
-
-#if PRINTPKT_SUPPORT
-/*
- * chap_print_pkt - print the contents of a CHAP packet.
- */
-static const char* const chap_code_names[] = {
-       "Challenge", "Response", "Success", "Failure"
-};
-
-static int chap_print_pkt(const unsigned char *p, int plen,
-              void (*printer) (void *, const char *, ...), void *arg) {
-       int code, id, len;
-       int clen, nlen;
-       unsigned char x;
-
-       if (plen < CHAP_HDRLEN)
-               return 0;
-       GETCHAR(code, p);
-       GETCHAR(id, p);
-       GETSHORT(len, p);
-       if (len < CHAP_HDRLEN || len > plen)
-               return 0;
-
-       if (code >= 1 && code <= (int)sizeof(chap_code_names) / (int)sizeof(char *))
-               printer(arg, " %s", chap_code_names[code-1]);
-       else
-               printer(arg, " code=0x%x", code);
-       printer(arg, " id=0x%x", id);
-       len -= CHAP_HDRLEN;
-       switch (code) {
-       case CHAP_CHALLENGE:
-       case CHAP_RESPONSE:
-               if (len < 1)
-                       break;
-               clen = p[0];
-               if (len < clen + 1)
-                       break;
-               ++p;
-               nlen = len - clen - 1;
-               printer(arg, " <");
-               for (; clen > 0; --clen) {
-                       GETCHAR(x, p);
-                       printer(arg, "%.2x", x);
-               }
-               printer(arg, ">, name = ");
-               ppp_print_string(p, nlen, printer, arg);
-               break;
-       case CHAP_FAILURE:
-       case CHAP_SUCCESS:
-               printer(arg, " ");
-               ppp_print_string(p, len, printer, arg);
-               break;
-       default:
-               for (clen = len; clen > 0; --clen) {
-                       GETCHAR(x, p);
-                       printer(arg, " %.2x", x);
-               }
-               /* no break */
-       }
-
-       return len + CHAP_HDRLEN;
-}
-#endif /* PRINTPKT_SUPPORT */
-
-const struct protent chap_protent = {
-       PPP_CHAP,
-       chap_init,
-       chap_input,
-       chap_protrej,
-       chap_lowerup,
-       chap_lowerdown,
-       NULL,           /* open */
-       NULL,           /* close */
-#if PRINTPKT_SUPPORT
-       chap_print_pkt,
-#endif /* PRINTPKT_SUPPORT */
-#if PPP_DATAINPUT
-       NULL,           /* datainput */
-#endif /* PPP_DATAINPUT */
-#if PRINTPKT_SUPPORT
-       "CHAP",         /* name */
-       NULL,           /* data_name */
-#endif /* PRINTPKT_SUPPORT */
-#if PPP_OPTIONS
-       chap_option_list,
-       NULL,           /* check_options */
-#endif /* PPP_OPTIONS */
-#if DEMAND_SUPPORT
-       NULL,
-       NULL
-#endif /* DEMAND_SUPPORT */
-};
-
-#endif /* PPP_SUPPORT && CHAP_SUPPORT */
diff --git a/components/lwip/netif/ppp/chap_ms.c b/components/lwip/netif/ppp/chap_ms.c
deleted file mode 100644 (file)
index 550c95d..0000000
+++ /dev/null
@@ -1,954 +0,0 @@
-/*
- * chap_ms.c - Microsoft MS-CHAP compatible implementation.
- *
- * Copyright (c) 1995 Eric Rosenquist.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The name(s) of the authors of this software must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission.
- *
- * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-/*
- * Modifications by Lauri Pesonen / lpesonen@clinet.fi, april 1997
- *
- *   Implemented LANManager type password response to MS-CHAP challenges.
- *   Now pppd provides both NT style and LANMan style blocks, and the
- *   prefered is set by option "ms-lanman". Default is to use NT.
- *   The hash text (StdText) was taken from Win95 RASAPI32.DLL.
- *
- *   You should also use DOMAIN\\USERNAME as described in README.MSCHAP80
- */
-
-/*
- * Modifications by Frank Cusack, frank@google.com, March 2002.
- *
- *   Implemented MS-CHAPv2 functionality, heavily based on sample
- *   implementation in RFC 2759.  Implemented MPPE functionality,
- *   heavily based on sample implementation in RFC 3079.
- *
- * Copyright (c) 2002 Google, Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The name(s) of the authors of this software must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission.
- *
- * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && MSCHAP_SUPPORT  /* don't build if not configured for use in lwipopts.h */
-
-#if 0 /* UNUSED */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#include <unistd.h>
-#endif /* UNUSED */
-
-#include "netif/ppp/ppp_impl.h"
-
-#include "netif/ppp/chap-new.h"
-#include "netif/ppp/chap_ms.h"
-#include "netif/ppp/pppcrypt.h"
-#include "netif/ppp/magic.h"
-#if MPPE_SUPPORT
-#include "netif/ppp/mppe.h" /* For mppe_sha1_pad*, mppe_set_key() */
-#endif /* MPPE_SUPPORT */
-
-#if LWIP_INCLUDED_POLARSSL_MD4
-#include "netif/ppp/polarssl/md4.h"
-#else
-#include "polarssl/md4.h"
-#endif
-
-#if LWIP_INCLUDED_POLARSSL_SHA1
-#include "netif/ppp/polarssl/sha1.h"
-#else
-#include "polarssl/sha1.h"
-#endif
-
-#if LWIP_INCLUDED_POLARSSL_DES
-#include "netif/ppp/polarssl/des.h"
-#else
-#include "polarssl/des.h"
-#endif
-
-#define SHA1_SIGNATURE_SIZE    20
-#define MD4_SIGNATURE_SIZE     16      /* 16 bytes in a MD4 message digest */
-#define MAX_NT_PASSWORD                256     /* Max (Unicode) chars in an NT pass */
-
-#define MS_CHAP_RESPONSE_LEN   49      /* Response length for MS-CHAP */
-#define MS_CHAP2_RESPONSE_LEN  49      /* Response length for MS-CHAPv2 */
-#define MS_AUTH_RESPONSE_LENGTH        40      /* MS-CHAPv2 authenticator response, */
-                                       /* as ASCII */
-
-/* Error codes for MS-CHAP failure messages. */
-#define MS_CHAP_ERROR_RESTRICTED_LOGON_HOURS   646
-#define MS_CHAP_ERROR_ACCT_DISABLED            647
-#define MS_CHAP_ERROR_PASSWD_EXPIRED           648
-#define MS_CHAP_ERROR_NO_DIALIN_PERMISSION     649
-#define MS_CHAP_ERROR_AUTHENTICATION_FAILURE   691
-#define MS_CHAP_ERROR_CHANGING_PASSWORD                709
-
-/*
- * Offsets within the response field for MS-CHAP
- */
-#define MS_CHAP_LANMANRESP     0
-#define MS_CHAP_LANMANRESP_LEN 24
-#define MS_CHAP_NTRESP         24
-#define MS_CHAP_NTRESP_LEN     24
-#define MS_CHAP_USENT          48
-
-/*
- * Offsets within the response field for MS-CHAP2
- */
-#define MS_CHAP2_PEER_CHALLENGE        0
-#define MS_CHAP2_PEER_CHAL_LEN 16
-#define MS_CHAP2_RESERVED_LEN  8
-#define MS_CHAP2_NTRESP                24
-#define MS_CHAP2_NTRESP_LEN    24
-#define MS_CHAP2_FLAGS         48
-
-#if MPPE_SUPPORT
-#if 0 /* UNUSED */
-/* These values are the RADIUS attribute values--see RFC 2548. */
-#define MPPE_ENC_POL_ENC_ALLOWED 1
-#define MPPE_ENC_POL_ENC_REQUIRED 2
-#define MPPE_ENC_TYPES_RC4_40 2
-#define MPPE_ENC_TYPES_RC4_128 4
-
-/* used by plugins (using above values) */
-extern void set_mppe_enc_types(int, int);
-#endif /* UNUSED */
-#endif /* MPPE_SUPPORT */
-
-/* Are we the authenticator or authenticatee?  For MS-CHAPv2 key derivation. */
-#define MS_CHAP2_AUTHENTICATEE 0
-#define MS_CHAP2_AUTHENTICATOR 1
-
-static void    ascii2unicode (const char[], int, u_char[]);
-static void    NTPasswordHash (u_char *, int, u_char[MD4_SIGNATURE_SIZE]);
-static void    ChallengeResponse (const u_char *, const u_char *, u_char[24]);
-static void    ChallengeHash (const u_char[16], const u_char *, const char *, u_char[8]);
-static void    ChapMS_NT (const u_char *, const char *, int, u_char[24]);
-static void    ChapMS2_NT (const u_char *, const u_char[16], const char *, const char *, int,
-                               u_char[24]);
-static void    GenerateAuthenticatorResponsePlain
-                       (const char*, int, u_char[24], const u_char[16], const u_char *,
-                            const char *, u_char[41]);
-#ifdef MSLANMAN
-static void    ChapMS_LANMan (u_char *, char *, int, u_char *);
-#endif
-
-static void GenerateAuthenticatorResponse(const u_char PasswordHashHash[MD4_SIGNATURE_SIZE],
-                       u_char NTResponse[24], const u_char PeerChallenge[16],
-                       const u_char *rchallenge, const char *username,
-                       u_char authResponse[MS_AUTH_RESPONSE_LENGTH+1]);
-
-#if MPPE_SUPPORT
-static void    Set_Start_Key (ppp_pcb *pcb, const u_char *, const char *, int);
-static void    SetMasterKeys (ppp_pcb *pcb, const char *, int, u_char[24], int);
-#endif /* MPPE_SUPPORT */
-
-static void ChapMS (ppp_pcb *pcb, const u_char *, const char *, int, u_char *);
-static void ChapMS2 (ppp_pcb *pcb, const u_char *, const u_char *, const char *, const char *, int,
-                 u_char *, u_char[MS_AUTH_RESPONSE_LENGTH+1], int);
-
-#ifdef MSLANMAN
-bool   ms_lanman = 0;          /* Use LanMan password instead of NT */
-                               /* Has meaning only with MS-CHAP challenges */
-#endif
-
-#if MPPE_SUPPORT
-#ifdef DEBUGMPPEKEY
-/* For MPPE debug */
-/* Use "[]|}{?/><,`!2&&(" (sans quotes) for RFC 3079 MS-CHAPv2 test value */
-static char *mschap_challenge = NULL;
-/* Use "!@\#$%^&*()_+:3|~" (sans quotes, backslash is to escape #) for ... */
-static char *mschap2_peer_challenge = NULL;
-#endif
-
-#include "netif/ppp/fsm.h"             /* Need to poke MPPE options */
-#include "netif/ppp/ccp.h"
-#endif /* MPPE_SUPPORT */
-
-#if PPP_OPTIONS
-/*
- * Command-line options.
- */
-static option_t chapms_option_list[] = {
-#ifdef MSLANMAN
-       { "ms-lanman", o_bool, &ms_lanman,
-         "Use LanMan passwd when using MS-CHAP", 1 },
-#endif
-#ifdef DEBUGMPPEKEY
-       { "mschap-challenge", o_string, &mschap_challenge,
-         "specify CHAP challenge" },
-       { "mschap2-peer-challenge", o_string, &mschap2_peer_challenge,
-         "specify CHAP peer challenge" },
-#endif
-       { NULL }
-};
-#endif /* PPP_OPTIONS */
-
-#if PPP_SERVER
-/*
- * chapms_generate_challenge - generate a challenge for MS-CHAP.
- * For MS-CHAP the challenge length is fixed at 8 bytes.
- * The length goes in challenge[0] and the actual challenge starts
- * at challenge[1].
- */
-static void chapms_generate_challenge(ppp_pcb *pcb, unsigned char *challenge) {
-       LWIP_UNUSED_ARG(pcb);
-
-       *challenge++ = 8;
-#ifdef DEBUGMPPEKEY
-       if (mschap_challenge && strlen(mschap_challenge) == 8)
-               memcpy(challenge, mschap_challenge, 8);
-       else
-#endif
-               magic_random_bytes(challenge, 8);
-}
-
-static void chapms2_generate_challenge(ppp_pcb *pcb, unsigned char *challenge) {
-       LWIP_UNUSED_ARG(pcb);
-
-       *challenge++ = 16;
-#ifdef DEBUGMPPEKEY
-       if (mschap_challenge && strlen(mschap_challenge) == 16)
-               memcpy(challenge, mschap_challenge, 16);
-       else
-#endif
-               magic_random_bytes(challenge, 16);
-}
-
-static int chapms_verify_response(ppp_pcb *pcb, int id, const char *name,
-                      const unsigned char *secret, int secret_len,
-                      const unsigned char *challenge, const unsigned char *response,
-                      char *message, int message_space) {
-       unsigned char md[MS_CHAP_RESPONSE_LEN];
-       int diff;
-       int challenge_len, response_len;
-       LWIP_UNUSED_ARG(id);
-       LWIP_UNUSED_ARG(name);
-
-       challenge_len = *challenge++;   /* skip length, is 8 */
-       response_len = *response++;
-       if (response_len != MS_CHAP_RESPONSE_LEN)
-               goto bad;
-
-#ifndef MSLANMAN
-       if (!response[MS_CHAP_USENT]) {
-               /* Should really propagate this into the error packet. */
-               ppp_notice("Peer request for LANMAN auth not supported");
-               goto bad;
-       }
-#endif
-
-       /* Generate the expected response. */
-       ChapMS(pcb, (const u_char *)challenge, (const char *)secret, secret_len, md);
-
-#ifdef MSLANMAN
-       /* Determine which part of response to verify against */
-       if (!response[MS_CHAP_USENT])
-               diff = memcmp(&response[MS_CHAP_LANMANRESP],
-                             &md[MS_CHAP_LANMANRESP], MS_CHAP_LANMANRESP_LEN);
-       else
-#endif
-               diff = memcmp(&response[MS_CHAP_NTRESP], &md[MS_CHAP_NTRESP],
-                             MS_CHAP_NTRESP_LEN);
-
-       if (diff == 0) {
-               ppp_slprintf(message, message_space, "Access granted");
-               return 1;
-       }
-
- bad:
-       /* See comments below for MS-CHAP V2 */
-       ppp_slprintf(message, message_space, "E=691 R=1 C=%0.*B V=0",
-                challenge_len, challenge);
-       return 0;
-}
-
-static int chapms2_verify_response(ppp_pcb *pcb, int id, const char *name,
-                       const unsigned char *secret, int secret_len,
-                       const unsigned char *challenge, const unsigned char *response,
-                       char *message, int message_space) {
-       unsigned char md[MS_CHAP2_RESPONSE_LEN];
-       char saresponse[MS_AUTH_RESPONSE_LENGTH+1];
-       int challenge_len, response_len;
-       LWIP_UNUSED_ARG(id);
-
-       challenge_len = *challenge++;   /* skip length, is 16 */
-       response_len = *response++;
-       if (response_len != MS_CHAP2_RESPONSE_LEN)
-               goto bad;       /* not even the right length */
-
-       /* Generate the expected response and our mutual auth. */
-       ChapMS2(pcb, (const u_char*)challenge, (const u_char*)&response[MS_CHAP2_PEER_CHALLENGE], name,
-               (const char *)secret, secret_len, md,
-               (unsigned char *)saresponse, MS_CHAP2_AUTHENTICATOR);
-
-       /* compare MDs and send the appropriate status */
-       /*
-        * Per RFC 2759, success message must be formatted as
-        *     "S=<auth_string> M=<message>"
-        * where
-        *     <auth_string> is the Authenticator Response (mutual auth)
-        *     <message> is a text message
-        *
-        * However, some versions of Windows (win98 tested) do not know
-        * about the M=<message> part (required per RFC 2759) and flag
-        * it as an error (reported incorrectly as an encryption error
-        * to the user).  Since the RFC requires it, and it can be
-        * useful information, we supply it if the peer is a conforming
-        * system.  Luckily (?), win98 sets the Flags field to 0x04
-        * (contrary to RFC requirements) so we can use that to
-        * distinguish between conforming and non-conforming systems.
-        *
-        * Special thanks to Alex Swiridov <say@real.kharkov.ua> for
-        * help debugging this.
-        */
-       if (memcmp(&md[MS_CHAP2_NTRESP], &response[MS_CHAP2_NTRESP],
-                  MS_CHAP2_NTRESP_LEN) == 0) {
-               if (response[MS_CHAP2_FLAGS])
-                       ppp_slprintf(message, message_space, "S=%s", saresponse);
-               else
-                       ppp_slprintf(message, message_space, "S=%s M=%s",
-                                saresponse, "Access granted");
-               return 1;
-       }
-
- bad:
-       /*
-        * Failure message must be formatted as
-        *     "E=e R=r C=c V=v M=m"
-        * where
-        *     e = error code (we use 691, ERROR_AUTHENTICATION_FAILURE)
-        *     r = retry (we use 1, ok to retry)
-        *     c = challenge to use for next response, we reuse previous
-        *     v = Change Password version supported, we use 0
-        *     m = text message
-        *
-        * The M=m part is only for MS-CHAPv2.  Neither win2k nor
-        * win98 (others untested) display the message to the user anyway.
-        * They also both ignore the E=e code.
-        *
-        * Note that it's safe to reuse the same challenge as we don't
-        * actually accept another response based on the error message
-        * (and no clients try to resend a response anyway).
-        *
-        * Basically, this whole bit is useless code, even the small
-        * implementation here is only because of overspecification.
-        */
-       ppp_slprintf(message, message_space, "E=691 R=1 C=%0.*B V=0 M=%s",
-                challenge_len, challenge, "Access denied");
-       return 0;
-}
-#endif /* PPP_SERVER */
-
-static void chapms_make_response(ppp_pcb *pcb, unsigned char *response, int id, const char *our_name,
-                    const unsigned char *challenge, const char *secret, int secret_len,
-                    unsigned char *private_) {
-       LWIP_UNUSED_ARG(id);
-       LWIP_UNUSED_ARG(our_name);
-       LWIP_UNUSED_ARG(private_);
-       challenge++;    /* skip length, should be 8 */
-       *response++ = MS_CHAP_RESPONSE_LEN;
-       ChapMS(pcb, challenge, secret, secret_len, response);
-}
-
-static void chapms2_make_response(ppp_pcb *pcb, unsigned char *response, int id, const char *our_name,
-                     const unsigned char *challenge, const char *secret, int secret_len,
-                     unsigned char *private_) {
-       LWIP_UNUSED_ARG(id);
-       challenge++;    /* skip length, should be 16 */
-       *response++ = MS_CHAP2_RESPONSE_LEN;
-       ChapMS2(pcb, challenge,
-#ifdef DEBUGMPPEKEY
-               mschap2_peer_challenge,
-#else
-               NULL,
-#endif
-               our_name, secret, secret_len, response, private_,
-               MS_CHAP2_AUTHENTICATEE);
-}
-
-static int chapms2_check_success(ppp_pcb *pcb, unsigned char *msg, int len, unsigned char *private_) {
-       LWIP_UNUSED_ARG(pcb);
-
-       if ((len < MS_AUTH_RESPONSE_LENGTH + 2) ||
-           strncmp((char *)msg, "S=", 2) != 0) {
-               /* Packet does not start with "S=" */
-               ppp_error("MS-CHAPv2 Success packet is badly formed.");
-               return 0;
-       }
-       msg += 2;
-       len -= 2;
-       if (len < MS_AUTH_RESPONSE_LENGTH
-           || memcmp(msg, private_, MS_AUTH_RESPONSE_LENGTH)) {
-               /* Authenticator Response did not match expected. */
-               ppp_error("MS-CHAPv2 mutual authentication failed.");
-               return 0;
-       }
-       /* Authenticator Response matches. */
-       msg += MS_AUTH_RESPONSE_LENGTH; /* Eat it */
-       len -= MS_AUTH_RESPONSE_LENGTH;
-       if ((len >= 3) && !strncmp((char *)msg, " M=", 3)) {
-               msg += 3; /* Eat the delimiter */
-       } else if (len) {
-               /* Packet has extra text which does not begin " M=" */
-               ppp_error("MS-CHAPv2 Success packet is badly formed.");
-               return 0;
-       }
-       return 1;
-}
-
-static void chapms_handle_failure(ppp_pcb *pcb, unsigned char *inp, int len) {
-       int err;
-       const char *p;
-       char msg[64];
-       LWIP_UNUSED_ARG(pcb);
-
-       /* We want a null-terminated string for strxxx(). */
-       len = LWIP_MIN(len, 63);
-       MEMCPY(msg, inp, len);
-       msg[len] = 0;
-       p = msg;
-
-       /*
-        * Deal with MS-CHAP formatted failure messages; just print the
-        * M=<message> part (if any).  For MS-CHAP we're not really supposed
-        * to use M=<message>, but it shouldn't hurt.  See
-        * chapms[2]_verify_response.
-        */
-       if (!strncmp(p, "E=", 2))
-               err = strtol(p+2, NULL, 10); /* Remember the error code. */
-       else
-               goto print_msg; /* Message is badly formatted. */
-
-       if (len && ((p = strstr(p, " M=")) != NULL)) {
-               /* M=<message> field found. */
-               p += 3;
-       } else {
-               /* No M=<message>; use the error code. */
-               switch (err) {
-               case MS_CHAP_ERROR_RESTRICTED_LOGON_HOURS:
-                       p = "E=646 Restricted logon hours";
-                       break;
-
-               case MS_CHAP_ERROR_ACCT_DISABLED:
-                       p = "E=647 Account disabled";
-                       break;
-
-               case MS_CHAP_ERROR_PASSWD_EXPIRED:
-                       p = "E=648 Password expired";
-                       break;
-
-               case MS_CHAP_ERROR_NO_DIALIN_PERMISSION:
-                       p = "E=649 No dialin permission";
-                       break;
-
-               case MS_CHAP_ERROR_AUTHENTICATION_FAILURE:
-                       p = "E=691 Authentication failure";
-                       break;
-
-               case MS_CHAP_ERROR_CHANGING_PASSWORD:
-                       /* Should never see this, we don't support Change Password. */
-                       p = "E=709 Error changing password";
-                       break;
-
-               default:
-                       ppp_error("Unknown MS-CHAP authentication failure: %.*v",
-                             len, inp);
-                       return;
-               }
-       }
-print_msg:
-       if (p != NULL)
-               ppp_error("MS-CHAP authentication failed: %v", p);
-}
-
-static void ChallengeResponse(const u_char *challenge,
-                 const u_char PasswordHash[MD4_SIGNATURE_SIZE],
-                 u_char response[24]) {
-    u_char    ZPasswordHash[21];
-    des_context des;
-    u_char des_key[8];
-
-    BZERO(ZPasswordHash, sizeof(ZPasswordHash));
-    MEMCPY(ZPasswordHash, PasswordHash, MD4_SIGNATURE_SIZE);
-
-#if 0
-    dbglog("ChallengeResponse - ZPasswordHash %.*B",
-          sizeof(ZPasswordHash), ZPasswordHash);
-#endif
-
-    pppcrypt_56_to_64_bit_key(ZPasswordHash + 0, des_key);
-    des_setkey_enc(&des, des_key);
-    des_crypt_ecb(&des, challenge, response +0);
-
-    pppcrypt_56_to_64_bit_key(ZPasswordHash + 7, des_key);
-    des_setkey_enc(&des, des_key);
-    des_crypt_ecb(&des, challenge, response +8);
-
-    pppcrypt_56_to_64_bit_key(ZPasswordHash + 14, des_key);
-    des_setkey_enc(&des, des_key);
-    des_crypt_ecb(&des, challenge, response +16);
-
-#if 0
-    dbglog("ChallengeResponse - response %.24B", response);
-#endif
-}
-
-static void ChallengeHash(const u_char PeerChallenge[16], const u_char *rchallenge,
-             const char *username, u_char Challenge[8]) {
-    sha1_context       sha1Context;
-    u_char     sha1Hash[SHA1_SIGNATURE_SIZE];
-    const char *user;
-
-    /* remove domain from "domain\username" */
-    if ((user = strrchr(username, '\\')) != NULL)
-       ++user;
-    else
-       user = username;
-
-    sha1_starts(&sha1Context);
-    sha1_update(&sha1Context, PeerChallenge, 16);
-    sha1_update(&sha1Context, rchallenge, 16);
-    sha1_update(&sha1Context, (const unsigned char*)user, strlen(user));
-    sha1_finish(&sha1Context, sha1Hash);
-
-    MEMCPY(Challenge, sha1Hash, 8);
-}
-
-/*
- * Convert the ASCII version of the password to Unicode.
- * This implicitly supports 8-bit ISO8859/1 characters.
- * This gives us the little-endian representation, which
- * is assumed by all M$ CHAP RFCs.  (Unicode byte ordering
- * is machine-dependent.)
- */
-static void ascii2unicode(const char ascii[], int ascii_len, u_char unicode[]) {
-    int i;
-
-    BZERO(unicode, ascii_len * 2);
-    for (i = 0; i < ascii_len; i++)
-       unicode[i * 2] = (u_char) ascii[i];
-}
-
-static void NTPasswordHash(u_char *secret, int secret_len, u_char hash[MD4_SIGNATURE_SIZE]) {
-    md4_context                md4Context;
-
-    md4_starts(&md4Context);
-    md4_update(&md4Context, secret, secret_len);
-    md4_finish(&md4Context, hash);
-}
-
-static void ChapMS_NT(const u_char *rchallenge, const char *secret, int secret_len,
-         u_char NTResponse[24]) {
-    u_char     unicodePassword[MAX_NT_PASSWORD * 2];
-    u_char     PasswordHash[MD4_SIGNATURE_SIZE];
-
-    /* Hash the Unicode version of the secret (== password). */
-    ascii2unicode(secret, secret_len, unicodePassword);
-    NTPasswordHash(unicodePassword, secret_len * 2, PasswordHash);
-
-    ChallengeResponse(rchallenge, PasswordHash, NTResponse);
-}
-
-static void ChapMS2_NT(const u_char *rchallenge, const u_char PeerChallenge[16], const char *username,
-          const char *secret, int secret_len, u_char NTResponse[24]) {
-    u_char     unicodePassword[MAX_NT_PASSWORD * 2];
-    u_char     PasswordHash[MD4_SIGNATURE_SIZE];
-    u_char     Challenge[8];
-
-    ChallengeHash(PeerChallenge, rchallenge, username, Challenge);
-
-    /* Hash the Unicode version of the secret (== password). */
-    ascii2unicode(secret, secret_len, unicodePassword);
-    NTPasswordHash(unicodePassword, secret_len * 2, PasswordHash);
-
-    ChallengeResponse(Challenge, PasswordHash, NTResponse);
-}
-
-#ifdef MSLANMAN
-static u_char *StdText = (u_char *)"KGS!@#$%"; /* key from rasapi32.dll */
-
-static void ChapMS_LANMan(u_char *rchallenge, char *secret, int secret_len,
-             unsigned char *response) {
-    int                        i;
-    u_char             UcasePassword[MAX_NT_PASSWORD]; /* max is actually 14 */
-    u_char             PasswordHash[MD4_SIGNATURE_SIZE];
-    des_context des;
-    u_char des_key[8];
-
-    /* LANMan password is case insensitive */
-    BZERO(UcasePassword, sizeof(UcasePassword));
-    for (i = 0; i < secret_len; i++)
-       UcasePassword[i] = (u_char)toupper(secret[i]);
-
-    pppcrypt_56_to_64_bit_key(UcasePassword +0, des_key);
-    des_setkey_enc(&des, des_key);
-    des_crypt_ecb(&des, StdText, PasswordHash +0);
-
-    pppcrypt_56_to_64_bit_key(UcasePassword +7, des_key);
-    des_setkey_enc(&des, des_key);
-    des_crypt_ecb(&des, StdText, PasswordHash +8);
-
-    ChallengeResponse(rchallenge, PasswordHash, &response[MS_CHAP_LANMANRESP]);
-}
-#endif
-
-
-static void GenerateAuthenticatorResponse(const u_char PasswordHashHash[MD4_SIGNATURE_SIZE],
-                             u_char NTResponse[24], const u_char PeerChallenge[16],
-                             const u_char *rchallenge, const char *username,
-                             u_char authResponse[MS_AUTH_RESPONSE_LENGTH+1]) {
-    /*
-     * "Magic" constants used in response generation, from RFC 2759.
-     */
-    static const u_char Magic1[39] = /* "Magic server to client signing constant" */
-       { 0x4D, 0x61, 0x67, 0x69, 0x63, 0x20, 0x73, 0x65, 0x72, 0x76,
-         0x65, 0x72, 0x20, 0x74, 0x6F, 0x20, 0x63, 0x6C, 0x69, 0x65,
-         0x6E, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6E, 0x69, 0x6E, 0x67,
-         0x20, 0x63, 0x6F, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x74 };
-    static const u_char Magic2[41] = /* "Pad to make it do more than one iteration" */
-       { 0x50, 0x61, 0x64, 0x20, 0x74, 0x6F, 0x20, 0x6D, 0x61, 0x6B,
-         0x65, 0x20, 0x69, 0x74, 0x20, 0x64, 0x6F, 0x20, 0x6D, 0x6F,
-         0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6E, 0x20, 0x6F, 0x6E,
-         0x65, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6F,
-         0x6E };
-
-    int                i;
-    sha1_context       sha1Context;
-    u_char     Digest[SHA1_SIGNATURE_SIZE];
-    u_char     Challenge[8];
-
-    sha1_starts(&sha1Context);
-    sha1_update(&sha1Context, PasswordHashHash, MD4_SIGNATURE_SIZE);
-    sha1_update(&sha1Context, NTResponse, 24);
-    sha1_update(&sha1Context, Magic1, sizeof(Magic1));
-    sha1_finish(&sha1Context, Digest);
-
-    ChallengeHash(PeerChallenge, rchallenge, username, Challenge);
-
-    sha1_starts(&sha1Context);
-    sha1_update(&sha1Context, Digest, sizeof(Digest));
-    sha1_update(&sha1Context, Challenge, sizeof(Challenge));
-    sha1_update(&sha1Context, Magic2, sizeof(Magic2));
-    sha1_finish(&sha1Context, Digest);
-
-    /* Convert to ASCII hex string. */
-    for (i = 0; i < LWIP_MAX((MS_AUTH_RESPONSE_LENGTH / 2), (int)sizeof(Digest)); i++)
-       sprintf((char *)&authResponse[i * 2], "%02X", Digest[i]);
-}
-
-
-static void GenerateAuthenticatorResponsePlain(
-                const char *secret, int secret_len,
-                u_char NTResponse[24], const u_char PeerChallenge[16],
-                const u_char *rchallenge, const char *username,
-                u_char authResponse[MS_AUTH_RESPONSE_LENGTH+1]) {
-    u_char     unicodePassword[MAX_NT_PASSWORD * 2];
-    u_char     PasswordHash[MD4_SIGNATURE_SIZE];
-    u_char     PasswordHashHash[MD4_SIGNATURE_SIZE];
-
-    /* Hash (x2) the Unicode version of the secret (== password). */
-    ascii2unicode(secret, secret_len, unicodePassword);
-    NTPasswordHash(unicodePassword, secret_len * 2, PasswordHash);
-    NTPasswordHash(PasswordHash, sizeof(PasswordHash),
-                  PasswordHashHash);
-
-    GenerateAuthenticatorResponse(PasswordHashHash, NTResponse, PeerChallenge,
-                                 rchallenge, username, authResponse);
-}
-
-
-#if MPPE_SUPPORT
-/*
- * Set mppe_xxxx_key from MS-CHAP credentials. (see RFC 3079)
- */
-static void Set_Start_Key(ppp_pcb *pcb, const u_char *rchallenge, const char *secret, int secret_len) {
-    u_char     unicodePassword[MAX_NT_PASSWORD * 2];
-    u_char     PasswordHash[MD4_SIGNATURE_SIZE];
-    u_char     PasswordHashHash[MD4_SIGNATURE_SIZE];
-    sha1_context       sha1Context;
-    u_char     Digest[SHA1_SIGNATURE_SIZE];    /* >= MPPE_MAX_KEY_LEN */
-
-    /* Hash (x2) the Unicode version of the secret (== password). */
-    ascii2unicode(secret, secret_len, unicodePassword);
-    NTPasswordHash(unicodePassword, secret_len * 2, PasswordHash);
-    NTPasswordHash(PasswordHash, sizeof(PasswordHash), PasswordHashHash);
-
-    sha1_starts(&sha1Context);
-    sha1_update(&sha1Context, PasswordHashHash, MD4_SIGNATURE_SIZE);
-    sha1_update(&sha1Context, PasswordHashHash, MD4_SIGNATURE_SIZE);
-    sha1_update(&sha1Context, rchallenge, 8);
-    sha1_finish(&sha1Context, Digest);
-
-    /* Same key in both directions. */
-    mppe_set_key(pcb, &pcb->mppe_comp, Digest);
-    mppe_set_key(pcb, &pcb->mppe_decomp, Digest);
-
-    pcb->mppe_keys_set = 1;
-}
-
-/*
- * Set mppe_xxxx_key from MS-CHAPv2 credentials. (see RFC 3079)
- */
-static void SetMasterKeys(ppp_pcb *pcb, const char *secret, int secret_len, u_char NTResponse[24], int IsServer) {
-    u_char     unicodePassword[MAX_NT_PASSWORD * 2];
-    u_char     PasswordHash[MD4_SIGNATURE_SIZE];
-    u_char     PasswordHashHash[MD4_SIGNATURE_SIZE];
-    sha1_context       sha1Context;
-    u_char     MasterKey[SHA1_SIGNATURE_SIZE]; /* >= MPPE_MAX_KEY_LEN */
-    u_char     Digest[SHA1_SIGNATURE_SIZE];    /* >= MPPE_MAX_KEY_LEN */
-    const u_char *s;
-
-    /* "This is the MPPE Master Key" */
-    static const u_char Magic1[27] =
-       { 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74,
-         0x68, 0x65, 0x20, 0x4d, 0x50, 0x50, 0x45, 0x20, 0x4d,
-         0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x4b, 0x65, 0x79 };
-    /* "On the client side, this is the send key; "
-       "on the server side, it is the receive key." */
-    static const u_char Magic2[84] =
-       { 0x4f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x69,
-         0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x64, 0x65, 0x2c, 0x20,
-         0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68,
-         0x65, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x6b, 0x65, 0x79,
-         0x3b, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73,
-         0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x73, 0x69, 0x64, 0x65,
-         0x2c, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68,
-         0x65, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x20,
-         0x6b, 0x65, 0x79, 0x2e };
-    /* "On the client side, this is the receive key; "
-       "on the server side, it is the send key." */
-    static const u_char Magic3[84] =
-       { 0x4f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x69,
-         0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x64, 0x65, 0x2c, 0x20,
-         0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68,
-         0x65, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x20,
-         0x6b, 0x65, 0x79, 0x3b, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68,
-         0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x73,
-         0x69, 0x64, 0x65, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73,
-         0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20,
-         0x6b, 0x65, 0x79, 0x2e };
-
-    /* Hash (x2) the Unicode version of the secret (== password). */
-    ascii2unicode(secret, secret_len, unicodePassword);
-    NTPasswordHash(unicodePassword, secret_len * 2, PasswordHash);
-    NTPasswordHash(PasswordHash, sizeof(PasswordHash), PasswordHashHash);
-
-    sha1_starts(&sha1Context);
-    sha1_update(&sha1Context, PasswordHashHash, MD4_SIGNATURE_SIZE);
-    sha1_update(&sha1Context, NTResponse, 24);
-    sha1_update(&sha1Context, Magic1, sizeof(Magic1));
-    sha1_finish(&sha1Context, MasterKey);
-
-    /*
-     * generate send key
-     */
-    if (IsServer)
-       s = Magic3;
-    else
-       s = Magic2;
-    sha1_starts(&sha1Context);
-    sha1_update(&sha1Context, MasterKey, 16);
-    sha1_update(&sha1Context, mppe_sha1_pad1, SHA1_PAD_SIZE);
-    sha1_update(&sha1Context, s, 84);
-    sha1_update(&sha1Context, mppe_sha1_pad2, SHA1_PAD_SIZE);
-    sha1_finish(&sha1Context, Digest);
-
-    mppe_set_key(pcb, &pcb->mppe_comp, Digest);
-
-    /*
-     * generate recv key
-     */
-    if (IsServer)
-       s = Magic2;
-    else
-       s = Magic3;
-    sha1_starts(&sha1Context);
-    sha1_update(&sha1Context, MasterKey, 16);
-    sha1_update(&sha1Context, mppe_sha1_pad1, SHA1_PAD_SIZE);
-    sha1_update(&sha1Context, s, 84);
-    sha1_update(&sha1Context, mppe_sha1_pad2, SHA1_PAD_SIZE);
-    sha1_finish(&sha1Context, Digest);
-
-    mppe_set_key(pcb, &pcb->mppe_decomp, Digest);
-
-    pcb->mppe_keys_set = 1;
-}
-
-#endif /* MPPE_SUPPORT */
-
-
-static void ChapMS(ppp_pcb *pcb, const u_char *rchallenge, const char *secret, int secret_len,
-       unsigned char *response) {
-#if !MPPE_SUPPORT
-    LWIP_UNUSED_ARG(pcb);
-#endif /* !MPPE_SUPPORT */
-    BZERO(response, MS_CHAP_RESPONSE_LEN);
-
-    ChapMS_NT(rchallenge, secret, secret_len, &response[MS_CHAP_NTRESP]);
-
-#ifdef MSLANMAN
-    ChapMS_LANMan(rchallenge, secret, secret_len,
-                 &response[MS_CHAP_LANMANRESP]);
-
-    /* preferred method is set by option  */
-    response[MS_CHAP_USENT] = !ms_lanman;
-#else
-    response[MS_CHAP_USENT] = 1;
-#endif
-
-#if MPPE_SUPPORT
-    Set_Start_Key(pcb, rchallenge, secret, secret_len);
-#endif /* MPPE_SUPPORT */
-}
-
-
-/*
- * If PeerChallenge is NULL, one is generated and the PeerChallenge
- * field of response is filled in.  Call this way when generating a response.
- * If PeerChallenge is supplied, it is copied into the PeerChallenge field.
- * Call this way when verifying a response (or debugging).
- * Do not call with PeerChallenge = response.
- *
- * The PeerChallenge field of response is then used for calculation of the
- * Authenticator Response.
- */
-static void ChapMS2(ppp_pcb *pcb, const u_char *rchallenge, const u_char *PeerChallenge,
-       const char *user, const char *secret, int secret_len, unsigned char *response,
-       u_char authResponse[], int authenticator) {
-    /* ARGSUSED */
-    LWIP_UNUSED_ARG(authenticator);
-#if !MPPE_SUPPORT
-    LWIP_UNUSED_ARG(pcb);
-#endif /* !MPPE_SUPPORT */
-
-    BZERO(response, MS_CHAP2_RESPONSE_LEN);
-
-    /* Generate the Peer-Challenge if requested, or copy it if supplied. */
-    if (!PeerChallenge)
-       magic_random_bytes(&response[MS_CHAP2_PEER_CHALLENGE], MS_CHAP2_PEER_CHAL_LEN);
-    else
-       MEMCPY(&response[MS_CHAP2_PEER_CHALLENGE], PeerChallenge,
-             MS_CHAP2_PEER_CHAL_LEN);
-
-    /* Generate the NT-Response */
-    ChapMS2_NT(rchallenge, &response[MS_CHAP2_PEER_CHALLENGE], user,
-              secret, secret_len, &response[MS_CHAP2_NTRESP]);
-
-    /* Generate the Authenticator Response. */
-    GenerateAuthenticatorResponsePlain(secret, secret_len,
-                                      &response[MS_CHAP2_NTRESP],
-                                      &response[MS_CHAP2_PEER_CHALLENGE],
-                                      rchallenge, user, authResponse);
-
-#if MPPE_SUPPORT
-    SetMasterKeys(pcb, secret, secret_len,
-                 &response[MS_CHAP2_NTRESP], authenticator);
-#endif /* MPPE_SUPPORT */
-}
-
-#if 0 /* UNUSED */
-#if MPPE_SUPPORT
-/*
- * Set MPPE options from plugins.
- */
-void set_mppe_enc_types(int policy, int types) {
-    /* Early exit for unknown policies. */
-    if (policy != MPPE_ENC_POL_ENC_ALLOWED ||
-       policy != MPPE_ENC_POL_ENC_REQUIRED)
-       return;
-
-    /* Don't modify MPPE if it's optional and wasn't already configured. */
-    if (policy == MPPE_ENC_POL_ENC_ALLOWED && !ccp_wantoptions[0].mppe)
-       return;
-
-    /*
-     * Disable undesirable encryption types.  Note that we don't ENABLE
-     * any encryption types, to avoid overriding manual configuration.
-     */
-    switch(types) {
-       case MPPE_ENC_TYPES_RC4_40:
-           ccp_wantoptions[0].mppe &= ~MPPE_OPT_128;   /* disable 128-bit */
-           break;
-       case MPPE_ENC_TYPES_RC4_128:
-           ccp_wantoptions[0].mppe &= ~MPPE_OPT_40;    /* disable 40-bit */
-           break;
-       default:
-           break;
-    }
-}
-#endif /* MPPE_SUPPORT */
-#endif /* UNUSED */
-
-const struct chap_digest_type chapms_digest = {
-       CHAP_MICROSOFT,         /* code */
-#if PPP_SERVER
-       chapms_generate_challenge,
-       chapms_verify_response,
-#endif /* PPP_SERVER */
-       chapms_make_response,
-       NULL,                   /* check_success */
-       chapms_handle_failure,
-};
-
-const struct chap_digest_type chapms2_digest = {
-       CHAP_MICROSOFT_V2,      /* code */
-#if PPP_SERVER
-       chapms2_generate_challenge,
-       chapms2_verify_response,
-#endif /* PPP_SERVER */
-       chapms2_make_response,
-       chapms2_check_success,
-       chapms_handle_failure,
-};
-
-#endif /* PPP_SUPPORT && MSCHAP_SUPPORT */
diff --git a/components/lwip/netif/ppp/demand.c b/components/lwip/netif/ppp/demand.c
deleted file mode 100644 (file)
index 7a018ae..0000000
+++ /dev/null
@@ -1,465 +0,0 @@
-/*
- * demand.c - Support routines for demand-dialling.
- *
- * Copyright (c) 1996-2002 Paul Mackerras. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. The name(s) of the authors of this software must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission.
- *
- * 3. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by Paul Mackerras
- *     <paulus@samba.org>".
- *
- * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && DEMAND_SUPPORT  /* don't build if not configured for use in lwipopts.h */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <netdb.h>
-#include <unistd.h>
-#include <syslog.h>
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-#include <sys/stat.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#ifdef PPP_FILTER
-#include <pcap-bpf.h>
-#endif
-
-#include "netif/ppp/ppp_impl.h"
-
-#include "netif/ppp/fsm.h"
-#include "netif/ppp/ipcp.h"
-#include "netif/ppp/lcp.h"
-
-char *frame;
-int framelen;
-int framemax;
-int escape_flag;
-int flush_flag;
-int fcs;
-
-struct packet {
-    int length;
-    struct packet *next;
-    unsigned char data[1];
-};
-
-struct packet *pend_q;
-struct packet *pend_qtail;
-
-static int active_packet (unsigned char *, int);
-
-/*
- * demand_conf - configure the interface for doing dial-on-demand.
- */
-void
-demand_conf()
-{
-    int i;
-    const struct protent *protp;
-
-/*    framemax = lcp_allowoptions[0].mru;
-    if (framemax < PPP_MRU) */
-       framemax = PPP_MRU;
-    framemax += PPP_HDRLEN + PPP_FCSLEN;
-    frame = mem_malloc(framemax);
-    if (frame == NULL)
-       novm("demand frame");
-    framelen = 0;
-    pend_q = NULL;
-    escape_flag = 0;
-    flush_flag = 0;
-    fcs = PPP_INITFCS;
-
-    netif_set_mtu(pcb, LWIP_MIN(lcp_allowoptions[0].mru, PPP_MRU));
-    if (ppp_send_config(pcb, PPP_MRU, (u32_t) 0, 0, 0) < 0
-       || ppp_recv_config(pcb, PPP_MRU, (u32_t) 0, 0, 0) < 0)
-           fatal("Couldn't set up demand-dialled PPP interface: %m");
-
-#ifdef PPP_FILTER
-    set_filters(&pass_filter, &active_filter);
-#endif
-
-    /*
-     * Call the demand_conf procedure for each protocol that's got one.
-     */
-    for (i = 0; (protp = protocols[i]) != NULL; ++i)
-       if (protp->demand_conf != NULL)
-           ((*protp->demand_conf)(pcb));
-/* FIXME: find a way to die() here */
-#if 0
-           if (!((*protp->demand_conf)(pcb)))
-               die(1);
-#endif
-}
-
-
-/*
- * demand_block - set each network protocol to block further packets.
- */
-void
-demand_block()
-{
-    int i;
-    const struct protent *protp;
-
-    for (i = 0; (protp = protocols[i]) != NULL; ++i)
-       if (protp->demand_conf != NULL)
-           sifnpmode(pcb, protp->protocol & ~0x8000, NPMODE_QUEUE);
-    get_loop_output();
-}
-
-/*
- * demand_discard - set each network protocol to discard packets
- * with an error.
- */
-void
-demand_discard()
-{
-    struct packet *pkt, *nextpkt;
-    int i;
-    const struct protent *protp;
-
-    for (i = 0; (protp = protocols[i]) != NULL; ++i)
-       if (protp->demand_conf != NULL)
-           sifnpmode(pcb, protp->protocol & ~0x8000, NPMODE_ERROR);
-    get_loop_output();
-
-    /* discard all saved packets */
-    for (pkt = pend_q; pkt != NULL; pkt = nextpkt) {
-       nextpkt = pkt->next;
-       free(pkt);
-    }
-    pend_q = NULL;
-    framelen = 0;
-    flush_flag = 0;
-    escape_flag = 0;
-    fcs = PPP_INITFCS;
-}
-
-/*
- * demand_unblock - set each enabled network protocol to pass packets.
- */
-void
-demand_unblock()
-{
-    int i;
-    const struct protent *protp;
-
-    for (i = 0; (protp = protocols[i]) != NULL; ++i)
-       if (protp->demand_conf != NULL)
-           sifnpmode(pcb, protp->protocol & ~0x8000, NPMODE_PASS);
-}
-
-/*
- * FCS lookup table as calculated by genfcstab.
- */
-static u_short fcstab[256] = {
-       0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
-       0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
-       0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
-       0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
-       0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
-       0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
-       0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
-       0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
-       0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
-       0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
-       0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
-       0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
-       0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
-       0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
-       0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
-       0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
-       0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
-       0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
-       0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
-       0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
-       0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
-       0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
-       0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
-       0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
-       0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
-       0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
-       0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
-       0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
-       0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
-       0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
-       0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
-       0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
-};
-
-/*
- * loop_chars - process characters received from the loopback.
- * Calls loop_frame when a complete frame has been accumulated.
- * Return value is 1 if we need to bring up the link, 0 otherwise.
- */
-int
-loop_chars(p, n)
-    unsigned char *p;
-    int n;
-{
-    int c, rv;
-
-    rv = 0;
-
-/* check for synchronous connection... */
-
-    if ( (p[0] == 0xFF) && (p[1] == 0x03) ) {
-        rv = loop_frame(p,n);
-        return rv;
-    }
-
-    for (; n > 0; --n) {
-       c = *p++;
-       if (c == PPP_FLAG) {
-           if (!escape_flag && !flush_flag
-               && framelen > 2 && fcs == PPP_GOODFCS) {
-               framelen -= 2;
-               if (loop_frame((unsigned char *)frame, framelen))
-                   rv = 1;
-           }
-           framelen = 0;
-           flush_flag = 0;
-           escape_flag = 0;
-           fcs = PPP_INITFCS;
-           continue;
-       }
-       if (flush_flag)
-           continue;
-       if (escape_flag) {
-           c ^= PPP_TRANS;
-           escape_flag = 0;
-       } else if (c == PPP_ESCAPE) {
-           escape_flag = 1;
-           continue;
-       }
-       if (framelen >= framemax) {
-           flush_flag = 1;
-           continue;
-       }
-       frame[framelen++] = c;
-       fcs = PPP_FCS(fcs, c);
-    }
-    return rv;
-}
-
-/*
- * loop_frame - given a frame obtained from the loopback,
- * decide whether to bring up the link or not, and, if we want
- * to transmit this frame later, put it on the pending queue.
- * Return value is 1 if we need to bring up the link, 0 otherwise.
- * We assume that the kernel driver has already applied the
- * pass_filter, so we won't get packets it rejected.
- * We apply the active_filter to see if we want this packet to
- * bring up the link.
- */
-int
-loop_frame(frame, len)
-    unsigned char *frame;
-    int len;
-{
-    struct packet *pkt;
-
-    /* dbglog("from loop: %P", frame, len); */
-    if (len < PPP_HDRLEN)
-       return 0;
-    if ((PPP_PROTOCOL(frame) & 0x8000) != 0)
-       return 0;               /* shouldn't get any of these anyway */
-    if (!active_packet(frame, len))
-       return 0;
-
-    pkt = (struct packet *) mem_malloc(sizeof(struct packet) + len);
-    if (pkt != NULL) {
-       pkt->length = len;
-       pkt->next = NULL;
-       memcpy(pkt->data, frame, len);
-       if (pend_q == NULL)
-           pend_q = pkt;
-       else
-           pend_qtail->next = pkt;
-       pend_qtail = pkt;
-    }
-    return 1;
-}
-
-/*
- * demand_rexmit - Resend all those frames which we got via the
- * loopback, now that the real serial link is up.
- */
-void
-demand_rexmit(proto, newip)
-    int proto;
-    u32_t newip;
-{
-    struct packet *pkt, *prev, *nextpkt;
-    unsigned short checksum;
-    unsigned short pkt_checksum = 0;
-    unsigned iphdr;
-    struct timeval tv;
-    char cv = 0;
-    char ipstr[16];
-
-    prev = NULL;
-    pkt = pend_q;
-    pend_q = NULL;
-    tv.tv_sec = 1;
-    tv.tv_usec = 0;
-    select(0,NULL,NULL,NULL,&tv);      /* Sleep for 1 Seconds */
-    for (; pkt != NULL; pkt = nextpkt) {
-       nextpkt = pkt->next;
-       if (PPP_PROTOCOL(pkt->data) == proto) {
-            if ( (proto == PPP_IP) && newip ) {
-               /* Get old checksum */
-
-               iphdr = (pkt->data[4] & 15) << 2;
-               checksum = *((unsigned short *) (pkt->data+14));
-                if (checksum == 0xFFFF) {
-                    checksum = 0;
-                }
-
-                if (pkt->data[13] == 17) {
-                    pkt_checksum =  *((unsigned short *) (pkt->data+10+iphdr));
-                   if (pkt_checksum) {
-                        cv = 1;
-                        if (pkt_checksum == 0xFFFF) {
-                            pkt_checksum = 0;
-                        }
-                    }
-                    else {
-                       cv = 0;
-                    }
-                }
-
-               if (pkt->data[13] == 6) {
-                   pkt_checksum = *((unsigned short *) (pkt->data+20+iphdr));
-                   cv = 1;
-                    if (pkt_checksum == 0xFFFF) {
-                        pkt_checksum = 0;
-                    }
-               }
-
-               /* Delete old Source-IP-Address */
-                checksum -= *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
-                checksum -= *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
-
-               pkt_checksum -= *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
-               pkt_checksum -= *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
-
-               /* Change Source-IP-Address */
-                * ((u32_t *) (pkt->data + 16)) = newip;
-
-               /* Add new Source-IP-Address */
-                checksum += *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
-                checksum += *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
-
-                pkt_checksum += *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
-                pkt_checksum += *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
-
-               /* Write new checksum */
-                if (!checksum) {
-                    checksum = 0xFFFF;
-                }
-                *((unsigned short *) (pkt->data+14)) = checksum;
-               if (pkt->data[13] == 6) {
-                   *((unsigned short *) (pkt->data+20+iphdr)) = pkt_checksum;
-               }
-               if (cv && (pkt->data[13] == 17) ) {
-                   *((unsigned short *) (pkt->data+10+iphdr)) = pkt_checksum;
-               }
-
-               /* Log Packet */
-               strcpy(ipstr,inet_ntoa(*( (struct in_addr *) (pkt->data+16))));
-               if (pkt->data[13] == 1) {
-                   syslog(LOG_INFO,"Open ICMP %s -> %s\n",
-                       ipstr,
-                       inet_ntoa(*( (struct in_addr *) (pkt->data+20))));
-               } else {
-                   syslog(LOG_INFO,"Open %s %s:%d -> %s:%d\n",
-                       pkt->data[13] == 6 ? "TCP" : "UDP",
-                       ipstr,
-                       ntohs(*( (short *) (pkt->data+iphdr+4))),
-                       inet_ntoa(*( (struct in_addr *) (pkt->data+20))),
-                       ntohs(*( (short *) (pkt->data+iphdr+6))));
-                }
-            }
-           output(pcb, pkt->data, pkt->length);
-           free(pkt);
-       } else {
-           if (prev == NULL)
-               pend_q = pkt;
-           else
-               prev->next = pkt;
-           prev = pkt;
-       }
-    }
-    pend_qtail = prev;
-    if (prev != NULL)
-       prev->next = NULL;
-}
-
-/*
- * Scan a packet to decide whether it is an "active" packet,
- * that is, whether it is worth bringing up the link for.
- */
-static int
-active_packet(p, len)
-    unsigned char *p;
-    int len;
-{
-    int proto, i;
-    const struct protent *protp;
-
-    if (len < PPP_HDRLEN)
-       return 0;
-    proto = PPP_PROTOCOL(p);
-#ifdef PPP_FILTER
-    p[0] = 1;          /* outbound packet indicator */
-    if ((pass_filter.bf_len != 0
-        && bpf_filter(pass_filter.bf_insns, p, len, len) == 0)
-       || (active_filter.bf_len != 0
-           && bpf_filter(active_filter.bf_insns, p, len, len) == 0)) {
-       p[0] = 0xff;
-       return 0;
-    }
-    p[0] = 0xff;
-#endif
-    for (i = 0; (protp = protocols[i]) != NULL; ++i) {
-       if (protp->protocol < 0xC000 && (protp->protocol & ~0x8000) == proto) {
-           if (protp->active_pkt == NULL)
-               return 1;
-           return (*protp->active_pkt)(p, len);
-       }
-    }
-    return 0;                  /* not a supported protocol !!?? */
-}
-
-#endif /* PPP_SUPPORT && DEMAND_SUPPORT */
diff --git a/components/lwip/netif/ppp/eap.c b/components/lwip/netif/ppp/eap.c
deleted file mode 100644 (file)
index 39cd21e..0000000
+++ /dev/null
@@ -1,2429 +0,0 @@
-/*
- * eap.c - Extensible Authentication Protocol for PPP (RFC 2284)
- *
- * Copyright (c) 2001 by Sun Microsystems, Inc.
- * All rights reserved.
- *
- * Non-exclusive rights to redistribute, modify, translate, and use
- * this software in source and binary forms, in whole or in part, is
- * hereby granted, provided that the above copyright notice is
- * duplicated in any source form, and that neither the name of the
- * copyright holder nor the author is used to endorse or promote
- * products derived from this software.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Original version by James Carlson
- *
- * This implementation of EAP supports MD5-Challenge and SRP-SHA1
- * authentication styles.  Note that support of MD5-Challenge is a
- * requirement of RFC 2284, and that it's essentially just a
- * reimplementation of regular RFC 1994 CHAP using EAP messages.
- *
- * As an authenticator ("server"), there are multiple phases for each
- * style.  In the first phase of each style, the unauthenticated peer
- * name is queried using the EAP Identity request type.  If the
- * "remotename" option is used, then this phase is skipped, because
- * the peer's name is presumed to be known.
- *
- * For MD5-Challenge, there are two phases, and the second phase
- * consists of sending the challenge itself and handling the
- * associated response.
- *
- * For SRP-SHA1, there are four phases.  The second sends 's', 'N',
- * and 'g'.  The reply contains 'A'.  The third sends 'B', and the
- * reply contains 'M1'.  The forth sends the 'M2' value.
- *
- * As an authenticatee ("client"), there's just a single phase --
- * responding to the queries generated by the peer.  EAP is an
- * authenticator-driven protocol.
- *
- * Based on draft-ietf-pppext-eap-srp-03.txt.
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && EAP_SUPPORT  /* don't build if not configured for use in lwipopts.h */
-
-#include "netif/ppp/ppp_impl.h"
-
-#if LWIP_INCLUDED_POLARSSL_MD5
-#include "netif/ppp/polarssl/md5.h"
-#else
-#include "polarssl/md5.h"
-#endif
-
-#include "netif/ppp/eap.h"
-#include "netif/ppp/magic.h"
-
-#ifdef USE_SRP
-#include <t_pwd.h>
-#include <t_server.h>
-#include <t_client.h>
-#include "netif/ppp/pppcrypt.h"
-#endif /* USE_SRP */
-
-#ifndef SHA_DIGESTSIZE
-#define        SHA_DIGESTSIZE 20
-#endif
-
-#ifdef USE_SRP
-static char *pn_secret = NULL;         /* Pseudonym generating secret */
-#endif
-
-#if PPP_OPTIONS
-/*
- * Command-line options.
- */
-static option_t eap_option_list[] = {
-    { "eap-restart", o_int, &eap_states[0].es_server.ea_timeout,
-      "Set retransmit timeout for EAP Requests (server)" },
-    { "eap-max-sreq", o_int, &eap_states[0].es_server.ea_maxrequests,
-      "Set max number of EAP Requests sent (server)" },
-    { "eap-timeout", o_int, &eap_states[0].es_client.ea_timeout,
-      "Set time limit for peer EAP authentication" },
-    { "eap-max-rreq", o_int, &eap_states[0].es_client.ea_maxrequests,
-      "Set max number of EAP Requests allows (client)" },
-    { "eap-interval", o_int, &eap_states[0].es_rechallenge,
-      "Set interval for EAP rechallenge" },
-#ifdef USE_SRP
-    { "srp-interval", o_int, &eap_states[0].es_lwrechallenge,
-      "Set interval for SRP lightweight rechallenge" },
-    { "srp-pn-secret", o_string, &pn_secret,
-      "Long term pseudonym generation secret" },
-    { "srp-use-pseudonym", o_bool, &eap_states[0].es_usepseudo,
-      "Use pseudonym if offered one by server", 1 },
-#endif
-    { NULL }
-};
-#endif /* PPP_OPTIONS */
-
-/*
- * Protocol entry points.
- */
-static void eap_init(ppp_pcb *pcb);
-static void eap_input(ppp_pcb *pcb, u_char *inp, int inlen);
-static void eap_protrej(ppp_pcb *pcb);
-static void eap_lowerup(ppp_pcb *pcb);
-static void eap_lowerdown(ppp_pcb *pcb);
-#if PRINTPKT_SUPPORT
-static int  eap_printpkt(const u_char *inp, int inlen,
-    void (*)(void *arg, const char *fmt, ...), void *arg);
-#endif /* PRINTPKT_SUPPORT */
-
-const struct protent eap_protent = {
-       PPP_EAP,                /* protocol number */
-       eap_init,               /* initialization procedure */
-       eap_input,              /* process a received packet */
-       eap_protrej,            /* process a received protocol-reject */
-       eap_lowerup,            /* lower layer has gone up */
-       eap_lowerdown,          /* lower layer has gone down */
-       NULL,                   /* open the protocol */
-       NULL,                   /* close the protocol */
-#if PRINTPKT_SUPPORT
-       eap_printpkt,           /* print a packet in readable form */
-#endif /* PRINTPKT_SUPPORT */
-#if PPP_DATAINPUT
-       NULL,                   /* process a received data packet */
-#endif /* PPP_DATAINPUT */
-#if PRINTPKT_SUPPORT
-       "EAP",                  /* text name of protocol */
-       NULL,                   /* text name of corresponding data protocol */
-#endif /* PRINTPKT_SUPPORT */
-#if PPP_OPTIONS
-       eap_option_list,        /* list of command-line options */
-       NULL,                   /* check requested options; assign defaults */
-#endif /* PPP_OPTIONS */
-#if DEMAND_SUPPORT
-       NULL,                   /* configure interface for demand-dial */
-       NULL                    /* say whether to bring up link for this pkt */
-#endif /* DEMAND_SUPPORT */
-};
-
-#ifdef USE_SRP
-/*
- * A well-known 2048 bit modulus.
- */
-static const u_char wkmodulus[] = {
-       0xAC, 0x6B, 0xDB, 0x41, 0x32, 0x4A, 0x9A, 0x9B,
-       0xF1, 0x66, 0xDE, 0x5E, 0x13, 0x89, 0x58, 0x2F,
-       0xAF, 0x72, 0xB6, 0x65, 0x19, 0x87, 0xEE, 0x07,
-       0xFC, 0x31, 0x92, 0x94, 0x3D, 0xB5, 0x60, 0x50,
-       0xA3, 0x73, 0x29, 0xCB, 0xB4, 0xA0, 0x99, 0xED,
-       0x81, 0x93, 0xE0, 0x75, 0x77, 0x67, 0xA1, 0x3D,
-       0xD5, 0x23, 0x12, 0xAB, 0x4B, 0x03, 0x31, 0x0D,
-       0xCD, 0x7F, 0x48, 0xA9, 0xDA, 0x04, 0xFD, 0x50,
-       0xE8, 0x08, 0x39, 0x69, 0xED, 0xB7, 0x67, 0xB0,
-       0xCF, 0x60, 0x95, 0x17, 0x9A, 0x16, 0x3A, 0xB3,
-       0x66, 0x1A, 0x05, 0xFB, 0xD5, 0xFA, 0xAA, 0xE8,
-       0x29, 0x18, 0xA9, 0x96, 0x2F, 0x0B, 0x93, 0xB8,
-       0x55, 0xF9, 0x79, 0x93, 0xEC, 0x97, 0x5E, 0xEA,
-       0xA8, 0x0D, 0x74, 0x0A, 0xDB, 0xF4, 0xFF, 0x74,
-       0x73, 0x59, 0xD0, 0x41, 0xD5, 0xC3, 0x3E, 0xA7,
-       0x1D, 0x28, 0x1E, 0x44, 0x6B, 0x14, 0x77, 0x3B,
-       0xCA, 0x97, 0xB4, 0x3A, 0x23, 0xFB, 0x80, 0x16,
-       0x76, 0xBD, 0x20, 0x7A, 0x43, 0x6C, 0x64, 0x81,
-       0xF1, 0xD2, 0xB9, 0x07, 0x87, 0x17, 0x46, 0x1A,
-       0x5B, 0x9D, 0x32, 0xE6, 0x88, 0xF8, 0x77, 0x48,
-       0x54, 0x45, 0x23, 0xB5, 0x24, 0xB0, 0xD5, 0x7D,
-       0x5E, 0xA7, 0x7A, 0x27, 0x75, 0xD2, 0xEC, 0xFA,
-       0x03, 0x2C, 0xFB, 0xDB, 0xF5, 0x2F, 0xB3, 0x78,
-       0x61, 0x60, 0x27, 0x90, 0x04, 0xE5, 0x7A, 0xE6,
-       0xAF, 0x87, 0x4E, 0x73, 0x03, 0xCE, 0x53, 0x29,
-       0x9C, 0xCC, 0x04, 0x1C, 0x7B, 0xC3, 0x08, 0xD8,
-       0x2A, 0x56, 0x98, 0xF3, 0xA8, 0xD0, 0xC3, 0x82,
-       0x71, 0xAE, 0x35, 0xF8, 0xE9, 0xDB, 0xFB, 0xB6,
-       0x94, 0xB5, 0xC8, 0x03, 0xD8, 0x9F, 0x7A, 0xE4,
-       0x35, 0xDE, 0x23, 0x6D, 0x52, 0x5F, 0x54, 0x75,
-       0x9B, 0x65, 0xE3, 0x72, 0xFC, 0xD6, 0x8E, 0xF2,
-       0x0F, 0xA7, 0x11, 0x1F, 0x9E, 0x4A, 0xFF, 0x73
-};
-#endif
-
-#if PPP_SERVER
-/* Local forward declarations. */
-static void eap_server_timeout(void *arg);
-#endif /* PPP_SERVER */
-
-/*
- * Convert EAP state code to printable string for debug.
- */
-static const char * eap_state_name(enum eap_state_code esc)
-{
-       static const char *state_names[] = { EAP_STATES };
-
-       return (state_names[(int)esc]);
-}
-
-/*
- * eap_init - Initialize state for an EAP user.  This is currently
- * called once by main() during start-up.
- */
-static void eap_init(ppp_pcb *pcb) {
-
-       BZERO(&pcb->eap, sizeof(eap_state));
-#if PPP_SERVER
-       pcb->eap.es_server.ea_id = magic();
-#endif /* PPP_SERVER */
-}
-
-/*
- * eap_client_timeout - Give up waiting for the peer to send any
- * Request messages.
- */
-static void eap_client_timeout(void *arg) {
-       ppp_pcb *pcb = (ppp_pcb*)arg;
-
-       if (!eap_client_active(pcb))
-               return;
-
-       ppp_error("EAP: timeout waiting for Request from peer");
-       auth_withpeer_fail(pcb, PPP_EAP);
-       pcb->eap.es_client.ea_state = eapBadAuth;
-}
-
-/*
- * eap_authwithpeer - Authenticate to our peer (behave as client).
- *
- * Start client state and wait for requests.  This is called only
- * after eap_lowerup.
- */
-void eap_authwithpeer(ppp_pcb *pcb, const char *localname) {
-
-       if(NULL == localname)
-               return;
-
-       /* Save the peer name we're given */
-       pcb->eap.es_client.ea_name = localname;
-       pcb->eap.es_client.ea_namelen = strlen(localname);
-
-       pcb->eap.es_client.ea_state = eapListen;
-
-       /*
-        * Start a timer so that if the other end just goes
-        * silent, we don't sit here waiting forever.
-        */
-       if (pcb->settings.eap_req_time > 0)
-               TIMEOUT(eap_client_timeout, pcb,
-                   pcb->settings.eap_req_time);
-}
-
-#if PPP_SERVER
-/*
- * Format a standard EAP Failure message and send it to the peer.
- * (Server operation)
- */
-static void eap_send_failure(ppp_pcb *pcb) {
-       struct pbuf *p;
-       u_char *outp;
-
-       p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN + EAP_HEADERLEN), PPP_CTRL_PBUF_TYPE);
-       if(NULL == p)
-               return;
-       if(p->tot_len != p->len) {
-               pbuf_free(p);
-               return;
-       }
-
-       outp = (u_char*)p->payload;
-
-       MAKEHEADER(outp, PPP_EAP);
-
-       PUTCHAR(EAP_FAILURE, outp);
-       pcb->eap.es_server.ea_id++;
-       PUTCHAR(pcb->eap.es_server.ea_id, outp);
-       PUTSHORT(EAP_HEADERLEN, outp);
-
-       ppp_write(pcb, p);
-
-       pcb->eap.es_server.ea_state = eapBadAuth;
-       auth_peer_fail(pcb, PPP_EAP);
-}
-
-/*
- * Format a standard EAP Success message and send it to the peer.
- * (Server operation)
- */
-static void eap_send_success(ppp_pcb *pcb) {
-       struct pbuf *p;
-       u_char *outp;
-
-       p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN + EAP_HEADERLEN), PPP_CTRL_PBUF_TYPE);
-       if(NULL == p)
-               return;
-       if(p->tot_len != p->len) {
-               pbuf_free(p);
-               return;
-       }
-
-       outp = (u_char*)p->payload;
-    
-       MAKEHEADER(outp, PPP_EAP);
-
-       PUTCHAR(EAP_SUCCESS, outp);
-       pcb->eap.es_server.ea_id++;
-       PUTCHAR(pcb->eap.es_server.ea_id, outp);
-       PUTSHORT(EAP_HEADERLEN, outp);
-
-       ppp_write(pcb, p);
-
-       auth_peer_success(pcb, PPP_EAP, 0,
-           pcb->eap.es_server.ea_peer, pcb->eap.es_server.ea_peerlen);
-}
-#endif /* PPP_SERVER */
-
-#ifdef USE_SRP
-/*
- * Set DES key according to pseudonym-generating secret and current
- * date.
- */
-static bool
-pncrypt_setkey(int timeoffs)
-{
-       struct tm *tp;
-       char tbuf[9];
-       SHA1_CTX ctxt;
-       u_char dig[SHA_DIGESTSIZE];
-       time_t reftime;
-
-       if (pn_secret == NULL)
-               return (0);
-       reftime = time(NULL) + timeoffs;
-       tp = localtime(&reftime);
-       SHA1Init(&ctxt);
-       SHA1Update(&ctxt, pn_secret, strlen(pn_secret));
-       strftime(tbuf, sizeof (tbuf), "%Y%m%d", tp);
-       SHA1Update(&ctxt, tbuf, strlen(tbuf));
-       SHA1Final(dig, &ctxt);
-       /* FIXME: if we want to do SRP, we need to find a way to pass the PolarSSL des_context instead of using static memory */
-       return (DesSetkey(dig));
-}
-
-static char base64[] =
-"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
-struct b64state {
-       u32_t bs_bits;
-       int bs_offs;
-};
-
-static int
-b64enc(bs, inp, inlen, outp)
-struct b64state *bs;
-u_char *inp;
-int inlen;
-u_char *outp;
-{
-       int outlen = 0;
-
-       while (inlen > 0) {
-               bs->bs_bits = (bs->bs_bits << 8) | *inp++;
-               inlen--;
-               bs->bs_offs += 8;
-               if (bs->bs_offs >= 24) {
-                       *outp++ = base64[(bs->bs_bits >> 18) & 0x3F];
-                       *outp++ = base64[(bs->bs_bits >> 12) & 0x3F];
-                       *outp++ = base64[(bs->bs_bits >> 6) & 0x3F];
-                       *outp++ = base64[bs->bs_bits & 0x3F];
-                       outlen += 4;
-                       bs->bs_offs = 0;
-                       bs->bs_bits = 0;
-               }
-       }
-       return (outlen);
-}
-
-static int
-b64flush(bs, outp)
-struct b64state *bs;
-u_char *outp;
-{
-       int outlen = 0;
-
-       if (bs->bs_offs == 8) {
-               *outp++ = base64[(bs->bs_bits >> 2) & 0x3F];
-               *outp++ = base64[(bs->bs_bits << 4) & 0x3F];
-               outlen = 2;
-       } else if (bs->bs_offs == 16) {
-               *outp++ = base64[(bs->bs_bits >> 10) & 0x3F];
-               *outp++ = base64[(bs->bs_bits >> 4) & 0x3F];
-               *outp++ = base64[(bs->bs_bits << 2) & 0x3F];
-               outlen = 3;
-       }
-       bs->bs_offs = 0;
-       bs->bs_bits = 0;
-       return (outlen);
-}
-
-static int
-b64dec(bs, inp, inlen, outp)
-struct b64state *bs;
-u_char *inp;
-int inlen;
-u_char *outp;
-{
-       int outlen = 0;
-       char *cp;
-
-       while (inlen > 0) {
-               if ((cp = strchr(base64, *inp++)) == NULL)
-                       break;
-               bs->bs_bits = (bs->bs_bits << 6) | (cp - base64);
-               inlen--;
-               bs->bs_offs += 6;
-               if (bs->bs_offs >= 8) {
-                       *outp++ = bs->bs_bits >> (bs->bs_offs - 8);
-                       outlen++;
-                       bs->bs_offs -= 8;
-               }
-       }
-       return (outlen);
-}
-#endif /* USE_SRP */
-
-#if PPP_SERVER
-/*
- * Assume that current waiting server state is complete and figure
- * next state to use based on available authentication data.  'status'
- * indicates if there was an error in handling the last query.  It is
- * 0 for success and non-zero for failure.
- */
-static void eap_figure_next_state(ppp_pcb *pcb, int status) {
-#ifdef USE_SRP
-       unsigned char secbuf[MAXSECRETLEN], clear[8], *sp, *dp;
-       struct t_pw tpw;
-       struct t_confent *tce, mytce;
-       char *cp, *cp2;
-       struct t_server *ts;
-       int id, i, plen, toffs;
-       u_char vals[2];
-       struct b64state bs;
-#endif /* USE_SRP */
-
-       pcb->settings.eap_timeout_time = pcb->eap.es_savedtime;
-       switch (pcb->eap.es_server.ea_state) {
-       case eapBadAuth:
-               return;
-
-       case eapIdentify:
-#ifdef USE_SRP
-               /* Discard any previous session. */
-               ts = (struct t_server *)pcb->eap.es_server.ea_session;
-               if (ts != NULL) {
-                       t_serverclose(ts);
-                       pcb->eap.es_server.ea_session = NULL;
-                       pcb->eap.es_server.ea_skey = NULL;
-               }
-#endif /* USE_SRP */
-               if (status != 0) {
-                       pcb->eap.es_server.ea_state = eapBadAuth;
-                       break;
-               }
-#ifdef USE_SRP
-               /* If we've got a pseudonym, try to decode to real name. */
-               if (pcb->eap.es_server.ea_peerlen > SRP_PSEUDO_LEN &&
-                   strncmp(pcb->eap.es_server.ea_peer, SRP_PSEUDO_ID,
-                       SRP_PSEUDO_LEN) == 0 &&
-                   (pcb->eap.es_server.ea_peerlen - SRP_PSEUDO_LEN) * 3 / 4 <
-                   sizeof (secbuf)) {
-                       BZERO(&bs, sizeof (bs));
-                       plen = b64dec(&bs,
-                           pcb->eap.es_server.ea_peer + SRP_PSEUDO_LEN,
-                           pcb->eap.es_server.ea_peerlen - SRP_PSEUDO_LEN,
-                           secbuf);
-                       toffs = 0;
-                       for (i = 0; i < 5; i++) {
-                               pncrypt_setkey(toffs);
-                               toffs -= 86400;
-                               /* FIXME: if we want to do SRP, we need to find a way to pass the PolarSSL des_context instead of using static memory */
-                               if (!DesDecrypt(secbuf, clear)) {
-                                       ppp_dbglog("no DES here; cannot decode "
-                                           "pseudonym");
-                                       return;
-                               }
-                               id = *(unsigned char *)clear;
-                               if (id + 1 <= plen && id + 9 > plen)
-                                       break;
-                       }
-                       if (plen % 8 == 0 && i < 5) {
-                               /*
-                                * Note that this is always shorter than the
-                                * original stored string, so there's no need
-                                * to realloc.
-                                */
-                               if ((i = plen = *(unsigned char *)clear) > 7)
-                                       i = 7;
-                               pcb->eap.es_server.ea_peerlen = plen;
-                               dp = (unsigned char *)pcb->eap.es_server.ea_peer;
-                               MEMCPY(dp, clear + 1, i);
-                               plen -= i;
-                               dp += i;
-                               sp = secbuf + 8;
-                               while (plen > 0) {
-                                       /* FIXME: if we want to do SRP, we need to find a way to pass the PolarSSL des_context instead of using static memory */
-                                       (void) DesDecrypt(sp, dp);
-                                       sp += 8;
-                                       dp += 8;
-                                       plen -= 8;
-                               }
-                               pcb->eap.es_server.ea_peer[
-                                       pcb->eap.es_server.ea_peerlen] = '\0';
-                               ppp_dbglog("decoded pseudonym to \"%.*q\"",
-                                   pcb->eap.es_server.ea_peerlen,
-                                   pcb->eap.es_server.ea_peer);
-                       } else {
-                               ppp_dbglog("failed to decode real name");
-                               /* Stay in eapIdentfy state; requery */
-                               break;
-                       }
-               }
-               /* Look up user in secrets database. */
-               if (get_srp_secret(pcb->eap.es_unit, pcb->eap.es_server.ea_peer,
-                   pcb->eap.es_server.ea_name, (char *)secbuf, 1) != 0) {
-                       /* Set up default in case SRP entry is bad */
-                       pcb->eap.es_server.ea_state = eapMD5Chall;
-                       /* Get t_confent based on index in srp-secrets */
-                       id = strtol((char *)secbuf, &cp, 10);
-                       if (*cp++ != ':' || id < 0)
-                               break;
-                       if (id == 0) {
-                               mytce.index = 0;
-                               mytce.modulus.data = (u_char *)wkmodulus;
-                               mytce.modulus.len = sizeof (wkmodulus);
-                               mytce.generator.data = (u_char *)"\002";
-                               mytce.generator.len = 1;
-                               tce = &mytce;
-                       } else if ((tce = gettcid(id)) != NULL) {
-                               /*
-                                * Client will have to verify this modulus/
-                                * generator combination, and that will take
-                                * a while.  Lengthen the timeout here.
-                                */
-                               if (pcb->settings.eap_timeout_time > 0 &&
-                                   pcb->settings.eap_timeout_time < 30)
-                                       pcb->settings.eap_timeout_time = 30;
-                       } else {
-                               break;
-                       }
-                       if ((cp2 = strchr(cp, ':')) == NULL)
-                               break;
-                       *cp2++ = '\0';
-                       tpw.pebuf.name = pcb->eap.es_server.ea_peer;
-                       tpw.pebuf.password.len = t_fromb64((char *)tpw.pwbuf,
-                           cp);
-                       tpw.pebuf.password.data = tpw.pwbuf;
-                       tpw.pebuf.salt.len = t_fromb64((char *)tpw.saltbuf,
-                           cp2);
-                       tpw.pebuf.salt.data = tpw.saltbuf;
-                       if ((ts = t_serveropenraw(&tpw.pebuf, tce)) == NULL)
-                               break;
-                       pcb->eap.es_server.ea_session = (void *)ts;
-                       pcb->eap.es_server.ea_state = eapSRP1;
-                       vals[0] = pcb->eap.es_server.ea_id + 1;
-                       vals[1] = EAPT_SRP;
-                       t_serveraddexdata(ts, vals, 2);
-                       /* Generate B; must call before t_servergetkey() */
-                       t_servergenexp(ts);
-                       break;
-               }
-#endif /* USE_SRP */
-               pcb->eap.es_server.ea_state = eapMD5Chall;
-               break;
-
-       case eapSRP1:
-#ifdef USE_SRP
-               ts = (struct t_server *)pcb->eap.es_server.ea_session;
-               if (ts != NULL && status != 0) {
-                       t_serverclose(ts);
-                       pcb->eap.es_server.ea_session = NULL;
-                       pcb->eap.es_server.ea_skey = NULL;
-               }
-#endif /* USE_SRP */
-               if (status == 1) {
-                       pcb->eap.es_server.ea_state = eapMD5Chall;
-               } else if (status != 0 || pcb->eap.es_server.ea_session == NULL) {
-                       pcb->eap.es_server.ea_state = eapBadAuth;
-               } else {
-                       pcb->eap.es_server.ea_state = eapSRP2;
-               }
-               break;
-
-       case eapSRP2:
-#ifdef USE_SRP
-               ts = (struct t_server *)pcb->eap.es_server.ea_session;
-               if (ts != NULL && status != 0) {
-                       t_serverclose(ts);
-                       pcb->eap.es_server.ea_session = NULL;
-                       pcb->eap.es_server.ea_skey = NULL;
-               }
-#endif /* USE_SRP */
-               if (status != 0 || pcb->eap.es_server.ea_session == NULL) {
-                       pcb->eap.es_server.ea_state = eapBadAuth;
-               } else {
-                       pcb->eap.es_server.ea_state = eapSRP3;
-               }
-               break;
-
-       case eapSRP3:
-       case eapSRP4:
-#ifdef USE_SRP
-               ts = (struct t_server *)pcb->eap.es_server.ea_session;
-               if (ts != NULL && status != 0) {
-                       t_serverclose(ts);
-                       pcb->eap.es_server.ea_session = NULL;
-                       pcb->eap.es_server.ea_skey = NULL;
-               }
-#endif /* USE_SRP */
-               if (status != 0 || pcb->eap.es_server.ea_session == NULL) {
-                       pcb->eap.es_server.ea_state = eapBadAuth;
-               } else {
-                       pcb->eap.es_server.ea_state = eapOpen;
-               }
-               break;
-
-       case eapMD5Chall:
-               if (status != 0) {
-                       pcb->eap.es_server.ea_state = eapBadAuth;
-               } else {
-                       pcb->eap.es_server.ea_state = eapOpen;
-               }
-               break;
-
-       default:
-               pcb->eap.es_server.ea_state = eapBadAuth;
-               break;
-       }
-       if (pcb->eap.es_server.ea_state == eapBadAuth)
-               eap_send_failure(pcb);
-}
-
-/*
- * Format an EAP Request message and send it to the peer.  Message
- * type depends on current state.  (Server operation)
- */
-static void eap_send_request(ppp_pcb *pcb) {
-       struct pbuf *p;
-       u_char *outp;
-       u_char *lenloc;
-       int outlen;
-       int len;
-       const char *str;
-#ifdef USE_SRP
-       struct t_server *ts;
-       u_char clear[8], cipher[8], dig[SHA_DIGESTSIZE], *optr, *cp;
-       int i, j;
-       struct b64state b64;
-       SHA1_CTX ctxt;
-#endif /* USE_SRP */
-
-       /* Handle both initial auth and restart */
-       if (pcb->eap.es_server.ea_state < eapIdentify &&
-           pcb->eap.es_server.ea_state != eapInitial) {
-               pcb->eap.es_server.ea_state = eapIdentify;
-#if PPP_REMOTENAME
-               if (pcb->settings.explicit_remote && pcb->remote_name) {
-                       /*
-                        * If we already know the peer's
-                        * unauthenticated name, then there's no
-                        * reason to ask.  Go to next state instead.
-                        */
-                       int len = (int)strlen(pcb->remote_name);
-                       if (len > MAXNAMELEN) {
-                               len = MAXNAMELEN;
-                       }
-                       MEMCPY(pcb->eap.es_server.ea_peer, pcb->remote_name, len);
-                       pcb->eap.es_server.ea_peer[len] = '\0';
-                       pcb->eap.es_server.ea_peerlen = len;
-                       eap_figure_next_state(pcb, 0);
-               }
-#endif /* PPP_REMOTENAME */
-       }
-
-       if (pcb->settings.eap_max_transmits > 0 &&
-           pcb->eap.es_server.ea_requests >= pcb->settings.eap_max_transmits) {
-               if (pcb->eap.es_server.ea_responses > 0)
-                       ppp_error("EAP: too many Requests sent");
-               else
-                       ppp_error("EAP: no response to Requests");
-               eap_send_failure(pcb);
-               return;
-       }
-
-       p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_CTRL_PBUF_MAX_SIZE), PPP_CTRL_PBUF_TYPE);
-       if(NULL == p)
-               return;
-       if(p->tot_len != p->len) {
-               pbuf_free(p);
-               return;
-       }
-
-       outp = (u_char*)p->payload;
-    
-       MAKEHEADER(outp, PPP_EAP);
-
-       PUTCHAR(EAP_REQUEST, outp);
-       PUTCHAR(pcb->eap.es_server.ea_id, outp);
-       lenloc = outp;
-       INCPTR(2, outp);
-
-       switch (pcb->eap.es_server.ea_state) {
-       case eapIdentify:
-               PUTCHAR(EAPT_IDENTITY, outp);
-               str = "Name";
-               len = strlen(str);
-               MEMCPY(outp, str, len);
-               INCPTR(len, outp);
-               break;
-
-       case eapMD5Chall:
-               PUTCHAR(EAPT_MD5CHAP, outp);
-               /*
-                * pick a random challenge length between
-                * EAP_MIN_CHALLENGE_LENGTH and EAP_MAX_CHALLENGE_LENGTH
-                */
-               pcb->eap.es_challen = EAP_MIN_CHALLENGE_LENGTH +
-                   magic_pow(EAP_MIN_MAX_POWER_OF_TWO_CHALLENGE_LENGTH);
-               PUTCHAR(pcb->eap.es_challen, outp);
-               magic_random_bytes(pcb->eap.es_challenge, pcb->eap.es_challen);
-               MEMCPY(outp, pcb->eap.es_challenge, pcb->eap.es_challen);
-               INCPTR(pcb->eap.es_challen, outp);
-               MEMCPY(outp, pcb->eap.es_server.ea_name, pcb->eap.es_server.ea_namelen);
-               INCPTR(pcb->eap.es_server.ea_namelen, outp);
-               break;
-
-#ifdef USE_SRP
-       case eapSRP1:
-               PUTCHAR(EAPT_SRP, outp);
-               PUTCHAR(EAPSRP_CHALLENGE, outp);
-
-               PUTCHAR(pcb->eap.es_server.ea_namelen, outp);
-               MEMCPY(outp, pcb->eap.es_server.ea_name, pcb->eap.es_server.ea_namelen);
-               INCPTR(pcb->eap.es_server.ea_namelen, outp);
-
-               ts = (struct t_server *)pcb->eap.es_server.ea_session;
-               assert(ts != NULL);
-               PUTCHAR(ts->s.len, outp);
-               MEMCPY(outp, ts->s.data, ts->s.len);
-               INCPTR(ts->s.len, outp);
-
-               if (ts->g.len == 1 && ts->g.data[0] == 2) {
-                       PUTCHAR(0, outp);
-               } else {
-                       PUTCHAR(ts->g.len, outp);
-                       MEMCPY(outp, ts->g.data, ts->g.len);
-                       INCPTR(ts->g.len, outp);
-               }
-
-               if (ts->n.len != sizeof (wkmodulus) ||
-                   BCMP(ts->n.data, wkmodulus, sizeof (wkmodulus)) != 0) {
-                       MEMCPY(outp, ts->n.data, ts->n.len);
-                       INCPTR(ts->n.len, outp);
-               }
-               break;
-
-       case eapSRP2:
-               PUTCHAR(EAPT_SRP, outp);
-               PUTCHAR(EAPSRP_SKEY, outp);
-
-               ts = (struct t_server *)pcb->eap.es_server.ea_session;
-               assert(ts != NULL);
-               MEMCPY(outp, ts->B.data, ts->B.len);
-               INCPTR(ts->B.len, outp);
-               break;
-
-       case eapSRP3:
-               PUTCHAR(EAPT_SRP, outp);
-               PUTCHAR(EAPSRP_SVALIDATOR, outp);
-               PUTLONG(SRPVAL_EBIT, outp);
-               ts = (struct t_server *)pcb->eap.es_server.ea_session;
-               assert(ts != NULL);
-               MEMCPY(outp, t_serverresponse(ts), SHA_DIGESTSIZE);
-               INCPTR(SHA_DIGESTSIZE, outp);
-
-               if (pncrypt_setkey(0)) {
-                       /* Generate pseudonym */
-                       optr = outp;
-                       cp = (unsigned char *)pcb->eap.es_server.ea_peer;
-                       if ((j = i = pcb->eap.es_server.ea_peerlen) > 7)
-                               j = 7;
-                       clear[0] = i;
-                       MEMCPY(clear + 1, cp, j);
-                       i -= j;
-                       cp += j;
-                       /* FIXME: if we want to do SRP, we need to find a way to pass the PolarSSL des_context instead of using static memory */
-                       if (!DesEncrypt(clear, cipher)) {
-                               ppp_dbglog("no DES here; not generating pseudonym");
-                               break;
-                       }
-                       BZERO(&b64, sizeof (b64));
-                       outp++;         /* space for pseudonym length */
-                       outp += b64enc(&b64, cipher, 8, outp);
-                       while (i >= 8) {
-                               /* FIXME: if we want to do SRP, we need to find a way to pass the PolarSSL des_context instead of using static memory */
-                               (void) DesEncrypt(cp, cipher);
-                               outp += b64enc(&b64, cipher, 8, outp);
-                               cp += 8;
-                               i -= 8;
-                       }
-                       if (i > 0) {
-                               MEMCPY(clear, cp, i);
-                               cp += i;
-                               magic_random_bytes(cp, 8-i);
-                               /* FIXME: if we want to do SRP, we need to find a way to pass the PolarSSL des_context instead of using static memory */
-                               (void) DesEncrypt(clear, cipher);
-                               outp += b64enc(&b64, cipher, 8, outp);
-                       }
-                       outp += b64flush(&b64, outp);
-
-                       /* Set length and pad out to next 20 octet boundary */
-                       i = outp - optr - 1;
-                       *optr = i;
-                       i %= SHA_DIGESTSIZE;
-                       if (i != 0) {
-                               magic_random_bytes(outp, SHA_DIGESTSIZE-i);
-                               INCPTR(SHA_DIGESTSIZE-i, outp);
-                       }
-
-                       /* Obscure the pseudonym with SHA1 hash */
-                       SHA1Init(&ctxt);
-                       SHA1Update(&ctxt, &pcb->eap.es_server.ea_id, 1);
-                       SHA1Update(&ctxt, pcb->eap.es_server.ea_skey,
-                           SESSION_KEY_LEN);
-                       SHA1Update(&ctxt, pcb->eap.es_server.ea_peer,
-                           pcb->eap.es_server.ea_peerlen);
-                       while (optr < outp) {
-                               SHA1Final(dig, &ctxt);
-                               cp = dig;
-                               while (cp < dig + SHA_DIGESTSIZE)
-                                       *optr++ ^= *cp++;
-                               SHA1Init(&ctxt);
-                               SHA1Update(&ctxt, &pcb->eap.es_server.ea_id, 1);
-                               SHA1Update(&ctxt, pcb->eap.es_server.ea_skey,
-                                   SESSION_KEY_LEN);
-                               SHA1Update(&ctxt, optr - SHA_DIGESTSIZE,
-                                   SHA_DIGESTSIZE);
-                       }
-               }
-               break;
-
-       case eapSRP4:
-               PUTCHAR(EAPT_SRP, outp);
-               PUTCHAR(EAPSRP_LWRECHALLENGE, outp);
-               pcb->eap.es_challen = EAP_MIN_CHALLENGE_LENGTH +
-                   magic_pow(EAP_MIN_MAX_POWER_OF_TWO_CHALLENGE_LENGTH);
-               magic_random_bytes(pcb->eap.es_challenge, pcb->eap.es_challen);
-               MEMCPY(outp, pcb->eap.es_challenge, pcb->eap.es_challen);
-               INCPTR(pcb->eap.es_challen, outp);
-               break;
-#endif /* USE_SRP */
-
-       default:
-               return;
-       }
-
-       outlen = (outp - (unsigned char*)p->payload) - PPP_HDRLEN;
-       PUTSHORT(outlen, lenloc);
-
-       pbuf_realloc(p, outlen + PPP_HDRLEN);
-       ppp_write(pcb, p);
-
-       pcb->eap.es_server.ea_requests++;
-
-       if (pcb->settings.eap_timeout_time > 0)
-               TIMEOUT(eap_server_timeout, pcb, pcb->settings.eap_timeout_time);
-}
-
-/*
- * eap_authpeer - Authenticate our peer (behave as server).
- *
- * Start server state and send first request.  This is called only
- * after eap_lowerup.
- */
-void eap_authpeer(ppp_pcb *pcb, const char *localname) {
-
-       /* Save the name we're given. */
-       pcb->eap.es_server.ea_name = localname;
-       pcb->eap.es_server.ea_namelen = strlen(localname);
-
-       pcb->eap.es_savedtime = pcb->settings.eap_timeout_time;
-
-       /* Lower layer up yet? */
-       if (pcb->eap.es_server.ea_state == eapInitial ||
-           pcb->eap.es_server.ea_state == eapPending) {
-               pcb->eap.es_server.ea_state = eapPending;
-               return;
-       }
-
-       pcb->eap.es_server.ea_state = eapPending;
-
-       /* ID number not updated here intentionally; hashed into M1 */
-       eap_send_request(pcb);
-}
-
-/*
- * eap_server_timeout - Retransmission timer for sending Requests
- * expired.
- */
-static void eap_server_timeout(void *arg) {
-       ppp_pcb *pcb = (ppp_pcb*)arg;
-
-       if (!eap_server_active(pcb))
-               return;
-
-       /* EAP ID number must not change on timeout. */
-       eap_send_request(pcb);
-}
-
-/*
- * When it's time to send rechallenge the peer, this timeout is
- * called.  Once the rechallenge is successful, the response handler
- * will restart the timer.  If it fails, then the link is dropped.
- */
-static void eap_rechallenge(void *arg) {
-       ppp_pcb *pcb = (ppp_pcb*)arg;
-
-       if (pcb->eap.es_server.ea_state != eapOpen &&
-           pcb->eap.es_server.ea_state != eapSRP4)
-               return;
-
-       pcb->eap.es_server.ea_requests = 0;
-       pcb->eap.es_server.ea_state = eapIdentify;
-       eap_figure_next_state(pcb, 0);
-       pcb->eap.es_server.ea_id++;
-       eap_send_request(pcb);
-}
-
-static void srp_lwrechallenge(void *arg) {
-       ppp_pcb *pcb = (ppp_pcb*)arg;
-
-       if (pcb->eap.es_server.ea_state != eapOpen ||
-           pcb->eap.es_server.ea_type != EAPT_SRP)
-               return;
-
-       pcb->eap.es_server.ea_requests = 0;
-       pcb->eap.es_server.ea_state = eapSRP4;
-       pcb->eap.es_server.ea_id++;
-       eap_send_request(pcb);
-}
-#endif /* PPP_SERVER */
-
-/*
- * eap_lowerup - The lower layer is now up.
- *
- * This is called before either eap_authpeer or eap_authwithpeer.  See
- * link_established() in auth.c.  All that's necessary here is to
- * return to closed state so that those two routines will do the right
- * thing.
- */
-static void eap_lowerup(ppp_pcb *pcb) {
-       pcb->eap.es_client.ea_state = eapClosed;
-#if PPP_SERVER
-       pcb->eap.es_server.ea_state = eapClosed;
-#endif /* PPP_SERVER */
-}
-
-/*
- * eap_lowerdown - The lower layer is now down.
- *
- * Cancel all timeouts and return to initial state.
- */
-static void eap_lowerdown(ppp_pcb *pcb) {
-
-       if (eap_client_active(pcb) && pcb->settings.eap_req_time > 0) {
-               UNTIMEOUT(eap_client_timeout, pcb);
-       }
-#if PPP_SERVER
-       if (eap_server_active(pcb)) {
-               if (pcb->settings.eap_timeout_time > 0) {
-                       UNTIMEOUT(eap_server_timeout, pcb);
-               }
-       } else {
-               if ((pcb->eap.es_server.ea_state == eapOpen ||
-                   pcb->eap.es_server.ea_state == eapSRP4) &&
-                   pcb->eap.es_rechallenge > 0) {
-                       UNTIMEOUT(eap_rechallenge, (void *)pcb);
-               }
-               if (pcb->eap.es_server.ea_state == eapOpen &&
-                   pcb->eap.es_lwrechallenge > 0) {
-                       UNTIMEOUT(srp_lwrechallenge, (void *)pcb);
-               }
-       }
-
-       pcb->eap.es_client.ea_state = pcb->eap.es_server.ea_state = eapInitial;
-       pcb->eap.es_client.ea_requests = pcb->eap.es_server.ea_requests = 0;
-#endif /* PPP_SERVER */
-}
-
-/*
- * eap_protrej - Peer doesn't speak this protocol.
- *
- * This shouldn't happen.  If it does, it represents authentication
- * failure.
- */
-static void eap_protrej(ppp_pcb *pcb) {
-
-       if (eap_client_active(pcb)) {
-               ppp_error("EAP authentication failed due to Protocol-Reject");
-               auth_withpeer_fail(pcb, PPP_EAP);
-       }
-#if PPP_SERVER
-       if (eap_server_active(pcb)) {
-               ppp_error("EAP authentication of peer failed on Protocol-Reject");
-               auth_peer_fail(pcb, PPP_EAP);
-       }
-#endif /* PPP_SERVER */
-       eap_lowerdown(pcb);
-}
-
-/*
- * Format and send a regular EAP Response message.
- */
-static void eap_send_response(ppp_pcb *pcb, u_char id, u_char typenum, const u_char *str, int lenstr) {
-       struct pbuf *p;
-       u_char *outp;
-       int msglen;
-
-       msglen = EAP_HEADERLEN + sizeof (u_char) + lenstr;
-       p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN + msglen), PPP_CTRL_PBUF_TYPE);
-       if(NULL == p)
-               return;
-       if(p->tot_len != p->len) {
-               pbuf_free(p);
-               return;
-       }
-
-       outp = (u_char*)p->payload;
-
-       MAKEHEADER(outp, PPP_EAP);
-
-       PUTCHAR(EAP_RESPONSE, outp);
-       PUTCHAR(id, outp);
-       pcb->eap.es_client.ea_id = id;
-       PUTSHORT(msglen, outp);
-       PUTCHAR(typenum, outp);
-       if (lenstr > 0) {
-               MEMCPY(outp, str, lenstr);
-       }
-
-       ppp_write(pcb, p);
-}
-
-/*
- * Format and send an MD5-Challenge EAP Response message.
- */
-static void eap_chap_response(ppp_pcb *pcb, u_char id, u_char *hash, const char *name, int namelen) {
-       struct pbuf *p;
-       u_char *outp;
-       int msglen;
-
-       msglen = EAP_HEADERLEN + 2 * sizeof (u_char) + MD5_SIGNATURE_SIZE +
-           namelen;
-       p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN + msglen), PPP_CTRL_PBUF_TYPE);
-       if(NULL == p)
-               return;
-       if(p->tot_len != p->len) {
-               pbuf_free(p);
-               return;
-       }
-
-       outp = (u_char*)p->payload;
-    
-       MAKEHEADER(outp, PPP_EAP);
-
-       PUTCHAR(EAP_RESPONSE, outp);
-       PUTCHAR(id, outp);
-       pcb->eap.es_client.ea_id = id;
-       PUTSHORT(msglen, outp);
-       PUTCHAR(EAPT_MD5CHAP, outp);
-       PUTCHAR(MD5_SIGNATURE_SIZE, outp);
-       MEMCPY(outp, hash, MD5_SIGNATURE_SIZE);
-       INCPTR(MD5_SIGNATURE_SIZE, outp);
-       if (namelen > 0) {
-               MEMCPY(outp, name, namelen);
-       }
-
-       ppp_write(pcb, p);
-}
-
-#ifdef USE_SRP
-/*
- * Format and send a SRP EAP Response message.
- */
-static void
-eap_srp_response(esp, id, subtypenum, str, lenstr)
-eap_state *esp;
-u_char id;
-u_char subtypenum;
-u_char *str;
-int lenstr;
-{
-       ppp_pcb *pcb = &ppp_pcb_list[pcb->eap.es_unit];
-       struct pbuf *p;
-       u_char *outp;
-       int msglen;
-
-       msglen = EAP_HEADERLEN + 2 * sizeof (u_char) + lenstr;
-       p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN + msglen), PPP_CTRL_PBUF_TYPE);
-       if(NULL == p)
-               return;
-       if(p->tot_len != p->len) {
-               pbuf_free(p);
-               return;
-       }
-
-       outp = p->payload;
-
-       MAKEHEADER(outp, PPP_EAP);
-
-       PUTCHAR(EAP_RESPONSE, outp);
-       PUTCHAR(id, outp);
-       pcb->eap.es_client.ea_id = id;
-       PUTSHORT(msglen, outp);
-       PUTCHAR(EAPT_SRP, outp);
-       PUTCHAR(subtypenum, outp);
-       if (lenstr > 0) {
-               MEMCPY(outp, str, lenstr);
-       }
-
-       ppp_write(pcb, p);
-}
-
-/*
- * Format and send a SRP EAP Client Validator Response message.
- */
-static void
-eap_srpval_response(esp, id, flags, str)
-eap_state *esp;
-u_char id;
-u32_t flags;
-u_char *str;
-{
-       ppp_pcb *pcb = &ppp_pcb_list[pcb->eap.es_unit];
-       struct pbuf *p;
-       u_char *outp;
-       int msglen;
-
-       msglen = EAP_HEADERLEN + 2 * sizeof (u_char) + sizeof (u32_t) +
-           SHA_DIGESTSIZE;
-       p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN + msglen), PPP_CTRL_PBUF_TYPE);
-       if(NULL == p)
-               return;
-       if(p->tot_len != p->len) {
-               pbuf_free(p);
-               return;
-       }
-
-       outp = p->payload;
-
-       MAKEHEADER(outp, PPP_EAP);
-
-       PUTCHAR(EAP_RESPONSE, outp);
-       PUTCHAR(id, outp);
-       pcb->eap.es_client.ea_id = id;
-       PUTSHORT(msglen, outp);
-       PUTCHAR(EAPT_SRP, outp);
-       PUTCHAR(EAPSRP_CVALIDATOR, outp);
-       PUTLONG(flags, outp);
-       MEMCPY(outp, str, SHA_DIGESTSIZE);
-
-       ppp_write(pcb, p);
-}
-#endif /* USE_SRP */
-
-static void eap_send_nak(ppp_pcb *pcb, u_char id, u_char type) {
-       struct pbuf *p;
-       u_char *outp;
-       int msglen;
-
-       msglen = EAP_HEADERLEN + 2 * sizeof (u_char);
-       p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN + msglen), PPP_CTRL_PBUF_TYPE);
-       if(NULL == p)
-               return;
-       if(p->tot_len != p->len) {
-               pbuf_free(p);
-               return;
-       }
-
-       outp = (u_char*)p->payload;
-
-       MAKEHEADER(outp, PPP_EAP);
-
-       PUTCHAR(EAP_RESPONSE, outp);
-       PUTCHAR(id, outp);
-       pcb->eap.es_client.ea_id = id;
-       PUTSHORT(msglen, outp);
-       PUTCHAR(EAPT_NAK, outp);
-       PUTCHAR(type, outp);
-
-       ppp_write(pcb, p);
-}
-
-#ifdef USE_SRP
-static char *
-name_of_pn_file()
-{
-       char *user, *path, *file;
-       struct passwd *pw;
-       size_t pl;
-       static bool pnlogged = 0;
-
-       pw = getpwuid(getuid());
-       if (pw == NULL || (user = pw->pw_dir) == NULL || user[0] == 0) {
-               errno = EINVAL;
-               return (NULL);
-       }
-       file = _PATH_PSEUDONYM;
-       pl = strlen(user) + strlen(file) + 2;
-       path = mem_malloc(pl);
-       if (path == NULL)
-               return (NULL);
-       (void) slprintf(path, pl, "%s/%s", user, file);
-       if (!pnlogged) {
-               ppp_dbglog("pseudonym file: %s", path);
-               pnlogged = 1;
-       }
-       return (path);
-}
-
-static int
-open_pn_file(modebits)
-mode_t modebits;
-{
-       char *path;
-       int fd, err;
-
-       if ((path = name_of_pn_file()) == NULL)
-               return (-1);
-       fd = open(path, modebits, S_IRUSR | S_IWUSR);
-       err = errno;
-       free(path);
-       errno = err;
-       return (fd);
-}
-
-static void
-remove_pn_file()
-{
-       char *path;
-
-       if ((path = name_of_pn_file()) != NULL) {
-               (void) unlink(path);
-               (void) free(path);
-       }
-}
-
-static void
-write_pseudonym(esp, inp, len, id)
-eap_state *esp;
-u_char *inp;
-int len, id;
-{
-       u_char val;
-       u_char *datp, *digp;
-       SHA1_CTX ctxt;
-       u_char dig[SHA_DIGESTSIZE];
-       int dsize, fd, olen = len;
-
-       /*
-        * Do the decoding by working backwards.  This eliminates the need
-        * to save the decoded output in a separate buffer.
-        */
-       val = id;
-       while (len > 0) {
-               if ((dsize = len % SHA_DIGESTSIZE) == 0)
-                       dsize = SHA_DIGESTSIZE;
-               len -= dsize;
-               datp = inp + len;
-               SHA1Init(&ctxt);
-               SHA1Update(&ctxt, &val, 1);
-               SHA1Update(&ctxt, pcb->eap.es_client.ea_skey, SESSION_KEY_LEN);
-               if (len > 0) {
-                       SHA1Update(&ctxt, datp, SHA_DIGESTSIZE);
-               } else {
-                       SHA1Update(&ctxt, pcb->eap.es_client.ea_name,
-                           pcb->eap.es_client.ea_namelen);
-               }
-               SHA1Final(dig, &ctxt);
-               for (digp = dig; digp < dig + SHA_DIGESTSIZE; digp++)
-                       *datp++ ^= *digp;
-       }
-
-       /* Now check that the result is sane */
-       if (olen <= 0 || *inp + 1 > olen) {
-               ppp_dbglog("EAP: decoded pseudonym is unusable <%.*B>", olen, inp);
-               return;
-       }
-
-       /* Save it away */
-       fd = open_pn_file(O_WRONLY | O_CREAT | O_TRUNC);
-       if (fd < 0) {
-               ppp_dbglog("EAP: error saving pseudonym: %m");
-               return;
-       }
-       len = write(fd, inp + 1, *inp);
-       if (close(fd) != -1 && len == *inp) {
-               ppp_dbglog("EAP: saved pseudonym");
-               pcb->eap.es_usedpseudo = 0;
-       } else {
-               ppp_dbglog("EAP: failed to save pseudonym");
-               remove_pn_file();
-       }
-}
-#endif /* USE_SRP */
-
-/*
- * eap_request - Receive EAP Request message (client mode).
- */
-static void eap_request(ppp_pcb *pcb, u_char *inp, int id, int len) {
-       u_char typenum;
-       u_char vallen;
-       int secret_len;
-       char secret[MAXSECRETLEN];
-       char rhostname[MAXNAMELEN];
-       md5_context mdContext;
-       u_char hash[MD5_SIGNATURE_SIZE];
-#ifdef USE_SRP
-       struct t_client *tc;
-       struct t_num sval, gval, Nval, *Ap, Bval;
-       u_char vals[2];
-       SHA1_CTX ctxt;
-       u_char dig[SHA_DIGESTSIZE];
-       int fd;
-#endif /* USE_SRP */
-
-       /*
-        * Note: we update es_client.ea_id *only if* a Response
-        * message is being generated.  Otherwise, we leave it the
-        * same for duplicate detection purposes.
-        */
-
-       pcb->eap.es_client.ea_requests++;
-       if (pcb->settings.eap_allow_req != 0 &&
-           pcb->eap.es_client.ea_requests > pcb->settings.eap_allow_req) {
-               ppp_info("EAP: received too many Request messages");
-               if (pcb->settings.eap_req_time > 0) {
-                       UNTIMEOUT(eap_client_timeout, pcb);
-               }
-               auth_withpeer_fail(pcb, PPP_EAP);
-               return;
-       }
-
-       if (len <= 0) {
-               ppp_error("EAP: empty Request message discarded");
-               return;
-       }
-
-       GETCHAR(typenum, inp);
-       len--;
-
-       switch (typenum) {
-       case EAPT_IDENTITY:
-               if (len > 0)
-                       ppp_info("EAP: Identity prompt \"%.*q\"", len, inp);
-#ifdef USE_SRP
-               if (pcb->eap.es_usepseudo &&
-                   (pcb->eap.es_usedpseudo == 0 ||
-                       (pcb->eap.es_usedpseudo == 1 &&
-                           id == pcb->eap.es_client.ea_id))) {
-                       pcb->eap.es_usedpseudo = 1;
-                       /* Try to get a pseudonym */
-                       if ((fd = open_pn_file(O_RDONLY)) >= 0) {
-                               strcpy(rhostname, SRP_PSEUDO_ID);
-                               len = read(fd, rhostname + SRP_PSEUDO_LEN,
-                                   sizeof (rhostname) - SRP_PSEUDO_LEN);
-                               /* XXX NAI unsupported */
-                               if (len > 0) {
-                                       eap_send_response(pcb, id, typenum,
-                                           rhostname, len + SRP_PSEUDO_LEN);
-                               }
-                               (void) close(fd);
-                               if (len > 0)
-                                       break;
-                       }
-               }
-               /* Stop using pseudonym now. */
-               if (pcb->eap.es_usepseudo && pcb->eap.es_usedpseudo != 2) {
-                       remove_pn_file();
-                       pcb->eap.es_usedpseudo = 2;
-               }
-#endif /* USE_SRP */
-               eap_send_response(pcb, id, typenum, (const u_char*)pcb->eap.es_client.ea_name,
-                   pcb->eap.es_client.ea_namelen);
-               break;
-
-       case EAPT_NOTIFICATION:
-               if (len > 0)
-                       ppp_info("EAP: Notification \"%.*q\"", len, inp);
-               eap_send_response(pcb, id, typenum, NULL, 0);
-               break;
-
-       case EAPT_NAK:
-               /*
-                * Avoid the temptation to send Response Nak in reply
-                * to Request Nak here.  It can only lead to trouble.
-                */
-               ppp_warn("EAP: unexpected Nak in Request; ignored");
-               /* Return because we're waiting for something real. */
-               return;
-
-       case EAPT_MD5CHAP:
-               if (len < 1) {
-                       ppp_error("EAP: received MD5-Challenge with no data");
-                       /* Bogus request; wait for something real. */
-                       return;
-               }
-               GETCHAR(vallen, inp);
-               len--;
-               if (vallen < 8 || vallen > len) {
-                       ppp_error("EAP: MD5-Challenge with bad length %d (8..%d)",
-                           vallen, len);
-                       /* Try something better. */
-                       eap_send_nak(pcb, id, EAPT_SRP);
-                       break;
-               }
-
-               /* Not so likely to happen. */
-               if (vallen >= len + sizeof (rhostname)) {
-                       ppp_dbglog("EAP: trimming really long peer name down");
-                       MEMCPY(rhostname, inp + vallen, sizeof (rhostname) - 1);
-                       rhostname[sizeof (rhostname) - 1] = '\0';
-               } else {
-                       MEMCPY(rhostname, inp + vallen, len - vallen);
-                       rhostname[len - vallen] = '\0';
-               }
-
-#if PPP_REMOTENAME
-               /* In case the remote doesn't give us his name. */
-               if (pcb->settings.explicit_remote ||
-                   (pcb->settings.remote_name[0] != '\0' && vallen == len))
-                       strlcpy(rhostname, pcb->settings.remote_name, sizeof (rhostname));
-#endif /* PPP_REMOTENAME */
-
-               /*
-                * Get the secret for authenticating ourselves with
-                * the specified host.
-                */
-               if (!get_secret(pcb, pcb->eap.es_client.ea_name,
-                   rhostname, secret, &secret_len, 0)) {
-                       ppp_dbglog("EAP: no MD5 secret for auth to %q", rhostname);
-                       eap_send_nak(pcb, id, EAPT_SRP);
-                       break;
-               }
-               md5_starts(&mdContext);
-               typenum = id;
-               md5_update(&mdContext, &typenum, 1);
-               md5_update(&mdContext, (u_char *)secret, secret_len);
-               BZERO(secret, sizeof (secret));
-               md5_update(&mdContext, inp, vallen);
-               md5_finish(&mdContext, hash);
-               eap_chap_response(pcb, id, hash, pcb->eap.es_client.ea_name,
-                   pcb->eap.es_client.ea_namelen);
-               break;
-
-#ifdef USE_SRP
-       case EAPT_SRP:
-               if (len < 1) {
-                       ppp_error("EAP: received empty SRP Request");
-                       /* Bogus request; wait for something real. */
-                       return;
-               }
-
-               /* Get subtype */
-               GETCHAR(vallen, inp);
-               len--;
-               switch (vallen) {
-               case EAPSRP_CHALLENGE:
-                       tc = NULL;
-                       if (pcb->eap.es_client.ea_session != NULL) {
-                               tc = (struct t_client *)pcb->eap.es_client.
-                                   ea_session;
-                               /*
-                                * If this is a new challenge, then start
-                                * over with a new client session context.
-                                * Otherwise, just resend last response.
-                                */
-                               if (id != pcb->eap.es_client.ea_id) {
-                                       t_clientclose(tc);
-                                       pcb->eap.es_client.ea_session = NULL;
-                                       tc = NULL;
-                               }
-                       }
-                       /* No session key just yet */
-                       pcb->eap.es_client.ea_skey = NULL;
-                       if (tc == NULL) {
-                               int rhostnamelen;
-
-                               GETCHAR(vallen, inp);
-                               len--;
-                               if (vallen >= len) {
-                                       ppp_error("EAP: badly-formed SRP Challenge"
-                                           " (name)");
-                                       /* Ignore badly-formed messages */
-                                       return;
-                               }
-                               MEMCPY(rhostname, inp, vallen);
-                               rhostname[vallen] = '\0';
-                               INCPTR(vallen, inp);
-                               len -= vallen;
-
-                               /*
-                                * In case the remote doesn't give us his name,
-                                * use configured name.
-                                */
-                               if (explicit_remote ||
-                                   (remote_name[0] != '\0' && vallen == 0)) {
-                                       strlcpy(rhostname, remote_name,
-                                           sizeof (rhostname));
-                               }
-
-                               rhostnamelen = (int)strlen(rhostname);
-                               if (rhostnamelen > MAXNAMELEN) {
-                                       rhostnamelen = MAXNAMELEN;
-                               }
-                               MEMCPY(pcb->eap.es_client.ea_peer, rhostname, rhostnamelen);
-                               pcb->eap.es_client.ea_peer[rhostnamelen] = '\0';
-                               pcb->eap.es_client.ea_peerlen = rhostnamelen;
-
-                               GETCHAR(vallen, inp);
-                               len--;
-                               if (vallen >= len) {
-                                       ppp_error("EAP: badly-formed SRP Challenge"
-                                           " (s)");
-                                       /* Ignore badly-formed messages */
-                                       return;
-                               }
-                               sval.data = inp;
-                               sval.len = vallen;
-                               INCPTR(vallen, inp);
-                               len -= vallen;
-
-                               GETCHAR(vallen, inp);
-                               len--;
-                               if (vallen > len) {
-                                       ppp_error("EAP: badly-formed SRP Challenge"
-                                           " (g)");
-                                       /* Ignore badly-formed messages */
-                                       return;
-                               }
-                               /* If no generator present, then use value 2 */
-                               if (vallen == 0) {
-                                       gval.data = (u_char *)"\002";
-                                       gval.len = 1;
-                               } else {
-                                       gval.data = inp;
-                                       gval.len = vallen;
-                               }
-                               INCPTR(vallen, inp);
-                               len -= vallen;
-
-                               /*
-                                * If no modulus present, then use well-known
-                                * value.
-                                */
-                               if (len == 0) {
-                                       Nval.data = (u_char *)wkmodulus;
-                                       Nval.len = sizeof (wkmodulus);
-                               } else {
-                                       Nval.data = inp;
-                                       Nval.len = len;
-                               }
-                               tc = t_clientopen(pcb->eap.es_client.ea_name,
-                                   &Nval, &gval, &sval);
-                               if (tc == NULL) {
-                                       eap_send_nak(pcb, id, EAPT_MD5CHAP);
-                                       break;
-                               }
-                               pcb->eap.es_client.ea_session = (void *)tc;
-
-                               /* Add Challenge ID & type to verifier */
-                               vals[0] = id;
-                               vals[1] = EAPT_SRP;
-                               t_clientaddexdata(tc, vals, 2);
-                       }
-                       Ap = t_clientgenexp(tc);
-                       eap_srp_response(esp, id, EAPSRP_CKEY, Ap->data,
-                           Ap->len);
-                       break;
-
-               case EAPSRP_SKEY:
-                       tc = (struct t_client *)pcb->eap.es_client.ea_session;
-                       if (tc == NULL) {
-                               ppp_warn("EAP: peer sent Subtype 2 without 1");
-                               eap_send_nak(pcb, id, EAPT_MD5CHAP);
-                               break;
-                       }
-                       if (pcb->eap.es_client.ea_skey != NULL) {
-                               /*
-                                * ID number should not change here.  Warn
-                                * if it does (but otherwise ignore).
-                                */
-                               if (id != pcb->eap.es_client.ea_id) {
-                                       ppp_warn("EAP: ID changed from %d to %d "
-                                           "in SRP Subtype 2 rexmit",
-                                           pcb->eap.es_client.ea_id, id);
-                               }
-                       } else {
-                               if (get_srp_secret(pcb->eap.es_unit,
-                                   pcb->eap.es_client.ea_name,
-                                   pcb->eap.es_client.ea_peer, secret, 0) == 0) {
-                                       /*
-                                        * Can't work with this peer because
-                                        * the secret is missing.  Just give
-                                        * up.
-                                        */
-                                       eap_send_nak(pcb, id, EAPT_MD5CHAP);
-                                       break;
-                               }
-                               Bval.data = inp;
-                               Bval.len = len;
-                               t_clientpasswd(tc, secret);
-                               BZERO(secret, sizeof (secret));
-                               pcb->eap.es_client.ea_skey =
-                                   t_clientgetkey(tc, &Bval);
-                               if (pcb->eap.es_client.ea_skey == NULL) {
-                                       /* Server is rogue; stop now */
-                                       ppp_error("EAP: SRP server is rogue");
-                                       goto client_failure;
-                               }
-                       }
-                       eap_srpval_response(esp, id, SRPVAL_EBIT,
-                           t_clientresponse(tc));
-                       break;
-
-               case EAPSRP_SVALIDATOR:
-                       tc = (struct t_client *)pcb->eap.es_client.ea_session;
-                       if (tc == NULL || pcb->eap.es_client.ea_skey == NULL) {
-                               ppp_warn("EAP: peer sent Subtype 3 without 1/2");
-                               eap_send_nak(pcb, id, EAPT_MD5CHAP);
-                               break;
-                       }
-                       /*
-                        * If we're already open, then this ought to be a
-                        * duplicate.  Otherwise, check that the server is
-                        * who we think it is.
-                        */
-                       if (pcb->eap.es_client.ea_state == eapOpen) {
-                               if (id != pcb->eap.es_client.ea_id) {
-                                       ppp_warn("EAP: ID changed from %d to %d "
-                                           "in SRP Subtype 3 rexmit",
-                                           pcb->eap.es_client.ea_id, id);
-                               }
-                       } else {
-                               len -= sizeof (u32_t) + SHA_DIGESTSIZE;
-                               if (len < 0 || t_clientverify(tc, inp +
-                                       sizeof (u32_t)) != 0) {
-                                       ppp_error("EAP: SRP server verification "
-                                           "failed");
-                                       goto client_failure;
-                               }
-                               GETLONG(pcb->eap.es_client.ea_keyflags, inp);
-                               /* Save pseudonym if user wants it. */
-                               if (len > 0 && pcb->eap.es_usepseudo) {
-                                       INCPTR(SHA_DIGESTSIZE, inp);
-                                       write_pseudonym(esp, inp, len, id);
-                               }
-                       }
-                       /*
-                        * We've verified our peer.  We're now mostly done,
-                        * except for waiting on the regular EAP Success
-                        * message.
-                        */
-                       eap_srp_response(esp, id, EAPSRP_ACK, NULL, 0);
-                       break;
-
-               case EAPSRP_LWRECHALLENGE:
-                       if (len < 4) {
-                               ppp_warn("EAP: malformed Lightweight rechallenge");
-                               return;
-                       }
-                       SHA1Init(&ctxt);
-                       vals[0] = id;
-                       SHA1Update(&ctxt, vals, 1);
-                       SHA1Update(&ctxt, pcb->eap.es_client.ea_skey,
-                           SESSION_KEY_LEN);
-                       SHA1Update(&ctxt, inp, len);
-                       SHA1Update(&ctxt, pcb->eap.es_client.ea_name,
-                           pcb->eap.es_client.ea_namelen);
-                       SHA1Final(dig, &ctxt);
-                       eap_srp_response(esp, id, EAPSRP_LWRECHALLENGE, dig,
-                           SHA_DIGESTSIZE);
-                       break;
-
-               default:
-                       ppp_error("EAP: unknown SRP Subtype %d", vallen);
-                       eap_send_nak(pcb, id, EAPT_MD5CHAP);
-                       break;
-               }
-               break;
-#endif /* USE_SRP */
-
-       default:
-               ppp_info("EAP: unknown authentication type %d; Naking", typenum);
-               eap_send_nak(pcb, id, EAPT_SRP);
-               break;
-       }
-
-       if (pcb->settings.eap_req_time > 0) {
-               UNTIMEOUT(eap_client_timeout, pcb);
-               TIMEOUT(eap_client_timeout, pcb,
-                   pcb->settings.eap_req_time);
-       }
-       return;
-
-#ifdef USE_SRP
-client_failure:
-       pcb->eap.es_client.ea_state = eapBadAuth;
-       if (pcb->settings.eap_req_time > 0) {
-               UNTIMEOUT(eap_client_timeout, (void *)esp);
-       }
-       pcb->eap.es_client.ea_session = NULL;
-       t_clientclose(tc);
-       auth_withpeer_fail(pcb, PPP_EAP);
-#endif /* USE_SRP */
-}
-
-#if PPP_SERVER
-/*
- * eap_response - Receive EAP Response message (server mode).
- */
-static void eap_response(ppp_pcb *pcb, u_char *inp, int id, int len) {
-       u_char typenum;
-       u_char vallen;
-       int secret_len;
-       char secret[MAXSECRETLEN];
-       char rhostname[MAXNAMELEN];
-       md5_context mdContext;
-       u_char hash[MD5_SIGNATURE_SIZE];
-#ifdef USE_SRP
-       struct t_server *ts;
-       struct t_num A;
-       SHA1_CTX ctxt;
-       u_char dig[SHA_DIGESTSIZE];
-#endif /* USE_SRP */
-
-       if (pcb->eap.es_server.ea_id != id) {
-               ppp_dbglog("EAP: discarding Response %d; expected ID %d", id,
-                   pcb->eap.es_server.ea_id);
-               return;
-       }
-
-       pcb->eap.es_server.ea_responses++;
-
-       if (len <= 0) {
-               ppp_error("EAP: empty Response message discarded");
-               return;
-       }
-
-       GETCHAR(typenum, inp);
-       len--;
-
-       switch (typenum) {
-       case EAPT_IDENTITY:
-               if (pcb->eap.es_server.ea_state != eapIdentify) {
-                       ppp_dbglog("EAP discarding unwanted Identify \"%.q\"", len,
-                           inp);
-                       break;
-               }
-               ppp_info("EAP: unauthenticated peer name \"%.*q\"", len, inp);
-               if (len > MAXNAMELEN) {
-                 len = MAXNAMELEN;
-               }
-               MEMCPY(pcb->eap.es_server.ea_peer, inp, len);
-               pcb->eap.es_server.ea_peer[len] = '\0';
-               pcb->eap.es_server.ea_peerlen = len;
-               eap_figure_next_state(pcb, 0);
-               break;
-
-       case EAPT_NOTIFICATION:
-               ppp_dbglog("EAP unexpected Notification; response discarded");
-               break;
-
-       case EAPT_NAK:
-               if (len < 1) {
-                       ppp_info("EAP: Nak Response with no suggested protocol");
-                       eap_figure_next_state(pcb, 1);
-                       break;
-               }
-
-               GETCHAR(vallen, inp);
-               len--;
-
-               if (
-#if PPP_REMOTENAME
-               !pcb->explicit_remote &&
-#endif /* PPP_REMOTENAME */
-               pcb->eap.es_server.ea_state == eapIdentify){
-                       /* Peer cannot Nak Identify Request */
-                       eap_figure_next_state(pcb, 1);
-                       break;
-               }
-
-               switch (vallen) {
-               case EAPT_SRP:
-                       /* Run through SRP validator selection again. */
-                       pcb->eap.es_server.ea_state = eapIdentify;
-                       eap_figure_next_state(pcb, 0);
-                       break;
-
-               case EAPT_MD5CHAP:
-                       pcb->eap.es_server.ea_state = eapMD5Chall;
-                       break;
-
-               default:
-                       ppp_dbglog("EAP: peer requesting unknown Type %d", vallen);
-                       switch (pcb->eap.es_server.ea_state) {
-                       case eapSRP1:
-                       case eapSRP2:
-                       case eapSRP3:
-                               pcb->eap.es_server.ea_state = eapMD5Chall;
-                               break;
-                       case eapMD5Chall:
-                       case eapSRP4:
-                               pcb->eap.es_server.ea_state = eapIdentify;
-                               eap_figure_next_state(pcb, 0);
-                               break;
-                       default:
-                               break;
-                       }
-                       break;
-               }
-               break;
-
-       case EAPT_MD5CHAP:
-               if (pcb->eap.es_server.ea_state != eapMD5Chall) {
-                       ppp_error("EAP: unexpected MD5-Response");
-                       eap_figure_next_state(pcb, 1);
-                       break;
-               }
-               if (len < 1) {
-                       ppp_error("EAP: received MD5-Response with no data");
-                       eap_figure_next_state(pcb, 1);
-                       break;
-               }
-               GETCHAR(vallen, inp);
-               len--;
-               if (vallen != 16 || vallen > len) {
-                       ppp_error("EAP: MD5-Response with bad length %d", vallen);
-                       eap_figure_next_state(pcb, 1);
-                       break;
-               }
-
-               /* Not so likely to happen. */
-               if (vallen >= len + sizeof (rhostname)) {
-                       ppp_dbglog("EAP: trimming really long peer name down");
-                       MEMCPY(rhostname, inp + vallen, sizeof (rhostname) - 1);
-                       rhostname[sizeof (rhostname) - 1] = '\0';
-               } else {
-                       MEMCPY(rhostname, inp + vallen, len - vallen);
-                       rhostname[len - vallen] = '\0';
-               }
-
-#if PPP_REMOTENAME
-               /* In case the remote doesn't give us his name. */
-               if (explicit_remote ||
-                   (remote_name[0] != '\0' && vallen == len))
-                       strlcpy(rhostname, remote_name, sizeof (rhostname));
-#endif /* PPP_REMOTENAME */
-
-               /*
-                * Get the secret for authenticating the specified
-                * host.
-                */
-               if (!get_secret(pcb, rhostname,
-                   pcb->eap.es_server.ea_name, secret, &secret_len, 1)) {
-                       ppp_dbglog("EAP: no MD5 secret for auth of %q", rhostname);
-                       eap_send_failure(pcb);
-                       break;
-               }
-               md5_starts(&mdContext);
-               md5_update(&mdContext, &pcb->eap.es_server.ea_id, 1);
-               md5_update(&mdContext, (u_char *)secret, secret_len);
-               BZERO(secret, sizeof (secret));
-               md5_update(&mdContext, pcb->eap.es_challenge, pcb->eap.es_challen);
-               md5_finish(&mdContext, hash);
-               if (BCMP(hash, inp, MD5_SIGNATURE_SIZE) != 0) {
-                       eap_send_failure(pcb);
-                       break;
-               }
-               pcb->eap.es_server.ea_type = EAPT_MD5CHAP;
-               eap_send_success(pcb);
-               eap_figure_next_state(pcb, 0);
-               if (pcb->eap.es_rechallenge != 0)
-                       TIMEOUT(eap_rechallenge, pcb, pcb->eap.es_rechallenge);
-               break;
-
-#ifdef USE_SRP
-       case EAPT_SRP:
-               if (len < 1) {
-                       ppp_error("EAP: empty SRP Response");
-                       eap_figure_next_state(pcb, 1);
-                       break;
-               }
-               GETCHAR(typenum, inp);
-               len--;
-               switch (typenum) {
-               case EAPSRP_CKEY:
-                       if (pcb->eap.es_server.ea_state != eapSRP1) {
-                               ppp_error("EAP: unexpected SRP Subtype 1 Response");
-                               eap_figure_next_state(pcb, 1);
-                               break;
-                       }
-                       A.data = inp;
-                       A.len = len;
-                       ts = (struct t_server *)pcb->eap.es_server.ea_session;
-                       assert(ts != NULL);
-                       pcb->eap.es_server.ea_skey = t_servergetkey(ts, &A);
-                       if (pcb->eap.es_server.ea_skey == NULL) {
-                               /* Client's A value is bogus; terminate now */
-                               ppp_error("EAP: bogus A value from client");
-                               eap_send_failure(pcb);
-                       } else {
-                               eap_figure_next_state(pcb, 0);
-                       }
-                       break;
-
-               case EAPSRP_CVALIDATOR:
-                       if (pcb->eap.es_server.ea_state != eapSRP2) {
-                               ppp_error("EAP: unexpected SRP Subtype 2 Response");
-                               eap_figure_next_state(pcb, 1);
-                               break;
-                       }
-                       if (len < sizeof (u32_t) + SHA_DIGESTSIZE) {
-                               ppp_error("EAP: M1 length %d < %d", len,
-                                   sizeof (u32_t) + SHA_DIGESTSIZE);
-                               eap_figure_next_state(pcb, 1);
-                               break;
-                       }
-                       GETLONG(pcb->eap.es_server.ea_keyflags, inp);
-                       ts = (struct t_server *)pcb->eap.es_server.ea_session;
-                       assert(ts != NULL);
-                       if (t_serververify(ts, inp)) {
-                               ppp_info("EAP: unable to validate client identity");
-                               eap_send_failure(pcb);
-                               break;
-                       }
-                       eap_figure_next_state(pcb, 0);
-                       break;
-
-               case EAPSRP_ACK:
-                       if (pcb->eap.es_server.ea_state != eapSRP3) {
-                               ppp_error("EAP: unexpected SRP Subtype 3 Response");
-                               eap_send_failure(esp);
-                               break;
-                       }
-                       pcb->eap.es_server.ea_type = EAPT_SRP;
-                       eap_send_success(pcb, esp);
-                       eap_figure_next_state(pcb, 0);
-                       if (pcb->eap.es_rechallenge != 0)
-                               TIMEOUT(eap_rechallenge, pcb,
-                                   pcb->eap.es_rechallenge);
-                       if (pcb->eap.es_lwrechallenge != 0)
-                               TIMEOUT(srp_lwrechallenge, pcb,
-                                   pcb->eap.es_lwrechallenge);
-                       break;
-
-               case EAPSRP_LWRECHALLENGE:
-                       if (pcb->eap.es_server.ea_state != eapSRP4) {
-                               ppp_info("EAP: unexpected SRP Subtype 4 Response");
-                               return;
-                       }
-                       if (len != SHA_DIGESTSIZE) {
-                               ppp_error("EAP: bad Lightweight rechallenge "
-                                   "response");
-                               return;
-                       }
-                       SHA1Init(&ctxt);
-                       vallen = id;
-                       SHA1Update(&ctxt, &vallen, 1);
-                       SHA1Update(&ctxt, pcb->eap.es_server.ea_skey,
-                           SESSION_KEY_LEN);
-                       SHA1Update(&ctxt, pcb->eap.es_challenge, pcb->eap.es_challen);
-                       SHA1Update(&ctxt, pcb->eap.es_server.ea_peer,
-                           pcb->eap.es_server.ea_peerlen);
-                       SHA1Final(dig, &ctxt);
-                       if (BCMP(dig, inp, SHA_DIGESTSIZE) != 0) {
-                               ppp_error("EAP: failed Lightweight rechallenge");
-                               eap_send_failure(pcb);
-                               break;
-                       }
-                       pcb->eap.es_server.ea_state = eapOpen;
-                       if (pcb->eap.es_lwrechallenge != 0)
-                               TIMEOUT(srp_lwrechallenge, esp,
-                                   pcb->eap.es_lwrechallenge);
-                       break;
-               }
-               break;
-#endif /* USE_SRP */
-
-       default:
-               /* This can't happen. */
-               ppp_error("EAP: unknown Response type %d; ignored", typenum);
-               return;
-       }
-
-       if (pcb->settings.eap_timeout_time > 0) {
-               UNTIMEOUT(eap_server_timeout, pcb);
-       }
-
-       if (pcb->eap.es_server.ea_state != eapBadAuth &&
-           pcb->eap.es_server.ea_state != eapOpen) {
-               pcb->eap.es_server.ea_id++;
-               eap_send_request(pcb);
-       }
-}
-#endif /* PPP_SERVER */
-
-/*
- * eap_success - Receive EAP Success message (client mode).
- */
-static void eap_success(ppp_pcb *pcb, u_char *inp, int id, int len) {
-       LWIP_UNUSED_ARG(id);
-
-       if (pcb->eap.es_client.ea_state != eapOpen && !eap_client_active(pcb)) {
-               ppp_dbglog("EAP unexpected success message in state %s (%d)",
-                   eap_state_name(pcb->eap.es_client.ea_state),
-                   pcb->eap.es_client.ea_state);
-               return;
-       }
-
-       if (pcb->settings.eap_req_time > 0) {
-               UNTIMEOUT(eap_client_timeout, pcb);
-       }
-
-       if (len > 0) {
-               /* This is odd.  The spec doesn't allow for this. */
-               PRINTMSG(inp, len);
-       }
-
-       pcb->eap.es_client.ea_state = eapOpen;
-       auth_withpeer_success(pcb, PPP_EAP, 0);
-}
-
-/*
- * eap_failure - Receive EAP Failure message (client mode).
- */
-static void eap_failure(ppp_pcb *pcb, u_char *inp, int id, int len) {
-       LWIP_UNUSED_ARG(id);
-
-       if (!eap_client_active(pcb)) {
-               ppp_dbglog("EAP unexpected failure message in state %s (%d)",
-                   eap_state_name(pcb->eap.es_client.ea_state),
-                   pcb->eap.es_client.ea_state);
-       }
-
-       if (pcb->settings.eap_req_time > 0) {
-               UNTIMEOUT(eap_client_timeout, pcb);
-       }
-
-       if (len > 0) {
-               /* This is odd.  The spec doesn't allow for this. */
-               PRINTMSG(inp, len);
-       }
-
-       pcb->eap.es_client.ea_state = eapBadAuth;
-
-       ppp_error("EAP: peer reports authentication failure");
-       auth_withpeer_fail(pcb, PPP_EAP);
-}
-
-/*
- * eap_input - Handle received EAP message.
- */
-static void eap_input(ppp_pcb *pcb, u_char *inp, int inlen) {
-       u_char code, id;
-       int len;
-
-       /*
-        * Parse header (code, id and length).  If packet too short,
-        * drop it.
-        */
-       if (inlen < EAP_HEADERLEN) {
-               ppp_error("EAP: packet too short: %d < %d", inlen, EAP_HEADERLEN);
-               return;
-       }
-       GETCHAR(code, inp);
-       GETCHAR(id, inp);
-       GETSHORT(len, inp);
-       if (len < EAP_HEADERLEN || len > inlen) {
-               ppp_error("EAP: packet has illegal length field %d (%d..%d)", len,
-                   EAP_HEADERLEN, inlen);
-               return;
-       }
-       len -= EAP_HEADERLEN;
-
-       /* Dispatch based on message code */
-       switch (code) {
-       case EAP_REQUEST:
-               eap_request(pcb, inp, id, len);
-               break;
-
-#if PPP_SERVER
-       case EAP_RESPONSE:
-               eap_response(pcb, inp, id, len);
-               break;
-#endif /* PPP_SERVER */
-
-       case EAP_SUCCESS:
-               eap_success(pcb, inp, id, len);
-               break;
-
-       case EAP_FAILURE:
-               eap_failure(pcb, inp, id, len);
-               break;
-
-       default:                                /* XXX Need code reject */
-               /* Note: it's not legal to send EAP Nak here. */
-               ppp_warn("EAP: unknown code %d received", code);
-               break;
-       }
-}
-
-#if PRINTPKT_SUPPORT
-/*
- * eap_printpkt - print the contents of an EAP packet.
- */
-static const char* const eap_codenames[] = {
-       "Request", "Response", "Success", "Failure"
-};
-
-static const char* const eap_typenames[] = {
-       "Identity", "Notification", "Nak", "MD5-Challenge",
-       "OTP", "Generic-Token", NULL, NULL,
-       "RSA", "DSS", "KEA", "KEA-Validate",
-       "TLS", "Defender", "Windows 2000", "Arcot",
-       "Cisco", "Nokia", "SRP"
-};
-
-static int eap_printpkt(const u_char *inp, int inlen, void (*printer) (void *, const char *, ...), void *arg) {
-       int code, id, len, rtype, vallen;
-       const u_char *pstart;
-       u32_t uval;
-
-       if (inlen < EAP_HEADERLEN)
-               return (0);
-       pstart = inp;
-       GETCHAR(code, inp);
-       GETCHAR(id, inp);
-       GETSHORT(len, inp);
-       if (len < EAP_HEADERLEN || len > inlen)
-               return (0);
-
-       if (code >= 1 && code <= (int)sizeof(eap_codenames) / (int)sizeof(char *))
-               printer(arg, " %s", eap_codenames[code-1]);
-       else
-               printer(arg, " code=0x%x", code);
-       printer(arg, " id=0x%x", id);
-       len -= EAP_HEADERLEN;
-       switch (code) {
-       case EAP_REQUEST:
-               if (len < 1) {
-                       printer(arg, " <missing type>");
-                       break;
-               }
-               GETCHAR(rtype, inp);
-               len--;
-               if (rtype >= 1 &&
-                   rtype <= (int)sizeof (eap_typenames) / (int)sizeof (char *))
-                       printer(arg, " %s", eap_typenames[rtype-1]);
-               else
-                       printer(arg, " type=0x%x", rtype);
-               switch (rtype) {
-               case EAPT_IDENTITY:
-               case EAPT_NOTIFICATION:
-                       if (len > 0) {
-                               printer(arg, " <Message ");
-                               ppp_print_string(inp, len, printer, arg);
-                               printer(arg, ">");
-                               INCPTR(len, inp);
-                               len = 0;
-                       } else {
-                               printer(arg, " <No message>");
-                       }
-                       break;
-
-               case EAPT_MD5CHAP:
-                       if (len <= 0)
-                               break;
-                       GETCHAR(vallen, inp);
-                       len--;
-                       if (vallen > len)
-                               goto truncated;
-                       printer(arg, " <Value%.*B>", vallen, inp);
-                       INCPTR(vallen, inp);
-                       len -= vallen;
-                       if (len > 0) {
-                               printer(arg, " <Name ");
-                               ppp_print_string(inp, len, printer, arg);
-                               printer(arg, ">");
-                               INCPTR(len, inp);
-                               len = 0;
-                       } else {
-                               printer(arg, " <No name>");
-                       }
-                       break;
-
-               case EAPT_SRP:
-                       if (len < 3)
-                               goto truncated;
-                       GETCHAR(vallen, inp);
-                       len--;
-                       printer(arg, "-%d", vallen);
-                       switch (vallen) {
-                       case EAPSRP_CHALLENGE:
-                               GETCHAR(vallen, inp);
-                               len--;
-                               if (vallen >= len)
-                                       goto truncated;
-                               if (vallen > 0) {
-                                       printer(arg, " <Name ");
-                                       ppp_print_string(inp, vallen, printer,
-                                           arg);
-                                       printer(arg, ">");
-                               } else {
-                                       printer(arg, " <No name>");
-                               }
-                               INCPTR(vallen, inp);
-                               len -= vallen;
-                               GETCHAR(vallen, inp);
-                               len--;
-                               if (vallen >= len)
-                                       goto truncated;
-                               printer(arg, " <s%.*B>", vallen, inp);
-                               INCPTR(vallen, inp);
-                               len -= vallen;
-                               GETCHAR(vallen, inp);
-                               len--;
-                               if (vallen > len)
-                                       goto truncated;
-                               if (vallen == 0) {
-                                       printer(arg, " <Default g=2>");
-                               } else {
-                                       printer(arg, " <g%.*B>", vallen, inp);
-                               }
-                               INCPTR(vallen, inp);
-                               len -= vallen;
-                               if (len == 0) {
-                                       printer(arg, " <Default N>");
-                               } else {
-                                       printer(arg, " <N%.*B>", len, inp);
-                                       INCPTR(len, inp);
-                                       len = 0;
-                               }
-                               break;
-
-                       case EAPSRP_SKEY:
-                               printer(arg, " <B%.*B>", len, inp);
-                               INCPTR(len, inp);
-                               len = 0;
-                               break;
-
-                       case EAPSRP_SVALIDATOR:
-                               if (len < (int)sizeof (u32_t))
-                                       break;
-                               GETLONG(uval, inp);
-                               len -= sizeof (u32_t);
-                               if (uval & SRPVAL_EBIT) {
-                                       printer(arg, " E");
-                                       uval &= ~SRPVAL_EBIT;
-                               }
-                               if (uval != 0) {
-                                       printer(arg, " f<%X>", uval);
-                               }
-                               if ((vallen = len) > SHA_DIGESTSIZE)
-                                       vallen = SHA_DIGESTSIZE;
-                               printer(arg, " <M2%.*B%s>", len, inp,
-                                   len < SHA_DIGESTSIZE ? "?" : "");
-                               INCPTR(vallen, inp);
-                               len -= vallen;
-                               if (len > 0) {
-                                       printer(arg, " <PN%.*B>", len, inp);
-                                       INCPTR(len, inp);
-                                       len = 0;
-                               }
-                               break;
-
-                       case EAPSRP_LWRECHALLENGE:
-                               printer(arg, " <Challenge%.*B>", len, inp);
-                               INCPTR(len, inp);
-                               len = 0;
-                               break;
-                       default:
-                               break;
-                       }
-                       break;
-               default:
-                       break;
-               }
-               break;
-
-       case EAP_RESPONSE:
-               if (len < 1)
-                       break;
-               GETCHAR(rtype, inp);
-               len--;
-               if (rtype >= 1 &&
-                   rtype <= (int)sizeof (eap_typenames) / (int)sizeof (char *))
-                       printer(arg, " %s", eap_typenames[rtype-1]);
-               else
-                       printer(arg, " type=0x%x", rtype);
-               switch (rtype) {
-               case EAPT_IDENTITY:
-                       if (len > 0) {
-                               printer(arg, " <Name ");
-                               ppp_print_string(inp, len, printer, arg);
-                               printer(arg, ">");
-                               INCPTR(len, inp);
-                               len = 0;
-                       }
-                       break;
-
-               case EAPT_NAK:
-                       if (len <= 0) {
-                               printer(arg, " <missing hint>");
-                               break;
-                       }
-                       GETCHAR(rtype, inp);
-                       len--;
-                       printer(arg, " <Suggested-type %02X", rtype);
-                       if (rtype >= 1 &&
-                           rtype < (int)sizeof (eap_typenames) / (int)sizeof (char *))
-                               printer(arg, " (%s)", eap_typenames[rtype-1]);
-                       printer(arg, ">");
-                       break;
-
-               case EAPT_MD5CHAP:
-                       if (len <= 0) {
-                               printer(arg, " <missing length>");
-                               break;
-                       }
-                       GETCHAR(vallen, inp);
-                       len--;
-                       if (vallen > len)
-                               goto truncated;
-                       printer(arg, " <Value%.*B>", vallen, inp);
-                       INCPTR(vallen, inp);
-                       len -= vallen;
-                       if (len > 0) {
-                               printer(arg, " <Name ");
-                               ppp_print_string(inp, len, printer, arg);
-                               printer(arg, ">");
-                               INCPTR(len, inp);
-                               len = 0;
-                       } else {
-                               printer(arg, " <No name>");
-                       }
-                       break;
-
-               case EAPT_SRP:
-                       if (len < 1)
-                               goto truncated;
-                       GETCHAR(vallen, inp);
-                       len--;
-                       printer(arg, "-%d", vallen);
-                       switch (vallen) {
-                       case EAPSRP_CKEY:
-                               printer(arg, " <A%.*B>", len, inp);
-                               INCPTR(len, inp);
-                               len = 0;
-                               break;
-
-                       case EAPSRP_CVALIDATOR:
-                               if (len < (int)sizeof (u32_t))
-                                       break;
-                               GETLONG(uval, inp);
-                               len -= sizeof (u32_t);
-                               if (uval & SRPVAL_EBIT) {
-                                       printer(arg, " E");
-                                       uval &= ~SRPVAL_EBIT;
-                               }
-                               if (uval != 0) {
-                                       printer(arg, " f<%X>", uval);
-                               }
-                               printer(arg, " <M1%.*B%s>", len, inp,
-                                   len == SHA_DIGESTSIZE ? "" : "?");
-                               INCPTR(len, inp);
-                               len = 0;
-                               break;
-
-                       case EAPSRP_ACK:
-                               break;
-
-                       case EAPSRP_LWRECHALLENGE:
-                               printer(arg, " <Response%.*B%s>", len, inp,
-                                   len == SHA_DIGESTSIZE ? "" : "?");
-                               if ((vallen = len) > SHA_DIGESTSIZE)
-                                       vallen = SHA_DIGESTSIZE;
-                               INCPTR(vallen, inp);
-                               len -= vallen;
-                               break;
-                       default:
-                               break;
-                       }
-                       break;
-               default:
-                       break;
-               }
-               break;
-
-       case EAP_SUCCESS:       /* No payload expected for these! */
-       case EAP_FAILURE:
-       default:
-               break;
-
-       truncated:
-               printer(arg, " <truncated>");
-               break;
-       }
-
-       if (len > 8)
-               printer(arg, "%8B...", inp);
-       else if (len > 0)
-               printer(arg, "%.*B", len, inp);
-       INCPTR(len, inp);
-
-       return (inp - pstart);
-}
-#endif /* PRINTPKT_SUPPORT */
-
-#endif /* PPP_SUPPORT && EAP_SUPPORT */
diff --git a/components/lwip/netif/ppp/ecp.c b/components/lwip/netif/ppp/ecp.c
deleted file mode 100644 (file)
index 4f1dee3..0000000
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * ecp.c - PPP Encryption Control Protocol.
- *
- * Copyright (c) 2002 Google, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The name(s) of the authors of this software must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission.
- *
- * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * Derived from ccp.c, which is:
- *
- * Copyright (c) 1994-2002 Paul Mackerras. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. The name(s) of the authors of this software must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission.
- *
- * 3. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by Paul Mackerras
- *     <paulus@samba.org>".
- *
- * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && ECP_SUPPORT  /* don't build if not configured for use in lwipopts.h */
-
-#include <string.h>
-
-#include "netif/ppp/ppp_impl.h"
-
-#include "netif/ppp/fsm.h"
-#include "netif/ppp/ecp.h"
-
-#if PPP_OPTIONS
-static option_t ecp_option_list[] = {
-    { "noecp", o_bool, &ecp_protent.enabled_flag,
-      "Disable ECP negotiation" },
-    { "-ecp", o_bool, &ecp_protent.enabled_flag,
-      "Disable ECP negotiation", OPT_ALIAS },
-
-    { NULL }
-};
-#endif /* PPP_OPTIONS */
-
-/*
- * Protocol entry points from main code.
- */
-static void ecp_init (int unit);
-/*
-static void ecp_open (int unit);
-static void ecp_close (int unit, char *);
-static void ecp_lowerup (int unit);
-static void ecp_lowerdown (int);
-static void ecp_input (int unit, u_char *pkt, int len);
-static void ecp_protrej (int unit);
-*/
-#if PRINTPKT_SUPPORT
-static int  ecp_printpkt (const u_char *pkt, int len,
-                             void (*printer) (void *, char *, ...),
-                             void *arg);
-#endif /* PRINTPKT_SUPPORT */
-/*
-static void ecp_datainput (int unit, u_char *pkt, int len);
-*/
-
-const struct protent ecp_protent = {
-    PPP_ECP,
-    ecp_init,
-    NULL, /* ecp_input, */
-    NULL, /* ecp_protrej, */
-    NULL, /* ecp_lowerup, */
-    NULL, /* ecp_lowerdown, */
-    NULL, /* ecp_open, */
-    NULL, /* ecp_close, */
-#if PRINTPKT_SUPPORT
-    ecp_printpkt,
-#endif /* PRINTPKT_SUPPORT */
-#if PPP_DATAINPUT
-    NULL, /* ecp_datainput, */
-#endif /* PPP_DATAINPUT */
-#if PRINTPKT_SUPPORT
-    "ECP",
-    "Encrypted",
-#endif /* PRINTPKT_SUPPORT */
-#if PPP_OPTIONS
-    ecp_option_list,
-    NULL,
-#endif /* PPP_OPTIONS */
-#if DEMAND_SUPPORT
-    NULL,
-    NULL
-#endif /* DEMAND_SUPPORT */
-};
-
-fsm ecp_fsm[NUM_PPP];
-ecp_options ecp_wantoptions[NUM_PPP];  /* what to request the peer to use */
-ecp_options ecp_gotoptions[NUM_PPP];   /* what the peer agreed to do */
-ecp_options ecp_allowoptions[NUM_PPP]; /* what we'll agree to do */
-ecp_options ecp_hisoptions[NUM_PPP];   /* what we agreed to do */
-
-static const fsm_callbacks ecp_callbacks = {
-    NULL, /* ecp_resetci, */
-    NULL, /* ecp_cilen, */
-    NULL, /* ecp_addci, */
-    NULL, /* ecp_ackci, */
-    NULL, /* ecp_nakci, */
-    NULL, /* ecp_rejci, */
-    NULL, /* ecp_reqci, */
-    NULL, /* ecp_up, */
-    NULL, /* ecp_down, */
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    NULL, /* ecp_extcode, */
-    "ECP"
-};
-
-/*
- * ecp_init - initialize ECP.
- */
-static void
-ecp_init(unit)
-    int unit;
-{
-    fsm *f = &ecp_fsm[unit];
-
-    f->unit = unit;
-    f->protocol = PPP_ECP;
-    f->callbacks = &ecp_callbacks;
-    fsm_init(f);
-
-#if 0 /* Not necessary, everything is cleared in ppp_clear() */
-    memset(&ecp_wantoptions[unit],  0, sizeof(ecp_options));
-    memset(&ecp_gotoptions[unit],   0, sizeof(ecp_options));
-    memset(&ecp_allowoptions[unit], 0, sizeof(ecp_options));
-    memset(&ecp_hisoptions[unit],   0, sizeof(ecp_options));
-#endif /* 0 */
-
-}
-
-
-#if PRINTPKT_SUPPORT
-static int
-ecp_printpkt(p, plen, printer, arg)
-    const u_char *p;
-    int plen;
-    void (*printer) (void *, char *, ...);
-    void *arg;
-{
-    return 0;
-}
-#endif /* PRINTPKT_SUPPORT */
-
-#endif /* PPP_SUPPORT && ECP_SUPPORT */
diff --git a/components/lwip/netif/ppp/eui64.c b/components/lwip/netif/ppp/eui64.c
deleted file mode 100644 (file)
index e042eb4..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * eui64.c - EUI64 routines for IPv6CP.
- *
- * Copyright (c) 1999 Tommi Komulainen.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The name(s) of the authors of this software must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission.
- *
- * 4. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by Tommi Komulainen
- *     <Tommi.Komulainen@iki.fi>".
- *
- * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * $Id: eui64.c,v 1.6 2002/12/04 23:03:32 paulus Exp $
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && PPP_IPV6_SUPPORT  /* don't build if not configured for use in lwipopts.h */
-
-#include "netif/ppp/ppp_impl.h"
-#include "netif/ppp/eui64.h"
-
-/*
- * eui64_ntoa - Make an ascii representation of an interface identifier
- */
-char *eui64_ntoa(eui64_t e) {
-    static char buf[20];
-
-    sprintf(buf, "%02x%02x:%02x%02x:%02x%02x:%02x%02x",
-            e.e8[0], e.e8[1], e.e8[2], e.e8[3], 
-            e.e8[4], e.e8[5], e.e8[6], e.e8[7]);
-    return buf;
-}
-
-#endif /* PPP_SUPPORT && PPP_IPV6_SUPPORT */
diff --git a/components/lwip/netif/ppp/fsm.c b/components/lwip/netif/ppp/fsm.c
deleted file mode 100644 (file)
index d7c5142..0000000
+++ /dev/null
@@ -1,799 +0,0 @@
-/*
- * fsm.c - {Link, IP} Control Protocol Finite State Machine.
- *
- * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The name "Carnegie Mellon University" must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission. For permission or any legal
- *    details, please contact
- *      Office of Technology Transfer
- *      Carnegie Mellon University
- *      5000 Forbes Avenue
- *      Pittsburgh, PA  15213-3890
- *      (412) 268-4387, fax: (412) 268-7395
- *      tech-transfer@andrew.cmu.edu
- *
- * 4. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by Computing Services
- *     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
- *
- * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
- * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */
-
-/*
- * TODO:
- * Randomize fsm id on link/init.
- * Deal with variable outgoing MTU.
- */
-
-#if 0 /* UNUSED */
-#include <stdio.h>
-#include <string.h>
-#include <sys/types.h>
-#endif /* UNUSED */
-
-#include "netif/ppp/ppp_impl.h"
-
-#include "netif/ppp/fsm.h"
-
-static void fsm_timeout (void *);
-static void fsm_rconfreq(fsm *f, u_char id, u_char *inp, int len);
-static void fsm_rconfack(fsm *f, int id, u_char *inp, int len);
-static void fsm_rconfnakrej(fsm *f, int code, int id, u_char *inp, int len);
-static void fsm_rtermreq(fsm *f, int id, u_char *p, int len);
-static void fsm_rtermack(fsm *f);
-static void fsm_rcoderej(fsm *f, u_char *inp, int len);
-static void fsm_sconfreq(fsm *f, int retransmit);
-
-#define PROTO_NAME(f)  ((f)->callbacks->proto_name)
-
-/*
- * fsm_init - Initialize fsm.
- *
- * Initialize fsm state.
- */
-void fsm_init(fsm *f) {
-    ppp_pcb *pcb = f->pcb;
-    f->state = PPP_FSM_INITIAL;
-    f->flags = 0;
-    f->id = 0;                         /* XXX Start with random id? */
-    f->maxnakloops = pcb->settings.fsm_max_nak_loops;
-    f->term_reason_len = 0;
-}
-
-
-/*
- * fsm_lowerup - The lower layer is up.
- */
-void fsm_lowerup(fsm *f) {
-    switch( f->state ){
-    case PPP_FSM_INITIAL:
-       f->state = PPP_FSM_CLOSED;
-       break;
-
-    case PPP_FSM_STARTING:
-       if( f->flags & OPT_SILENT )
-           f->state = PPP_FSM_STOPPED;
-       else {
-           /* Send an initial configure-request */
-           fsm_sconfreq(f, 0);
-           f->state = PPP_FSM_REQSENT;
-       }
-       break;
-
-    default:
-       FSMDEBUG(("%s: Up event in state %d!", PROTO_NAME(f), f->state));
-       /* no break */
-    }
-}
-
-
-/*
- * fsm_lowerdown - The lower layer is down.
- *
- * Cancel all timeouts and inform upper layers.
- */
-void fsm_lowerdown(fsm *f) {
-    switch( f->state ){
-    case PPP_FSM_CLOSED:
-       f->state = PPP_FSM_INITIAL;
-       break;
-
-    case PPP_FSM_STOPPED:
-       f->state = PPP_FSM_STARTING;
-       if( f->callbacks->starting )
-           (*f->callbacks->starting)(f);
-       break;
-
-    case PPP_FSM_CLOSING:
-       f->state = PPP_FSM_INITIAL;
-       UNTIMEOUT(fsm_timeout, f);      /* Cancel timeout */
-       break;
-
-    case PPP_FSM_STOPPING:
-    case PPP_FSM_REQSENT:
-    case PPP_FSM_ACKRCVD:
-    case PPP_FSM_ACKSENT:
-       f->state = PPP_FSM_STARTING;
-       UNTIMEOUT(fsm_timeout, f);      /* Cancel timeout */
-       break;
-
-    case PPP_FSM_OPENED:
-       if( f->callbacks->down )
-           (*f->callbacks->down)(f);
-       f->state = PPP_FSM_STARTING;
-       break;
-
-    default:
-       FSMDEBUG(("%s: Down event in state %d!", PROTO_NAME(f), f->state));
-       /* no break */
-    }
-}
-
-
-/*
- * fsm_open - Link is allowed to come up.
- */
-void fsm_open(fsm *f) {
-    switch( f->state ){
-    case PPP_FSM_INITIAL:
-       f->state = PPP_FSM_STARTING;
-       if( f->callbacks->starting )
-           (*f->callbacks->starting)(f);
-       break;
-
-    case PPP_FSM_CLOSED:
-       if( f->flags & OPT_SILENT )
-           f->state = PPP_FSM_STOPPED;
-       else {
-           /* Send an initial configure-request */
-           fsm_sconfreq(f, 0);
-           f->state = PPP_FSM_REQSENT;
-       }
-       break;
-
-    case PPP_FSM_CLOSING:
-       f->state = PPP_FSM_STOPPING;
-       /* fall through */
-       /* no break */
-    case PPP_FSM_STOPPED:
-    case PPP_FSM_OPENED:
-       if( f->flags & OPT_RESTART ){
-           fsm_lowerdown(f);
-           fsm_lowerup(f);
-       }
-       break;
-    default:
-       break;
-    }
-}
-
-/*
- * terminate_layer - Start process of shutting down the FSM
- *
- * Cancel any timeout running, notify upper layers we're done, and
- * send a terminate-request message as configured.
- */
-static void terminate_layer(fsm *f, int nextstate) {
-    ppp_pcb *pcb = f->pcb;
-
-    if( f->state != PPP_FSM_OPENED )
-       UNTIMEOUT(fsm_timeout, f);      /* Cancel timeout */
-    else if( f->callbacks->down )
-       (*f->callbacks->down)(f);       /* Inform upper layers we're down */
-
-    /* Init restart counter and send Terminate-Request */
-    f->retransmits = pcb->settings.fsm_max_term_transmits;
-    fsm_sdata(f, TERMREQ, f->reqid = ++f->id,
-             (const u_char *) f->term_reason, f->term_reason_len);
-
-    if (f->retransmits == 0) {
-       /*
-        * User asked for no terminate requests at all; just close it.
-        * We've already fired off one Terminate-Request just to be nice
-        * to the peer, but we're not going to wait for a reply.
-        */
-       f->state = nextstate == PPP_FSM_CLOSING ? PPP_FSM_CLOSED : PPP_FSM_STOPPED;
-       if( f->callbacks->finished )
-           (*f->callbacks->finished)(f);
-       return;
-    }
-
-    TIMEOUT(fsm_timeout, f, pcb->settings.fsm_timeout_time);
-    --f->retransmits;
-
-    f->state = nextstate;
-}
-
-/*
- * fsm_close - Start closing connection.
- *
- * Cancel timeouts and either initiate close or possibly go directly to
- * the PPP_FSM_CLOSED state.
- */
-void fsm_close(fsm *f, const char *reason) {
-    f->term_reason = reason;
-    f->term_reason_len = (reason == NULL? 0: LWIP_MIN(strlen(reason), 0xFF) );
-    switch( f->state ){
-    case PPP_FSM_STARTING:
-       f->state = PPP_FSM_INITIAL;
-       break;
-    case PPP_FSM_STOPPED:
-       f->state = PPP_FSM_CLOSED;
-       break;
-    case PPP_FSM_STOPPING:
-       f->state = PPP_FSM_CLOSING;
-       break;
-
-    case PPP_FSM_REQSENT:
-    case PPP_FSM_ACKRCVD:
-    case PPP_FSM_ACKSENT:
-    case PPP_FSM_OPENED:
-       terminate_layer(f, PPP_FSM_CLOSING);
-       break;
-    default:
-       break;
-    }
-}
-
-
-/*
- * fsm_timeout - Timeout expired.
- */
-static void fsm_timeout(void *arg) {
-    fsm *f = (fsm *) arg;
-    ppp_pcb *pcb = f->pcb;
-
-    switch (f->state) {
-    case PPP_FSM_CLOSING:
-    case PPP_FSM_STOPPING:
-       if( f->retransmits <= 0 ){
-           /*
-            * We've waited for an ack long enough.  Peer probably heard us.
-            */
-           f->state = (f->state == PPP_FSM_CLOSING)? PPP_FSM_CLOSED: PPP_FSM_STOPPED;
-           if( f->callbacks->finished )
-               (*f->callbacks->finished)(f);
-       } else {
-           /* Send Terminate-Request */
-           fsm_sdata(f, TERMREQ, f->reqid = ++f->id,
-                     (const u_char *) f->term_reason, f->term_reason_len);
-           TIMEOUT(fsm_timeout, f, pcb->settings.fsm_timeout_time);
-           --f->retransmits;
-       }
-       break;
-
-    case PPP_FSM_REQSENT:
-    case PPP_FSM_ACKRCVD:
-    case PPP_FSM_ACKSENT:
-       if (f->retransmits <= 0) {
-           ppp_warn("%s: timeout sending Config-Requests", PROTO_NAME(f));
-           f->state = PPP_FSM_STOPPED;
-           if( (f->flags & OPT_PASSIVE) == 0 && f->callbacks->finished )
-               (*f->callbacks->finished)(f);
-
-       } else {
-           /* Retransmit the configure-request */
-           if (f->callbacks->retransmit)
-               (*f->callbacks->retransmit)(f);
-           fsm_sconfreq(f, 1);         /* Re-send Configure-Request */
-           if( f->state == PPP_FSM_ACKRCVD )
-               f->state = PPP_FSM_REQSENT;
-       }
-       break;
-
-    default:
-       FSMDEBUG(("%s: Timeout event in state %d!", PROTO_NAME(f), f->state));
-       /* no break */
-    }
-}
-
-
-/*
- * fsm_input - Input packet.
- */
-void fsm_input(fsm *f, u_char *inpacket, int l) {
-    u_char *inp;
-    u_char code, id;
-    int len;
-
-    /*
-     * Parse header (code, id and length).
-     * If packet too short, drop it.
-     */
-    inp = inpacket;
-    if (l < HEADERLEN) {
-       FSMDEBUG(("fsm_input(%x): Rcvd short header.", f->protocol));
-       return;
-    }
-    GETCHAR(code, inp);
-    GETCHAR(id, inp);
-    GETSHORT(len, inp);
-    if (len < HEADERLEN) {
-       FSMDEBUG(("fsm_input(%x): Rcvd illegal length.", f->protocol));
-       return;
-    }
-    if (len > l) {
-       FSMDEBUG(("fsm_input(%x): Rcvd short packet.", f->protocol));
-       return;
-    }
-    len -= HEADERLEN;          /* subtract header length */
-
-    if( f->state == PPP_FSM_INITIAL || f->state == PPP_FSM_STARTING ){
-       FSMDEBUG(("fsm_input(%x): Rcvd packet in state %d.",
-                 f->protocol, f->state));
-       return;
-    }
-
-    /*
-     * Action depends on code.
-     */
-    switch (code) {
-    case CONFREQ:
-       fsm_rconfreq(f, id, inp, len);
-       break;
-    
-    case CONFACK:
-       fsm_rconfack(f, id, inp, len);
-       break;
-    
-    case CONFNAK:
-    case CONFREJ:
-       fsm_rconfnakrej(f, code, id, inp, len);
-       break;
-    
-    case TERMREQ:
-       fsm_rtermreq(f, id, inp, len);
-       break;
-    
-    case TERMACK:
-       fsm_rtermack(f);
-       break;
-    
-    case CODEREJ:
-       fsm_rcoderej(f, inp, len);
-       break;
-    
-    default:
-       if( !f->callbacks->extcode
-          || !(*f->callbacks->extcode)(f, code, id, inp, len) )
-           fsm_sdata(f, CODEREJ, ++f->id, inpacket, len + HEADERLEN);
-       break;
-    }
-}
-
-
-/*
- * fsm_rconfreq - Receive Configure-Request.
- */
-static void fsm_rconfreq(fsm *f, u_char id, u_char *inp, int len) {
-    int code, reject_if_disagree;
-
-    switch( f->state ){
-    case PPP_FSM_CLOSED:
-       /* Go away, we're closed */
-       fsm_sdata(f, TERMACK, id, NULL, 0);
-       return;
-    case PPP_FSM_CLOSING:
-    case PPP_FSM_STOPPING:
-       return;
-
-    case PPP_FSM_OPENED:
-       /* Go down and restart negotiation */
-       if( f->callbacks->down )
-           (*f->callbacks->down)(f);   /* Inform upper layers */
-       fsm_sconfreq(f, 0);             /* Send initial Configure-Request */
-       f->state = PPP_FSM_REQSENT;
-       break;
-
-    case PPP_FSM_STOPPED:
-       /* Negotiation started by our peer */
-       fsm_sconfreq(f, 0);             /* Send initial Configure-Request */
-       f->state = PPP_FSM_REQSENT;
-       break;
-    default:
-       break;
-    }
-
-    /*
-     * Pass the requested configuration options
-     * to protocol-specific code for checking.
-     */
-    if (f->callbacks->reqci){          /* Check CI */
-       reject_if_disagree = (f->nakloops >= f->maxnakloops);
-       code = (*f->callbacks->reqci)(f, inp, &len, reject_if_disagree);
-    } else if (len)
-       code = CONFREJ;                 /* Reject all CI */
-    else
-       code = CONFACK;
-
-    /* send the Ack, Nak or Rej to the peer */
-    fsm_sdata(f, code, id, inp, len);
-
-    if (code == CONFACK) {
-       if (f->state == PPP_FSM_ACKRCVD) {
-           UNTIMEOUT(fsm_timeout, f);  /* Cancel timeout */
-           f->state = PPP_FSM_OPENED;
-           if (f->callbacks->up)
-               (*f->callbacks->up)(f); /* Inform upper layers */
-       } else
-           f->state = PPP_FSM_ACKSENT;
-       f->nakloops = 0;
-
-    } else {
-       /* we sent CONFACK or CONFREJ */
-       if (f->state != PPP_FSM_ACKRCVD)
-           f->state = PPP_FSM_REQSENT;
-       if( code == CONFNAK )
-           ++f->nakloops;
-    }
-}
-
-
-/*
- * fsm_rconfack - Receive Configure-Ack.
- */
-static void fsm_rconfack(fsm *f, int id, u_char *inp, int len) {
-    ppp_pcb *pcb = f->pcb;
-
-    if (id != f->reqid || f->seen_ack)         /* Expected id? */
-       return;                                 /* Nope, toss... */
-    if( !(f->callbacks->ackci? (*f->callbacks->ackci)(f, inp, len):
-         (len == 0)) ){
-       /* Ack is bad - ignore it */
-       ppp_error("Received bad configure-ack: %P", inp, len);
-       return;
-    }
-    f->seen_ack = 1;
-    f->rnakloops = 0;
-
-    switch (f->state) {
-    case PPP_FSM_CLOSED:
-    case PPP_FSM_STOPPED:
-       fsm_sdata(f, TERMACK, id, NULL, 0);
-       break;
-
-    case PPP_FSM_REQSENT:
-       f->state = PPP_FSM_ACKRCVD;
-       f->retransmits = pcb->settings.fsm_max_conf_req_transmits;
-       break;
-
-    case PPP_FSM_ACKRCVD:
-       /* Huh? an extra valid Ack? oh well... */
-       UNTIMEOUT(fsm_timeout, f);      /* Cancel timeout */
-       fsm_sconfreq(f, 0);
-       f->state = PPP_FSM_REQSENT;
-       break;
-
-    case PPP_FSM_ACKSENT:
-       UNTIMEOUT(fsm_timeout, f);      /* Cancel timeout */
-       f->state = PPP_FSM_OPENED;
-       f->retransmits = pcb->settings.fsm_max_conf_req_transmits;
-       if (f->callbacks->up)
-           (*f->callbacks->up)(f);     /* Inform upper layers */
-       break;
-
-    case PPP_FSM_OPENED:
-       /* Go down and restart negotiation */
-       if (f->callbacks->down)
-           (*f->callbacks->down)(f);   /* Inform upper layers */
-       fsm_sconfreq(f, 0);             /* Send initial Configure-Request */
-       f->state = PPP_FSM_REQSENT;
-       break;
-    default:
-       break;
-    }
-}
-
-
-/*
- * fsm_rconfnakrej - Receive Configure-Nak or Configure-Reject.
- */
-static void fsm_rconfnakrej(fsm *f, int code, int id, u_char *inp, int len) {
-    int ret;
-    int treat_as_reject;
-
-    if (id != f->reqid || f->seen_ack) /* Expected id? */
-       return;                         /* Nope, toss... */
-
-    if (code == CONFNAK) {
-       ++f->rnakloops;
-       treat_as_reject = (f->rnakloops >= f->maxnakloops);
-       if (f->callbacks->nakci == NULL
-           || !(ret = f->callbacks->nakci(f, inp, len, treat_as_reject))) {
-           ppp_error("Received bad configure-nak: %P", inp, len);
-           return;
-       }
-    } else {
-       f->rnakloops = 0;
-       if (f->callbacks->rejci == NULL
-           || !(ret = f->callbacks->rejci(f, inp, len))) {
-           ppp_error("Received bad configure-rej: %P", inp, len);
-           return;
-       }
-    }
-
-    f->seen_ack = 1;
-
-    switch (f->state) {
-    case PPP_FSM_CLOSED:
-    case PPP_FSM_STOPPED:
-       fsm_sdata(f, TERMACK, id, NULL, 0);
-       break;
-
-    case PPP_FSM_REQSENT:
-    case PPP_FSM_ACKSENT:
-       /* They didn't agree to what we wanted - try another request */
-       UNTIMEOUT(fsm_timeout, f);      /* Cancel timeout */
-       if (ret < 0)
-           f->state = PPP_FSM_STOPPED;         /* kludge for stopping CCP */
-       else
-           fsm_sconfreq(f, 0);         /* Send Configure-Request */
-       break;
-
-    case PPP_FSM_ACKRCVD:
-       /* Got a Nak/reject when we had already had an Ack?? oh well... */
-       UNTIMEOUT(fsm_timeout, f);      /* Cancel timeout */
-       fsm_sconfreq(f, 0);
-       f->state = PPP_FSM_REQSENT;
-       break;
-
-    case PPP_FSM_OPENED:
-       /* Go down and restart negotiation */
-       if (f->callbacks->down)
-           (*f->callbacks->down)(f);   /* Inform upper layers */
-       fsm_sconfreq(f, 0);             /* Send initial Configure-Request */
-       f->state = PPP_FSM_REQSENT;
-       break;
-    default:
-       break;
-    }
-}
-
-
-/*
- * fsm_rtermreq - Receive Terminate-Req.
- */
-static void fsm_rtermreq(fsm *f, int id, u_char *p, int len) {
-    ppp_pcb *pcb = f->pcb;
-
-    switch (f->state) {
-    case PPP_FSM_ACKRCVD:
-    case PPP_FSM_ACKSENT:
-       f->state = PPP_FSM_REQSENT;             /* Start over but keep trying */
-       break;
-
-    case PPP_FSM_OPENED:
-       if (len > 0) {
-           ppp_info("%s terminated by peer (%0.*v)", PROTO_NAME(f), len, p);
-       } else
-           ppp_info("%s terminated by peer", PROTO_NAME(f));
-       f->retransmits = 0;
-       f->state = PPP_FSM_STOPPING;
-       if (f->callbacks->down)
-           (*f->callbacks->down)(f);   /* Inform upper layers */
-       TIMEOUT(fsm_timeout, f, pcb->settings.fsm_timeout_time);
-       break;
-    default:
-       break;
-    }
-
-    fsm_sdata(f, TERMACK, id, NULL, 0);
-}
-
-
-/*
- * fsm_rtermack - Receive Terminate-Ack.
- */
-static void fsm_rtermack(fsm *f) {
-    switch (f->state) {
-    case PPP_FSM_CLOSING:
-       UNTIMEOUT(fsm_timeout, f);
-       f->state = PPP_FSM_CLOSED;
-       if( f->callbacks->finished )
-           (*f->callbacks->finished)(f);
-       break;
-    case PPP_FSM_STOPPING:
-       UNTIMEOUT(fsm_timeout, f);
-       f->state = PPP_FSM_STOPPED;
-       if( f->callbacks->finished )
-           (*f->callbacks->finished)(f);
-       break;
-
-    case PPP_FSM_ACKRCVD:
-       f->state = PPP_FSM_REQSENT;
-       break;
-
-    case PPP_FSM_OPENED:
-       if (f->callbacks->down)
-           (*f->callbacks->down)(f);   /* Inform upper layers */
-       fsm_sconfreq(f, 0);
-       f->state = PPP_FSM_REQSENT;
-       break;
-    default:
-       break;
-    }
-}
-
-
-/*
- * fsm_rcoderej - Receive an Code-Reject.
- */
-static void fsm_rcoderej(fsm *f, u_char *inp, int len) {
-    u_char code, id;
-
-    if (len < HEADERLEN) {
-       FSMDEBUG(("fsm_rcoderej: Rcvd short Code-Reject packet!"));
-       return;
-    }
-    GETCHAR(code, inp);
-    GETCHAR(id, inp);
-    ppp_warn("%s: Rcvd Code-Reject for code %d, id %d", PROTO_NAME(f), code, id);
-
-    if( f->state == PPP_FSM_ACKRCVD )
-       f->state = PPP_FSM_REQSENT;
-}
-
-
-/*
- * fsm_protreject - Peer doesn't speak this protocol.
- *
- * Treat this as a catastrophic error (RXJ-).
- */
-void fsm_protreject(fsm *f) {
-    switch( f->state ){
-    case PPP_FSM_CLOSING:
-       UNTIMEOUT(fsm_timeout, f);      /* Cancel timeout */
-       /* fall through */
-       /* no break */
-    case PPP_FSM_CLOSED:
-       f->state = PPP_FSM_CLOSED;
-       if( f->callbacks->finished )
-           (*f->callbacks->finished)(f);
-       break;
-
-    case PPP_FSM_STOPPING:
-    case PPP_FSM_REQSENT:
-    case PPP_FSM_ACKRCVD:
-    case PPP_FSM_ACKSENT:
-       UNTIMEOUT(fsm_timeout, f);      /* Cancel timeout */
-       /* fall through */
-       /* no break */
-    case PPP_FSM_STOPPED:
-       f->state = PPP_FSM_STOPPED;
-       if( f->callbacks->finished )
-           (*f->callbacks->finished)(f);
-       break;
-
-    case PPP_FSM_OPENED:
-       terminate_layer(f, PPP_FSM_STOPPING);
-       break;
-
-    default:
-       FSMDEBUG(("%s: Protocol-reject event in state %d!",
-                 PROTO_NAME(f), f->state));
-       /* no break */
-    }
-}
-
-
-/*
- * fsm_sconfreq - Send a Configure-Request.
- */
-static void fsm_sconfreq(fsm *f, int retransmit) {
-    ppp_pcb *pcb = f->pcb;
-    struct pbuf *p;
-    u_char *outp;
-    int cilen;
-
-    if( f->state != PPP_FSM_REQSENT && f->state != PPP_FSM_ACKRCVD && f->state != PPP_FSM_ACKSENT ){
-       /* Not currently negotiating - reset options */
-       if( f->callbacks->resetci )
-           (*f->callbacks->resetci)(f);
-       f->nakloops = 0;
-       f->rnakloops = 0;
-    }
-
-    if( !retransmit ){
-       /* New request - reset retransmission counter, use new ID */
-       f->retransmits = pcb->settings.fsm_max_conf_req_transmits;
-       f->reqid = ++f->id;
-    }
-
-    f->seen_ack = 0;
-
-    /*
-     * Make up the request packet
-     */
-    if( f->callbacks->cilen && f->callbacks->addci ){
-       cilen = (*f->callbacks->cilen)(f);
-       if( cilen > pcb->peer_mru - HEADERLEN )
-           cilen = pcb->peer_mru - HEADERLEN;
-    } else
-       cilen = 0;
-
-    p = pbuf_alloc(PBUF_RAW, (u16_t)(cilen + HEADERLEN + PPP_HDRLEN), PPP_CTRL_PBUF_TYPE);
-    if(NULL == p)
-        return;
-    if(p->tot_len != p->len) {
-        pbuf_free(p);
-        return;
-    }
-
-    /* send the request to our peer */
-    outp = (u_char*)p->payload;
-    MAKEHEADER(outp, f->protocol);
-    PUTCHAR(CONFREQ, outp);
-    PUTCHAR(f->reqid, outp);
-    PUTSHORT(cilen + HEADERLEN, outp);
-    if (cilen != 0) {
-       (*f->callbacks->addci)(f, outp, &cilen);
-       LWIP_ASSERT("cilen == p->len - HEADERLEN - PPP_HDRLEN", cilen == p->len - HEADERLEN - PPP_HDRLEN);
-    }
-
-    ppp_write(pcb, p);
-
-    /* start the retransmit timer */
-    --f->retransmits;
-    TIMEOUT(fsm_timeout, f, pcb->settings.fsm_timeout_time);
-}
-
-
-/*
- * fsm_sdata - Send some data.
- *
- * Used for all packets sent to our peer by this module.
- */
-void fsm_sdata(fsm *f, u_char code, u_char id, const u_char *data, int datalen) {
-    ppp_pcb *pcb = f->pcb;
-    struct pbuf *p;
-    u_char *outp;
-    int outlen;
-
-    /* Adjust length to be smaller than MTU */
-    if (datalen > pcb->peer_mru - HEADERLEN)
-       datalen = pcb->peer_mru - HEADERLEN;
-    outlen = datalen + HEADERLEN;
-
-    p = pbuf_alloc(PBUF_RAW, (u16_t)(outlen + PPP_HDRLEN), PPP_CTRL_PBUF_TYPE);
-    if(NULL == p)
-        return;
-    if(p->tot_len != p->len) {
-        pbuf_free(p);
-        return;
-    }
-
-    outp = (u_char*)p->payload;
-    if (datalen) /* && data != outp + PPP_HDRLEN + HEADERLEN)  -- was only for fsm_sconfreq() */
-       MEMCPY(outp + PPP_HDRLEN + HEADERLEN, data, datalen);
-    MAKEHEADER(outp, f->protocol);
-    PUTCHAR(code, outp);
-    PUTCHAR(id, outp);
-    PUTSHORT(outlen, outp);
-    ppp_write(pcb, p);
-}
-
-#endif /* PPP_SUPPORT */
diff --git a/components/lwip/netif/ppp/ipcp.c b/components/lwip/netif/ppp/ipcp.c
deleted file mode 100644 (file)
index 5dc65f6..0000000
+++ /dev/null
@@ -1,2408 +0,0 @@
-/*
- * ipcp.c - PPP IP Control Protocol.
- *
- * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The name "Carnegie Mellon University" must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission. For permission or any legal
- *    details, please contact
- *      Office of Technology Transfer
- *      Carnegie Mellon University
- *      5000 Forbes Avenue
- *      Pittsburgh, PA  15213-3890
- *      (412) 268-4387, fax: (412) 268-7395
- *      tech-transfer@andrew.cmu.edu
- *
- * 4. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by Computing Services
- *     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
- *
- * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
- * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && PPP_IPV4_SUPPORT /* don't build if not configured for use in lwipopts.h */
-
-/*
- * TODO:
- */
-
-#if 0 /* UNUSED */
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <netdb.h>
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#endif /* UNUSED */
-
-#include "netif/ppp/ppp_impl.h"
-
-#include "netif/ppp/fsm.h"
-#include "netif/ppp/ipcp.h"
-
-#if 0 /* UNUSED */
-/* global vars */
-u32_t netmask = 0;             /* IP netmask to set on interface */
-#endif /* UNUSED */
-
-#if 0 /* UNUSED */
-bool   disable_defaultip = 0;  /* Don't use hostname for default IP adrs */
-#endif /* UNUSED */
-
-#if 0 /* moved to ppp_settings */
-bool   noremoteip = 0;         /* Let him have no IP address */
-#endif /* moved to ppp_setting */
-
-#if 0 /* UNUSED */
-/* Hook for a plugin to know when IP protocol has come up */
-void (*ip_up_hook) (void) = NULL;
-
-/* Hook for a plugin to know when IP protocol has come down */
-void (*ip_down_hook) (void) = NULL;
-
-/* Hook for a plugin to choose the remote IP address */
-void (*ip_choose_hook) (u32_t *) = NULL;
-#endif /* UNUSED */
-
-#if PPP_NOTIFY
-/* Notifiers for when IPCP goes up and down */
-struct notifier *ip_up_notifier = NULL;
-struct notifier *ip_down_notifier = NULL;
-#endif /* PPP_NOTIFY */
-
-/* local vars */
-#if 0 /* moved to ppp_pcb */
-static int default_route_set[NUM_PPP]; /* Have set up a default route */
-static int proxy_arp_set[NUM_PPP];     /* Have created proxy arp entry */
-static int ipcp_is_up;                 /* have called np_up() */
-static int ipcp_is_open;               /* haven't called np_finished() */
-static bool ask_for_local;             /* request our address from peer */
-#endif /* moved to ppp_pcb */
-#if 0 /* UNUSED */
-static char vj_value[8];               /* string form of vj option value */
-static char netmask_str[20];           /* string form of netmask value */
-#endif /* UNUSED */
-
-/*
- * Callbacks for fsm code.  (CI = Configuration Information)
- */
-static void ipcp_resetci(fsm *f);      /* Reset our CI */
-static int  ipcp_cilen(fsm *f);                /* Return length of our CI */
-static void ipcp_addci(fsm *f, u_char *ucp, int *lenp); /* Add our CI */
-static int  ipcp_ackci(fsm *f, u_char *p, int len);    /* Peer ack'd our CI */
-static int  ipcp_nakci(fsm *f, u_char *p, int len, int treat_as_reject);/* Peer nak'd our CI */
-static int  ipcp_rejci(fsm *f, u_char *p, int len);    /* Peer rej'd our CI */
-static int  ipcp_reqci(fsm *f, u_char *inp, int *len, int reject_if_disagree); /* Rcv CI */
-static void ipcp_up(fsm *f);           /* We're UP */
-static void ipcp_down(fsm *f);         /* We're DOWN */
-static void ipcp_finished(fsm *f);     /* Don't need lower layer */
-
-static const fsm_callbacks ipcp_callbacks = { /* IPCP callback routines */
-    ipcp_resetci,              /* Reset our Configuration Information */
-    ipcp_cilen,                        /* Length of our Configuration Information */
-    ipcp_addci,                        /* Add our Configuration Information */
-    ipcp_ackci,                        /* ACK our Configuration Information */
-    ipcp_nakci,                        /* NAK our Configuration Information */
-    ipcp_rejci,                        /* Reject our Configuration Information */
-    ipcp_reqci,                        /* Request peer's Configuration Information */
-    ipcp_up,                   /* Called when fsm reaches OPENED state */
-    ipcp_down,                 /* Called when fsm leaves OPENED state */
-    NULL,                      /* Called when we want the lower layer up */
-    ipcp_finished,             /* Called when we want the lower layer down */
-    NULL,                      /* Called when Protocol-Reject received */
-    NULL,                      /* Retransmission is necessary */
-    NULL,                      /* Called to handle protocol-specific codes */
-    "IPCP"                     /* String name of protocol */
-};
-
-/*
- * Command-line options.
- */
-#if PPP_OPTIONS
-static int setvjslots (char **);
-static int setdnsaddr (char **);
-static int setwinsaddr (char **);
-static int setnetmask (char **);
-int setipaddr (char *, char **, int);
-
-static void printipaddr (option_t *, void (*)(void *, char *,...),void *);
-
-static option_t ipcp_option_list[] = {
-    { "noip", o_bool, &ipcp_protent.enabled_flag,
-      "Disable IP and IPCP" },
-    { "-ip", o_bool, &ipcp_protent.enabled_flag,
-      "Disable IP and IPCP", OPT_ALIAS },
-
-    { "novj", o_bool, &ipcp_wantoptions[0].neg_vj,
-      "Disable VJ compression", OPT_A2CLR, &ipcp_allowoptions[0].neg_vj },
-    { "-vj", o_bool, &ipcp_wantoptions[0].neg_vj,
-      "Disable VJ compression", OPT_ALIAS | OPT_A2CLR,
-      &ipcp_allowoptions[0].neg_vj },
-
-    { "novjccomp", o_bool, &ipcp_wantoptions[0].cflag,
-      "Disable VJ connection-ID compression", OPT_A2CLR,
-      &ipcp_allowoptions[0].cflag },
-    { "-vjccomp", o_bool, &ipcp_wantoptions[0].cflag,
-      "Disable VJ connection-ID compression", OPT_ALIAS | OPT_A2CLR,
-      &ipcp_allowoptions[0].cflag },
-
-    { "vj-max-slots", o_special, (void *)setvjslots,
-      "Set maximum VJ header slots",
-      OPT_PRIO | OPT_A2STRVAL | OPT_STATIC, vj_value },
-
-    { "ipcp-accept-local", o_bool, &ipcp_wantoptions[0].accept_local,
-      "Accept peer's address for us", 1 },
-    { "ipcp-accept-remote", o_bool, &ipcp_wantoptions[0].accept_remote,
-      "Accept peer's address for it", 1 },
-
-    { "ipparam", o_string, &ipparam,
-      "Set ip script parameter", OPT_PRIO },
-
-    { "noipdefault", o_bool, &disable_defaultip,
-      "Don't use name for default IP adrs", 1 },
-
-    { "ms-dns", 1, (void *)setdnsaddr,
-      "DNS address for the peer's use" },
-    { "ms-wins", 1, (void *)setwinsaddr,
-      "Nameserver for SMB over TCP/IP for peer" },
-
-    { "ipcp-restart", o_int, &ipcp_fsm[0].timeouttime,
-      "Set timeout for IPCP", OPT_PRIO },
-    { "ipcp-max-terminate", o_int, &ipcp_fsm[0].maxtermtransmits,
-      "Set max #xmits for term-reqs", OPT_PRIO },
-    { "ipcp-max-configure", o_int, &ipcp_fsm[0].maxconfreqtransmits,
-      "Set max #xmits for conf-reqs", OPT_PRIO },
-    { "ipcp-max-failure", o_int, &ipcp_fsm[0].maxnakloops,
-      "Set max #conf-naks for IPCP", OPT_PRIO },
-
-    { "defaultroute", o_bool, &ipcp_wantoptions[0].default_route,
-      "Add default route", OPT_ENABLE|1, &ipcp_allowoptions[0].default_route },
-    { "nodefaultroute", o_bool, &ipcp_allowoptions[0].default_route,
-      "disable defaultroute option", OPT_A2CLR,
-      &ipcp_wantoptions[0].default_route },
-    { "-defaultroute", o_bool, &ipcp_allowoptions[0].default_route,
-      "disable defaultroute option", OPT_ALIAS | OPT_A2CLR,
-      &ipcp_wantoptions[0].default_route },
-
-    { "replacedefaultroute", o_bool,
-                               &ipcp_wantoptions[0].replace_default_route,
-      "Replace default route", 1
-    },
-    { "noreplacedefaultroute", o_bool,
-                               &ipcp_allowoptions[0].replace_default_route,
-      "Never replace default route", OPT_A2COPY,
-                               &ipcp_wantoptions[0].replace_default_route },
-    { "proxyarp", o_bool, &ipcp_wantoptions[0].proxy_arp,
-      "Add proxy ARP entry", OPT_ENABLE|1, &ipcp_allowoptions[0].proxy_arp },
-    { "noproxyarp", o_bool, &ipcp_allowoptions[0].proxy_arp,
-      "disable proxyarp option", OPT_A2CLR,
-      &ipcp_wantoptions[0].proxy_arp },
-    { "-proxyarp", o_bool, &ipcp_allowoptions[0].proxy_arp,
-      "disable proxyarp option", OPT_ALIAS | OPT_A2CLR,
-      &ipcp_wantoptions[0].proxy_arp },
-
-    { "usepeerdns", o_bool, &usepeerdns,
-      "Ask peer for DNS address(es)", 1 },
-
-    { "netmask", o_special, (void *)setnetmask,
-      "set netmask", OPT_PRIO | OPT_A2STRVAL | OPT_STATIC, netmask_str },
-
-    { "ipcp-no-addresses", o_bool, &ipcp_wantoptions[0].old_addrs,
-      "Disable old-style IP-Addresses usage", OPT_A2CLR,
-      &ipcp_allowoptions[0].old_addrs },
-    { "ipcp-no-address", o_bool, &ipcp_wantoptions[0].neg_addr,
-      "Disable IP-Address usage", OPT_A2CLR,
-      &ipcp_allowoptions[0].neg_addr },
-
-    { "noremoteip", o_bool, &noremoteip,
-      "Allow peer to have no IP address", 1 },
-
-    { "nosendip", o_bool, &ipcp_wantoptions[0].neg_addr,
-      "Don't send our IP address to peer", OPT_A2CLR,
-      &ipcp_wantoptions[0].old_addrs},
-
-    { "IP addresses", o_wild, (void *) &setipaddr,
-      "set local and remote IP addresses",
-      OPT_NOARG | OPT_A2PRINTER, (void *) &printipaddr },
-
-    { NULL }
-};
-#endif /* PPP_OPTIONS */
-
-/*
- * Protocol entry points from main code.
- */
-static void ipcp_init(ppp_pcb *pcb);
-static void ipcp_open(ppp_pcb *pcb);
-static void ipcp_close(ppp_pcb *pcb, const char *reason);
-static void ipcp_lowerup(ppp_pcb *pcb);
-static void ipcp_lowerdown(ppp_pcb *pcb);
-static void ipcp_input(ppp_pcb *pcb, u_char *p, int len);
-static void ipcp_protrej(ppp_pcb *pcb);
-#if PRINTPKT_SUPPORT
-static int ipcp_printpkt(const u_char *p, int plen,
-               void (*printer) (void *, const char *, ...), void *arg);
-#endif /* PRINTPKT_SUPPORT */
-#if PPP_OPTIONS
-static void ip_check_options (void);
-#endif /* PPP_OPTIONS */
-#if DEMAND_SUPPORT
-static int  ip_demand_conf (int);
-static int  ip_active_pkt (u_char *, int);
-#endif /* DEMAND_SUPPORT */
-#if 0 /* UNUSED */
-static void create_resolv (u32_t, u32_t);
-#endif /* UNUSED */
-
-const struct protent ipcp_protent = {
-    PPP_IPCP,
-    ipcp_init,
-    ipcp_input,
-    ipcp_protrej,
-    ipcp_lowerup,
-    ipcp_lowerdown,
-    ipcp_open,
-    ipcp_close,
-#if PRINTPKT_SUPPORT
-    ipcp_printpkt,
-#endif /* PRINTPKT_SUPPORT */
-#if PPP_DATAINPUT
-    NULL,
-#endif /* PPP_DATAINPUT */
-#if PRINTPKT_SUPPORT
-    "IPCP",
-    "IP",
-#endif /* PRINTPKT_SUPPORT */
-#if PPP_OPTIONS
-    ipcp_option_list,
-    ip_check_options,
-#endif /* PPP_OPTIONS */
-#if DEMAND_SUPPORT
-    ip_demand_conf,
-    ip_active_pkt
-#endif /* DEMAND_SUPPORT */
-};
-
-static void ipcp_clear_addrs(ppp_pcb *pcb, u32_t ouraddr, u32_t hisaddr, u8_t replacedefaultroute);
-
-/*
- * Lengths of configuration options.
- */
-#define CILEN_VOID     2
-#define CILEN_COMPRESS 4       /* min length for compression protocol opt. */
-#define CILEN_VJ       6       /* length for RFC1332 Van-Jacobson opt. */
-#define CILEN_ADDR     6       /* new-style single address option */
-#define CILEN_ADDRS    10      /* old-style dual address option */
-
-
-#define CODENAME(x)    ((x) == CONFACK ? "ACK" : \
-                        (x) == CONFNAK ? "NAK" : "REJ")
-
-#if 0 /* UNUSED, already defined by lwIP */
-/*
- * Make a string representation of a network IP address.
- */
-char *
-ip_ntoa(ipaddr)
-u32_t ipaddr;
-{
-    static char b[64];
-
-    slprintf(b, sizeof(b), "%I", ipaddr);
-    return b;
-}
-#endif /* UNUSED, already defined by lwIP */
-
-/*
- * Option parsing.
- */
-#if PPP_OPTIONS
-/*
- * setvjslots - set maximum number of connection slots for VJ compression
- */
-static int
-setvjslots(argv)
-    char **argv;
-{
-    int value;
-
-/* FIXME: found what int_option() did */
-#if PPP_OPTIONS
-    if (!int_option(*argv, &value))
-       return 0;
-#endif /* PPP_OPTIONS */
-
-    if (value < 2 || value > 16) {
-       option_error("vj-max-slots value must be between 2 and 16");
-       return 0;
-    }
-    ipcp_wantoptions [0].maxslotindex =
-        ipcp_allowoptions[0].maxslotindex = value - 1;
-    slprintf(vj_value, sizeof(vj_value), "%d", value);
-    return 1;
-}
-
-/*
- * setdnsaddr - set the dns address(es)
- */
-static int
-setdnsaddr(argv)
-    char **argv;
-{
-    u32_t dns;
-    struct hostent *hp;
-
-    dns = inet_addr(*argv);
-    if (dns == (u32_t) -1) {
-       if ((hp = gethostbyname(*argv)) == NULL) {
-           option_error("invalid address parameter '%s' for ms-dns option",
-                        *argv);
-           return 0;
-       }
-       dns = *(u32_t *)hp->h_addr;
-    }
-
-    /* We take the last 2 values given, the 2nd-last as the primary
-       and the last as the secondary.  If only one is given it
-       becomes both primary and secondary. */
-    if (ipcp_allowoptions[0].dnsaddr[1] == 0)
-       ipcp_allowoptions[0].dnsaddr[0] = dns;
-    else
-       ipcp_allowoptions[0].dnsaddr[0] = ipcp_allowoptions[0].dnsaddr[1];
-
-    /* always set the secondary address value. */
-    ipcp_allowoptions[0].dnsaddr[1] = dns;
-
-    return (1);
-}
-
-/*
- * setwinsaddr - set the wins address(es)
- * This is primrarly used with the Samba package under UNIX or for pointing
- * the caller to the existing WINS server on a Windows NT platform.
- */
-static int
-setwinsaddr(argv)
-    char **argv;
-{
-    u32_t wins;
-    struct hostent *hp;
-
-    wins = inet_addr(*argv);
-    if (wins == (u32_t) -1) {
-       if ((hp = gethostbyname(*argv)) == NULL) {
-           option_error("invalid address parameter '%s' for ms-wins option",
-                        *argv);
-           return 0;
-       }
-       wins = *(u32_t *)hp->h_addr;
-    }
-
-    /* We take the last 2 values given, the 2nd-last as the primary
-       and the last as the secondary.  If only one is given it
-       becomes both primary and secondary. */
-    if (ipcp_allowoptions[0].winsaddr[1] == 0)
-       ipcp_allowoptions[0].winsaddr[0] = wins;
-    else
-       ipcp_allowoptions[0].winsaddr[0] = ipcp_allowoptions[0].winsaddr[1];
-
-    /* always set the secondary address value. */
-    ipcp_allowoptions[0].winsaddr[1] = wins;
-
-    return (1);
-}
-
-/*
- * setipaddr - Set the IP address
- * If doit is 0, the call is to check whether this option is
- * potentially an IP address specification.
- * Not static so that plugins can call it to set the addresses
- */
-int
-setipaddr(arg, argv, doit)
-    char *arg;
-    char **argv;
-    int doit;
-{
-    struct hostent *hp;
-    char *colon;
-    u32_t local, remote;
-    ipcp_options *wo = &ipcp_wantoptions[0];
-    static int prio_local = 0, prio_remote = 0;
-
-    /*
-     * IP address pair separated by ":".
-     */
-    if ((colon = strchr(arg, ':')) == NULL)
-       return 0;
-    if (!doit)
-       return 1;
-  
-    /*
-     * If colon first character, then no local addr.
-     */
-    if (colon != arg && option_priority >= prio_local) {
-       *colon = '\0';
-       if ((local = inet_addr(arg)) == (u32_t) -1) {
-           if ((hp = gethostbyname(arg)) == NULL) {
-               option_error("unknown host: %s", arg);
-               return 0;
-           }
-           local = *(u32_t *)hp->h_addr;
-       }
-       if (bad_ip_adrs(local)) {
-           option_error("bad local IP address %s", ip_ntoa(local));
-           return 0;
-       }
-       if (local != 0)
-           wo->ouraddr = local;
-       *colon = ':';
-       prio_local = option_priority;
-    }
-  
-    /*
-     * If colon last character, then no remote addr.
-     */
-    if (*++colon != '\0' && option_priority >= prio_remote) {
-       if ((remote = inet_addr(colon)) == (u32_t) -1) {
-           if ((hp = gethostbyname(colon)) == NULL) {
-               option_error("unknown host: %s", colon);
-               return 0;
-           }
-           remote = *(u32_t *)hp->h_addr;
-           if (remote_name[0] == 0)
-               strlcpy(remote_name, colon, sizeof(remote_name));
-       }
-       if (bad_ip_adrs(remote)) {
-           option_error("bad remote IP address %s", ip_ntoa(remote));
-           return 0;
-       }
-       if (remote != 0)
-           wo->hisaddr = remote;
-       prio_remote = option_priority;
-    }
-
-    return 1;
-}
-
-static void
-printipaddr(opt, printer, arg)
-    option_t *opt;
-    void (*printer) (void *, char *, ...);
-    void *arg;
-{
-       ipcp_options *wo = &ipcp_wantoptions[0];
-
-       if (wo->ouraddr != 0)
-               printer(arg, "%I", wo->ouraddr);
-       printer(arg, ":");
-       if (wo->hisaddr != 0)
-               printer(arg, "%I", wo->hisaddr);
-}
-
-/*
- * setnetmask - set the netmask to be used on the interface.
- */
-static int
-setnetmask(argv)
-    char **argv;
-{
-    u32_t mask;
-    int n;
-    char *p;
-
-    /*
-     * Unfortunately, if we use inet_addr, we can't tell whether
-     * a result of all 1s is an error or a valid 255.255.255.255.
-     */
-    p = *argv;
-    n = parse_dotted_ip(p, &mask);
-
-    mask = htonl(mask);
-
-    if (n == 0 || p[n] != 0 || (netmask & ~mask) != 0) {
-       option_error("invalid netmask value '%s'", *argv);
-       return 0;
-    }
-
-    netmask = mask;
-    slprintf(netmask_str, sizeof(netmask_str), "%I", mask);
-
-    return (1);
-}
-
-int
-parse_dotted_ip(p, vp)
-    char *p;
-    u32_t *vp;
-{
-    int n;
-    u32_t v, b;
-    char *endp, *p0 = p;
-
-    v = 0;
-    for (n = 3;; --n) {
-       b = strtoul(p, &endp, 0);
-       if (endp == p)
-           return 0;
-       if (b > 255) {
-           if (n < 3)
-               return 0;
-           /* accept e.g. 0xffffff00 */
-           *vp = b;
-           return endp - p0;
-       }
-       v |= b << (n * 8);
-       p = endp;
-       if (n == 0)
-           break;
-       if (*p != '.')
-           return 0;
-       ++p;
-    }
-    *vp = v;
-    return p - p0;
-}
-#endif /* PPP_OPTIONS */
-
-/*
- * ipcp_init - Initialize IPCP.
- */
-static void ipcp_init(ppp_pcb *pcb) {
-    fsm *f = &pcb->ipcp_fsm;
-
-    ipcp_options *wo = &pcb->ipcp_wantoptions;
-    ipcp_options *ao = &pcb->ipcp_allowoptions;
-
-    f->pcb = pcb;
-    f->protocol = PPP_IPCP;
-    f->callbacks = &ipcp_callbacks;
-    fsm_init(f);
-
-    /*
-     * Some 3G modems use repeated IPCP NAKs as a way of stalling
-     * until they can contact a server on the network, so we increase
-     * the default number of NAKs we accept before we start treating
-     * them as rejects.
-     */
-    f->maxnakloops = 100;
-
-#if 0 /* Not necessary, everything is cleared in ppp_clear() */
-    memset(wo, 0, sizeof(*wo));
-    memset(ao, 0, sizeof(*ao));
-#endif /* 0 */
-
-    wo->neg_addr = wo->old_addrs = 1;
-#if VJ_SUPPORT
-    wo->neg_vj = 1;
-    wo->vj_protocol = IPCP_VJ_COMP;
-    wo->maxslotindex = MAX_STATES - 1; /* really max index */
-    wo->cflag = 1;
-#endif /* VJ_SUPPORT */
-
-#if 0 /* UNUSED */
-    /* wanting default route by default */
-    wo->default_route = 1;
-#endif /* UNUSED */
-
-    ao->neg_addr = ao->old_addrs = 1;
-#if VJ_SUPPORT
-    /* max slots and slot-id compression are currently hardwired in */
-    /* ppp_if.c to 16 and 1, this needs to be changed (among other */
-    /* things) gmc */
-
-    ao->neg_vj = 1;
-    ao->maxslotindex = MAX_STATES - 1;
-    ao->cflag = 1;
-#endif /* #if VJ_SUPPORT */
-
-#if 0 /* UNUSED */
-    /*
-     * XXX These control whether the user may use the proxyarp
-     * and defaultroute options.
-     */
-    ao->proxy_arp = 1;
-    ao->default_route = 1;
-#endif /* UNUSED */
-}
-
-
-/*
- * ipcp_open - IPCP is allowed to come up.
- */
-static void ipcp_open(ppp_pcb *pcb) {
-    fsm *f = &pcb->ipcp_fsm;
-    fsm_open(f);
-    pcb->ipcp_is_open = 1;
-}
-
-
-/*
- * ipcp_close - Take IPCP down.
- */
-static void ipcp_close(ppp_pcb *pcb, const char *reason) {
-    fsm *f = &pcb->ipcp_fsm;
-    fsm_close(f, reason);
-}
-
-
-/*
- * ipcp_lowerup - The lower layer is up.
- */
-static void ipcp_lowerup(ppp_pcb *pcb) {
-    fsm *f = &pcb->ipcp_fsm;
-    fsm_lowerup(f);
-}
-
-
-/*
- * ipcp_lowerdown - The lower layer is down.
- */
-static void ipcp_lowerdown(ppp_pcb *pcb) {
-    fsm *f = &pcb->ipcp_fsm;
-    fsm_lowerdown(f);
-}
-
-
-/*
- * ipcp_input - Input IPCP packet.
- */
-static void ipcp_input(ppp_pcb *pcb, u_char *p, int len) {
-    fsm *f = &pcb->ipcp_fsm;
-    fsm_input(f, p, len);
-}
-
-
-/*
- * ipcp_protrej - A Protocol-Reject was received for IPCP.
- *
- * Pretend the lower layer went down, so we shut up.
- */
-static void ipcp_protrej(ppp_pcb *pcb) {
-    fsm *f = &pcb->ipcp_fsm;
-    fsm_lowerdown(f);
-}
-
-
-/*
- * ipcp_resetci - Reset our CI.
- * Called by fsm_sconfreq, Send Configure Request.
- */
-static void ipcp_resetci(fsm *f) {
-    ppp_pcb *pcb = f->pcb;
-    ipcp_options *wo = &pcb->ipcp_wantoptions;
-    ipcp_options *go = &pcb->ipcp_gotoptions;
-    ipcp_options *ao = &pcb->ipcp_allowoptions;
-
-    wo->req_addr = (wo->neg_addr || wo->old_addrs) &&
-       (ao->neg_addr || ao->old_addrs);
-    if (wo->ouraddr == 0)
-       wo->accept_local = 1;
-    if (wo->hisaddr == 0)
-       wo->accept_remote = 1;
-#if LWIP_DNS
-    wo->req_dns1 = wo->req_dns2 = pcb->settings.usepeerdns;    /* Request DNS addresses from the peer */
-#endif /* LWIP_DNS */
-    *go = *wo;
-#if 0 /* UNUSED */
-    /* We don't need ask_for_local, this is only useful for setup which
-     * can determine the local IP address from the system hostname.
-     */
-    if (!ask_for_local)
-       go->ouraddr = 0;
-#endif /* UNUSED */
-#if 0 /* UNUSED */
-    if (ip_choose_hook) {
-       ip_choose_hook(&wo->hisaddr);
-       if (wo->hisaddr) {
-           wo->accept_remote = 0;
-       }
-    }
-#endif /* UNUSED */
-    BZERO(&pcb->ipcp_hisoptions, sizeof(ipcp_options));
-}
-
-
-/*
- * ipcp_cilen - Return length of our CI.
- * Called by fsm_sconfreq, Send Configure Request.
- */
-static int ipcp_cilen(fsm *f) {
-    ppp_pcb *pcb = f->pcb;
-    ipcp_options *go = &pcb->ipcp_gotoptions;
-#if VJ_SUPPORT
-    ipcp_options *wo = &pcb->ipcp_wantoptions;
-#endif /* VJ_SUPPORT */
-    ipcp_options *ho = &pcb->ipcp_hisoptions;
-
-#define LENCIADDRS(neg)                (neg ? CILEN_ADDRS : 0)
-#if VJ_SUPPORT
-#define LENCIVJ(neg, old)      (neg ? (old? CILEN_COMPRESS : CILEN_VJ) : 0)
-#endif /* VJ_SUPPORT */
-#define LENCIADDR(neg)         (neg ? CILEN_ADDR : 0)
-#if LWIP_DNS
-#define LENCIDNS(neg)          LENCIADDR(neg)
-#endif /* LWIP_DNS */
-#if 0 /* UNUSED - WINS */
-#define LENCIWINS(neg)         LENCIADDR(neg)
-#endif /* UNUSED - WINS */
-
-    /*
-     * First see if we want to change our options to the old
-     * forms because we have received old forms from the peer.
-     */
-    if (go->neg_addr && go->old_addrs && !ho->neg_addr && ho->old_addrs)
-       go->neg_addr = 0;
-
-#if VJ_SUPPORT
-    if (wo->neg_vj && !go->neg_vj && !go->old_vj) {
-       /* try an older style of VJ negotiation */
-       /* use the old style only if the peer did */
-       if (ho->neg_vj && ho->old_vj) {
-           go->neg_vj = 1;
-           go->old_vj = 1;
-           go->vj_protocol = ho->vj_protocol;
-       }
-    }
-#endif /* VJ_SUPPORT */
-
-    return (LENCIADDRS(!go->neg_addr && go->old_addrs) +
-#if VJ_SUPPORT
-           LENCIVJ(go->neg_vj, go->old_vj) +
-#endif /* VJ_SUPPORT */
-           LENCIADDR(go->neg_addr) +
-#if LWIP_DNS
-           LENCIDNS(go->req_dns1) +
-           LENCIDNS(go->req_dns2) +
-#endif /* LWIP_DNS */
-#if 0 /* UNUSED - WINS */
-           LENCIWINS(go->winsaddr[0]) +
-           LENCIWINS(go->winsaddr[1]) +
-#endif /* UNUSED - WINS */
-           0);
-}
-
-
-/*
- * ipcp_addci - Add our desired CIs to a packet.
- * Called by fsm_sconfreq, Send Configure Request.
- */
-static void ipcp_addci(fsm *f, u_char *ucp, int *lenp) {
-    ppp_pcb *pcb = f->pcb;
-    ipcp_options *go = &pcb->ipcp_gotoptions;
-    int len = *lenp;
-
-#define ADDCIADDRS(opt, neg, val1, val2) \
-    if (neg) { \
-       if (len >= CILEN_ADDRS) { \
-           u32_t l; \
-           PUTCHAR(opt, ucp); \
-           PUTCHAR(CILEN_ADDRS, ucp); \
-           l = ntohl(val1); \
-           PUTLONG(l, ucp); \
-           l = ntohl(val2); \
-           PUTLONG(l, ucp); \
-           len -= CILEN_ADDRS; \
-       } else \
-           go->old_addrs = 0; \
-    }
-
-#if VJ_SUPPORT
-#define ADDCIVJ(opt, neg, val, old, maxslotindex, cflag) \
-    if (neg) { \
-       int vjlen = old? CILEN_COMPRESS : CILEN_VJ; \
-       if (len >= vjlen) { \
-           PUTCHAR(opt, ucp); \
-           PUTCHAR(vjlen, ucp); \
-           PUTSHORT(val, ucp); \
-           if (!old) { \
-               PUTCHAR(maxslotindex, ucp); \
-               PUTCHAR(cflag, ucp); \
-           } \
-           len -= vjlen; \
-       } else \
-           neg = 0; \
-    }
-#endif /* VJ_SUPPORT */
-
-#define ADDCIADDR(opt, neg, val) \
-    if (neg) { \
-       if (len >= CILEN_ADDR) { \
-           u32_t l; \
-           PUTCHAR(opt, ucp); \
-           PUTCHAR(CILEN_ADDR, ucp); \
-           l = ntohl(val); \
-           PUTLONG(l, ucp); \
-           len -= CILEN_ADDR; \
-       } else \
-           neg = 0; \
-    }
-
-#if LWIP_DNS
-#define ADDCIDNS(opt, neg, addr) \
-    if (neg) { \
-       if (len >= CILEN_ADDR) { \
-           u32_t l; \
-           PUTCHAR(opt, ucp); \
-           PUTCHAR(CILEN_ADDR, ucp); \
-           l = ntohl(addr); \
-           PUTLONG(l, ucp); \
-           len -= CILEN_ADDR; \
-       } else \
-           neg = 0; \
-    }
-#endif /* LWIP_DNS */
-
-#if 0 /* UNUSED - WINS */
-#define ADDCIWINS(opt, addr) \
-    if (addr) { \
-       if (len >= CILEN_ADDR) { \
-           u32_t l; \
-           PUTCHAR(opt, ucp); \
-           PUTCHAR(CILEN_ADDR, ucp); \
-           l = ntohl(addr); \
-           PUTLONG(l, ucp); \
-           len -= CILEN_ADDR; \
-       } else \
-           addr = 0; \
-    }
-#endif /* UNUSED - WINS */
-
-    ADDCIADDRS(CI_ADDRS, !go->neg_addr && go->old_addrs, go->ouraddr,
-              go->hisaddr);
-
-#if VJ_SUPPORT
-    ADDCIVJ(CI_COMPRESSTYPE, go->neg_vj, go->vj_protocol, go->old_vj,
-           go->maxslotindex, go->cflag);
-#endif /* VJ_SUPPORT */
-
-    ADDCIADDR(CI_ADDR, go->neg_addr, go->ouraddr);
-
-#if LWIP_DNS
-    ADDCIDNS(CI_MS_DNS1, go->req_dns1, go->dnsaddr[0]);
-
-    ADDCIDNS(CI_MS_DNS2, go->req_dns2, go->dnsaddr[1]);
-#endif /* LWIP_DNS */
-
-#if 0 /* UNUSED - WINS */
-    ADDCIWINS(CI_MS_WINS1, go->winsaddr[0]);
-
-    ADDCIWINS(CI_MS_WINS2, go->winsaddr[1]);
-#endif /* UNUSED - WINS */
-    
-    *lenp -= len;
-}
-
-
-/*
- * ipcp_ackci - Ack our CIs.
- * Called by fsm_rconfack, Receive Configure ACK.
- *
- * Returns:
- *     0 - Ack was bad.
- *     1 - Ack was good.
- */
-static int ipcp_ackci(fsm *f, u_char *p, int len) {
-    ppp_pcb *pcb = f->pcb;
-    ipcp_options *go = &pcb->ipcp_gotoptions;
-    u_short cilen, citype;
-    u32_t cilong;
-#if VJ_SUPPORT
-    u_short cishort;
-    u_char cimaxslotindex, cicflag;
-#endif /* VJ_SUPPORT */
-
-    /*
-     * CIs must be in exactly the same order that we sent...
-     * Check packet length and CI length at each step.
-     * If we find any deviations, then this packet is bad.
-     */
-
-#define ACKCIADDRS(opt, neg, val1, val2) \
-    if (neg) { \
-       u32_t l; \
-       if ((len -= CILEN_ADDRS) < 0) \
-           goto bad; \
-       GETCHAR(citype, p); \
-       GETCHAR(cilen, p); \
-       if (cilen != CILEN_ADDRS || \
-           citype != opt) \
-           goto bad; \
-       GETLONG(l, p); \
-       cilong = htonl(l); \
-       if (val1 != cilong) \
-           goto bad; \
-       GETLONG(l, p); \
-       cilong = htonl(l); \
-       if (val2 != cilong) \
-           goto bad; \
-    }
-
-#if VJ_SUPPORT
-#define ACKCIVJ(opt, neg, val, old, maxslotindex, cflag) \
-    if (neg) { \
-       int vjlen = old? CILEN_COMPRESS : CILEN_VJ; \
-       if ((len -= vjlen) < 0) \
-           goto bad; \
-       GETCHAR(citype, p); \
-       GETCHAR(cilen, p); \
-       if (cilen != vjlen || \
-           citype != opt)  \
-           goto bad; \
-       GETSHORT(cishort, p); \
-       if (cishort != val) \
-           goto bad; \
-       if (!old) { \
-           GETCHAR(cimaxslotindex, p); \
-           if (cimaxslotindex != maxslotindex) \
-               goto bad; \
-           GETCHAR(cicflag, p); \
-           if (cicflag != cflag) \
-               goto bad; \
-       } \
-    }
-#endif /* VJ_SUPPORT */
-
-#define ACKCIADDR(opt, neg, val) \
-    if (neg) { \
-       u32_t l; \
-       if ((len -= CILEN_ADDR) < 0) \
-           goto bad; \
-       GETCHAR(citype, p); \
-       GETCHAR(cilen, p); \
-       if (cilen != CILEN_ADDR || \
-           citype != opt) \
-           goto bad; \
-       GETLONG(l, p); \
-       cilong = htonl(l); \
-       if (val != cilong) \
-           goto bad; \
-    }
-
-#if LWIP_DNS
-#define ACKCIDNS(opt, neg, addr) \
-    if (neg) { \
-       u32_t l; \
-       if ((len -= CILEN_ADDR) < 0) \
-           goto bad; \
-       GETCHAR(citype, p); \
-       GETCHAR(cilen, p); \
-       if (cilen != CILEN_ADDR || citype != opt) \
-           goto bad; \
-       GETLONG(l, p); \
-       cilong = htonl(l); \
-       if (addr != cilong) \
-           goto bad; \
-    }
-#endif /* LWIP_DNS */
-
-#if 0 /* UNUSED - WINS */
-#define ACKCIWINS(opt, addr) \
-    if (addr) { \
-       u32_t l; \
-       if ((len -= CILEN_ADDR) < 0) \
-           goto bad; \
-       GETCHAR(citype, p); \
-       GETCHAR(cilen, p); \
-       if (cilen != CILEN_ADDR || citype != opt) \
-           goto bad; \
-       GETLONG(l, p); \
-       cilong = htonl(l); \
-       if (addr != cilong) \
-           goto bad; \
-    }
-#endif /* UNUSED - WINS */
-
-    ACKCIADDRS(CI_ADDRS, !go->neg_addr && go->old_addrs, go->ouraddr,
-              go->hisaddr);
-
-#if VJ_SUPPORT
-    ACKCIVJ(CI_COMPRESSTYPE, go->neg_vj, go->vj_protocol, go->old_vj,
-           go->maxslotindex, go->cflag);
-#endif /* VJ_SUPPORT */
-
-    ACKCIADDR(CI_ADDR, go->neg_addr, go->ouraddr);
-
-#if LWIP_DNS
-    ACKCIDNS(CI_MS_DNS1, go->req_dns1, go->dnsaddr[0]);
-
-    ACKCIDNS(CI_MS_DNS2, go->req_dns2, go->dnsaddr[1]);
-#endif /* LWIP_DNS */
-
-#if 0 /* UNUSED - WINS */
-    ACKCIWINS(CI_MS_WINS1, go->winsaddr[0]);
-
-    ACKCIWINS(CI_MS_WINS2, go->winsaddr[1]);
-#endif /* UNUSED - WINS */
-
-    /*
-     * If there are any remaining CIs, then this packet is bad.
-     */
-    if (len != 0)
-       goto bad;
-    return (1);
-
-bad:
-    IPCPDEBUG(("ipcp_ackci: received bad Ack!"));
-    return (0);
-}
-
-/*
- * ipcp_nakci - Peer has sent a NAK for some of our CIs.
- * This should not modify any state if the Nak is bad
- * or if IPCP is in the OPENED state.
- * Calback from fsm_rconfnakrej - Receive Configure-Nak or Configure-Reject.
- *
- * Returns:
- *     0 - Nak was bad.
- *     1 - Nak was good.
- */
-static int ipcp_nakci(fsm *f, u_char *p, int len, int treat_as_reject) {
-    ppp_pcb *pcb = f->pcb;
-    ipcp_options *go = &pcb->ipcp_gotoptions;
-    u_char citype, cilen, *next;
-#if VJ_SUPPORT
-    u_char cimaxslotindex, cicflag;
-    u_short cishort;
-#endif /* VJ_SUPPORT */
-    u32_t ciaddr1, ciaddr2, l;
-#if LWIP_DNS
-    u32_t cidnsaddr;
-#endif /* LWIP_DNS */
-    ipcp_options no;           /* options we've seen Naks for */
-    ipcp_options try_;         /* options to request next time */
-
-    BZERO(&no, sizeof(no));
-    try_ = *go;
-
-    /*
-     * Any Nak'd CIs must be in exactly the same order that we sent.
-     * Check packet length and CI length at each step.
-     * If we find any deviations, then this packet is bad.
-     */
-#define NAKCIADDRS(opt, neg, code) \
-    if ((neg) && \
-       (cilen = p[1]) == CILEN_ADDRS && \
-       len >= cilen && \
-       p[0] == opt) { \
-       len -= cilen; \
-       INCPTR(2, p); \
-       GETLONG(l, p); \
-       ciaddr1 = htonl(l); \
-       GETLONG(l, p); \
-       ciaddr2 = htonl(l); \
-       no.old_addrs = 1; \
-       code \
-    }
-
-#if VJ_SUPPORT
-#define NAKCIVJ(opt, neg, code) \
-    if (go->neg && \
-       ((cilen = p[1]) == CILEN_COMPRESS || cilen == CILEN_VJ) && \
-       len >= cilen && \
-       p[0] == opt) { \
-       len -= cilen; \
-       INCPTR(2, p); \
-       GETSHORT(cishort, p); \
-       no.neg = 1; \
-        code \
-    }
-#endif /* VJ_SUPPORT */
-
-#define NAKCIADDR(opt, neg, code) \
-    if (go->neg && \
-       (cilen = p[1]) == CILEN_ADDR && \
-       len >= cilen && \
-       p[0] == opt) { \
-       len -= cilen; \
-       INCPTR(2, p); \
-       GETLONG(l, p); \
-       ciaddr1 = htonl(l); \
-       no.neg = 1; \
-       code \
-    }
-
-#if LWIP_DNS
-#define NAKCIDNS(opt, neg, code) \
-    if (go->neg && \
-       ((cilen = p[1]) == CILEN_ADDR) && \
-       len >= cilen && \
-       p[0] == opt) { \
-       len -= cilen; \
-       INCPTR(2, p); \
-       GETLONG(l, p); \
-       cidnsaddr = htonl(l); \
-       no.neg = 1; \
-       code \
-    }
-#endif /* LWIP_DNS */
-
-    /*
-     * Accept the peer's idea of {our,his} address, if different
-     * from our idea, only if the accept_{local,remote} flag is set.
-     */
-    NAKCIADDRS(CI_ADDRS, !go->neg_addr && go->old_addrs,
-              if (treat_as_reject) {
-                  try_.old_addrs = 0;
-              } else {
-                  if (go->accept_local && ciaddr1) {
-                      /* take his idea of our address */
-                      try_.ouraddr = ciaddr1;
-                  }
-                  if (go->accept_remote && ciaddr2) {
-                      /* take his idea of his address */
-                      try_.hisaddr = ciaddr2;
-                  }
-              }
-       );
-
-#if VJ_SUPPORT
-    /*
-     * Accept the peer's value of maxslotindex provided that it
-     * is less than what we asked for.  Turn off slot-ID compression
-     * if the peer wants.  Send old-style compress-type option if
-     * the peer wants.
-     */
-    NAKCIVJ(CI_COMPRESSTYPE, neg_vj,
-           if (treat_as_reject) {
-               try_.neg_vj = 0;
-           } else if (cilen == CILEN_VJ) {
-               GETCHAR(cimaxslotindex, p);
-               GETCHAR(cicflag, p);
-               if (cishort == IPCP_VJ_COMP) {
-                   try_.old_vj = 0;
-                   if (cimaxslotindex < go->maxslotindex)
-                       try_.maxslotindex = cimaxslotindex;
-                   if (!cicflag)
-                       try_.cflag = 0;
-               } else {
-                   try_.neg_vj = 0;
-               }
-           } else {
-               if (cishort == IPCP_VJ_COMP || cishort == IPCP_VJ_COMP_OLD) {
-                   try_.old_vj = 1;
-                   try_.vj_protocol = cishort;
-               } else {
-                   try_.neg_vj = 0;
-               }
-           }
-           );
-#endif /* VJ_SUPPORT */
-
-    NAKCIADDR(CI_ADDR, neg_addr,
-             if (treat_as_reject) {
-                 try_.neg_addr = 0;
-                 try_.old_addrs = 0;
-             } else if (go->accept_local && ciaddr1) {
-                 /* take his idea of our address */
-                 try_.ouraddr = ciaddr1;
-             }
-             );
-
-#if LWIP_DNS
-    NAKCIDNS(CI_MS_DNS1, req_dns1,
-            if (treat_as_reject) {
-                try_.req_dns1 = 0;
-            } else {
-                try_.dnsaddr[0] = cidnsaddr;
-            }
-            );
-
-    NAKCIDNS(CI_MS_DNS2, req_dns2,
-            if (treat_as_reject) {
-                try_.req_dns2 = 0;
-            } else {
-                try_.dnsaddr[1] = cidnsaddr;
-            }
-            );
-#endif /* #if LWIP_DNS */
-
-    /*
-     * There may be remaining CIs, if the peer is requesting negotiation
-     * on an option that we didn't include in our request packet.
-     * If they want to negotiate about IP addresses, we comply.
-     * If they want us to ask for compression, we refuse.
-     * If they want us to ask for ms-dns, we do that, since some
-     * peers get huffy if we don't.
-     */
-    while (len >= CILEN_VOID) {
-       GETCHAR(citype, p);
-       GETCHAR(cilen, p);
-       if ( cilen < CILEN_VOID || (len -= cilen) < 0 )
-           goto bad;
-       next = p + cilen - 2;
-
-       switch (citype) {
-#if VJ_SUPPORT
-       case CI_COMPRESSTYPE:
-           if (go->neg_vj || no.neg_vj ||
-               (cilen != CILEN_VJ && cilen != CILEN_COMPRESS))
-               goto bad;
-           no.neg_vj = 1;
-           break;
-#endif /* VJ_SUPPORT */
-       case CI_ADDRS:
-           if ((!go->neg_addr && go->old_addrs) || no.old_addrs
-               || cilen != CILEN_ADDRS)
-               goto bad;
-           try_.neg_addr = 0;
-           GETLONG(l, p);
-           ciaddr1 = htonl(l);
-           if (ciaddr1 && go->accept_local)
-               try_.ouraddr = ciaddr1;
-           GETLONG(l, p);
-           ciaddr2 = htonl(l);
-           if (ciaddr2 && go->accept_remote)
-               try_.hisaddr = ciaddr2;
-           no.old_addrs = 1;
-           break;
-       case CI_ADDR:
-           if (go->neg_addr || no.neg_addr || cilen != CILEN_ADDR)
-               goto bad;
-           try_.old_addrs = 0;
-           GETLONG(l, p);
-           ciaddr1 = htonl(l);
-           if (ciaddr1 && go->accept_local)
-               try_.ouraddr = ciaddr1;
-           if (try_.ouraddr != 0)
-               try_.neg_addr = 1;
-           no.neg_addr = 1;
-           break;
-#if LWIP_DNS
-       case CI_MS_DNS1:
-           if (go->req_dns1 || no.req_dns1 || cilen != CILEN_ADDR)
-               goto bad;
-           GETLONG(l, p);
-           try_.dnsaddr[0] = htonl(l);
-           try_.req_dns1 = 1;
-           no.req_dns1 = 1;
-           break;
-       case CI_MS_DNS2:
-           if (go->req_dns2 || no.req_dns2 || cilen != CILEN_ADDR)
-               goto bad;
-           GETLONG(l, p);
-           try_.dnsaddr[1] = htonl(l);
-           try_.req_dns2 = 1;
-           no.req_dns2 = 1;
-           break;
-#endif /* LWIP_DNS */
-#if 0 /* UNUSED - WINS */
-       case CI_MS_WINS1:
-       case CI_MS_WINS2:
-           if (cilen != CILEN_ADDR)
-               goto bad;
-           GETLONG(l, p);
-           ciaddr1 = htonl(l);
-           if (ciaddr1)
-               try_.winsaddr[citype == CI_MS_WINS2] = ciaddr1;
-           break;
-#endif /* UNUSED - WINS */
-       default:
-           break;
-       }
-       p = next;
-    }
-
-    /*
-     * OK, the Nak is good.  Now we can update state.
-     * If there are any remaining options, we ignore them.
-     */
-    if (f->state != PPP_FSM_OPENED)
-       *go = try_;
-
-    return 1;
-
-bad:
-    IPCPDEBUG(("ipcp_nakci: received bad Nak!"));
-    return 0;
-}
-
-
-/*
- * ipcp_rejci - Reject some of our CIs.
- * Callback from fsm_rconfnakrej.
- */
-static int ipcp_rejci(fsm *f, u_char *p, int len) {
-    ppp_pcb *pcb = f->pcb;
-    ipcp_options *go = &pcb->ipcp_gotoptions;
-    u_char cilen;
-#if VJ_SUPPORT
-    u_char cimaxslotindex, ciflag;
-    u_short cishort;
-#endif /* VJ_SUPPORT */
-    u32_t cilong;
-    ipcp_options try_;         /* options to request next time */
-
-    try_ = *go;
-    /*
-     * Any Rejected CIs must be in exactly the same order that we sent.
-     * Check packet length and CI length at each step.
-     * If we find any deviations, then this packet is bad.
-     */
-#define REJCIADDRS(opt, neg, val1, val2) \
-    if ((neg) && \
-       (cilen = p[1]) == CILEN_ADDRS && \
-       len >= cilen && \
-       p[0] == opt) { \
-       u32_t l; \
-       len -= cilen; \
-       INCPTR(2, p); \
-       GETLONG(l, p); \
-       cilong = htonl(l); \
-       /* Check rejected value. */ \
-       if (cilong != val1) \
-           goto bad; \
-       GETLONG(l, p); \
-       cilong = htonl(l); \
-       /* Check rejected value. */ \
-       if (cilong != val2) \
-           goto bad; \
-       try_.old_addrs = 0; \
-    }
-
-#if VJ_SUPPORT
-#define REJCIVJ(opt, neg, val, old, maxslot, cflag) \
-    if (go->neg && \
-       p[1] == (old? CILEN_COMPRESS : CILEN_VJ) && \
-       len >= p[1] && \
-       p[0] == opt) { \
-       len -= p[1]; \
-       INCPTR(2, p); \
-       GETSHORT(cishort, p); \
-       /* Check rejected value. */  \
-       if (cishort != val) \
-           goto bad; \
-       if (!old) { \
-          GETCHAR(cimaxslotindex, p); \
-          if (cimaxslotindex != maxslot) \
-            goto bad; \
-          GETCHAR(ciflag, p); \
-          if (ciflag != cflag) \
-            goto bad; \
-        } \
-       try_.neg = 0; \
-     }
-#endif /* VJ_SUPPORT */
-
-#define REJCIADDR(opt, neg, val) \
-    if (go->neg && \
-       (cilen = p[1]) == CILEN_ADDR && \
-       len >= cilen && \
-       p[0] == opt) { \
-       u32_t l; \
-       len -= cilen; \
-       INCPTR(2, p); \
-       GETLONG(l, p); \
-       cilong = htonl(l); \
-       /* Check rejected value. */ \
-       if (cilong != val) \
-           goto bad; \
-       try_.neg = 0; \
-    }
-
-#if LWIP_DNS
-#define REJCIDNS(opt, neg, dnsaddr) \
-    if (go->neg && \
-       ((cilen = p[1]) == CILEN_ADDR) && \
-       len >= cilen && \
-       p[0] == opt) { \
-       u32_t l; \
-       len -= cilen; \
-       INCPTR(2, p); \
-       GETLONG(l, p); \
-       cilong = htonl(l); \
-       /* Check rejected value. */ \
-       if (cilong != dnsaddr) \
-           goto bad; \
-       try_.neg = 0; \
-    }
-#endif /* LWIP_DNS */
-
-#if 0 /* UNUSED - WINS */
-#define REJCIWINS(opt, addr) \
-    if (addr && \
-       ((cilen = p[1]) == CILEN_ADDR) && \
-       len >= cilen && \
-       p[0] == opt) { \
-       u32_t l; \
-       len -= cilen; \
-       INCPTR(2, p); \
-       GETLONG(l, p); \
-       cilong = htonl(l); \
-       /* Check rejected value. */ \
-       if (cilong != addr) \
-           goto bad; \
-       try_.winsaddr[opt == CI_MS_WINS2] = 0; \
-    }
-#endif /* UNUSED - WINS */
-
-    REJCIADDRS(CI_ADDRS, !go->neg_addr && go->old_addrs,
-              go->ouraddr, go->hisaddr);
-
-#if VJ_SUPPORT
-    REJCIVJ(CI_COMPRESSTYPE, neg_vj, go->vj_protocol, go->old_vj,
-           go->maxslotindex, go->cflag);
-#endif /* VJ_SUPPORT */
-
-    REJCIADDR(CI_ADDR, neg_addr, go->ouraddr);
-
-#if LWIP_DNS
-    REJCIDNS(CI_MS_DNS1, req_dns1, go->dnsaddr[0]);
-
-    REJCIDNS(CI_MS_DNS2, req_dns2, go->dnsaddr[1]);
-#endif /* LWIP_DNS */
-
-#if 0 /* UNUSED - WINS */
-    REJCIWINS(CI_MS_WINS1, go->winsaddr[0]);
-
-    REJCIWINS(CI_MS_WINS2, go->winsaddr[1]);
-#endif /* UNUSED - WINS */
-
-    /*
-     * If there are any remaining CIs, then this packet is bad.
-     */
-    if (len != 0)
-       goto bad;
-    /*
-     * Now we can update state.
-     */
-    if (f->state != PPP_FSM_OPENED)
-       *go = try_;
-    return 1;
-
-bad:
-    IPCPDEBUG(("ipcp_rejci: received bad Reject!"));
-    return 0;
-}
-
-
-/*
- * ipcp_reqci - Check the peer's requested CIs and send appropriate response.
- * Callback from fsm_rconfreq, Receive Configure Request
- *
- * Returns: CONFACK, CONFNAK or CONFREJ and input packet modified
- * appropriately.  If reject_if_disagree is non-zero, doesn't return
- * CONFNAK; returns CONFREJ if it can't return CONFACK.
- *
- * inp = Requested CIs
- * len = Length of requested CIs
- */
-static int ipcp_reqci(fsm *f, u_char *inp, int *len, int reject_if_disagree) {
-    ppp_pcb *pcb = f->pcb;
-    ipcp_options *wo = &pcb->ipcp_wantoptions;
-    ipcp_options *ho = &pcb->ipcp_hisoptions;
-    ipcp_options *ao = &pcb->ipcp_allowoptions;
-    u_char *cip, *next;                /* Pointer to current and next CIs */
-    u_short cilen, citype;     /* Parsed len, type */
-#if VJ_SUPPORT
-    u_short cishort;           /* Parsed short value */
-#endif /* VJ_SUPPORT */
-    u32_t tl, ciaddr1, ciaddr2;/* Parsed address values */
-    int rc = CONFACK;          /* Final packet return code */
-    int orc;                   /* Individual option return code */
-    u_char *p;                 /* Pointer to next char to parse */
-    u_char *ucp = inp;         /* Pointer to current output char */
-    int l = *len;              /* Length left */
-#if VJ_SUPPORT
-    u_char maxslotindex, cflag;
-#endif /* VJ_SUPPORT */
-#if LWIP_DNS
-    int d;
-#endif /* LWIP_DNS */
-
-    /*
-     * Reset all his options.
-     */
-    BZERO(ho, sizeof(*ho));
-    
-    /*
-     * Process all his options.
-     */
-    next = inp;
-    while (l) {
-       orc = CONFACK;                  /* Assume success */
-       cip = p = next;                 /* Remember begining of CI */
-       if (l < 2 ||                    /* Not enough data for CI header or */
-           p[1] < 2 ||                 /*  CI length too small or */
-           p[1] > l) {                 /*  CI length too big? */
-           IPCPDEBUG(("ipcp_reqci: bad CI length!"));
-           orc = CONFREJ;              /* Reject bad CI */
-           cilen = l;                  /* Reject till end of packet */
-           l = 0;                      /* Don't loop again */
-           goto endswitch;
-       }
-       GETCHAR(citype, p);             /* Parse CI type */
-       GETCHAR(cilen, p);              /* Parse CI length */
-       l -= cilen;                     /* Adjust remaining length */
-       next += cilen;                  /* Step to next CI */
-
-       switch (citype) {               /* Check CI type */
-       case CI_ADDRS:
-           if (!ao->old_addrs || ho->neg_addr ||
-               cilen != CILEN_ADDRS) { /* Check CI length */
-               orc = CONFREJ;          /* Reject CI */
-               break;
-           }
-
-           /*
-            * If he has no address, or if we both have his address but
-            * disagree about it, then NAK it with our idea.
-            * In particular, if we don't know his address, but he does,
-            * then accept it.
-            */
-           GETLONG(tl, p);             /* Parse source address (his) */
-           ciaddr1 = htonl(tl);
-           if (ciaddr1 != wo->hisaddr
-               && (ciaddr1 == 0 || !wo->accept_remote)) {
-               orc = CONFNAK;
-               if (!reject_if_disagree) {
-                   DECPTR(sizeof(u32_t), p);
-                   tl = ntohl(wo->hisaddr);
-                   PUTLONG(tl, p);
-               }
-           } else if (ciaddr1 == 0 && wo->hisaddr == 0) {
-               /*
-                * If neither we nor he knows his address, reject the option.
-                */
-               orc = CONFREJ;
-               wo->req_addr = 0;       /* don't NAK with 0.0.0.0 later */
-               break;
-           }
-
-           /*
-            * If he doesn't know our address, or if we both have our address
-            * but disagree about it, then NAK it with our idea.
-            */
-           GETLONG(tl, p);             /* Parse desination address (ours) */
-           ciaddr2 = htonl(tl);
-           if (ciaddr2 != wo->ouraddr) {
-               if (ciaddr2 == 0 || !wo->accept_local) {
-                   orc = CONFNAK;
-                   if (!reject_if_disagree) {
-                       DECPTR(sizeof(u32_t), p);
-                       tl = ntohl(wo->ouraddr);
-                       PUTLONG(tl, p);
-                   }
-               } else {
-                   wo->ouraddr = ciaddr2;      /* accept peer's idea */
-               }
-           }
-
-           ho->old_addrs = 1;
-           ho->hisaddr = ciaddr1;
-           ho->ouraddr = ciaddr2;
-           break;
-
-       case CI_ADDR:
-           if (!ao->neg_addr || ho->old_addrs ||
-               cilen != CILEN_ADDR) {  /* Check CI length */
-               orc = CONFREJ;          /* Reject CI */
-               break;
-           }
-
-           /*
-            * If he has no address, or if we both have his address but
-            * disagree about it, then NAK it with our idea.
-            * In particular, if we don't know his address, but he does,
-            * then accept it.
-            */
-           GETLONG(tl, p);     /* Parse source address (his) */
-           ciaddr1 = htonl(tl);
-           if (ciaddr1 != wo->hisaddr
-               && (ciaddr1 == 0 || !wo->accept_remote)) {
-               orc = CONFNAK;
-               if (!reject_if_disagree) {
-                   DECPTR(sizeof(u32_t), p);
-                   tl = ntohl(wo->hisaddr);
-                   PUTLONG(tl, p);
-               }
-           } else if (ciaddr1 == 0 && wo->hisaddr == 0) {
-               /*
-                * Don't ACK an address of 0.0.0.0 - reject it instead.
-                */
-               orc = CONFREJ;
-               wo->req_addr = 0;       /* don't NAK with 0.0.0.0 later */
-               break;
-           }
-       
-           ho->neg_addr = 1;
-           ho->hisaddr = ciaddr1;
-           break;
-
-#if LWIP_DNS
-       case CI_MS_DNS1:
-       case CI_MS_DNS2:
-           /* Microsoft primary or secondary DNS request */
-           d = citype == CI_MS_DNS2;
-
-           /* If we do not have a DNS address then we cannot send it */
-           if (ao->dnsaddr[d] == 0 ||
-               cilen != CILEN_ADDR) {  /* Check CI length */
-               orc = CONFREJ;          /* Reject CI */
-               break;
-           }
-           GETLONG(tl, p);
-           if (htonl(tl) != ao->dnsaddr[d]) {
-                DECPTR(sizeof(u32_t), p);
-               tl = ntohl(ao->dnsaddr[d]);
-               PUTLONG(tl, p);
-               orc = CONFNAK;
-            }
-            break;
-#endif /* LWIP_DNS */
-
-#if 0 /* UNUSED - WINS */
-       case CI_MS_WINS1:
-       case CI_MS_WINS2:
-           /* Microsoft primary or secondary WINS request */
-           d = citype == CI_MS_WINS2;
-
-           /* If we do not have a DNS address then we cannot send it */
-           if (ao->winsaddr[d] == 0 ||
-               cilen != CILEN_ADDR) {  /* Check CI length */
-               orc = CONFREJ;          /* Reject CI */
-               break;
-           }
-           GETLONG(tl, p);
-           if (htonl(tl) != ao->winsaddr[d]) {
-                DECPTR(sizeof(u32_t), p);
-               tl = ntohl(ao->winsaddr[d]);
-               PUTLONG(tl, p);
-               orc = CONFNAK;
-            }
-            break;
-#endif /* UNUSED - WINS */
-
-#if VJ_SUPPORT
-       case CI_COMPRESSTYPE:
-           if (!ao->neg_vj ||
-               (cilen != CILEN_VJ && cilen != CILEN_COMPRESS)) {
-               orc = CONFREJ;
-               break;
-           }
-           GETSHORT(cishort, p);
-
-           if (!(cishort == IPCP_VJ_COMP ||
-                 (cishort == IPCP_VJ_COMP_OLD && cilen == CILEN_COMPRESS))) {
-               orc = CONFREJ;
-               break;
-           }
-
-           ho->neg_vj = 1;
-           ho->vj_protocol = cishort;
-           if (cilen == CILEN_VJ) {
-               GETCHAR(maxslotindex, p);
-               if (maxslotindex > ao->maxslotindex) { 
-                   orc = CONFNAK;
-                   if (!reject_if_disagree){
-                       DECPTR(1, p);
-                       PUTCHAR(ao->maxslotindex, p);
-                   }
-               }
-               GETCHAR(cflag, p);
-               if (cflag && !ao->cflag) {
-                   orc = CONFNAK;
-                   if (!reject_if_disagree){
-                       DECPTR(1, p);
-                       PUTCHAR(wo->cflag, p);
-                   }
-               }
-               ho->maxslotindex = maxslotindex;
-               ho->cflag = cflag;
-           } else {
-               ho->old_vj = 1;
-               ho->maxslotindex = MAX_STATES - 1;
-               ho->cflag = 1;
-           }
-           break;
-#endif /* VJ_SUPPORT */
-
-       default:
-           orc = CONFREJ;
-           break;
-       }
-endswitch:
-       if (orc == CONFACK &&           /* Good CI */
-           rc != CONFACK)              /*  but prior CI wasnt? */
-           continue;                   /* Don't send this one */
-
-       if (orc == CONFNAK) {           /* Nak this CI? */
-           if (reject_if_disagree)     /* Getting fed up with sending NAKs? */
-               orc = CONFREJ;          /* Get tough if so */
-           else {
-               if (rc == CONFREJ)      /* Rejecting prior CI? */
-                   continue;           /* Don't send this one */
-               if (rc == CONFACK) {    /* Ack'd all prior CIs? */
-                   rc = CONFNAK;       /* Not anymore... */
-                   ucp = inp;          /* Backup */
-               }
-           }
-       }
-
-       if (orc == CONFREJ &&           /* Reject this CI */
-           rc != CONFREJ) {            /*  but no prior ones? */
-           rc = CONFREJ;
-           ucp = inp;                  /* Backup */
-       }
-
-       /* Need to move CI? */
-       if (ucp != cip)
-           MEMCPY(ucp, cip, cilen);    /* Move it */
-
-       /* Update output pointer */
-       INCPTR(cilen, ucp);
-    }
-
-    /*
-     * If we aren't rejecting this packet, and we want to negotiate
-     * their address, and they didn't send their address, then we
-     * send a NAK with a CI_ADDR option appended.  We assume the
-     * input buffer is long enough that we can append the extra
-     * option safely.
-     */
-    if (rc != CONFREJ && !ho->neg_addr && !ho->old_addrs &&
-       wo->req_addr && !reject_if_disagree && !pcb->settings.noremoteip) {
-       if (rc == CONFACK) {
-           rc = CONFNAK;
-           ucp = inp;                  /* reset pointer */
-           wo->req_addr = 0;           /* don't ask again */
-       }
-       PUTCHAR(CI_ADDR, ucp);
-       PUTCHAR(CILEN_ADDR, ucp);
-       tl = ntohl(wo->hisaddr);
-       PUTLONG(tl, ucp);
-    }
-
-    *len = ucp - inp;                  /* Compute output length */
-    IPCPDEBUG(("ipcp: returning Configure-%s", CODENAME(rc)));
-    return (rc);                       /* Return final code */
-}
-
-
-#if 0 /* UNUSED */
-/*
- * ip_check_options - check that any IP-related options are OK,
- * and assign appropriate defaults.
- */
-static void
-ip_check_options()
-{
-    struct hostent *hp;
-    u32_t local;
-    ipcp_options *wo = &ipcp_wantoptions[0];
-
-    /*
-     * Default our local IP address based on our hostname.
-     * If local IP address already given, don't bother.
-     */
-    if (wo->ouraddr == 0 && !disable_defaultip) {
-       /*
-        * Look up our hostname (possibly with domain name appended)
-        * and take the first IP address as our local IP address.
-        * If there isn't an IP address for our hostname, too bad.
-        */
-       wo->accept_local = 1;   /* don't insist on this default value */
-       if ((hp = gethostbyname(hostname)) != NULL) {
-           local = *(u32_t *)hp->h_addr;
-           if (local != 0 && !bad_ip_adrs(local))
-               wo->ouraddr = local;
-       }
-    }
-    ask_for_local = wo->ouraddr != 0 || !disable_defaultip;
-}
-#endif /* UNUSED */
-
-#if DEMAND_SUPPORT
-/*
- * ip_demand_conf - configure the interface as though
- * IPCP were up, for use with dial-on-demand.
- */
-static int
-ip_demand_conf(u)
-    int u;
-{
-    ppp_pcb *pcb = &ppp_pcb_list[u];
-    ipcp_options *wo = &ipcp_wantoptions[u];
-
-    if (wo->hisaddr == 0 && !pcb->settings.noremoteip) {
-       /* make up an arbitrary address for the peer */
-       wo->hisaddr = htonl(0x0a707070 + ifunit);
-       wo->accept_remote = 1;
-    }
-    if (wo->ouraddr == 0) {
-       /* make up an arbitrary address for us */
-       wo->ouraddr = htonl(0x0a404040 + ifunit);
-       wo->accept_local = 1;
-       ask_for_local = 0;      /* don't tell the peer this address */
-    }
-    if (!sifaddr(pcb, wo->ouraddr, wo->hisaddr, get_mask(wo->ouraddr)))
-       return 0;
-    if (!sifup(pcb))
-       return 0;
-    if (!sifnpmode(pcb, PPP_IP, NPMODE_QUEUE))
-       return 0;
-#if 0 /* UNUSED */
-    if (wo->default_route)
-       if (sifdefaultroute(pcb, wo->ouraddr, wo->hisaddr,
-               wo->replace_default_route))
-           default_route_set[u] = 1;
-#endif /* UNUSED */
-#if 0 /* UNUSED - PROXY ARP */
-    if (wo->proxy_arp)
-       if (sifproxyarp(pcb, wo->hisaddr))
-           proxy_arp_set[u] = 1;
-#endif /* UNUSED - PROXY ARP */
-
-    ppp_notice("local  IP address %I", wo->ouraddr);
-    if (wo->hisaddr)
-       ppp_notice("remote IP address %I", wo->hisaddr);
-
-    return 1;
-}
-#endif /* DEMAND_SUPPORT */
-
-/*
- * ipcp_up - IPCP has come UP.
- *
- * Configure the IP network interface appropriately and bring it up.
- */
-static void ipcp_up(fsm *f) {
-    ppp_pcb *pcb = f->pcb;
-    u32_t mask;
-    ipcp_options *ho = &pcb->ipcp_hisoptions;
-    ipcp_options *go = &pcb->ipcp_gotoptions;
-    ipcp_options *wo = &pcb->ipcp_wantoptions;
-
-    IPCPDEBUG(("ipcp: up"));
-
-    /*
-     * We must have a non-zero IP address for both ends of the link.
-     */
-    if (!ho->neg_addr && !ho->old_addrs)
-       ho->hisaddr = wo->hisaddr;
-
-    if (!(go->neg_addr || go->old_addrs) && (wo->neg_addr || wo->old_addrs)
-       && wo->ouraddr != 0) {
-       ppp_error("Peer refused to agree to our IP address");
-       ipcp_close(f->pcb, "Refused our IP address");
-       return;
-    }
-    if (go->ouraddr == 0) {
-       ppp_error("Could not determine local IP address");
-       ipcp_close(f->pcb, "Could not determine local IP address");
-       return;
-    }
-    if (ho->hisaddr == 0 && !pcb->settings.noremoteip) {
-       ho->hisaddr = htonl(0x0a404040);
-       ppp_warn("Could not determine remote IP address: defaulting to %I",
-            ho->hisaddr);
-    }
-#if 0 /* UNUSED */
-    script_setenv("IPLOCAL", ip_ntoa(go->ouraddr), 0);
-    if (ho->hisaddr != 0)
-       script_setenv("IPREMOTE", ip_ntoa(ho->hisaddr), 1);
-#endif /* UNUSED */
-
-#if LWIP_DNS
-    if (!go->req_dns1)
-           go->dnsaddr[0] = 0;
-    if (!go->req_dns2)
-           go->dnsaddr[1] = 0;
-#if 0 /* UNUSED */
-    if (go->dnsaddr[0])
-       script_setenv("DNS1", ip_ntoa(go->dnsaddr[0]), 0);
-    if (go->dnsaddr[1])
-       script_setenv("DNS2", ip_ntoa(go->dnsaddr[1]), 0);
-#endif /* UNUSED */
-    if (pcb->settings.usepeerdns && (go->dnsaddr[0] || go->dnsaddr[1])) {
-       sdns(pcb, go->dnsaddr[0], go->dnsaddr[1]);
-#if 0 /* UNUSED */
-       script_setenv("USEPEERDNS", "1", 0);
-       create_resolv(go->dnsaddr[0], go->dnsaddr[1]);
-#endif /* UNUSED */
-    }
-#endif /* LWIP_DNS */
-
-/* FIXME: check why it fails, just to know */
-#if 0 /* Unused */
-    /*
-     * Check that the peer is allowed to use the IP address it wants.
-     */
-    if (ho->hisaddr != 0 && !auth_ip_addr(f->unit, ho->hisaddr)) {
-       ppp_error("Peer is not authorized to use remote address %I", ho->hisaddr);
-       ipcp_close(f->unit, "Unauthorized remote IP address");
-       return;
-    }
-#endif /* Unused */
-
-#if VJ_SUPPORT
-    /* set tcp compression */
-    sifvjcomp(pcb, ho->neg_vj, ho->cflag, ho->maxslotindex);
-#endif /* VJ_SUPPORT */
-
-#if DEMAND_SUPPORT
-    /*
-     * If we are doing dial-on-demand, the interface is already
-     * configured, so we put out any saved-up packets, then set the
-     * interface to pass IP packets.
-     */
-    if (demand) {
-       if (go->ouraddr != wo->ouraddr || ho->hisaddr != wo->hisaddr) {
-           ipcp_clear_addrs(f->unit, wo->ouraddr, wo->hisaddr,
-                                     wo->replace_default_route);
-           if (go->ouraddr != wo->ouraddr) {
-               ppp_warn("Local IP address changed to %I", go->ouraddr);
-               script_setenv("OLDIPLOCAL", ip_ntoa(wo->ouraddr), 0);
-               wo->ouraddr = go->ouraddr;
-           } else
-               script_unsetenv("OLDIPLOCAL");
-           if (ho->hisaddr != wo->hisaddr && wo->hisaddr != 0) {
-               ppp_warn("Remote IP address changed to %I", ho->hisaddr);
-               script_setenv("OLDIPREMOTE", ip_ntoa(wo->hisaddr), 0);
-               wo->hisaddr = ho->hisaddr;
-           } else
-               script_unsetenv("OLDIPREMOTE");
-
-           /* Set the interface to the new addresses */
-           mask = get_mask(go->ouraddr);
-           if (!sifaddr(pcb, go->ouraddr, ho->hisaddr, mask)) {
-#if PPP_DEBUG
-               ppp_warn("Interface configuration failed");
-#endif /* PPP_DEBUG */
-               ipcp_close(f->unit, "Interface configuration failed");
-               return;
-           }
-
-           /* assign a default route through the interface if required */
-           if (ipcp_wantoptions[f->unit].default_route) 
-               if (sifdefaultroute(pcb, go->ouraddr, ho->hisaddr,
-                       wo->replace_default_route))
-                   default_route_set[f->unit] = 1;
-
-#if 0 /* UNUSED - PROXY ARP */
-           /* Make a proxy ARP entry if requested. */
-           if (ho->hisaddr != 0 && ipcp_wantoptions[f->unit].proxy_arp)
-               if (sifproxyarp(pcb, ho->hisaddr))
-                   proxy_arp_set[f->unit] = 1;
-#endif /* UNUSED - PROXY ARP */
-
-       }
-       demand_rexmit(PPP_IP,go->ouraddr);
-       sifnpmode(pcb, PPP_IP, NPMODE_PASS);
-
-    } else
-#endif /* DEMAND_SUPPORT */
-    {
-       /*
-        * Set IP addresses and (if specified) netmask.
-        */
-       mask = get_mask(go->ouraddr);
-
-#if !(defined(SVR4) && (defined(SNI) || defined(__USLC__)))
-       if (!sifaddr(pcb, go->ouraddr, ho->hisaddr, mask)) {
-#if PPP_DEBUG
-           ppp_warn("Interface configuration failed");
-#endif /* PPP_DEBUG */
-           ipcp_close(f->pcb, "Interface configuration failed");
-           return;
-       }
-#endif
-
-       /* bring the interface up for IP */
-       if (!sifup(pcb)) {
-#if PPP_DEBUG
-           ppp_warn("Interface failed to come up");
-#endif /* PPP_DEBUG */
-           ipcp_close(f->pcb, "Interface configuration failed");
-           return;
-       }
-
-#if (defined(SVR4) && (defined(SNI) || defined(__USLC__)))
-       if (!sifaddr(pcb, go->ouraddr, ho->hisaddr, mask)) {
-#if PPP_DEBUG
-           ppp_warn("Interface configuration failed");
-#endif /* PPP_DEBUG */
-           ipcp_close(f->unit, "Interface configuration failed");
-           return;
-       }
-#endif
-#if DEMAND_SUPPORT
-       sifnpmode(pcb, PPP_IP, NPMODE_PASS);
-#endif /* DEMAND_SUPPORT */
-
-#if 0 /* UNUSED */
-       /* assign a default route through the interface if required */
-       if (wo->default_route)
-           if (sifdefaultroute(pcb, go->ouraddr, ho->hisaddr,
-                   wo->replace_default_route))
-                   pcb->default_route_set = 1;
-#endif /* UNUSED */
-
-#if 0 /* UNUSED - PROXY ARP */
-       /* Make a proxy ARP entry if requested. */
-       if (ho->hisaddr != 0 && wo->proxy_arp)
-           if (sifproxyarp(pcb, ho->hisaddr))
-               pcb->proxy_arp_set = 1;
-#endif /* UNUSED - PROXY ARP */
-
-       wo->ouraddr = go->ouraddr;
-
-       ppp_notice("local  IP address %I", go->ouraddr);
-       if (ho->hisaddr != 0)
-           ppp_notice("remote IP address %I", ho->hisaddr);
-#if LWIP_DNS
-       if (go->dnsaddr[0])
-           ppp_notice("primary   DNS address %I", go->dnsaddr[0]);
-       if (go->dnsaddr[1])
-           ppp_notice("secondary DNS address %I", go->dnsaddr[1]);
-#endif /* LWIP_DNS */
-    }
-
-#if PPP_STATS_SUPPORT
-    reset_link_stats(f->unit);
-#endif /* PPP_STATS_SUPPORT */
-
-    np_up(pcb, PPP_IP);
-    pcb->ipcp_is_up = 1;
-
-#if PPP_NOTIFY
-    notify(ip_up_notifier, 0);
-#endif /* PPP_NOTIFY */
-#if 0 /* UNUSED */
-    if (ip_up_hook)
-       ip_up_hook();
-#endif /* UNUSED */
-}
-
-
-/*
- * ipcp_down - IPCP has gone DOWN.
- *
- * Take the IP network interface down, clear its addresses
- * and delete routes through it.
- */
-static void ipcp_down(fsm *f) {
-    ppp_pcb *pcb = f->pcb;
-    ipcp_options *ho = &pcb->ipcp_hisoptions;
-    ipcp_options *go = &pcb->ipcp_gotoptions;
-
-    IPCPDEBUG(("ipcp: down"));
-#if PPP_STATS_SUPPORT
-    /* XXX a bit IPv4-centric here, we only need to get the stats
-     * before the interface is marked down. */
-    /* XXX more correct: we must get the stats before running the notifiers,
-     * at least for the radius plugin */
-    update_link_stats(f->unit);
-#endif /* PPP_STATS_SUPPORT */
-#if PPP_NOTIFY
-    notify(ip_down_notifier, 0);
-#endif /* PPP_NOTIFY */
-#if 0 /* UNUSED */
-    if (ip_down_hook)
-       ip_down_hook();
-#endif /* UNUSED */
-    if (pcb->ipcp_is_up) {
-       pcb->ipcp_is_up = 0;
-       np_down(pcb, PPP_IP);
-    }
-#if VJ_SUPPORT
-    sifvjcomp(pcb, 0, 0, 0);
-#endif /* VJ_SUPPORT */
-
-#if PPP_STATS_SUPPORT
-    print_link_stats(); /* _after_ running the notifiers and ip_down_hook(),
-                        * because print_link_stats() sets link_stats_valid
-                        * to 0 (zero) */
-#endif /* PPP_STATS_SUPPORT */
-
-#if DEMAND_SUPPORT
-    /*
-     * If we are doing dial-on-demand, set the interface
-     * to queue up outgoing packets (for now).
-     */
-    if (demand) {
-       sifnpmode(pcb, PPP_IP, NPMODE_QUEUE);
-    } else
-#endif /* DEMAND_SUPPORT */
-    {
-#if DEMAND_SUPPORT
-       sifnpmode(pcb, PPP_IP, NPMODE_DROP);
-#endif /* DEMAND_SUPPORT */
-       sifdown(pcb);
-       ipcp_clear_addrs(pcb, go->ouraddr,
-                        ho->hisaddr, 0);
-#if LWIP_DNS
-       cdns(pcb, go->dnsaddr[0], go->dnsaddr[1]);
-#endif /* LWIP_DNS */
-    }
-}
-
-
-/*
- * ipcp_clear_addrs() - clear the interface addresses, routes,
- * proxy arp entries, etc.
- */
-static void ipcp_clear_addrs(ppp_pcb *pcb, u32_t ouraddr, u32_t hisaddr, u8_t replacedefaultroute) {
-    LWIP_UNUSED_ARG(replacedefaultroute);
-
-#if 0 /* UNUSED - PROXY ARP */
-    if (pcb->proxy_arp_set) {
-       cifproxyarp(pcb, hisaddr);
-       pcb->proxy_arp_set = 0;
-    }
-#endif /* UNUSED - PROXY ARP */
-#if 0 /* UNUSED */
-    /* If replacedefaultroute, sifdefaultroute will be called soon
-     * with replacedefaultroute set and that will overwrite the current
-     * default route. This is the case only when doing demand, otherwise
-     * during demand, this cifdefaultroute would restore the old default
-     * route which is not what we want in this case. In the non-demand
-     * case, we'll delete the default route and restore the old if there
-     * is one saved by an sifdefaultroute with replacedefaultroute.
-     */
-    if (!replacedefaultroute && pcb->default_route_set) {
-       cifdefaultroute(pcb, ouraddr, hisaddr);
-       pcb->default_route_set = 0;
-    }
-#endif /* UNUSED */
-    cifaddr(pcb, ouraddr, hisaddr);
-}
-
-
-/*
- * ipcp_finished - possibly shut down the lower layers.
- */
-static void ipcp_finished(fsm *f) {
-       ppp_pcb *pcb = f->pcb;
-       if (pcb->ipcp_is_open) {
-               pcb->ipcp_is_open = 0;
-               np_finished(pcb, PPP_IP);
-       }
-}
-
-
-#if 0 /* UNUSED */
-/*
- * create_resolv - create the replacement resolv.conf file
- */
-static void
-create_resolv(peerdns1, peerdns2)
-    u32_t peerdns1, peerdns2;
-{
-
-}
-#endif /* UNUSED */
-
-#if PRINTPKT_SUPPORT
-/*
- * ipcp_printpkt - print the contents of an IPCP packet.
- */
-static const char* const ipcp_codenames[] = {
-    "ConfReq", "ConfAck", "ConfNak", "ConfRej",
-    "TermReq", "TermAck", "CodeRej"
-};
-
-static int ipcp_printpkt(const u_char *p, int plen,
-               void (*printer) (void *, const char *, ...), void *arg) {
-    int code, id, len, olen;
-    const u_char *pstart, *optend;
-#if VJ_SUPPORT
-    u_short cishort;
-#endif /* VJ_SUPPORT */
-    u32_t cilong;
-
-    if (plen < HEADERLEN)
-       return 0;
-    pstart = p;
-    GETCHAR(code, p);
-    GETCHAR(id, p);
-    GETSHORT(len, p);
-    if (len < HEADERLEN || len > plen)
-       return 0;
-
-    if (code >= 1 && code <= (int)sizeof(ipcp_codenames) / (int)sizeof(char *))
-       printer(arg, " %s", ipcp_codenames[code-1]);
-    else
-       printer(arg, " code=0x%x", code);
-    printer(arg, " id=0x%x", id);
-    len -= HEADERLEN;
-    switch (code) {
-    case CONFREQ:
-    case CONFACK:
-    case CONFNAK:
-    case CONFREJ:
-       /* print option list */
-       while (len >= 2) {
-           GETCHAR(code, p);
-           GETCHAR(olen, p);
-           p -= 2;
-           if (olen < 2 || olen > len) {
-               break;
-           }
-           printer(arg, " <");
-           len -= olen;
-           optend = p + olen;
-           switch (code) {
-           case CI_ADDRS:
-               if (olen == CILEN_ADDRS) {
-                   p += 2;
-                   GETLONG(cilong, p);
-                   printer(arg, "addrs %I", htonl(cilong));
-                   GETLONG(cilong, p);
-                   printer(arg, " %I", htonl(cilong));
-               }
-               break;
-#if VJ_SUPPORT
-           case CI_COMPRESSTYPE:
-               if (olen >= CILEN_COMPRESS) {
-                   p += 2;
-                   GETSHORT(cishort, p);
-                   printer(arg, "compress ");
-                   switch (cishort) {
-                   case IPCP_VJ_COMP:
-                       printer(arg, "VJ");
-                       break;
-                   case IPCP_VJ_COMP_OLD:
-                       printer(arg, "old-VJ");
-                       break;
-                   default:
-                       printer(arg, "0x%x", cishort);
-                   }
-               }
-               break;
-#endif /* VJ_SUPPORT */
-           case CI_ADDR:
-               if (olen == CILEN_ADDR) {
-                   p += 2;
-                   GETLONG(cilong, p);
-                   printer(arg, "addr %I", htonl(cilong));
-               }
-               break;
-#if LWIP_DNS
-           case CI_MS_DNS1:
-           case CI_MS_DNS2:
-               p += 2;
-               GETLONG(cilong, p);
-               printer(arg, "ms-dns%d %I", (code == CI_MS_DNS1? 1: 2),
-                       htonl(cilong));
-               break;
-#endif /* LWIP_DNS */
-#if 0 /* UNUSED - WINS */
-           case CI_MS_WINS1:
-           case CI_MS_WINS2:
-               p += 2;
-               GETLONG(cilong, p);
-               printer(arg, "ms-wins %I", htonl(cilong));
-               break;
-#endif /* UNUSED - WINS */
-           default:
-               break;
-           }
-           while (p < optend) {
-               GETCHAR(code, p);
-               printer(arg, " %.2x", code);
-           }
-           printer(arg, ">");
-       }
-       break;
-
-    case TERMACK:
-    case TERMREQ:
-       if (len > 0 && *p >= ' ' && *p < 0x7f) {
-           printer(arg, " ");
-           ppp_print_string(p, len, printer, arg);
-           p += len;
-           len = 0;
-       }
-       break;
-    default:
-       break;
-    }
-
-    /* print the rest of the bytes in the packet */
-    for (; len > 0; --len) {
-       GETCHAR(code, p);
-       printer(arg, " %.2x", code);
-    }
-
-    return p - pstart;
-}
-#endif /* PRINTPKT_SUPPORT */
-
-#if DEMAND_SUPPORT
-/*
- * ip_active_pkt - see if this IP packet is worth bringing the link up for.
- * We don't bring the link up for IP fragments or for TCP FIN packets
- * with no data.
- */
-#define IP_HDRLEN      20      /* bytes */
-#define IP_OFFMASK     0x1fff
-#ifndef IPPROTO_TCP
-#define IPPROTO_TCP    6
-#endif
-#define TCP_HDRLEN     20
-#define TH_FIN         0x01
-
-/*
- * We use these macros because the IP header may be at an odd address,
- * and some compilers might use word loads to get th_off or ip_hl.
- */
-
-#define net_short(x)   (((x)[0] << 8) + (x)[1])
-#define get_iphl(x)    (((unsigned char *)(x))[0] & 0xF)
-#define get_ipoff(x)   net_short((unsigned char *)(x) + 6)
-#define get_ipproto(x) (((unsigned char *)(x))[9])
-#define get_tcpoff(x)  (((unsigned char *)(x))[12] >> 4)
-#define get_tcpflags(x)        (((unsigned char *)(x))[13])
-
-static int
-ip_active_pkt(pkt, len)
-    u_char *pkt;
-    int len;
-{
-    u_char *tcp;
-    int hlen;
-
-    len -= PPP_HDRLEN;
-    pkt += PPP_HDRLEN;
-    if (len < IP_HDRLEN)
-       return 0;
-    if ((get_ipoff(pkt) & IP_OFFMASK) != 0)
-       return 0;
-    if (get_ipproto(pkt) != IPPROTO_TCP)
-       return 1;
-    hlen = get_iphl(pkt) * 4;
-    if (len < hlen + TCP_HDRLEN)
-       return 0;
-    tcp = pkt + hlen;
-    if ((get_tcpflags(tcp) & TH_FIN) != 0 && len == hlen + get_tcpoff(tcp) * 4)
-       return 0;
-    return 1;
-}
-#endif /* DEMAND_SUPPORT */
-
-#endif /* PPP_SUPPORT && PPP_IPV4_SUPPORT */
diff --git a/components/lwip/netif/ppp/ipv6cp.c b/components/lwip/netif/ppp/ipv6cp.c
deleted file mode 100644 (file)
index 71ac9d7..0000000
+++ /dev/null
@@ -1,1533 +0,0 @@
-/*
- * ipv6cp.c - PPP IPV6 Control Protocol.
- *
- * Copyright (c) 1999 Tommi Komulainen.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The name(s) of the authors of this software must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission.
- *
- * 4. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by Tommi Komulainen
- *     <Tommi.Komulainen@iki.fi>".
- *
- * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-/*  Original version, based on RFC2023 :
-
-    Copyright (c) 1995, 1996, 1997 Francis.Dupont@inria.fr, INRIA Rocquencourt,
-    Alain.Durand@imag.fr, IMAG,
-    Jean-Luc.Richier@imag.fr, IMAG-LSR.
-
-    Copyright (c) 1998, 1999 Francis.Dupont@inria.fr, GIE DYADE,
-    Alain.Durand@imag.fr, IMAG,
-    Jean-Luc.Richier@imag.fr, IMAG-LSR.
-
-    Ce travail a Ã©té fait au sein du GIE DYADE (Groupement d'Intérêt
-    Ã‰conomique ayant pour membres BULL S.A. et l'INRIA).
-
-    Ce logiciel informatique est disponible aux conditions
-    usuelles dans la recherche, c'est-à-dire qu'il peut
-    Ãªtre utilisé, copié, modifié, distribué Ã  l'unique
-    condition que ce texte soit conservé afin que
-    l'origine de ce logiciel soit reconnue.
-
-    Le nom de l'Institut National de Recherche en Informatique
-    et en Automatique (INRIA), de l'IMAG, ou d'une personne morale
-    ou physique ayant participé Ã  l'élaboration de ce logiciel ne peut
-    Ãªtre utilisé sans son accord préalable explicite.
-
-    Ce logiciel est fourni tel quel sans aucune garantie,
-    support ou responsabilité d'aucune sorte.
-    Ce logiciel est dérivé de sources d'origine
-    "University of California at Berkeley" et
-    "Digital Equipment Corporation" couvertes par des copyrights.
-
-    L'Institut d'Informatique et de Mathématiques Appliquées de Grenoble (IMAG)
-    est une fédération d'unités mixtes de recherche du CNRS, de l'Institut National
-    Polytechnique de Grenoble et de l'Université Joseph Fourier regroupant
-    sept laboratoires dont le laboratoire Logiciels, Systèmes, Réseaux (LSR).
-
-    This work has been done in the context of GIE DYADE (joint R & D venture
-    between BULL S.A. and INRIA).
-
-    This software is available with usual "research" terms
-    with the aim of retain credits of the software. 
-    Permission to use, copy, modify and distribute this software for any
-    purpose and without fee is hereby granted, provided that the above
-    copyright notice and this permission notice appear in all copies,
-    and the name of INRIA, IMAG, or any contributor not be used in advertising
-    or publicity pertaining to this material without the prior explicit
-    permission. The software is provided "as is" without any
-    warranties, support or liabilities of any kind.
-    This software is derived from source code from
-    "University of California at Berkeley" and
-    "Digital Equipment Corporation" protected by copyrights.
-
-    Grenoble's Institute of Computer Science and Applied Mathematics (IMAG)
-    is a federation of seven research units funded by the CNRS, National
-    Polytechnic Institute of Grenoble and University Joseph Fourier.
-    The research unit in Software, Systems, Networks (LSR) is member of IMAG.
-*/
-
-/*
- * Derived from :
- *
- *
- * ipcp.c - PPP IP Control Protocol.
- *
- * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The name "Carnegie Mellon University" must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission. For permission or any legal
- *    details, please contact
- *      Office of Technology Transfer
- *      Carnegie Mellon University
- *      5000 Forbes Avenue
- *      Pittsburgh, PA  15213-3890
- *      (412) 268-4387, fax: (412) 268-7395
- *      tech-transfer@andrew.cmu.edu
- *
- * 4. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by Computing Services
- *     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
- *
- * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
- * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * $Id: ipv6cp.c,v 1.21 2005/08/25 23:59:34 paulus Exp $ 
- */
-
-/*
- * TODO: 
- *
- * Proxy Neighbour Discovery.
- *
- * Better defines for selecting the ordering of
- *   interface up / set address.
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && PPP_IPV6_SUPPORT  /* don't build if not configured for use in lwipopts.h */
-
-#if 0 /* UNUSED */
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <netdb.h>
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#endif /* UNUSED */
-
-#include "netif/ppp/ppp_impl.h"
-#include "netif/ppp/fsm.h"
-#include "netif/ppp/ipcp.h"
-#include "netif/ppp/ipv6cp.h"
-#include "netif/ppp/magic.h"
-
-/* global vars */
-#if 0 /* UNUSED */
-int no_ifaceid_neg = 0;
-#endif /* UNUSED */
-
-/*
- * Callbacks for fsm code.  (CI = Configuration Information)
- */
-static void ipv6cp_resetci(fsm *f); /* Reset our CI */
-static int  ipv6cp_cilen(fsm *f); /* Return length of our CI */
-static void ipv6cp_addci(fsm *f, u_char *ucp, int *lenp); /* Add our CI */
-static int  ipv6cp_ackci(fsm *f, u_char *p, int len); /* Peer ack'd our CI */
-static int  ipv6cp_nakci(fsm *f, u_char *p, int len, int treat_as_reject); /* Peer nak'd our CI */
-static int  ipv6cp_rejci(fsm *f, u_char *p, int len); /* Peer rej'd our CI */
-static int  ipv6cp_reqci(fsm *f, u_char *inp, int *len, int reject_if_disagree); /* Rcv CI */
-static void ipv6cp_up(fsm *f); /* We're UP */
-static void ipv6cp_down(fsm *f); /* We're DOWN */
-static void ipv6cp_finished(fsm *f); /* Don't need lower layer */
-
-static const fsm_callbacks ipv6cp_callbacks = { /* IPV6CP callback routines */
-    ipv6cp_resetci,            /* Reset our Configuration Information */
-    ipv6cp_cilen,              /* Length of our Configuration Information */
-    ipv6cp_addci,              /* Add our Configuration Information */
-    ipv6cp_ackci,              /* ACK our Configuration Information */
-    ipv6cp_nakci,              /* NAK our Configuration Information */
-    ipv6cp_rejci,              /* Reject our Configuration Information */
-    ipv6cp_reqci,              /* Request peer's Configuration Information */
-    ipv6cp_up,                 /* Called when fsm reaches OPENED state */
-    ipv6cp_down,               /* Called when fsm leaves OPENED state */
-    NULL,                      /* Called when we want the lower layer up */
-    ipv6cp_finished,           /* Called when we want the lower layer down */
-    NULL,                      /* Called when Protocol-Reject received */
-    NULL,                      /* Retransmission is necessary */
-    NULL,                      /* Called to handle protocol-specific codes */
-    "IPV6CP"                   /* String name of protocol */
-};
-
-#if PPP_OPTIONS
-/*
- * Command-line options.
- */
-static int setifaceid(char **arg));
-static void printifaceid(option_t *,
-                             void (*)(void *, char *, ...), void *));
-
-static option_t ipv6cp_option_list[] = {
-    { "ipv6", o_special, (void *)setifaceid,
-      "Set interface identifiers for IPV6",
-      OPT_A2PRINTER, (void *)printifaceid },
-
-    { "+ipv6", o_bool, &ipv6cp_protent.enabled_flag,
-      "Enable IPv6 and IPv6CP", OPT_PRIO | 1 },
-    { "noipv6", o_bool, &ipv6cp_protent.enabled_flag,
-      "Disable IPv6 and IPv6CP", OPT_PRIOSUB },
-    { "-ipv6", o_bool, &ipv6cp_protent.enabled_flag,
-      "Disable IPv6 and IPv6CP", OPT_PRIOSUB | OPT_ALIAS },
-
-    { "ipv6cp-accept-local", o_bool, &ipv6cp_allowoptions[0].accept_local,
-      "Accept peer's interface identifier for us", 1 },
-
-    { "ipv6cp-use-ipaddr", o_bool, &ipv6cp_allowoptions[0].use_ip,
-      "Use (default) IPv4 address as interface identifier", 1 },
-
-    { "ipv6cp-use-persistent", o_bool, &ipv6cp_wantoptions[0].use_persistent,
-      "Use uniquely-available persistent value for link local address", 1 },
-
-    { "ipv6cp-restart", o_int, &ipv6cp_fsm[0].timeouttime,
-      "Set timeout for IPv6CP", OPT_PRIO },
-    { "ipv6cp-max-terminate", o_int, &ipv6cp_fsm[0].maxtermtransmits,
-      "Set max #xmits for term-reqs", OPT_PRIO },
-    { "ipv6cp-max-configure", o_int, &ipv6cp_fsm[0].maxconfreqtransmits,
-      "Set max #xmits for conf-reqs", OPT_PRIO },
-    { "ipv6cp-max-failure", o_int, &ipv6cp_fsm[0].maxnakloops,
-      "Set max #conf-naks for IPv6CP", OPT_PRIO },
-
-   { NULL }
-};
-#endif /* PPP_OPTIONS */
-
-/*
- * Protocol entry points from main code.
- */
-static void ipv6cp_init(ppp_pcb *pcb);
-static void ipv6cp_open(ppp_pcb *pcb);
-static void ipv6cp_close(ppp_pcb *pcb, const char *reason);
-static void ipv6cp_lowerup(ppp_pcb *pcb);
-static void ipv6cp_lowerdown(ppp_pcb *pcb);
-static void ipv6cp_input(ppp_pcb *pcb, u_char *p, int len);
-static void ipv6cp_protrej(ppp_pcb *pcb);
-#if PPP_OPTIONS
-static void ipv6_check_options(void);
-#endif /* PPP_OPTIONS */
-#if DEMAND_SUPPORT
-static int  ipv6_demand_conf(int u);
-#endif /* DEMAND_SUPPORT */
-#if PRINTPKT_SUPPORT
-static int ipv6cp_printpkt(const u_char *p, int plen,
-               void (*printer)(void *, const char *, ...), void *arg);
-#endif /* PRINTPKT_SUPPORT */
-#if DEMAND_SUPPORT
-static int ipv6_active_pkt(u_char *pkt, int len);
-#endif /* DEMAND_SUPPORT */
-
-const struct protent ipv6cp_protent = {
-    PPP_IPV6CP,
-    ipv6cp_init,
-    ipv6cp_input,
-    ipv6cp_protrej,
-    ipv6cp_lowerup,
-    ipv6cp_lowerdown,
-    ipv6cp_open,
-    ipv6cp_close,
-#if PRINTPKT_SUPPORT
-    ipv6cp_printpkt,
-#endif /* PRINTPKT_SUPPORT */
-#if PPP_DATAINPUT
-    NULL,
-#endif /* PPP_DATAINPUT */
-#if PRINTPKT_SUPPORT
-    "IPV6CP",
-    "IPV6",
-#endif /* PRINTPKT_SUPPORT */
-#if PPP_OPTIONS
-    ipv6cp_option_list,
-    ipv6_check_options,
-#endif /* PPP_OPTIONS */
-#if DEMAND_SUPPORT
-    ipv6_demand_conf,
-    ipv6_active_pkt
-#endif /* DEMAND_SUPPORT */
-};
-
-static void ipv6cp_clear_addrs(ppp_pcb *pcb, eui64_t ourid, eui64_t hisid);
-#if 0 /* UNUSED */
-static void ipv6cp_script(char *));
-static void ipv6cp_script_done(void *));
-#endif /* UNUSED */
-
-/*
- * Lengths of configuration options.
- */
-#define CILEN_VOID     2
-#define CILEN_COMPRESS 4       /* length for RFC2023 compress opt. */
-#define CILEN_IFACEID   10     /* RFC2472, interface identifier    */
-
-#define CODENAME(x)    ((x) == CONFACK ? "ACK" : \
-                        (x) == CONFNAK ? "NAK" : "REJ")
-
-#if 0 /* UNUSED */
-/*
- * This state variable is used to ensure that we don't
- * run an ipcp-up/down script while one is already running.
- */
-static enum script_state {
-    s_down,
-    s_up,
-} ipv6cp_script_state;
-static pid_t ipv6cp_script_pid;
-#endif /* UNUSED */
-
-static char *llv6_ntoa(eui64_t ifaceid);
-
-#if PPP_OPTIONS
-/*
- * setifaceid - set the interface identifiers manually
- */
-static int
-setifaceid(argv)
-    char **argv;
-{
-    char *comma, *arg, c;
-    ipv6cp_options *wo = &ipv6cp_wantoptions[0];
-    struct in6_addr addr;
-    static int prio_local, prio_remote;
-
-#define VALIDID(a) ( (((a).s6_addr32[0] == 0) && ((a).s6_addr32[1] == 0)) && \
-                       (((a).s6_addr32[2] != 0) || ((a).s6_addr32[3] != 0)) )
-    
-    arg = *argv;
-    if ((comma = strchr(arg, ',')) == NULL)
-       comma = arg + strlen(arg);
-    
-    /* 
-     * If comma first character, then no local identifier
-     */
-    if (comma != arg) {
-       c = *comma;
-       *comma = '\0';
-
-       if (inet_pton(AF_INET6, arg, &addr) == 0 || !VALIDID(addr)) {
-           option_error("Illegal interface identifier (local): %s", arg);
-           return 0;
-       }
-
-       if (option_priority >= prio_local) {
-           eui64_copy(addr.s6_addr32[2], wo->ourid);
-           wo->opt_local = 1;
-           prio_local = option_priority;
-       }
-       *comma = c;
-    }
-    
-    /*
-     * If comma last character, the no remote identifier
-     */
-    if (*comma != 0 && *++comma != '\0') {
-       if (inet_pton(AF_INET6, comma, &addr) == 0 || !VALIDID(addr)) {
-           option_error("Illegal interface identifier (remote): %s", comma);
-           return 0;
-       }
-       if (option_priority >= prio_remote) {
-           eui64_copy(addr.s6_addr32[2], wo->hisid);
-           wo->opt_remote = 1;
-           prio_remote = option_priority;
-       }
-    }
-
-    if (override_value("+ipv6", option_priority, option_source))
-       ipv6cp_protent.enabled_flag = 1;
-    return 1;
-}
-
-static void
-printifaceid(opt, printer, arg)
-    option_t *opt;
-    void (*printer)(void *, char *, ...));
-    void *arg;
-{
-       ipv6cp_options *wo = &ipv6cp_wantoptions[0];
-
-       if (wo->opt_local)
-               printer(arg, "%s", llv6_ntoa(wo->ourid));
-       printer(arg, ",");
-       if (wo->opt_remote)
-               printer(arg, "%s", llv6_ntoa(wo->hisid));
-}
-#endif /* PPP_OPTIONS */
-
-/*
- * Make a string representation of a network address.
- */
-static char *
-llv6_ntoa(eui64_t ifaceid)
-{
-    static char b[26];
-
-    sprintf(b, "fe80::%02x%02x:%02x%02x:%02x%02x:%02x%02x",
-      ifaceid.e8[0], ifaceid.e8[1], ifaceid.e8[2], ifaceid.e8[3],
-      ifaceid.e8[4], ifaceid.e8[5], ifaceid.e8[6], ifaceid.e8[7]);
-
-    return b;
-}
-
-
-/*
- * ipv6cp_init - Initialize IPV6CP.
- */
-static void ipv6cp_init(ppp_pcb *pcb) {
-    fsm *f = &pcb->ipv6cp_fsm;
-    ipv6cp_options *wo = &pcb->ipv6cp_wantoptions;
-    ipv6cp_options *ao = &pcb->ipv6cp_allowoptions;
-
-    f->pcb = pcb;
-    f->protocol = PPP_IPV6CP;
-    f->callbacks = &ipv6cp_callbacks;
-    fsm_init(f);
-
-#if 0 /* Not necessary, everything is cleared in ppp_clear() */
-    memset(wo, 0, sizeof(*wo));
-    memset(ao, 0, sizeof(*ao));
-#endif /* 0 */
-
-    wo->accept_local = 1;
-    wo->neg_ifaceid = 1;
-    ao->neg_ifaceid = 1;
-
-#ifdef IPV6CP_COMP
-    wo->neg_vj = 1;
-    ao->neg_vj = 1;
-    wo->vj_protocol = IPV6CP_COMP;
-#endif
-
-}
-
-
-/*
- * ipv6cp_open - IPV6CP is allowed to come up.
- */
-static void ipv6cp_open(ppp_pcb *pcb) {
-    fsm_open(&pcb->ipv6cp_fsm);
-}
-
-
-/*
- * ipv6cp_close - Take IPV6CP down.
- */
-static void ipv6cp_close(ppp_pcb *pcb, const char *reason) {
-    fsm_close(&pcb->ipv6cp_fsm, reason);
-}
-
-
-/*
- * ipv6cp_lowerup - The lower layer is up.
- */
-static void ipv6cp_lowerup(ppp_pcb *pcb) {
-    fsm_lowerup(&pcb->ipv6cp_fsm);
-}
-
-
-/*
- * ipv6cp_lowerdown - The lower layer is down.
- */
-static void ipv6cp_lowerdown(ppp_pcb *pcb) {
-    fsm_lowerdown(&pcb->ipv6cp_fsm);
-}
-
-
-/*
- * ipv6cp_input - Input IPV6CP packet.
- */
-static void ipv6cp_input(ppp_pcb *pcb, u_char *p, int len) {
-    fsm_input(&pcb->ipv6cp_fsm, p, len);
-}
-
-
-/*
- * ipv6cp_protrej - A Protocol-Reject was received for IPV6CP.
- *
- * Pretend the lower layer went down, so we shut up.
- */
-static void ipv6cp_protrej(ppp_pcb *pcb) {
-    fsm_lowerdown(&pcb->ipv6cp_fsm);
-}
-
-
-/*
- * ipv6cp_resetci - Reset our CI.
- */
-static void ipv6cp_resetci(fsm *f) {
-    ppp_pcb *pcb = f->pcb;
-    ipv6cp_options *wo = &pcb->ipv6cp_wantoptions;
-    ipv6cp_options *go = &pcb->ipv6cp_gotoptions;
-    ipv6cp_options *ao = &pcb->ipv6cp_allowoptions;
-
-    wo->req_ifaceid = wo->neg_ifaceid && ao->neg_ifaceid;
-    
-    if (!wo->opt_local) {
-       eui64_magic_nz(wo->ourid);
-    }
-    
-    *go = *wo;
-    eui64_zero(go->hisid);     /* last proposed interface identifier */
-}
-
-
-/*
- * ipv6cp_cilen - Return length of our CI.
- */
-static int ipv6cp_cilen(fsm *f) {
-    ppp_pcb *pcb = f->pcb;
-    ipv6cp_options *go = &pcb->ipv6cp_gotoptions;
-
-#ifdef IPV6CP_COMP
-#define LENCIVJ(neg)           (neg ? CILEN_COMPRESS : 0)
-#endif /* IPV6CP_COMP */
-#define LENCIIFACEID(neg)      (neg ? CILEN_IFACEID : 0)
-
-    return (LENCIIFACEID(go->neg_ifaceid) +
-#ifdef IPV6CP_COMP
-           LENCIVJ(go->neg_vj) +
-#endif /* IPV6CP_COMP */
-           0);
-}
-
-
-/*
- * ipv6cp_addci - Add our desired CIs to a packet.
- */
-static void ipv6cp_addci(fsm *f, u_char *ucp, int *lenp) {
-    ppp_pcb *pcb = f->pcb;
-    ipv6cp_options *go = &pcb->ipv6cp_gotoptions;
-    int len = *lenp;
-
-#ifdef IPV6CP_COMP
-#define ADDCIVJ(opt, neg, val) \
-    if (neg) { \
-       int vjlen = CILEN_COMPRESS; \
-       if (len >= vjlen) { \
-           PUTCHAR(opt, ucp); \
-           PUTCHAR(vjlen, ucp); \
-           PUTSHORT(val, ucp); \
-           len -= vjlen; \
-       } else \
-           neg = 0; \
-    }
-#endif /* IPV6CP_COMP */
-
-#define ADDCIIFACEID(opt, neg, val1) \
-    if (neg) { \
-       int idlen = CILEN_IFACEID; \
-       if (len >= idlen) { \
-           PUTCHAR(opt, ucp); \
-           PUTCHAR(idlen, ucp); \
-           eui64_put(val1, ucp); \
-           len -= idlen; \
-       } else \
-           neg = 0; \
-    }
-
-    ADDCIIFACEID(CI_IFACEID, go->neg_ifaceid, go->ourid);
-
-#ifdef IPV6CP_COMP
-    ADDCIVJ(CI_COMPRESSTYPE, go->neg_vj, go->vj_protocol);
-#endif /* IPV6CP_COMP */
-
-    *lenp -= len;
-}
-
-
-/*
- * ipv6cp_ackci - Ack our CIs.
- *
- * Returns:
- *     0 - Ack was bad.
- *     1 - Ack was good.
- */
-static int ipv6cp_ackci(fsm *f, u_char *p, int len) {
-    ppp_pcb *pcb = f->pcb;
-    ipv6cp_options *go = &pcb->ipv6cp_gotoptions;
-    u_short cilen, citype;
-#ifdef IPV6CP_COMP
-    u_short cishort;
-#endif /* IPV6CP_COMP */
-    eui64_t ifaceid;
-
-    /*
-     * CIs must be in exactly the same order that we sent...
-     * Check packet length and CI length at each step.
-     * If we find any deviations, then this packet is bad.
-     */
-
-#ifdef IPV6CP_COMP
-#define ACKCIVJ(opt, neg, val) \
-    if (neg) { \
-       int vjlen = CILEN_COMPRESS; \
-       if ((len -= vjlen) < 0) \
-           goto bad; \
-       GETCHAR(citype, p); \
-       GETCHAR(cilen, p); \
-       if (cilen != vjlen || \
-           citype != opt)  \
-           goto bad; \
-       GETSHORT(cishort, p); \
-       if (cishort != val) \
-           goto bad; \
-    }
-#endif /* IPV6CP_COMP */
-
-#define ACKCIIFACEID(opt, neg, val1) \
-    if (neg) { \
-       int idlen = CILEN_IFACEID; \
-       if ((len -= idlen) < 0) \
-           goto bad; \
-       GETCHAR(citype, p); \
-       GETCHAR(cilen, p); \
-       if (cilen != idlen || \
-           citype != opt) \
-           goto bad; \
-       eui64_get(ifaceid, p); \
-       if (! eui64_equals(val1, ifaceid)) \
-           goto bad; \
-    }
-
-    ACKCIIFACEID(CI_IFACEID, go->neg_ifaceid, go->ourid);
-
-#ifdef IPV6CP_COMP
-    ACKCIVJ(CI_COMPRESSTYPE, go->neg_vj, go->vj_protocol);
-#endif /* IPV6CP_COMP */
-
-    /*
-     * If there are any remaining CIs, then this packet is bad.
-     */
-    if (len != 0)
-       goto bad;
-    return (1);
-
-bad:
-    IPV6CPDEBUG(("ipv6cp_ackci: received bad Ack!"));
-    return (0);
-}
-
-/*
- * ipv6cp_nakci - Peer has sent a NAK for some of our CIs.
- * This should not modify any state if the Nak is bad
- * or if IPV6CP is in the OPENED state.
- *
- * Returns:
- *     0 - Nak was bad.
- *     1 - Nak was good.
- */
-static int ipv6cp_nakci(fsm *f, u_char *p, int len, int treat_as_reject) {
-    ppp_pcb *pcb = f->pcb;
-    ipv6cp_options *go = &pcb->ipv6cp_gotoptions;
-    u_char citype, cilen, *next;
-#ifdef IPV6CP_COMP
-    u_short cishort;
-#endif /* IPV6CP_COMP */
-    eui64_t ifaceid;
-    ipv6cp_options no;         /* options we've seen Naks for */
-    ipv6cp_options try_;       /* options to request next time */
-
-    BZERO(&no, sizeof(no));
-    try_ = *go;
-
-    /*
-     * Any Nak'd CIs must be in exactly the same order that we sent.
-     * Check packet length and CI length at each step.
-     * If we find any deviations, then this packet is bad.
-     */
-#define NAKCIIFACEID(opt, neg, code) \
-    if (go->neg && \
-       len >= (cilen = CILEN_IFACEID) && \
-       p[1] == cilen && \
-       p[0] == opt) { \
-       len -= cilen; \
-       INCPTR(2, p); \
-       eui64_get(ifaceid, p); \
-       no.neg = 1; \
-       code \
-    }
-
-#ifdef IPV6CP_COMP
-#define NAKCIVJ(opt, neg, code) \
-    if (go->neg && \
-       ((cilen = p[1]) == CILEN_COMPRESS) && \
-       len >= cilen && \
-       p[0] == opt) { \
-       len -= cilen; \
-       INCPTR(2, p); \
-       GETSHORT(cishort, p); \
-       no.neg = 1; \
-        code \
-    }
-#endif /* IPV6CP_COMP */
-
-    /*
-     * Accept the peer's idea of {our,his} interface identifier, if different
-     * from our idea, only if the accept_{local,remote} flag is set.
-     */
-    NAKCIIFACEID(CI_IFACEID, neg_ifaceid,
-                if (treat_as_reject) {
-                    try_.neg_ifaceid = 0;
-                } else if (go->accept_local) {
-                    while (eui64_iszero(ifaceid) || 
-                           eui64_equals(ifaceid, go->hisid)) /* bad luck */
-                        eui64_magic(ifaceid);
-                    try_.ourid = ifaceid;
-                    IPV6CPDEBUG(("local LL address %s", llv6_ntoa(ifaceid)));
-                }
-                );
-
-#ifdef IPV6CP_COMP
-    NAKCIVJ(CI_COMPRESSTYPE, neg_vj,
-           {
-               if (cishort == IPV6CP_COMP && !treat_as_reject) {
-                   try_.vj_protocol = cishort;
-               } else {
-                   try_.neg_vj = 0;
-               }
-           }
-           );
-#endif /* IPV6CP_COMP */
-
-    /*
-     * There may be remaining CIs, if the peer is requesting negotiation
-     * on an option that we didn't include in our request packet.
-     * If they want to negotiate about interface identifier, we comply.
-     * If they want us to ask for compression, we refuse.
-     */
-    while (len >= CILEN_VOID) {
-       GETCHAR(citype, p);
-       GETCHAR(cilen, p);
-       if ( cilen < CILEN_VOID || (len -= cilen) < 0 )
-           goto bad;
-       next = p + cilen - 2;
-
-       switch (citype) {
-#ifdef IPV6CP_COMP
-       case CI_COMPRESSTYPE:
-           if (go->neg_vj || no.neg_vj ||
-               (cilen != CILEN_COMPRESS))
-               goto bad;
-           no.neg_vj = 1;
-           break;
-#endif /* IPV6CP_COMP */
-       case CI_IFACEID:
-           if (go->neg_ifaceid || no.neg_ifaceid || cilen != CILEN_IFACEID)
-               goto bad;
-           try_.neg_ifaceid = 1;
-           eui64_get(ifaceid, p);
-           if (go->accept_local) {
-               while (eui64_iszero(ifaceid) || 
-                      eui64_equals(ifaceid, go->hisid)) /* bad luck */
-                   eui64_magic(ifaceid);
-               try_.ourid = ifaceid;
-           }
-           no.neg_ifaceid = 1;
-           break;
-       default:
-           break;
-       }
-       p = next;
-    }
-
-    /* If there is still anything left, this packet is bad. */
-    if (len != 0)
-       goto bad;
-
-    /*
-     * OK, the Nak is good.  Now we can update state.
-     */
-    if (f->state != PPP_FSM_OPENED)
-       *go = try_;
-
-    return 1;
-
-bad:
-    IPV6CPDEBUG(("ipv6cp_nakci: received bad Nak!"));
-    return 0;
-}
-
-
-/*
- * ipv6cp_rejci - Reject some of our CIs.
- */
-static int ipv6cp_rejci(fsm *f, u_char *p, int len) {
-    ppp_pcb *pcb = f->pcb;
-    ipv6cp_options *go = &pcb->ipv6cp_gotoptions;
-    u_char cilen;
-#ifdef IPV6CP_COMP
-    u_short cishort;
-#endif /* IPV6CP_COMP */
-    eui64_t ifaceid;
-    ipv6cp_options try_;               /* options to request next time */
-
-    try_ = *go;
-    /*
-     * Any Rejected CIs must be in exactly the same order that we sent.
-     * Check packet length and CI length at each step.
-     * If we find any deviations, then this packet is bad.
-     */
-#define REJCIIFACEID(opt, neg, val1) \
-    if (go->neg && \
-       len >= (cilen = CILEN_IFACEID) && \
-       p[1] == cilen && \
-       p[0] == opt) { \
-       len -= cilen; \
-       INCPTR(2, p); \
-       eui64_get(ifaceid, p); \
-       /* Check rejected value. */ \
-       if (! eui64_equals(ifaceid, val1)) \
-           goto bad; \
-       try_.neg = 0; \
-    }
-
-#ifdef IPV6CP_COMP
-#define REJCIVJ(opt, neg, val) \
-    if (go->neg && \
-       p[1] == CILEN_COMPRESS && \
-       len >= p[1] && \
-       p[0] == opt) { \
-       len -= p[1]; \
-       INCPTR(2, p); \
-       GETSHORT(cishort, p); \
-       /* Check rejected value. */  \
-       if (cishort != val) \
-           goto bad; \
-       try_.neg = 0; \
-     }
-#endif /* IPV6CP_COMP */
-
-    REJCIIFACEID(CI_IFACEID, neg_ifaceid, go->ourid);
-
-#ifdef IPV6CP_COMP
-    REJCIVJ(CI_COMPRESSTYPE, neg_vj, go->vj_protocol);
-#endif /* IPV6CP_COMP */
-
-    /*
-     * If there are any remaining CIs, then this packet is bad.
-     */
-    if (len != 0)
-       goto bad;
-    /*
-     * Now we can update state.
-     */
-    if (f->state != PPP_FSM_OPENED)
-       *go = try_;
-    return 1;
-
-bad:
-    IPV6CPDEBUG(("ipv6cp_rejci: received bad Reject!"));
-    return 0;
-}
-
-
-/*
- * ipv6cp_reqci - Check the peer's requested CIs and send appropriate response.
- *
- * Returns: CONFACK, CONFNAK or CONFREJ and input packet modified
- * appropriately.  If reject_if_disagree is non-zero, doesn't return
- * CONFNAK; returns CONFREJ if it can't return CONFACK.
- *
- * inp = Requested CIs
- * len = Length of requested CIs
- *
- */
-static int ipv6cp_reqci(fsm *f, u_char *inp, int *len, int reject_if_disagree) {
-    ppp_pcb *pcb = f->pcb;
-    ipv6cp_options *wo = &pcb->ipv6cp_wantoptions;
-    ipv6cp_options *ho = &pcb->ipv6cp_hisoptions;
-    ipv6cp_options *ao = &pcb->ipv6cp_allowoptions;
-    ipv6cp_options *go = &pcb->ipv6cp_gotoptions;
-    u_char *cip, *next;                /* Pointer to current and next CIs */
-    u_short cilen, citype;     /* Parsed len, type */
-#ifdef IPV6CP_COMP
-    u_short cishort;           /* Parsed short value */
-#endif /* IPV6CP_COMP */
-    eui64_t ifaceid;           /* Parsed interface identifier */
-    int rc = CONFACK;          /* Final packet return code */
-    int orc;                   /* Individual option return code */
-    u_char *p;                 /* Pointer to next char to parse */
-    u_char *ucp = inp;         /* Pointer to current output char */
-    int l = *len;              /* Length left */
-
-    /*
-     * Reset all his options.
-     */
-    BZERO(ho, sizeof(*ho));
-    
-    /*
-     * Process all his options.
-     */
-    next = inp;
-    while (l) {
-       orc = CONFACK;                  /* Assume success */
-       cip = p = next;                 /* Remember begining of CI */
-       if (l < 2 ||                    /* Not enough data for CI header or */
-           p[1] < 2 ||                 /*  CI length too small or */
-           p[1] > l) {                 /*  CI length too big? */
-           IPV6CPDEBUG(("ipv6cp_reqci: bad CI length!"));
-           orc = CONFREJ;              /* Reject bad CI */
-           cilen = l;                  /* Reject till end of packet */
-           l = 0;                      /* Don't loop again */
-           goto endswitch;
-       }
-       GETCHAR(citype, p);             /* Parse CI type */
-       GETCHAR(cilen, p);              /* Parse CI length */
-       l -= cilen;                     /* Adjust remaining length */
-       next += cilen;                  /* Step to next CI */
-
-       switch (citype) {               /* Check CI type */
-       case CI_IFACEID:
-           IPV6CPDEBUG(("ipv6cp: received interface identifier "));
-
-           if (!ao->neg_ifaceid ||
-               cilen != CILEN_IFACEID) {       /* Check CI length */
-               orc = CONFREJ;          /* Reject CI */
-               break;
-           }
-
-           /*
-            * If he has no interface identifier, or if we both have same 
-            * identifier then NAK it with new idea.
-            * In particular, if we don't know his identifier, but he does,
-            * then accept it.
-            */
-           eui64_get(ifaceid, p);
-           IPV6CPDEBUG(("(%s)", llv6_ntoa(ifaceid)));
-           if (eui64_iszero(ifaceid) && eui64_iszero(go->ourid)) {
-               orc = CONFREJ;          /* Reject CI */
-               break;
-           }
-           if (!eui64_iszero(wo->hisid) && 
-               !eui64_equals(ifaceid, wo->hisid) && 
-               eui64_iszero(go->hisid)) {
-                   
-               orc = CONFNAK;
-               ifaceid = wo->hisid;
-               go->hisid = ifaceid;
-               DECPTR(sizeof(ifaceid), p);
-               eui64_put(ifaceid, p);
-           } else
-           if (eui64_iszero(ifaceid) || eui64_equals(ifaceid, go->ourid)) {
-               orc = CONFNAK;
-               if (eui64_iszero(go->hisid))    /* first time, try option */
-                   ifaceid = wo->hisid;
-               while (eui64_iszero(ifaceid) || 
-                      eui64_equals(ifaceid, go->ourid)) /* bad luck */
-                   eui64_magic(ifaceid);
-               go->hisid = ifaceid;
-               DECPTR(sizeof(ifaceid), p);
-               eui64_put(ifaceid, p);
-           }
-
-           ho->neg_ifaceid = 1;
-           ho->hisid = ifaceid;
-           break;
-
-#ifdef IPV6CP_COMP
-       case CI_COMPRESSTYPE:
-           IPV6CPDEBUG(("ipv6cp: received COMPRESSTYPE "));
-           if (!ao->neg_vj ||
-               (cilen != CILEN_COMPRESS)) {
-               orc = CONFREJ;
-               break;
-           }
-           GETSHORT(cishort, p);
-           IPV6CPDEBUG(("(%d)", cishort));
-
-           if (!(cishort == IPV6CP_COMP)) {
-               orc = CONFREJ;
-               break;
-           }
-
-           ho->neg_vj = 1;
-           ho->vj_protocol = cishort;
-           break;
-#endif /* IPV6CP_COMP */
-
-       default:
-           orc = CONFREJ;
-           break;
-       }
-
-endswitch:
-       IPV6CPDEBUG((" (%s)\n", CODENAME(orc)));
-
-       if (orc == CONFACK &&           /* Good CI */
-           rc != CONFACK)              /*  but prior CI wasnt? */
-           continue;                   /* Don't send this one */
-
-       if (orc == CONFNAK) {           /* Nak this CI? */
-           if (reject_if_disagree)     /* Getting fed up with sending NAKs? */
-               orc = CONFREJ;          /* Get tough if so */
-           else {
-               if (rc == CONFREJ)      /* Rejecting prior CI? */
-                   continue;           /* Don't send this one */
-               if (rc == CONFACK) {    /* Ack'd all prior CIs? */
-                   rc = CONFNAK;       /* Not anymore... */
-                   ucp = inp;          /* Backup */
-               }
-           }
-       }
-
-       if (orc == CONFREJ &&           /* Reject this CI */
-           rc != CONFREJ) {            /*  but no prior ones? */
-           rc = CONFREJ;
-           ucp = inp;                  /* Backup */
-       }
-
-       /* Need to move CI? */
-       if (ucp != cip)
-           MEMCPY(ucp, cip, cilen);    /* Move it */
-
-       /* Update output pointer */
-       INCPTR(cilen, ucp);
-    }
-
-    /*
-     * If we aren't rejecting this packet, and we want to negotiate
-     * their identifier and they didn't send their identifier, then we
-     * send a NAK with a CI_IFACEID option appended.  We assume the
-     * input buffer is long enough that we can append the extra
-     * option safely.
-     */
-    if (rc != CONFREJ && !ho->neg_ifaceid &&
-       wo->req_ifaceid && !reject_if_disagree) {
-       if (rc == CONFACK) {
-           rc = CONFNAK;
-           ucp = inp;                          /* reset pointer */
-           wo->req_ifaceid = 0;                /* don't ask again */
-       }
-       PUTCHAR(CI_IFACEID, ucp);
-       PUTCHAR(CILEN_IFACEID, ucp);
-       eui64_put(wo->hisid, ucp);
-    }
-
-    *len = ucp - inp;                  /* Compute output length */
-    IPV6CPDEBUG(("ipv6cp: returning Configure-%s", CODENAME(rc)));
-    return (rc);                       /* Return final code */
-}
-
-#if PPP_OPTIONS
-/*
- * ipv6_check_options - check that any IP-related options are OK,
- * and assign appropriate defaults.
- */
-static void ipv6_check_options() {
-    ipv6cp_options *wo = &ipv6cp_wantoptions[0];
-
-    if (!ipv6cp_protent.enabled_flag)
-       return;
-
-    /*
-     * Persistent link-local id is only used when user has not explicitly
-     * configure/hard-code the id
-     */
-    if ((wo->use_persistent) && (!wo->opt_local) && (!wo->opt_remote)) {
-
-       /* 
-        * On systems where there are no Ethernet interfaces used, there
-        * may be other ways to obtain a persistent id. Right now, it
-        * will fall back to using magic [see eui64_magic] below when
-        * an EUI-48 from MAC address can't be obtained. Other possibilities
-        * include obtaining EEPROM serial numbers, or some other unique
-        * yet persistent number. On Sparc platforms, this is possible,
-        * but too bad there's no standards yet for x86 machines.
-        */
-       if (ether_to_eui64(&wo->ourid)) {
-           wo->opt_local = 1;
-       }
-    }
-
-    if (!wo->opt_local) {      /* init interface identifier */
-       if (wo->use_ip && eui64_iszero(wo->ourid)) {
-           eui64_setlo32(wo->ourid, ntohl(ipcp_wantoptions[0].ouraddr));
-           if (!eui64_iszero(wo->ourid))
-               wo->opt_local = 1;
-       }
-       
-       while (eui64_iszero(wo->ourid))
-           eui64_magic(wo->ourid);
-    }
-
-    if (!wo->opt_remote) {
-       if (wo->use_ip && eui64_iszero(wo->hisid)) {
-           eui64_setlo32(wo->hisid, ntohl(ipcp_wantoptions[0].hisaddr));
-           if (!eui64_iszero(wo->hisid))
-               wo->opt_remote = 1;
-       }
-    }
-
-    if (demand && (eui64_iszero(wo->ourid) || eui64_iszero(wo->hisid))) {
-       option_error("local/remote LL address required for demand-dialling\n");
-       exit(1);
-    }
-}
-#endif /* PPP_OPTIONS */
-
-#if DEMAND_SUPPORT
-/*
- * ipv6_demand_conf - configure the interface as though
- * IPV6CP were up, for use with dial-on-demand.
- */
-static int ipv6_demand_conf(int u) {
-    ipv6cp_options *wo = &ipv6cp_wantoptions[u];
-
-    if (!sif6up(u))
-       return 0;
-
-    if (!sif6addr(u, wo->ourid, wo->hisid))
-       return 0;
-
-    if (!sifnpmode(u, PPP_IPV6, NPMODE_QUEUE))
-       return 0;
-
-    ppp_notice("ipv6_demand_conf");
-    ppp_notice("local  LL address %s", llv6_ntoa(wo->ourid));
-    ppp_notice("remote LL address %s", llv6_ntoa(wo->hisid));
-
-    return 1;
-}
-#endif /* DEMAND_SUPPORT */
-
-
-/*
- * ipv6cp_up - IPV6CP has come UP.
- *
- * Configure the IPv6 network interface appropriately and bring it up.
- */
-static void ipv6cp_up(fsm *f) {
-    ppp_pcb *pcb = f->pcb;
-    ipv6cp_options *wo = &pcb->ipv6cp_wantoptions;
-    ipv6cp_options *ho = &pcb->ipv6cp_hisoptions;
-    ipv6cp_options *go = &pcb->ipv6cp_gotoptions;
-
-    IPV6CPDEBUG(("ipv6cp: up"));
-
-    /*
-     * We must have a non-zero LL address for both ends of the link.
-     */
-    if (!ho->neg_ifaceid)
-       ho->hisid = wo->hisid;
-
-#if 0 /* UNUSED */
-    if(!no_ifaceid_neg) {
-#endif /* UNUSED */
-       if (eui64_iszero(ho->hisid)) {
-           ppp_error("Could not determine remote LL address");
-           ipv6cp_close(f->pcb, "Could not determine remote LL address");
-           return;
-       }
-       if (eui64_iszero(go->ourid)) {
-           ppp_error("Could not determine local LL address");
-           ipv6cp_close(f->pcb, "Could not determine local LL address");
-           return;
-       }
-       if (eui64_equals(go->ourid, ho->hisid)) {
-           ppp_error("local and remote LL addresses are equal");
-           ipv6cp_close(f->pcb, "local and remote LL addresses are equal");
-           return;
-       }
-#if 0 /* UNUSED */
-    }
-#endif /* UNUSED */
-#if 0 /* UNUSED */
-    script_setenv("LLLOCAL", llv6_ntoa(go->ourid), 0);
-    script_setenv("LLREMOTE", llv6_ntoa(ho->hisid), 0);
-#endif /* UNUSED */
-
-#ifdef IPV6CP_COMP
-    /* set tcp compression */
-    sif6comp(f->unit, ho->neg_vj);
-#endif
-
-#if DEMAND_SUPPORT
-    /*
-     * If we are doing dial-on-demand, the interface is already
-     * configured, so we put out any saved-up packets, then set the
-     * interface to pass IPv6 packets.
-     */
-    if (demand) {
-       if (! eui64_equals(go->ourid, wo->ourid) || 
-           ! eui64_equals(ho->hisid, wo->hisid)) {
-           if (! eui64_equals(go->ourid, wo->ourid))
-               warn("Local LL address changed to %s", 
-                    llv6_ntoa(go->ourid));
-           if (! eui64_equals(ho->hisid, wo->hisid))
-               warn("Remote LL address changed to %s", 
-                    llv6_ntoa(ho->hisid));
-           ipv6cp_clear_addrs(f->pcb, go->ourid, ho->hisid);
-
-           /* Set the interface to the new addresses */
-           if (!sif6addr(f->pcb, go->ourid, ho->hisid)) {
-               if (debug)
-                   warn("sif6addr failed");
-               ipv6cp_close(f->unit, "Interface configuration failed");
-               return;
-           }
-
-       }
-       demand_rexmit(PPP_IPV6);
-       sifnpmode(f->unit, PPP_IPV6, NPMODE_PASS);
-
-    } else
-#endif /* DEMAND_SUPPORT */
-    {
-       /*
-        * Set LL addresses
-        */
-       if (!sif6addr(f->pcb, go->ourid, ho->hisid)) {
-           PPPDEBUG(LOG_DEBUG, ("sif6addr failed"));
-           ipv6cp_close(f->pcb, "Interface configuration failed");
-           return;
-       }
-
-       /* bring the interface up for IPv6 */
-       if (!sif6up(f->pcb)) {
-           PPPDEBUG(LOG_DEBUG, ("sif6up failed (IPV6)"));
-           ipv6cp_close(f->pcb, "Interface configuration failed");
-           return;
-       }
-#if DEMAND_SUPPORT
-       sifnpmode(f->pcb, PPP_IPV6, NPMODE_PASS);
-#endif /* DEMAND_SUPPORT */
-
-       ppp_notice("local  LL address %s", llv6_ntoa(go->ourid));
-       ppp_notice("remote LL address %s", llv6_ntoa(ho->hisid));
-    }
-
-    np_up(f->pcb, PPP_IPV6);
-    pcb->ipv6cp_is_up = 1;
-
-#if 0 /* UNUSED */
-    /*
-     * Execute the ipv6-up script, like this:
-     * /etc/ppp/ipv6-up interface tty speed local-LL remote-LL
-     */
-    if (ipv6cp_script_state == s_down && ipv6cp_script_pid == 0) {
-       ipv6cp_script_state = s_up;
-       ipv6cp_script(_PATH_IPV6UP);
-    }
-#endif /* UNUSED */
-}
-
-
-/*
- * ipv6cp_down - IPV6CP has gone DOWN.
- *
- * Take the IPv6 network interface down, clear its addresses
- * and delete routes through it.
- */
-static void ipv6cp_down(fsm *f) {
-    ppp_pcb *pcb = f->pcb;
-    ipv6cp_options *go = &pcb->ipv6cp_gotoptions;
-    ipv6cp_options *ho = &pcb->ipv6cp_hisoptions;
-
-    IPV6CPDEBUG(("ipv6cp: down"));
-#if PPP_STATS_SUPPORT
-    update_link_stats(f->unit);
-#endif /* PPP_STATS_SUPPORT */
-    if (pcb->ipv6cp_is_up) {
-       pcb->ipv6cp_is_up = 0;
-       np_down(f->pcb, PPP_IPV6);
-    }
-#ifdef IPV6CP_COMP
-    sif6comp(f->unit, 0);
-#endif
-
-#if DEMAND_SUPPORT
-    /*
-     * If we are doing dial-on-demand, set the interface
-     * to queue up outgoing packets (for now).
-     */
-    if (demand) {
-       sifnpmode(f->pcb, PPP_IPV6, NPMODE_QUEUE);
-    } else
-#endif /* DEMAND_SUPPORT */
-    {
-#if DEMAND_SUPPORT
-       sifnpmode(f->pcb, PPP_IPV6, NPMODE_DROP);
-#endif /* DEMAND_SUPPORT */
-       ipv6cp_clear_addrs(f->pcb,
-                          go->ourid,
-                          ho->hisid);
-       sif6down(f->pcb);
-    }
-
-#if 0 /* UNUSED */
-    /* Execute the ipv6-down script */
-    if (ipv6cp_script_state == s_up && ipv6cp_script_pid == 0) {
-       ipv6cp_script_state = s_down;
-       ipv6cp_script(_PATH_IPV6DOWN);
-    }
-#endif /* UNUSED */
-}
-
-
-/*
- * ipv6cp_clear_addrs() - clear the interface addresses, routes,
- * proxy neighbour discovery entries, etc.
- */
-static void ipv6cp_clear_addrs(ppp_pcb *pcb, eui64_t ourid, eui64_t hisid) {
-    cif6addr(pcb, ourid, hisid);
-}
-
-
-/*
- * ipv6cp_finished - possibly shut down the lower layers.
- */
-static void ipv6cp_finished(fsm *f) {
-    np_finished(f->pcb, PPP_IPV6);
-}
-
-
-#if 0 /* UNUSED */
-/*
- * ipv6cp_script_done - called when the ipv6-up or ipv6-down script
- * has finished.
- */
-static void
-ipv6cp_script_done(arg)
-    void *arg;
-{
-    ipv6cp_script_pid = 0;
-    switch (ipv6cp_script_state) {
-    case s_up:
-       if (ipv6cp_fsm[0].state != PPP_FSM_OPENED) {
-           ipv6cp_script_state = s_down;
-           ipv6cp_script(_PATH_IPV6DOWN);
-       }
-       break;
-    case s_down:
-       if (ipv6cp_fsm[0].state == PPP_FSM_OPENED) {
-           ipv6cp_script_state = s_up;
-           ipv6cp_script(_PATH_IPV6UP);
-       }
-       break;
-    }
-}
-
-
-/*
- * ipv6cp_script - Execute a script with arguments
- * interface-name tty-name speed local-LL remote-LL.
- */
-static void
-ipv6cp_script(script)
-    char *script;
-{
-    char strspeed[32], strlocal[32], strremote[32];
-    char *argv[8];
-
-    sprintf(strspeed, "%d", baud_rate);
-    strcpy(strlocal, llv6_ntoa(ipv6cp_gotoptions[0].ourid));
-    strcpy(strremote, llv6_ntoa(ipv6cp_hisoptions[0].hisid));
-
-    argv[0] = script;
-    argv[1] = ifname;
-    argv[2] = devnam;
-    argv[3] = strspeed;
-    argv[4] = strlocal;
-    argv[5] = strremote;
-    argv[6] = ipparam;
-    argv[7] = NULL;
-
-    ipv6cp_script_pid = run_program(script, argv, 0, ipv6cp_script_done,
-                                   NULL, 0);
-}
-#endif /* UNUSED */
-
-#if PRINTPKT_SUPPORT
-/*
- * ipv6cp_printpkt - print the contents of an IPV6CP packet.
- */
-static const char* const ipv6cp_codenames[] = {
-    "ConfReq", "ConfAck", "ConfNak", "ConfRej",
-    "TermReq", "TermAck", "CodeRej"
-};
-
-static int ipv6cp_printpkt(const u_char *p, int plen,
-               void (*printer)(void *, const char *, ...), void *arg) {
-    int code, id, len, olen;
-    const u_char *pstart, *optend;
-#ifdef IPV6CP_COMP
-    u_short cishort;
-#endif /* IPV6CP_COMP */
-    eui64_t ifaceid;
-
-    if (plen < HEADERLEN)
-       return 0;
-    pstart = p;
-    GETCHAR(code, p);
-    GETCHAR(id, p);
-    GETSHORT(len, p);
-    if (len < HEADERLEN || len > plen)
-       return 0;
-
-    if (code >= 1 && code <= (int)sizeof(ipv6cp_codenames) / (int)sizeof(char *))
-       printer(arg, " %s", ipv6cp_codenames[code-1]);
-    else
-       printer(arg, " code=0x%x", code);
-    printer(arg, " id=0x%x", id);
-    len -= HEADERLEN;
-    switch (code) {
-    case CONFREQ:
-    case CONFACK:
-    case CONFNAK:
-    case CONFREJ:
-       /* print option list */
-       while (len >= 2) {
-           GETCHAR(code, p);
-           GETCHAR(olen, p);
-           p -= 2;
-           if (olen < 2 || olen > len) {
-               break;
-           }
-           printer(arg, " <");
-           len -= olen;
-           optend = p + olen;
-           switch (code) {
-#ifdef IPV6CP_COMP
-           case CI_COMPRESSTYPE:
-               if (olen >= CILEN_COMPRESS) {
-                   p += 2;
-                   GETSHORT(cishort, p);
-                   printer(arg, "compress ");
-                   printer(arg, "0x%x", cishort);
-               }
-               break;
-#endif /* IPV6CP_COMP */
-           case CI_IFACEID:
-               if (olen == CILEN_IFACEID) {
-                   p += 2;
-                   eui64_get(ifaceid, p);
-                   printer(arg, "addr %s", llv6_ntoa(ifaceid));
-               }
-               break;
-           default:
-               break;
-           }
-           while (p < optend) {
-               GETCHAR(code, p);
-               printer(arg, " %.2x", code);
-           }
-           printer(arg, ">");
-       }
-       break;
-
-    case TERMACK:
-    case TERMREQ:
-       if (len > 0 && *p >= ' ' && *p < 0x7f) {
-           printer(arg, " ");
-           ppp_print_string(p, len, printer, arg);
-           p += len;
-           len = 0;
-       }
-       break;
-    default:
-       break;
-    }
-
-    /* print the rest of the bytes in the packet */
-    for (; len > 0; --len) {
-       GETCHAR(code, p);
-       printer(arg, " %.2x", code);
-    }
-
-    return p - pstart;
-}
-#endif /* PRINTPKT_SUPPORT */
-
-#if DEMAND_SUPPORT
-/*
- * ipv6_active_pkt - see if this IP packet is worth bringing the link up for.
- * We don't bring the link up for IP fragments or for TCP FIN packets
- * with no data.
- */
-#define IP6_HDRLEN     40      /* bytes */
-#define IP6_NHDR_FRAG  44      /* fragment IPv6 header */
-#define TCP_HDRLEN     20
-#define TH_FIN         0x01
-
-/*
- * We use these macros because the IP header may be at an odd address,
- * and some compilers might use word loads to get th_off or ip_hl.
- */
-
-#define get_ip6nh(x)   (((unsigned char *)(x))[6])
-#define get_tcpoff(x)  (((unsigned char *)(x))[12] >> 4)
-#define get_tcpflags(x)        (((unsigned char *)(x))[13])
-
-static int ipv6_active_pkt(u_char *pkt, int len) {
-    u_char *tcp;
-
-    len -= PPP_HDRLEN;
-    pkt += PPP_HDRLEN;
-    if (len < IP6_HDRLEN)
-       return 0;
-    if (get_ip6nh(pkt) == IP6_NHDR_FRAG)
-       return 0;
-    if (get_ip6nh(pkt) != IPPROTO_TCP)
-       return 1;
-    if (len < IP6_HDRLEN + TCP_HDRLEN)
-       return 0;
-    tcp = pkt + IP6_HDRLEN;
-    if ((get_tcpflags(tcp) & TH_FIN) != 0 && len == IP6_HDRLEN + get_tcpoff(tcp) * 4)
-       return 0;
-    return 1;
-}
-#endif /* DEMAND_SUPPORT */
-
-#endif /* PPP_SUPPORT && PPP_IPV6_SUPPORT */
diff --git a/components/lwip/netif/ppp/lcp.c b/components/lwip/netif/ppp/lcp.c
deleted file mode 100644 (file)
index 1e47980..0000000
+++ /dev/null
@@ -1,2786 +0,0 @@
-/*
- * lcp.c - PPP Link Control Protocol.
- *
- * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The name "Carnegie Mellon University" must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission. For permission or any legal
- *    details, please contact
- *      Office of Technology Transfer
- *      Carnegie Mellon University
- *      5000 Forbes Avenue
- *      Pittsburgh, PA  15213-3890
- *      (412) 268-4387, fax: (412) 268-7395
- *      tech-transfer@andrew.cmu.edu
- *
- * 4. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by Computing Services
- *     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
- *
- * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
- * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */
-
-/*
- * TODO:
- */
-
-#if 0 /* UNUSED */
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#endif /* UNUSED */
-
-#include "netif/ppp/ppp_impl.h"
-
-#include "netif/ppp/fsm.h"
-#include "netif/ppp/lcp.h"
-#if CHAP_SUPPORT
-#include "netif/ppp/chap-new.h"
-#endif /* CHAP_SUPPORT */
-#include "netif/ppp/magic.h"
-
-/*
- * When the link comes up we want to be able to wait for a short while,
- * or until seeing some input from the peer, before starting to send
- * configure-requests.  We do this by delaying the fsm_lowerup call.
- */
-/* steal a bit in fsm flags word */
-#define DELAYED_UP     0x80
-
-static void lcp_delayed_up(void *arg);
-
-/*
- * LCP-related command-line options.
- */
-#if 0 /* UNUSED */
-int    lcp_echo_interval = 0;  /* Interval between LCP echo-requests */
-int    lcp_echo_fails = 0;     /* Tolerance to unanswered echo-requests */
-#endif /* UNUSED */
-
-#if 0 /* UNUSED */
-/* options */
-static u_int lcp_echo_interval      = LCP_ECHOINTERVAL; /* Interval between LCP echo-requests */
-static u_int lcp_echo_fails         = LCP_MAXECHOFAILS; /* Tolerance to unanswered echo-requests */
-#endif /* UNUSED */
-
-#if 0 /* UNUSED */
-#if PPP_LCP_ADAPTIVE
-bool   lcp_echo_adaptive = 0;  /* request echo only if the link was idle */
-#endif
-bool   lax_recv = 0;           /* accept control chars in asyncmap */
-bool   noendpoint = 0;         /* don't send/accept endpoint discriminator */
-#endif /* UNUSED */
-
-#if PPP_OPTIONS
-static int noopt (char **);
-#endif /* PPP_OPTIONS */
-
-#ifdef HAVE_MULTILINK
-static int setendpoint (char **);
-static void printendpoint (option_t *, void (*)(void *, char *, ...),
-                              void *);
-#endif /* HAVE_MULTILINK */
-
-#if PPP_OPTIONS
-static option_t lcp_option_list[] = {
-    /* LCP options */
-    { "-all", o_special_noarg, (void *)noopt,
-      "Don't request/allow any LCP options" },
-
-    { "noaccomp", o_bool, &lcp_wantoptions[0].neg_accompression,
-      "Disable address/control compression",
-      OPT_A2CLR, &lcp_allowoptions[0].neg_accompression },
-    { "-ac", o_bool, &lcp_wantoptions[0].neg_accompression,
-      "Disable address/control compression",
-      OPT_ALIAS | OPT_A2CLR, &lcp_allowoptions[0].neg_accompression },
-
-    { "asyncmap", o_uint32, &lcp_wantoptions[0].asyncmap,
-      "Set asyncmap (for received packets)",
-      OPT_OR, &lcp_wantoptions[0].neg_asyncmap },
-    { "-as", o_uint32, &lcp_wantoptions[0].asyncmap,
-      "Set asyncmap (for received packets)",
-      OPT_ALIAS | OPT_OR, &lcp_wantoptions[0].neg_asyncmap },
-    { "default-asyncmap", o_uint32, &lcp_wantoptions[0].asyncmap,
-      "Disable asyncmap negotiation",
-      OPT_OR | OPT_NOARG | OPT_VAL(~0U) | OPT_A2CLR,
-      &lcp_allowoptions[0].neg_asyncmap },
-    { "-am", o_uint32, &lcp_wantoptions[0].asyncmap,
-      "Disable asyncmap negotiation",
-      OPT_ALIAS | OPT_OR | OPT_NOARG | OPT_VAL(~0U) | OPT_A2CLR,
-      &lcp_allowoptions[0].neg_asyncmap },
-
-    { "nomagic", o_bool, &lcp_wantoptions[0].neg_magicnumber,
-      "Disable magic number negotiation (looped-back line detection)",
-      OPT_A2CLR, &lcp_allowoptions[0].neg_magicnumber },
-    { "-mn", o_bool, &lcp_wantoptions[0].neg_magicnumber,
-      "Disable magic number negotiation (looped-back line detection)",
-      OPT_ALIAS | OPT_A2CLR, &lcp_allowoptions[0].neg_magicnumber },
-
-    { "mru", o_int, &lcp_wantoptions[0].mru,
-      "Set MRU (maximum received packet size) for negotiation",
-      OPT_PRIO, &lcp_wantoptions[0].neg_mru },
-    { "default-mru", o_bool, &lcp_wantoptions[0].neg_mru,
-      "Disable MRU negotiation (use default 1500)",
-      OPT_PRIOSUB | OPT_A2CLR, &lcp_allowoptions[0].neg_mru },
-    { "-mru", o_bool, &lcp_wantoptions[0].neg_mru,
-      "Disable MRU negotiation (use default 1500)",
-      OPT_ALIAS | OPT_PRIOSUB | OPT_A2CLR, &lcp_allowoptions[0].neg_mru },
-
-    { "mtu", o_int, &lcp_allowoptions[0].mru,
-      "Set our MTU", OPT_LIMITS, NULL, MAXMRU, MINMRU },
-
-    { "nopcomp", o_bool, &lcp_wantoptions[0].neg_pcompression,
-      "Disable protocol field compression",
-      OPT_A2CLR, &lcp_allowoptions[0].neg_pcompression },
-    { "-pc", o_bool, &lcp_wantoptions[0].neg_pcompression,
-      "Disable protocol field compression",
-      OPT_ALIAS | OPT_A2CLR, &lcp_allowoptions[0].neg_pcompression },
-
-    { "passive", o_bool, &lcp_wantoptions[0].passive,
-      "Set passive mode", 1 },
-    { "-p", o_bool, &lcp_wantoptions[0].passive,
-      "Set passive mode", OPT_ALIAS | 1 },
-
-    { "silent", o_bool, &lcp_wantoptions[0].silent,
-      "Set silent mode", 1 },
-
-    { "lcp-echo-failure", o_int, &lcp_echo_fails,
-      "Set number of consecutive echo failures to indicate link failure",
-      OPT_PRIO },
-    { "lcp-echo-interval", o_int, &lcp_echo_interval,
-      "Set time in seconds between LCP echo requests", OPT_PRIO },
-#if PPP_LCP_ADAPTIVE
-    { "lcp-echo-adaptive", o_bool, &lcp_echo_adaptive,
-      "Suppress LCP echo requests if traffic was received", 1 },
-#endif
-    { "lcp-restart", o_int, &lcp_fsm[0].timeouttime,
-      "Set time in seconds between LCP retransmissions", OPT_PRIO },
-    { "lcp-max-terminate", o_int, &lcp_fsm[0].maxtermtransmits,
-      "Set maximum number of LCP terminate-request transmissions", OPT_PRIO },
-    { "lcp-max-configure", o_int, &lcp_fsm[0].maxconfreqtransmits,
-      "Set maximum number of LCP configure-request transmissions", OPT_PRIO },
-    { "lcp-max-failure", o_int, &lcp_fsm[0].maxnakloops,
-      "Set limit on number of LCP configure-naks", OPT_PRIO },
-
-    { "receive-all", o_bool, &lax_recv,
-      "Accept all received control characters", 1 },
-
-#ifdef HAVE_MULTILINK
-    { "mrru", o_int, &lcp_wantoptions[0].mrru,
-      "Maximum received packet size for multilink bundle",
-      OPT_PRIO, &lcp_wantoptions[0].neg_mrru },
-
-    { "mpshortseq", o_bool, &lcp_wantoptions[0].neg_ssnhf,
-      "Use short sequence numbers in multilink headers",
-      OPT_PRIO | 1, &lcp_allowoptions[0].neg_ssnhf },
-    { "nompshortseq", o_bool, &lcp_wantoptions[0].neg_ssnhf,
-      "Don't use short sequence numbers in multilink headers",
-      OPT_PRIOSUB | OPT_A2CLR, &lcp_allowoptions[0].neg_ssnhf },
-
-    { "endpoint", o_special, (void *) setendpoint,
-      "Endpoint discriminator for multilink",
-      OPT_PRIO | OPT_A2PRINTER, (void *) printendpoint },
-#endif /* HAVE_MULTILINK */
-
-    { "noendpoint", o_bool, &noendpoint,
-      "Don't send or accept multilink endpoint discriminator", 1 },
-
-    {NULL}
-};
-#endif /* PPP_OPTIONS */
-
-/*
- * Callbacks for fsm code.  (CI = Configuration Information)
- */
-static void lcp_resetci(fsm *f);       /* Reset our CI */
-static int  lcp_cilen(fsm *f);         /* Return length of our CI */
-static void lcp_addci(fsm *f, u_char *ucp, int *lenp); /* Add our CI to pkt */
-static int  lcp_ackci(fsm *f, u_char *p, int len); /* Peer ack'd our CI */
-static int  lcp_nakci(fsm *f, u_char *p, int len, int treat_as_reject); /* Peer nak'd our CI */
-static int  lcp_rejci(fsm *f, u_char *p, int len); /* Peer rej'd our CI */
-static int  lcp_reqci(fsm *f, u_char *inp, int *lenp, int reject_if_disagree); /* Rcv peer CI */
-static void lcp_up(fsm *f);            /* We're UP */
-static void lcp_down(fsm *f);          /* We're DOWN */
-static void lcp_starting (fsm *);      /* We need lower layer up */
-static void lcp_finished (fsm *);      /* We need lower layer down */
-static int  lcp_extcode(fsm *f, int code, int id, u_char *inp, int len);
-static void lcp_rprotrej(fsm *f, u_char *inp, int len);
-
-/*
- * routines to send LCP echos to peer
- */
-
-static void lcp_echo_lowerup(ppp_pcb *pcb);
-static void lcp_echo_lowerdown(ppp_pcb *pcb);
-static void LcpEchoTimeout(void *arg);
-static void lcp_received_echo_reply(fsm *f, int id, u_char *inp, int len);
-static void LcpSendEchoRequest(fsm *f);
-static void LcpLinkFailure(fsm *f);
-static void LcpEchoCheck(fsm *f);
-
-static const fsm_callbacks lcp_callbacks = {   /* LCP callback routines */
-    lcp_resetci,               /* Reset our Configuration Information */
-    lcp_cilen,                 /* Length of our Configuration Information */
-    lcp_addci,                 /* Add our Configuration Information */
-    lcp_ackci,                 /* ACK our Configuration Information */
-    lcp_nakci,                 /* NAK our Configuration Information */
-    lcp_rejci,                 /* Reject our Configuration Information */
-    lcp_reqci,                 /* Request peer's Configuration Information */
-    lcp_up,                    /* Called when fsm reaches OPENED state */
-    lcp_down,                  /* Called when fsm leaves OPENED state */
-    lcp_starting,              /* Called when we want the lower layer up */
-    lcp_finished,              /* Called when we want the lower layer down */
-    NULL,                      /* Called when Protocol-Reject received */
-    NULL,                      /* Retransmission is necessary */
-    lcp_extcode,               /* Called to handle LCP-specific codes */
-    "LCP"                      /* String name of protocol */
-};
-
-/*
- * Protocol entry points.
- * Some of these are called directly.
- */
-
-static void lcp_init(ppp_pcb *pcb);
-static void lcp_input(ppp_pcb *pcb, u_char *p, int len);
-static void lcp_protrej(ppp_pcb *pcb);
-#if PRINTPKT_SUPPORT
-static int lcp_printpkt(const u_char *p, int plen,
-               void (*printer) (void *, const char *, ...), void *arg);
-#endif /* PRINTPKT_SUPPORT */
-
-const struct protent lcp_protent = {
-    PPP_LCP,
-    lcp_init,
-    lcp_input,
-    lcp_protrej,
-    lcp_lowerup,
-    lcp_lowerdown,
-    lcp_open,
-    lcp_close,
-#if PRINTPKT_SUPPORT
-    lcp_printpkt,
-#endif /* PRINTPKT_SUPPORT */
-#if PPP_DATAINPUT
-    NULL,
-#endif /* PPP_DATAINPUT */
-#if PRINTPKT_SUPPORT
-    "LCP",
-    NULL,
-#endif /* PRINTPKT_SUPPORT */
-#if PPP_OPTIONS
-    lcp_option_list,
-    NULL,
-#endif /* PPP_OPTIONS */
-#if DEMAND_SUPPORT
-    NULL,
-    NULL
-#endif /* DEMAND_SUPPORT */
-};
-
-/*
- * Length of each type of configuration option (in octets)
- */
-#define CILEN_VOID     2
-#define CILEN_CHAR     3
-#define CILEN_SHORT    4       /* CILEN_VOID + 2 */
-#if CHAP_SUPPORT
-#define CILEN_CHAP     5       /* CILEN_VOID + 2 + 1 */
-#endif /* CHAP_SUPPORT */
-#define CILEN_LONG     6       /* CILEN_VOID + 4 */
-#if LQR_SUPPORT
-#define CILEN_LQR      8       /* CILEN_VOID + 2 + 4 */
-#endif /* LQR_SUPPORT */
-#define CILEN_CBCP     3
-
-#define CODENAME(x)    ((x) == CONFACK ? "ACK" : \
-                        (x) == CONFNAK ? "NAK" : "REJ")
-
-#if PPP_OPTIONS
-/*
- * noopt - Disable all options (why?).
- */
-static int
-noopt(argv)
-    char **argv;
-{
-    BZERO((char *) &lcp_wantoptions[0], sizeof (struct lcp_options));
-    BZERO((char *) &lcp_allowoptions[0], sizeof (struct lcp_options));
-
-    return (1);
-}
-#endif /* PPP_OPTIONS */
-
-#ifdef HAVE_MULTILINK
-static int
-setendpoint(argv)
-    char **argv;
-{
-    if (str_to_epdisc(&lcp_wantoptions[0].endpoint, *argv)) {
-       lcp_wantoptions[0].neg_endpoint = 1;
-       return 1;
-    }
-    option_error("Can't parse '%s' as an endpoint discriminator", *argv);
-    return 0;
-}
-
-static void
-printendpoint(opt, printer, arg)
-    option_t *opt;
-    void (*printer) (void *, char *, ...);
-    void *arg;
-{
-       printer(arg, "%s", epdisc_to_str(&lcp_wantoptions[0].endpoint));
-}
-#endif /* HAVE_MULTILINK */
-
-/*
- * lcp_init - Initialize LCP.
- */
-static void lcp_init(ppp_pcb *pcb) {
-    fsm *f = &pcb->lcp_fsm;
-    lcp_options *wo = &pcb->lcp_wantoptions;
-    lcp_options *ao = &pcb->lcp_allowoptions;
-
-    f->pcb = pcb;
-    f->protocol = PPP_LCP;
-    f->callbacks = &lcp_callbacks;
-
-    fsm_init(f);
-
-    BZERO(wo, sizeof(*wo));
-    wo->neg_mru = 1;
-    wo->mru = PPP_DEFMRU;
-    wo->neg_asyncmap = 1;
-    wo->neg_magicnumber = 1;
-    wo->neg_pcompression = 1;
-    wo->neg_accompression = 1;
-
-    BZERO(ao, sizeof(*ao));
-    ao->neg_mru = 1;
-    ao->mru = PPP_MAXMRU;
-    ao->neg_asyncmap = 1;
-#if CHAP_SUPPORT
-    ao->neg_chap = 1;
-    ao->chap_mdtype = CHAP_MDTYPE_SUPPORTED;
-#endif /* CHAP_SUPPORT */
-#if PAP_SUPPORT
-    ao->neg_upap = 1;
-#endif /* PAP_SUPPORT */
-#if EAP_SUPPORT
-    ao->neg_eap = 1;
-#endif /* EAP_SUPPORT */
-    ao->neg_magicnumber = 1;
-    ao->neg_pcompression = 1;
-    ao->neg_accompression = 1;
-    ao->neg_endpoint = 1;
-}
-
-
-/*
- * lcp_open - LCP is allowed to come up.
- */
-void lcp_open(ppp_pcb *pcb) {
-    fsm *f = &pcb->lcp_fsm;
-    lcp_options *wo = &pcb->lcp_wantoptions;
-
-    f->flags &= ~(OPT_PASSIVE | OPT_SILENT);
-    if (wo->passive)
-       f->flags |= OPT_PASSIVE;
-    if (wo->silent)
-       f->flags |= OPT_SILENT;
-    fsm_open(f);
-}
-
-
-/*
- * lcp_close - Take LCP down.
- */
-void lcp_close(ppp_pcb *pcb, const char *reason) {
-    fsm *f = &pcb->lcp_fsm;
-    int oldstate;
-
-    if (pcb->phase != PPP_PHASE_DEAD && pcb->phase != PPP_PHASE_MASTER)
-       new_phase(pcb, PPP_PHASE_TERMINATE);
-
-    if (f->flags & DELAYED_UP) {
-       UNTIMEOUT(lcp_delayed_up, f);
-       f->state = PPP_FSM_STOPPED;
-    }
-    oldstate = f->state;
-
-    fsm_close(f, reason);
-    if (oldstate == PPP_FSM_STOPPED && (f->flags & (OPT_PASSIVE|OPT_SILENT|DELAYED_UP))) {
-       /*
-        * This action is not strictly according to the FSM in RFC1548,
-        * but it does mean that the program terminates if you do a
-        * lcp_close() when a connection hasn't been established
-        * because we are in passive/silent mode or because we have
-        * delayed the fsm_lowerup() call and it hasn't happened yet.
-        */
-       f->flags &= ~DELAYED_UP;
-       lcp_finished(f);
-    }
-}
-
-
-/*
- * lcp_lowerup - The lower layer is up.
- */
-void lcp_lowerup(ppp_pcb *pcb) {
-    lcp_options *wo = &pcb->lcp_wantoptions;
-    fsm *f = &pcb->lcp_fsm;
-    /*
-     * Don't use A/C or protocol compression on transmission,
-     * but accept A/C and protocol compressed packets
-     * if we are going to ask for A/C and protocol compression.
-     */
-    if (ppp_send_config(pcb, PPP_MRU, 0xffffffff, 0, 0) < 0
-       || ppp_recv_config(pcb, PPP_MRU, (pcb->settings.lax_recv? 0: 0xffffffff),
-                          wo->neg_pcompression, wo->neg_accompression) < 0)
-           return;
-    pcb->peer_mru = PPP_MRU;
-
-    if (pcb->settings.listen_time != 0) {
-       f->flags |= DELAYED_UP;
-       TIMEOUTMS(lcp_delayed_up, f, pcb->settings.listen_time);
-    } else
-       fsm_lowerup(f);
-}
-
-
-/*
- * lcp_lowerdown - The lower layer is down.
- */
-void lcp_lowerdown(ppp_pcb *pcb) {
-    fsm *f = &pcb->lcp_fsm;
-
-    if (f->flags & DELAYED_UP) {
-       f->flags &= ~DELAYED_UP;
-       UNTIMEOUT(lcp_delayed_up, f);
-    } else
-       fsm_lowerdown(f);
-}
-
-
-/*
- * lcp_delayed_up - Bring the lower layer up now.
- */
-static void lcp_delayed_up(void *arg) {
-    fsm *f = (fsm*)arg;
-
-    if (f->flags & DELAYED_UP) {
-       f->flags &= ~DELAYED_UP;
-       fsm_lowerup(f);
-    }
-}
-
-
-/*
- * lcp_input - Input LCP packet.
- */
-static void lcp_input(ppp_pcb *pcb, u_char *p, int len) {
-    fsm *f = &pcb->lcp_fsm;
-
-    if (f->flags & DELAYED_UP) {
-       f->flags &= ~DELAYED_UP;
-       UNTIMEOUT(lcp_delayed_up, f);
-       fsm_lowerup(f);
-    }
-    fsm_input(f, p, len);
-}
-
-/*
- * lcp_extcode - Handle a LCP-specific code.
- */
-static int lcp_extcode(fsm *f, int code, int id, u_char *inp, int len) {
-    ppp_pcb *pcb = f->pcb;
-    lcp_options *go = &pcb->lcp_gotoptions;
-    u_char *magp;
-
-    switch( code ){
-    case PROTREJ:
-       lcp_rprotrej(f, inp, len);
-       break;
-    
-    case ECHOREQ:
-       if (f->state != PPP_FSM_OPENED)
-           break;
-       magp = inp;
-       PUTLONG(go->magicnumber, magp);
-       fsm_sdata(f, ECHOREP, id, inp, len);
-       break;
-    
-    case ECHOREP:
-       lcp_received_echo_reply(f, id, inp, len);
-       break;
-
-    case DISCREQ:
-    case IDENTIF:
-    case TIMEREM:
-       break;
-
-    default:
-       return 0;
-    }
-    return 1;
-}
-
-    
-/*
- * lcp_rprotrej - Receive an Protocol-Reject.
- *
- * Figure out which protocol is rejected and inform it.
- */
-static void lcp_rprotrej(fsm *f, u_char *inp, int len) {
-    int i;
-    const struct protent *protp;
-    u_short prot;
-#if PPP_PROTOCOLNAME
-    const char *pname;
-#endif /* PPP_PROTOCOLNAME */
-
-    if (len < 2) {
-       LCPDEBUG(("lcp_rprotrej: Rcvd short Protocol-Reject packet!"));
-       return;
-    }
-
-    GETSHORT(prot, inp);
-
-    /*
-     * Protocol-Reject packets received in any state other than the LCP
-     * OPENED state SHOULD be silently discarded.
-     */
-    if( f->state != PPP_FSM_OPENED ){
-       LCPDEBUG(("Protocol-Reject discarded: LCP in state %d", f->state));
-       return;
-    }
-
-#if PPP_PROTOCOLNAME
-    pname = protocol_name(prot);
-#endif /* PPP_PROTOCOLNAME */
-
-    /*
-     * Upcall the proper Protocol-Reject routine.
-     */
-    for (i = 0; (protp = protocols[i]) != NULL; ++i)
-       if (protp->protocol == prot) {
-#if PPP_PROTOCOLNAME
-           if (pname != NULL)
-               ppp_dbglog("Protocol-Reject for '%s' (0x%x) received", pname,
-                      prot);
-           else
-#endif /* PPP_PROTOCOLNAME */
-               ppp_dbglog("Protocol-Reject for 0x%x received", prot);
-           (*protp->protrej)(f->pcb);
-           return;
-       }
-
-#if PPP_PROTOCOLNAME
-    if (pname != NULL)
-       ppp_warn("Protocol-Reject for unsupported protocol '%s' (0x%x)", pname,
-            prot);
-    else
-#endif /* #if PPP_PROTOCOLNAME */
-       ppp_warn("Protocol-Reject for unsupported protocol 0x%x", prot);
-}
-
-
-/*
- * lcp_protrej - A Protocol-Reject was received.
- */
-/*ARGSUSED*/
-static void lcp_protrej(ppp_pcb *pcb) {
-    /*
-     * Can't reject LCP!
-     */
-    ppp_error("Received Protocol-Reject for LCP!");
-    fsm_protreject(&pcb->lcp_fsm);
-}
-
-
-/*
- * lcp_sprotrej - Send a Protocol-Reject for some protocol.
- */
-void lcp_sprotrej(ppp_pcb *pcb, u_char *p, int len) {
-    fsm *f = &pcb->lcp_fsm;
-    /*
-     * Send back the protocol and the information field of the
-     * rejected packet.  We only get here if LCP is in the OPENED state.
-     */
-#if 0
-    p += 2;
-    len -= 2;
-#endif
-
-    fsm_sdata(f, PROTREJ, ++f->id,
-             p, len);
-}
-
-
-/*
- * lcp_resetci - Reset our CI.
- */
-static void lcp_resetci(fsm *f) {
-    ppp_pcb *pcb = f->pcb;
-    lcp_options *wo = &pcb->lcp_wantoptions;
-    lcp_options *go = &pcb->lcp_gotoptions;
-    lcp_options *ao = &pcb->lcp_allowoptions;
-
-#if PPP_AUTH_SUPPORT
-
-    /* note: default value is true for allow options */
-    if (pcb->settings.user && pcb->settings.passwd) {
-#if PAP_SUPPORT
-      if (pcb->settings.refuse_pap) {
-        ao->neg_upap = 0;
-      }
-#endif /* PAP_SUPPORT */
-#if CHAP_SUPPORT
-      if (pcb->settings.refuse_chap) {
-        ao->chap_mdtype &= ~MDTYPE_MD5;
-      }
-#if MSCHAP_SUPPORT
-      if (pcb->settings.refuse_mschap) {
-        ao->chap_mdtype &= ~MDTYPE_MICROSOFT;
-      }
-      if (pcb->settings.refuse_mschap_v2) {
-        ao->chap_mdtype &= ~MDTYPE_MICROSOFT_V2;
-      }
-#endif /* MSCHAP_SUPPORT */
-      ao->neg_chap = (ao->chap_mdtype != MDTYPE_NONE);
-#endif /* CHAP_SUPPORT */
-#if EAP_SUPPORT
-      if (pcb->settings.refuse_eap) {
-        ao->neg_eap = 0;
-      }
-#endif /* EAP_SUPPORT */
-
-#if PPP_SERVER
-      /* note: default value is false for wanted options */
-      if (pcb->settings.auth_required) {
-#if PAP_SUPPORT
-        if (!pcb->settings.refuse_pap) {
-          wo->neg_upap = 1;
-        }
-#endif /* PAP_SUPPORT */
-#if CHAP_SUPPORT
-        if (!pcb->settings.refuse_chap) {
-          wo->chap_mdtype |= MDTYPE_MD5;
-        }
-#if MSCHAP_SUPPORT
-        if (!pcb->settings.refuse_mschap) {
-          wo->chap_mdtype |= MDTYPE_MICROSOFT;
-        }
-        if (!pcb->settings.refuse_mschap_v2) {
-          wo->chap_mdtype |= MDTYPE_MICROSOFT_V2;
-        }
-#endif /* MSCHAP_SUPPORT */
-        wo->neg_chap = (wo->chap_mdtype != MDTYPE_NONE);
-#endif /* CHAP_SUPPORT */
-#if EAP_SUPPORT
-        if (!pcb->settings.refuse_eap) {
-          wo->neg_eap = 1;
-        }
-#endif /* EAP_SUPPORT */
-      }
-#endif /* PPP_SERVER */
-
-    } else {
-#if PAP_SUPPORT
-      ao->neg_upap = 0;
-#endif /* PAP_SUPPORT */
-#if CHAP_SUPPORT
-      ao->neg_chap = 0;
-      ao->chap_mdtype = MDTYPE_NONE;
-#endif /* CHAP_SUPPORT */
-#if EAP_SUPPORT
-      ao->neg_eap = 0;
-#endif /* EAP_SUPPORT */
-    }
-
-    PPPDEBUG(LOG_DEBUG, ("ppp: auth protocols:"));
-#if PAP_SUPPORT
-    PPPDEBUG(LOG_DEBUG, (" PAP=%d", ao->neg_upap));
-#endif /* PAP_SUPPORT */
-#if CHAP_SUPPORT
-    PPPDEBUG(LOG_DEBUG, (" CHAP=%d CHAP_MD5=%d", ao->neg_chap, !!(ao->chap_mdtype&MDTYPE_MD5)));
-#if MSCHAP_SUPPORT
-    PPPDEBUG(LOG_DEBUG, (" CHAP_MS=%d CHAP_MS2=%d", !!(ao->chap_mdtype&MDTYPE_MICROSOFT), !!(ao->chap_mdtype&MDTYPE_MICROSOFT_V2)));
-#endif /* MSCHAP_SUPPORT */
-#endif /* CHAP_SUPPORT */
-#if EAP_SUPPORT
-    PPPDEBUG(LOG_DEBUG, (" EAP=%d", ao->neg_eap));
-#endif /* EAP_SUPPORT */
-    PPPDEBUG(LOG_DEBUG, ("\n"));
-
-#endif /* PPP_AUTH_SUPPORT */
-
-    wo->magicnumber = magic();
-    wo->numloops = 0;
-    *go = *wo;
-#ifdef HAVE_MULTILINK
-    if (!multilink) {
-       go->neg_mrru = 0;
-#endif /* HAVE_MULTILINK */
-       go->neg_ssnhf = 0;
-       go->neg_endpoint = 0;
-#ifdef HAVE_MULTILINK
-    }
-#endif /* HAVE_MULTILINK */
-    if (pcb->settings.noendpoint)
-       ao->neg_endpoint = 0;
-    pcb->peer_mru = PPP_MRU;
-#if 0 /* UNUSED */
-    auth_reset(pcb);
-#endif /* UNUSED */
-}
-
-
-/*
- * lcp_cilen - Return length of our CI.
- */
-static int lcp_cilen(fsm *f) {
-    ppp_pcb *pcb = f->pcb;
-    lcp_options *go = &pcb->lcp_gotoptions;
-
-#define LENCIVOID(neg) ((neg) ? CILEN_VOID : 0)
-#if CHAP_SUPPORT
-#define LENCICHAP(neg) ((neg) ? CILEN_CHAP : 0)
-#endif /* CHAP_SUPPORT */
-#define LENCISHORT(neg)        ((neg) ? CILEN_SHORT : 0)
-#define LENCILONG(neg) ((neg) ? CILEN_LONG : 0)
-#if LQR_SUPPORT
-#define LENCILQR(neg)  ((neg) ? CILEN_LQR: 0)
-#endif /* LQR_SUPPORT */
-#define LENCICBCP(neg) ((neg) ? CILEN_CBCP: 0)
-    /*
-     * NB: we only ask for one of CHAP, UPAP, or EAP, even if we will
-     * accept more than one.  We prefer EAP first, then CHAP, then
-     * PAP.
-     */
-    return (LENCISHORT(go->neg_mru && go->mru != PPP_DEFMRU) +
-           LENCILONG(go->neg_asyncmap && go->asyncmap != 0xFFFFFFFF) +
-#if EAP_SUPPORT
-           LENCISHORT(go->neg_eap) +
-#endif /* EAP_SUPPORT */
-#if CHAP_SUPPORT /* cannot be improved, embedding a directive within macro arguments is not portable */
-#if EAP_SUPPORT
-           LENCICHAP(!go->neg_eap && go->neg_chap) +
-#endif /* EAP_SUPPORT */
-#if !EAP_SUPPORT
-           LENCICHAP(go->neg_chap) +
-#endif /* !EAP_SUPPORT */
-#endif /* CHAP_SUPPORT */
-#if PAP_SUPPORT /* cannot be improved, embedding a directive within macro arguments is not portable */
-#if EAP_SUPPORT && CHAP_SUPPORT
-           LENCISHORT(!go->neg_eap && !go->neg_chap && go->neg_upap) +
-#endif /* EAP_SUPPORT && CHAP_SUPPORT */
-#if EAP_SUPPORT && !CHAP_SUPPORT
-           LENCISHORT(!go->neg_eap && go->neg_upap) +
-#endif /* EAP_SUPPORT && !CHAP_SUPPORT */
-#if !EAP_SUPPORT && CHAP_SUPPORT
-           LENCISHORT(!go->neg_chap && go->neg_upap) +
-#endif /* !EAP_SUPPORT && CHAP_SUPPORT */
-#if !EAP_SUPPORT && !CHAP_SUPPORT
-           LENCISHORT(go->neg_upap) +
-#endif /* !EAP_SUPPORT && !CHAP_SUPPORT */
-#endif /* PAP_SUPPORT */
-#if LQR_SUPPORT
-           LENCILQR(go->neg_lqr) +
-#endif /* LQR_SUPPORT */
-           LENCICBCP(go->neg_cbcp) +
-           LENCILONG(go->neg_magicnumber) +
-           LENCIVOID(go->neg_pcompression) +
-           LENCIVOID(go->neg_accompression) +
-#ifdef HAVE_MULTILINK
-           LENCISHORT(go->neg_mrru) +
-#endif /* HAVE_MULTILINK */
-           LENCIVOID(go->neg_ssnhf) +
-           (go->neg_endpoint? CILEN_CHAR + go->endpoint.length: 0));
-}
-
-
-/*
- * lcp_addci - Add our desired CIs to a packet.
- */
-static void lcp_addci(fsm *f, u_char *ucp, int *lenp) {
-    ppp_pcb *pcb = f->pcb;
-    lcp_options *go = &pcb->lcp_gotoptions;
-    u_char *start_ucp = ucp;
-
-#define ADDCIVOID(opt, neg) \
-    if (neg) { \
-       PUTCHAR(opt, ucp); \
-       PUTCHAR(CILEN_VOID, ucp); \
-    }
-#define ADDCISHORT(opt, neg, val) \
-    if (neg) { \
-       PUTCHAR(opt, ucp); \
-       PUTCHAR(CILEN_SHORT, ucp); \
-       PUTSHORT(val, ucp); \
-    }
-#if CHAP_SUPPORT
-#define ADDCICHAP(opt, neg, val) \
-    if (neg) { \
-       PUTCHAR((opt), ucp); \
-       PUTCHAR(CILEN_CHAP, ucp); \
-       PUTSHORT(PPP_CHAP, ucp); \
-       PUTCHAR((CHAP_DIGEST(val)), ucp); \
-    }
-#endif /* CHAP_SUPPORT */
-#define ADDCILONG(opt, neg, val) \
-    if (neg) { \
-       PUTCHAR(opt, ucp); \
-       PUTCHAR(CILEN_LONG, ucp); \
-       PUTLONG(val, ucp); \
-    }
-#if LQR_SUPPORT
-#define ADDCILQR(opt, neg, val) \
-    if (neg) { \
-       PUTCHAR(opt, ucp); \
-       PUTCHAR(CILEN_LQR, ucp); \
-       PUTSHORT(PPP_LQR, ucp); \
-       PUTLONG(val, ucp); \
-    }
-#endif /* LQR_SUPPORT */
-#define ADDCICHAR(opt, neg, val) \
-    if (neg) { \
-       PUTCHAR(opt, ucp); \
-       PUTCHAR(CILEN_CHAR, ucp); \
-       PUTCHAR(val, ucp); \
-    }
-#define ADDCIENDP(opt, neg, class, val, len) \
-    if (neg) { \
-       int i; \
-       PUTCHAR(opt, ucp); \
-       PUTCHAR(CILEN_CHAR + len, ucp); \
-       PUTCHAR(class, ucp); \
-       for (i = 0; i < len; ++i) \
-           PUTCHAR(val[i], ucp); \
-    }
-
-    ADDCISHORT(CI_MRU, go->neg_mru && go->mru != PPP_DEFMRU, go->mru);
-    ADDCILONG(CI_ASYNCMAP, go->neg_asyncmap && go->asyncmap != 0xFFFFFFFF,
-             go->asyncmap);
-#if EAP_SUPPORT
-    ADDCISHORT(CI_AUTHTYPE, go->neg_eap, PPP_EAP);
-#endif /* EAP_SUPPORT */
-#if CHAP_SUPPORT /* cannot be improved, embedding a directive within macro arguments is not portable */
-#if EAP_SUPPORT
-    ADDCICHAP(CI_AUTHTYPE, !go->neg_eap && go->neg_chap, go->chap_mdtype);
-#endif /* EAP_SUPPORT */
-#if !EAP_SUPPORT
-    ADDCICHAP(CI_AUTHTYPE, go->neg_chap, go->chap_mdtype);
-#endif /* !EAP_SUPPORT */
-#endif /* CHAP_SUPPORT */
-#if PAP_SUPPORT /* cannot be improved, embedding a directive within macro arguments is not portable */
-#if EAP_SUPPORT && CHAP_SUPPORT
-    ADDCISHORT(CI_AUTHTYPE, !go->neg_eap && !go->neg_chap && go->neg_upap, PPP_PAP);
-#endif /* EAP_SUPPORT && CHAP_SUPPORT */
-#if EAP_SUPPORT && !CHAP_SUPPORT
-    ADDCISHORT(CI_AUTHTYPE, !go->neg_eap && go->neg_upap, PPP_PAP);
-#endif /* EAP_SUPPORT && !CHAP_SUPPORT */
-#if !EAP_SUPPORT && CHAP_SUPPORT
-    ADDCISHORT(CI_AUTHTYPE, !go->neg_chap && go->neg_upap, PPP_PAP);
-#endif /* !EAP_SUPPORT && CHAP_SUPPORT */
-#if !EAP_SUPPORT && !CHAP_SUPPORT
-    ADDCISHORT(CI_AUTHTYPE, go->neg_upap, PPP_PAP);
-#endif /* !EAP_SUPPORT && !CHAP_SUPPORT */
-#endif /* PAP_SUPPORT */
-#if LQR_SUPPORT
-    ADDCILQR(CI_QUALITY, go->neg_lqr, go->lqr_period);
-#endif /* LQR_SUPPORT */
-    ADDCICHAR(CI_CALLBACK, go->neg_cbcp, CBCP_OPT);
-    ADDCILONG(CI_MAGICNUMBER, go->neg_magicnumber, go->magicnumber);
-    ADDCIVOID(CI_PCOMPRESSION, go->neg_pcompression);
-    ADDCIVOID(CI_ACCOMPRESSION, go->neg_accompression);
-#ifdef HAVE_MULTILINK
-    ADDCISHORT(CI_MRRU, go->neg_mrru, go->mrru);
-#endif
-    ADDCIVOID(CI_SSNHF, go->neg_ssnhf);
-    ADDCIENDP(CI_EPDISC, go->neg_endpoint, go->endpoint.class_,
-             go->endpoint.value, go->endpoint.length);
-
-    if (ucp - start_ucp != *lenp) {
-       /* this should never happen, because peer_mtu should be 1500 */
-       ppp_error("Bug in lcp_addci: wrong length");
-    }
-}
-
-
-/*
- * lcp_ackci - Ack our CIs.
- * This should not modify any state if the Ack is bad.
- *
- * Returns:
- *     0 - Ack was bad.
- *     1 - Ack was good.
- */
-static int lcp_ackci(fsm *f, u_char *p, int len) {
-    ppp_pcb *pcb = f->pcb;
-    lcp_options *go = &pcb->lcp_gotoptions;
-    u_char cilen, citype, cichar;
-    u_short cishort;
-    u32_t cilong;
-
-    /*
-     * CIs must be in exactly the same order that we sent.
-     * Check packet length and CI length at each step.
-     * If we find any deviations, then this packet is bad.
-     */
-#define ACKCIVOID(opt, neg) \
-    if (neg) { \
-       if ((len -= CILEN_VOID) < 0) \
-           goto bad; \
-       GETCHAR(citype, p); \
-       GETCHAR(cilen, p); \
-       if (cilen != CILEN_VOID || \
-           citype != opt) \
-           goto bad; \
-    }
-#define ACKCISHORT(opt, neg, val) \
-    if (neg) { \
-       if ((len -= CILEN_SHORT) < 0) \
-           goto bad; \
-       GETCHAR(citype, p); \
-       GETCHAR(cilen, p); \
-       if (cilen != CILEN_SHORT || \
-           citype != opt) \
-           goto bad; \
-       GETSHORT(cishort, p); \
-       if (cishort != val) \
-           goto bad; \
-    }
-#define ACKCICHAR(opt, neg, val) \
-    if (neg) { \
-       if ((len -= CILEN_CHAR) < 0) \
-           goto bad; \
-       GETCHAR(citype, p); \
-       GETCHAR(cilen, p); \
-       if (cilen != CILEN_CHAR || \
-           citype != opt) \
-           goto bad; \
-       GETCHAR(cichar, p); \
-       if (cichar != val) \
-           goto bad; \
-    }
-#if CHAP_SUPPORT
-#define ACKCICHAP(opt, neg, val) \
-    if (neg) { \
-       if ((len -= CILEN_CHAP) < 0) \
-           goto bad; \
-       GETCHAR(citype, p); \
-       GETCHAR(cilen, p); \
-       if (cilen != CILEN_CHAP || \
-           citype != (opt)) \
-           goto bad; \
-       GETSHORT(cishort, p); \
-       if (cishort != PPP_CHAP) \
-           goto bad; \
-       GETCHAR(cichar, p); \
-       if (cichar != (CHAP_DIGEST(val))) \
-         goto bad; \
-    }
-#endif /* CHAP_SUPPORT */
-#define ACKCILONG(opt, neg, val) \
-    if (neg) { \
-       if ((len -= CILEN_LONG) < 0) \
-           goto bad; \
-       GETCHAR(citype, p); \
-       GETCHAR(cilen, p); \
-       if (cilen != CILEN_LONG || \
-           citype != opt) \
-           goto bad; \
-       GETLONG(cilong, p); \
-       if (cilong != val) \
-           goto bad; \
-    }
-#if LQR_SUPPORT
-#define ACKCILQR(opt, neg, val) \
-    if (neg) { \
-       if ((len -= CILEN_LQR) < 0) \
-           goto bad; \
-       GETCHAR(citype, p); \
-       GETCHAR(cilen, p); \
-       if (cilen != CILEN_LQR || \
-           citype != opt) \
-           goto bad; \
-       GETSHORT(cishort, p); \
-       if (cishort != PPP_LQR) \
-           goto bad; \
-       GETLONG(cilong, p); \
-       if (cilong != val) \
-         goto bad; \
-    }
-#endif /* LQR_SUPPORT */
-#define ACKCIENDP(opt, neg, class, val, vlen) \
-    if (neg) { \
-       int i; \
-       if ((len -= CILEN_CHAR + vlen) < 0) \
-           goto bad; \
-       GETCHAR(citype, p); \
-       GETCHAR(cilen, p); \
-       if (cilen != CILEN_CHAR + vlen || \
-           citype != opt) \
-           goto bad; \
-       GETCHAR(cichar, p); \
-       if (cichar != class) \
-           goto bad; \
-       for (i = 0; i < vlen; ++i) { \
-           GETCHAR(cichar, p); \
-           if (cichar != val[i]) \
-               goto bad; \
-       } \
-    }
-
-    ACKCISHORT(CI_MRU, go->neg_mru && go->mru != PPP_DEFMRU, go->mru);
-    ACKCILONG(CI_ASYNCMAP, go->neg_asyncmap && go->asyncmap != 0xFFFFFFFF,
-             go->asyncmap);
-#if EAP_SUPPORT
-    ACKCISHORT(CI_AUTHTYPE, go->neg_eap, PPP_EAP);
-#endif /* EAP_SUPPORT */
-#if CHAP_SUPPORT /* cannot be improved, embedding a directive within macro arguments is not portable */
-#if EAP_SUPPORT
-    ACKCICHAP(CI_AUTHTYPE, !go->neg_eap && go->neg_chap, go->chap_mdtype);
-#endif /* EAP_SUPPORT */
-#if !EAP_SUPPORT
-    ACKCICHAP(CI_AUTHTYPE, go->neg_chap, go->chap_mdtype);
-#endif /* !EAP_SUPPORT */
-#endif /* CHAP_SUPPORT */
-#if PAP_SUPPORT /* cannot be improved, embedding a directive within macro arguments is not portable */
-#if EAP_SUPPORT && CHAP_SUPPORT
-    ACKCISHORT(CI_AUTHTYPE, !go->neg_eap && !go->neg_chap && go->neg_upap, PPP_PAP);
-#endif /* EAP_SUPPORT && CHAP_SUPPORT */
-#if EAP_SUPPORT && !CHAP_SUPPORT
-    ACKCISHORT(CI_AUTHTYPE, !go->neg_eap && go->neg_upap, PPP_PAP);
-#endif /* EAP_SUPPORT && !CHAP_SUPPORT */
-#if !EAP_SUPPORT && CHAP_SUPPORT
-    ACKCISHORT(CI_AUTHTYPE, !go->neg_chap && go->neg_upap, PPP_PAP);
-#endif /* !EAP_SUPPORT && CHAP_SUPPORT */
-#if !EAP_SUPPORT && !CHAP_SUPPORT
-    ACKCISHORT(CI_AUTHTYPE, go->neg_upap, PPP_PAP);
-#endif /* !EAP_SUPPORT && !CHAP_SUPPORT */
-#endif /* PAP_SUPPORT */
-#if LQR_SUPPORT
-    ACKCILQR(CI_QUALITY, go->neg_lqr, go->lqr_period);
-#endif /* LQR_SUPPORT */
-    ACKCICHAR(CI_CALLBACK, go->neg_cbcp, CBCP_OPT);
-    ACKCILONG(CI_MAGICNUMBER, go->neg_magicnumber, go->magicnumber);
-    ACKCIVOID(CI_PCOMPRESSION, go->neg_pcompression);
-    ACKCIVOID(CI_ACCOMPRESSION, go->neg_accompression);
-#ifdef HAVE_MULTILINK
-    ACKCISHORT(CI_MRRU, go->neg_mrru, go->mrru);
-#endif /* HAVE_MULTILINK */
-    ACKCIVOID(CI_SSNHF, go->neg_ssnhf);
-    ACKCIENDP(CI_EPDISC, go->neg_endpoint, go->endpoint.class_,
-             go->endpoint.value, go->endpoint.length);
-
-    /*
-     * If there are any remaining CIs, then this packet is bad.
-     */
-    if (len != 0)
-       goto bad;
-    return (1);
-bad:
-    LCPDEBUG(("lcp_acki: received bad Ack!"));
-    return (0);
-}
-
-
-/*
- * lcp_nakci - Peer has sent a NAK for some of our CIs.
- * This should not modify any state if the Nak is bad
- * or if LCP is in the OPENED state.
- *
- * Returns:
- *     0 - Nak was bad.
- *     1 - Nak was good.
- */
-static int lcp_nakci(fsm *f, u_char *p, int len, int treat_as_reject) {
-    ppp_pcb *pcb = f->pcb;
-    lcp_options *go = &pcb->lcp_gotoptions;
-    lcp_options *wo = &pcb->lcp_wantoptions;
-    u_char citype, cichar, *next;
-    u_short cishort;
-    u32_t cilong;
-    lcp_options no;            /* options we've seen Naks for */
-    lcp_options try_;          /* options to request next time */
-    int looped_back = 0;
-    int cilen;
-
-    BZERO(&no, sizeof(no));
-    try_ = *go;
-
-    /*
-     * Any Nak'd CIs must be in exactly the same order that we sent.
-     * Check packet length and CI length at each step.
-     * If we find any deviations, then this packet is bad.
-     */
-#define NAKCIVOID(opt, neg) \
-    if (go->neg && \
-       len >= CILEN_VOID && \
-       p[1] == CILEN_VOID && \
-       p[0] == opt) { \
-       len -= CILEN_VOID; \
-       INCPTR(CILEN_VOID, p); \
-       no.neg = 1; \
-       try_.neg = 0; \
-    }
-#if CHAP_SUPPORT
-#define NAKCICHAP(opt, neg, code) \
-    if (go->neg && \
-       len >= CILEN_CHAP && \
-       p[1] == CILEN_CHAP && \
-       p[0] == opt) { \
-       len -= CILEN_CHAP; \
-       INCPTR(2, p); \
-       GETSHORT(cishort, p); \
-       GETCHAR(cichar, p); \
-       no.neg = 1; \
-       code \
-    }
-#endif /* CHAP_SUPPORT */
-#define NAKCICHAR(opt, neg, code) \
-    if (go->neg && \
-       len >= CILEN_CHAR && \
-       p[1] == CILEN_CHAR && \
-       p[0] == opt) { \
-       len -= CILEN_CHAR; \
-       INCPTR(2, p); \
-       GETCHAR(cichar, p); \
-       no.neg = 1; \
-       code \
-    }
-#define NAKCISHORT(opt, neg, code) \
-    if (go->neg && \
-       len >= CILEN_SHORT && \
-       p[1] == CILEN_SHORT && \
-       p[0] == opt) { \
-       len -= CILEN_SHORT; \
-       INCPTR(2, p); \
-       GETSHORT(cishort, p); \
-       no.neg = 1; \
-       code \
-    }
-#define NAKCILONG(opt, neg, code) \
-    if (go->neg && \
-       len >= CILEN_LONG && \
-       p[1] == CILEN_LONG && \
-       p[0] == opt) { \
-       len -= CILEN_LONG; \
-       INCPTR(2, p); \
-       GETLONG(cilong, p); \
-       no.neg = 1; \
-       code \
-    }
-#if LQR_SUPPORT
-#define NAKCILQR(opt, neg, code) \
-    if (go->neg && \
-       len >= CILEN_LQR && \
-       p[1] == CILEN_LQR && \
-       p[0] == opt) { \
-       len -= CILEN_LQR; \
-       INCPTR(2, p); \
-       GETSHORT(cishort, p); \
-       GETLONG(cilong, p); \
-       no.neg = 1; \
-       code \
-    }
-#endif /* LQR_SUPPORT */
-#define NAKCIENDP(opt, neg) \
-    if (go->neg && \
-       len >= CILEN_CHAR && \
-       p[0] == opt && \
-       p[1] >= CILEN_CHAR && \
-       p[1] <= len) { \
-       len -= p[1]; \
-       INCPTR(p[1], p); \
-       no.neg = 1; \
-       try_.neg = 0; \
-    }
-
-    /*
-     * NOTE!  There must be no assignments to individual fields of *go in
-     * the code below.  Any such assignment is a BUG!
-     */
-    /*
-     * We don't care if they want to send us smaller packets than
-     * we want.  Therefore, accept any MRU less than what we asked for,
-     * but then ignore the new value when setting the MRU in the kernel.
-     * If they send us a bigger MRU than what we asked, accept it, up to
-     * the limit of the default MRU we'd get if we didn't negotiate.
-     */
-    if (go->neg_mru && go->mru != PPP_DEFMRU) {
-       NAKCISHORT(CI_MRU, neg_mru,
-                  if (cishort <= wo->mru || cishort <= PPP_DEFMRU)
-                      try_.mru = cishort;
-                  );
-    }
-
-    /*
-     * Add any characters they want to our (receive-side) asyncmap.
-     */
-    if (go->neg_asyncmap && go->asyncmap != 0xFFFFFFFF) {
-       NAKCILONG(CI_ASYNCMAP, neg_asyncmap,
-                 try_.asyncmap = go->asyncmap | cilong;
-                 );
-    }
-
-    /*
-     * If they've nak'd our authentication-protocol, check whether
-     * they are proposing a different protocol, or a different
-     * hash algorithm for CHAP.
-     */
-    if ((0
-#if CHAP_SUPPORT
-        || go->neg_chap
-#endif /* CHAP_SUPPORT */
-#if PAP_SUPPORT
-        || go->neg_upap
-#endif /* PAP_SUPPORT */
-#if EAP_SUPPORT
-        || go->neg_eap
-#endif /* EAP_SUPPORT */
-        )
-       && len >= CILEN_SHORT
-       && p[0] == CI_AUTHTYPE && p[1] >= CILEN_SHORT && p[1] <= len) {
-       cilen = p[1];
-       len -= cilen;
-#if CHAP_SUPPORT
-       no.neg_chap = go->neg_chap;
-#endif /* CHAP_SUPPORT */
-#if PAP_SUPPORT
-       no.neg_upap = go->neg_upap;
-#endif /* PAP_SUPPORT */
-#if EAP_SUPPORT
-       no.neg_eap = go->neg_eap;
-#endif /* EAP_SUPPORT */
-       INCPTR(2, p);
-       GETSHORT(cishort, p);
-
-#if PAP_SUPPORT
-       if (cishort == PPP_PAP && cilen == CILEN_SHORT) {
-#if EAP_SUPPORT
-           /* If we were asking for EAP, then we need to stop that. */
-           if (go->neg_eap)
-               try_.neg_eap = 0;
-           else
-#endif /* EAP_SUPPORT */
-
-#if CHAP_SUPPORT
-           /* If we were asking for CHAP, then we need to stop that. */
-           if (go->neg_chap)
-               try_.neg_chap = 0;
-           else
-#endif /* CHAP_SUPPORT */
-
-           /*
-            * If we weren't asking for CHAP or EAP, then we were asking for
-            * PAP, in which case this Nak is bad.
-            */
-               goto bad;
-       } else
-#endif /* PAP_SUPPORT */
-
-#if CHAP_SUPPORT
-       if (cishort == PPP_CHAP && cilen == CILEN_CHAP) {
-           GETCHAR(cichar, p);
-#if EAP_SUPPORT
-           /* Stop asking for EAP, if we were. */
-           if (go->neg_eap) {
-               try_.neg_eap = 0;
-               /* Try to set up to use their suggestion, if possible */
-               if (CHAP_CANDIGEST(go->chap_mdtype, cichar))
-                   try_.chap_mdtype = CHAP_MDTYPE_D(cichar);
-           } else
-#endif /* EAP_SUPPORT */
-           if (go->neg_chap) {
-               /*
-                * We were asking for our preferred algorithm, they must
-                * want something different.
-                */
-               if (cichar != CHAP_DIGEST(go->chap_mdtype)) {
-                   if (CHAP_CANDIGEST(go->chap_mdtype, cichar)) {
-                       /* Use their suggestion if we support it ... */
-                       try_.chap_mdtype = CHAP_MDTYPE_D(cichar);
-                   } else {
-                       /* ... otherwise, try our next-preferred algorithm. */
-                       try_.chap_mdtype &= ~(CHAP_MDTYPE(try_.chap_mdtype));
-                       if (try_.chap_mdtype == MDTYPE_NONE) /* out of algos */
-                           try_.neg_chap = 0;
-                   }
-               } else {
-                   /*
-                    * Whoops, they Nak'd our algorithm of choice
-                    * but then suggested it back to us.
-                    */
-                   goto bad;
-               }
-           } else {
-               /*
-                * Stop asking for PAP if we were asking for it.
-                */
-#if PAP_SUPPORT
-               try_.neg_upap = 0;
-#endif /* PAP_SUPPORT */
-           }
-
-       } else
-#endif /* CHAP_SUPPORT */
-       {
-
-#if EAP_SUPPORT
-           /*
-            * If we were asking for EAP, and they're Conf-Naking EAP,
-            * well, that's just strange.  Nobody should do that.
-            */
-           if (cishort == PPP_EAP && cilen == CILEN_SHORT && go->neg_eap)
-               ppp_dbglog("Unexpected Conf-Nak for EAP");
-
-           /*
-            * We don't recognize what they're suggesting.
-            * Stop asking for what we were asking for.
-            */
-           if (go->neg_eap)
-               try_.neg_eap = 0;
-           else
-#endif /* EAP_SUPPORT */
-
-#if CHAP_SUPPORT
-           if (go->neg_chap)
-               try_.neg_chap = 0;
-           else
-#endif /* CHAP_SUPPORT */
-
-#if PAP_SUPPORT
-           if(1)
-               try_.neg_upap = 0;
-           else
-#endif /* PAP_SUPPORT */
-           {}
-
-           p += cilen - CILEN_SHORT;
-       }
-    }
-
-#if LQR_SUPPORT
-    /*
-     * If they can't cope with our link quality protocol, we'll have
-     * to stop asking for LQR.  We haven't got any other protocol.
-     * If they Nak the reporting period, take their value XXX ?
-     */
-    NAKCILQR(CI_QUALITY, neg_lqr,
-            if (cishort != PPP_LQR)
-                try_.neg_lqr = 0;
-            else
-                try_.lqr_period = cilong;
-            );
-#endif /* LQR_SUPPORT */
-
-    /*
-     * Only implementing CBCP...not the rest of the callback options
-     */
-    NAKCICHAR(CI_CALLBACK, neg_cbcp,
-              try_.neg_cbcp = 0;
-              (void)cichar; /* if CHAP support is not compiled, cichar is set but not used, which makes some compilers complaining */
-              );
-
-    /*
-     * Check for a looped-back line.
-     */
-    NAKCILONG(CI_MAGICNUMBER, neg_magicnumber,
-             try_.magicnumber = magic();
-             looped_back = 1;
-             );
-
-    /*
-     * Peer shouldn't send Nak for protocol compression or
-     * address/control compression requests; they should send
-     * a Reject instead.  If they send a Nak, treat it as a Reject.
-     */
-    NAKCIVOID(CI_PCOMPRESSION, neg_pcompression);
-    NAKCIVOID(CI_ACCOMPRESSION, neg_accompression);
-
-#ifdef HAVE_MULTILINK
-    /*
-     * Nak for MRRU option - accept their value if it is smaller
-     * than the one we want.
-     */
-    if (go->neg_mrru) {
-       NAKCISHORT(CI_MRRU, neg_mrru,
-                  if (treat_as_reject)
-                      try_.neg_mrru = 0;
-                  else if (cishort <= wo->mrru)
-                      try_.mrru = cishort;
-                  );
-    }
-#else /* HAVE_MULTILINK */
-    LWIP_UNUSED_ARG(treat_as_reject);
-#endif /* HAVE_MULTILINK */
-
-    /*
-     * Nak for short sequence numbers shouldn't be sent, treat it
-     * like a reject.
-     */
-    NAKCIVOID(CI_SSNHF, neg_ssnhf);
-
-    /*
-     * Nak of the endpoint discriminator option is not permitted,
-     * treat it like a reject.
-     */
-    NAKCIENDP(CI_EPDISC, neg_endpoint);
-
-    /*
-     * There may be remaining CIs, if the peer is requesting negotiation
-     * on an option that we didn't include in our request packet.
-     * If we see an option that we requested, or one we've already seen
-     * in this packet, then this packet is bad.
-     * If we wanted to respond by starting to negotiate on the requested
-     * option(s), we could, but we don't, because except for the
-     * authentication type and quality protocol, if we are not negotiating
-     * an option, it is because we were told not to.
-     * For the authentication type, the Nak from the peer means
-     * `let me authenticate myself with you' which is a bit pointless.
-     * For the quality protocol, the Nak means `ask me to send you quality
-     * reports', but if we didn't ask for them, we don't want them.
-     * An option we don't recognize represents the peer asking to
-     * negotiate some option we don't support, so ignore it.
-     */
-    while (len >= CILEN_VOID) {
-       GETCHAR(citype, p);
-       GETCHAR(cilen, p);
-       if (cilen < CILEN_VOID || (len -= cilen) < 0)
-           goto bad;
-       next = p + cilen - 2;
-
-       switch (citype) {
-       case CI_MRU:
-           if ((go->neg_mru && go->mru != PPP_DEFMRU)
-               || no.neg_mru || cilen != CILEN_SHORT)
-               goto bad;
-           GETSHORT(cishort, p);
-           if (cishort < PPP_DEFMRU) {
-               try_.neg_mru = 1;
-               try_.mru = cishort;
-           }
-           break;
-       case CI_ASYNCMAP:
-           if ((go->neg_asyncmap && go->asyncmap != 0xFFFFFFFF)
-               || no.neg_asyncmap || cilen != CILEN_LONG)
-               goto bad;
-           break;
-       case CI_AUTHTYPE:
-           if (0
-#if CHAP_SUPPORT
-                || go->neg_chap || no.neg_chap
-#endif /* CHAP_SUPPORT */
-#if PAP_SUPPORT
-                || go->neg_upap || no.neg_upap
-#endif /* PAP_SUPPORT */
-#if EAP_SUPPORT
-               || go->neg_eap || no.neg_eap
-#endif /* EAP_SUPPORT */
-               )
-               goto bad;
-           break;
-       case CI_MAGICNUMBER:
-           if (go->neg_magicnumber || no.neg_magicnumber ||
-               cilen != CILEN_LONG)
-               goto bad;
-           break;
-       case CI_PCOMPRESSION:
-           if (go->neg_pcompression || no.neg_pcompression
-               || cilen != CILEN_VOID)
-               goto bad;
-           break;
-       case CI_ACCOMPRESSION:
-           if (go->neg_accompression || no.neg_accompression
-               || cilen != CILEN_VOID)
-               goto bad;
-           break;
-#if LQR_SUPPORT
-       case CI_QUALITY:
-           if (go->neg_lqr || no.neg_lqr || cilen != CILEN_LQR)
-               goto bad;
-           break;
-#endif /* LQR_SUPPORT */
-#ifdef HAVE_MULTILINK
-       case CI_MRRU:
-           if (go->neg_mrru || no.neg_mrru || cilen != CILEN_SHORT)
-               goto bad;
-           break;
-#endif /* HAVE_MULTILINK */
-       case CI_SSNHF:
-           if (go->neg_ssnhf || no.neg_ssnhf || cilen != CILEN_VOID)
-               goto bad;
-           try_.neg_ssnhf = 1;
-           break;
-       case CI_EPDISC:
-           if (go->neg_endpoint || no.neg_endpoint || cilen < CILEN_CHAR)
-               goto bad;
-           break;
-       default:
-           break;
-       }
-       p = next;
-    }
-
-    /*
-     * OK, the Nak is good.  Now we can update state.
-     * If there are any options left we ignore them.
-     */
-    if (f->state != PPP_FSM_OPENED) {
-       if (looped_back) {
-           if (++try_.numloops >= pcb->settings.lcp_loopbackfail) {
-               ppp_notice("Serial line is looped back.");
-               pcb->err_code = PPPERR_LOOPBACK;
-               lcp_close(f->pcb, "Loopback detected");
-           }
-       } else
-           try_.numloops = 0;
-       *go = try_;
-    }
-
-    return 1;
-
-bad:
-    LCPDEBUG(("lcp_nakci: received bad Nak!"));
-    return 0;
-}
-
-
-/*
- * lcp_rejci - Peer has Rejected some of our CIs.
- * This should not modify any state if the Reject is bad
- * or if LCP is in the OPENED state.
- *
- * Returns:
- *     0 - Reject was bad.
- *     1 - Reject was good.
- */
-static int lcp_rejci(fsm *f, u_char *p, int len) {
-    ppp_pcb *pcb = f->pcb;
-    lcp_options *go = &pcb->lcp_gotoptions;
-    u_char cichar;
-    u_short cishort;
-    u32_t cilong;
-    lcp_options try_;          /* options to request next time */
-
-    try_ = *go;
-
-    /*
-     * Any Rejected CIs must be in exactly the same order that we sent.
-     * Check packet length and CI length at each step.
-     * If we find any deviations, then this packet is bad.
-     */
-#define REJCIVOID(opt, neg) \
-    if (go->neg && \
-       len >= CILEN_VOID && \
-       p[1] == CILEN_VOID && \
-       p[0] == opt) { \
-       len -= CILEN_VOID; \
-       INCPTR(CILEN_VOID, p); \
-       try_.neg = 0; \
-    }
-#define REJCISHORT(opt, neg, val) \
-    if (go->neg && \
-       len >= CILEN_SHORT && \
-       p[1] == CILEN_SHORT && \
-       p[0] == opt) { \
-       len -= CILEN_SHORT; \
-       INCPTR(2, p); \
-       GETSHORT(cishort, p); \
-       /* Check rejected value. */ \
-       if (cishort != val) \
-           goto bad; \
-       try_.neg = 0; \
-    }
-
-#if CHAP_SUPPORT && EAP_SUPPORT && PAP_SUPPORT
-#define REJCICHAP(opt, neg, val) \
-    if (go->neg && \
-       len >= CILEN_CHAP && \
-       p[1] == CILEN_CHAP && \
-       p[0] == opt) { \
-       len -= CILEN_CHAP; \
-       INCPTR(2, p); \
-       GETSHORT(cishort, p); \
-       GETCHAR(cichar, p); \
-       /* Check rejected value. */ \
-       if ((cishort != PPP_CHAP) || (cichar != (CHAP_DIGEST(val)))) \
-           goto bad; \
-       try_.neg = 0; \
-       try_.neg_eap = try_.neg_upap = 0; \
-    }
-#endif /* CHAP_SUPPORT && EAP_SUPPORT && PAP_SUPPORT */
-
-#if CHAP_SUPPORT && !EAP_SUPPORT && PAP_SUPPORT
-#define REJCICHAP(opt, neg, val) \
-    if (go->neg && \
-       len >= CILEN_CHAP && \
-       p[1] == CILEN_CHAP && \
-       p[0] == opt) { \
-       len -= CILEN_CHAP; \
-       INCPTR(2, p); \
-       GETSHORT(cishort, p); \
-       GETCHAR(cichar, p); \
-       /* Check rejected value. */ \
-       if ((cishort != PPP_CHAP) || (cichar != (CHAP_DIGEST(val)))) \
-           goto bad; \
-       try_.neg = 0; \
-       try_.neg_upap = 0; \
-    }
-#endif /* CHAP_SUPPORT && !EAP_SUPPORT && PAP_SUPPORT */
-
-#if CHAP_SUPPORT && EAP_SUPPORT && !PAP_SUPPORT
-#define REJCICHAP(opt, neg, val) \
-    if (go->neg && \
-       len >= CILEN_CHAP && \
-       p[1] == CILEN_CHAP && \
-       p[0] == opt) { \
-       len -= CILEN_CHAP; \
-       INCPTR(2, p); \
-       GETSHORT(cishort, p); \
-       GETCHAR(cichar, p); \
-       /* Check rejected value. */ \
-       if ((cishort != PPP_CHAP) || (cichar != (CHAP_DIGEST(val)))) \
-           goto bad; \
-       try_.neg = 0; \
-       try_.neg_eap = 0; \
-    }
-#endif /* CHAP_SUPPORT && EAP_SUPPORT && !PAP_SUPPORT */
-
-#if CHAP_SUPPORT && !EAP_SUPPORT && !PAP_SUPPORT
-#define REJCICHAP(opt, neg, val) \
-    if (go->neg && \
-       len >= CILEN_CHAP && \
-       p[1] == CILEN_CHAP && \
-       p[0] == opt) { \
-       len -= CILEN_CHAP; \
-       INCPTR(2, p); \
-       GETSHORT(cishort, p); \
-       GETCHAR(cichar, p); \
-       /* Check rejected value. */ \
-       if ((cishort != PPP_CHAP) || (cichar != (CHAP_DIGEST(val)))) \
-           goto bad; \
-       try_.neg = 0; \
-    }
-#endif /* CHAP_SUPPORT && !EAP_SUPPORT && !PAP_SUPPORT */
-
-#define REJCILONG(opt, neg, val) \
-    if (go->neg && \
-       len >= CILEN_LONG && \
-       p[1] == CILEN_LONG && \
-       p[0] == opt) { \
-       len -= CILEN_LONG; \
-       INCPTR(2, p); \
-       GETLONG(cilong, p); \
-       /* Check rejected value. */ \
-       if (cilong != val) \
-           goto bad; \
-       try_.neg = 0; \
-    }
-#if LQR_SUPPORT
-#define REJCILQR(opt, neg, val) \
-    if (go->neg && \
-       len >= CILEN_LQR && \
-       p[1] == CILEN_LQR && \
-       p[0] == opt) { \
-       len -= CILEN_LQR; \
-       INCPTR(2, p); \
-       GETSHORT(cishort, p); \
-       GETLONG(cilong, p); \
-       /* Check rejected value. */ \
-       if (cishort != PPP_LQR || cilong != val) \
-           goto bad; \
-       try_.neg = 0; \
-    }
-#endif /* LQR_SUPPORT */
-#define REJCICBCP(opt, neg, val) \
-    if (go->neg && \
-       len >= CILEN_CBCP && \
-       p[1] == CILEN_CBCP && \
-       p[0] == opt) { \
-       len -= CILEN_CBCP; \
-       INCPTR(2, p); \
-       GETCHAR(cichar, p); \
-       /* Check rejected value. */ \
-       if (cichar != val) \
-           goto bad; \
-       try_.neg = 0; \
-    }
-#define REJCIENDP(opt, neg, class, val, vlen) \
-    if (go->neg && \
-       len >= CILEN_CHAR + vlen && \
-       p[0] == opt && \
-       p[1] == CILEN_CHAR + vlen) { \
-       int i; \
-       len -= CILEN_CHAR + vlen; \
-       INCPTR(2, p); \
-       GETCHAR(cichar, p); \
-       if (cichar != class) \
-           goto bad; \
-       for (i = 0; i < vlen; ++i) { \
-           GETCHAR(cichar, p); \
-           if (cichar != val[i]) \
-               goto bad; \
-       } \
-       try_.neg = 0; \
-    }
-
-    REJCISHORT(CI_MRU, neg_mru, go->mru);
-    REJCILONG(CI_ASYNCMAP, neg_asyncmap, go->asyncmap);
-#if EAP_SUPPORT
-    REJCISHORT(CI_AUTHTYPE, neg_eap, PPP_EAP);
-    if (!go->neg_eap) {
-#endif /* EAP_SUPPORT */
-#if CHAP_SUPPORT
-       REJCICHAP(CI_AUTHTYPE, neg_chap, go->chap_mdtype);
-       if (!go->neg_chap) {
-#endif /* CHAP_SUPPORT */
-#if PAP_SUPPORT
-           REJCISHORT(CI_AUTHTYPE, neg_upap, PPP_PAP);
-#endif /* PAP_SUPPORT */
-#if CHAP_SUPPORT
-       }
-#endif /* CHAP_SUPPORT */
-#if EAP_SUPPORT
-    }
-#endif /* EAP_SUPPORT */
-#if LQR_SUPPORT
-    REJCILQR(CI_QUALITY, neg_lqr, go->lqr_period);
-#endif /* LQR_SUPPORT */
-    REJCICBCP(CI_CALLBACK, neg_cbcp, CBCP_OPT);
-    REJCILONG(CI_MAGICNUMBER, neg_magicnumber, go->magicnumber);
-    REJCIVOID(CI_PCOMPRESSION, neg_pcompression);
-    REJCIVOID(CI_ACCOMPRESSION, neg_accompression);
-#ifdef HAVE_MULTILINK
-    REJCISHORT(CI_MRRU, neg_mrru, go->mrru);
-#endif /* HAVE_MULTILINK */
-    REJCIVOID(CI_SSNHF, neg_ssnhf);
-    REJCIENDP(CI_EPDISC, neg_endpoint, go->endpoint.class_,
-             go->endpoint.value, go->endpoint.length);
-
-    /*
-     * If there are any remaining CIs, then this packet is bad.
-     */
-    if (len != 0)
-       goto bad;
-    /*
-     * Now we can update state.
-     */
-    if (f->state != PPP_FSM_OPENED)
-       *go = try_;
-    return 1;
-
-bad:
-    LCPDEBUG(("lcp_rejci: received bad Reject!"));
-    return 0;
-}
-
-
-/*
- * lcp_reqci - Check the peer's requested CIs and send appropriate response.
- *
- * Returns: CONFACK, CONFNAK or CONFREJ and input packet modified
- * appropriately.  If reject_if_disagree is non-zero, doesn't return
- * CONFNAK; returns CONFREJ if it can't return CONFACK.
- *
- * inp = Requested CIs
- * lenp = Length of requested CIs
- */
-static int lcp_reqci(fsm *f, u_char *inp, int *lenp, int reject_if_disagree) {
-    ppp_pcb *pcb = f->pcb;
-    lcp_options *go = &pcb->lcp_gotoptions;
-    lcp_options *ho = &pcb->lcp_hisoptions;
-    lcp_options *ao = &pcb->lcp_allowoptions;
-    u_char *cip, *next;                /* Pointer to current and next CIs */
-    int cilen, citype, cichar; /* Parsed len, type, char value */
-    u_short cishort;           /* Parsed short value */
-    u32_t cilong;              /* Parse long value */
-    int rc = CONFACK;          /* Final packet return code */
-    int orc;                   /* Individual option return code */
-    u_char *p;                 /* Pointer to next char to parse */
-    u_char *rejp;              /* Pointer to next char in reject frame */
-    struct pbuf *nakp;          /* Nak buffer */
-    u_char *nakoutp;           /* Pointer to next char in Nak frame */
-    int l = *lenp;             /* Length left */
-
-    /*
-     * Reset all his options.
-     */
-    BZERO(ho, sizeof(*ho));
-
-    /*
-     * Process all his options.
-     */
-    next = inp;
-    nakp = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_CTRL_PBUF_MAX_SIZE), PPP_CTRL_PBUF_TYPE);
-    if(NULL == nakp)
-        return 0;
-    if(nakp->tot_len != nakp->len) {
-        pbuf_free(nakp);
-        return 0;
-    }
-
-    nakoutp = (u_char*)nakp->payload;
-    rejp = inp;
-    while (l) {
-       orc = CONFACK;                  /* Assume success */
-       cip = p = next;                 /* Remember begining of CI */
-       if (l < 2 ||                    /* Not enough data for CI header or */
-           p[1] < 2 ||                 /*  CI length too small or */
-           p[1] > l) {                 /*  CI length too big? */
-           LCPDEBUG(("lcp_reqci: bad CI length!"));
-           orc = CONFREJ;              /* Reject bad CI */
-           cilen = l;                  /* Reject till end of packet */
-           l = 0;                      /* Don't loop again */
-           citype = 0;
-           goto endswitch;
-       }
-       GETCHAR(citype, p);             /* Parse CI type */
-       GETCHAR(cilen, p);              /* Parse CI length */
-       l -= cilen;                     /* Adjust remaining length */
-       next += cilen;                  /* Step to next CI */
-
-       switch (citype) {               /* Check CI type */
-       case CI_MRU:
-           if (!ao->neg_mru ||         /* Allow option? */
-               cilen != CILEN_SHORT) { /* Check CI length */
-               orc = CONFREJ;          /* Reject CI */
-               break;
-           }
-           GETSHORT(cishort, p);       /* Parse MRU */
-
-           /*
-            * He must be able to receive at least our minimum.
-            * No need to check a maximum.  If he sends a large number,
-            * we'll just ignore it.
-            */
-           if (cishort < PPP_MINMRU) {
-               orc = CONFNAK;          /* Nak CI */
-               PUTCHAR(CI_MRU, nakoutp);
-               PUTCHAR(CILEN_SHORT, nakoutp);
-               PUTSHORT(PPP_MINMRU, nakoutp);  /* Give him a hint */
-               break;
-           }
-           ho->neg_mru = 1;            /* Remember he sent MRU */
-           ho->mru = cishort;          /* And remember value */
-           break;
-
-       case CI_ASYNCMAP:
-           if (!ao->neg_asyncmap ||
-               cilen != CILEN_LONG) {
-               orc = CONFREJ;
-               break;
-           }
-           GETLONG(cilong, p);
-
-           /*
-            * Asyncmap must have set at least the bits
-            * which are set in lcp_allowoptions[unit].asyncmap.
-            */
-           if ((ao->asyncmap & ~cilong) != 0) {
-               orc = CONFNAK;
-               PUTCHAR(CI_ASYNCMAP, nakoutp);
-               PUTCHAR(CILEN_LONG, nakoutp);
-               PUTLONG(ao->asyncmap | cilong, nakoutp);
-               break;
-           }
-           ho->neg_asyncmap = 1;
-           ho->asyncmap = cilong;
-           break;
-
-       case CI_AUTHTYPE:
-           if (cilen < CILEN_SHORT ||
-               !(0
-#if PAP_SUPPORT
-               || ao->neg_upap
-#endif /* PAP_SUPPORT */
-#if CHAP_SUPPORT
-               || ao->neg_chap
-#endif /* CHAP_SUPPORT */
-#if EAP_SUPPORT
-               || ao->neg_eap
-#endif /* EAP_SUPPORT */
-               )) {
-               /*
-                * Reject the option if we're not willing to authenticate.
-                */
-               ppp_dbglog("No auth is possible");
-               orc = CONFREJ;
-               break;
-           }
-           GETSHORT(cishort, p);
-
-           /*
-            * Authtype must be PAP, CHAP, or EAP.
-            *
-            * Note: if more than one of ao->neg_upap, ao->neg_chap, and
-            * ao->neg_eap are set, and the peer sends a Configure-Request
-            * with two or more authenticate-protocol requests, then we will
-            * reject the second request.
-            * Whether we end up doing CHAP, UPAP, or EAP depends then on
-            * the ordering of the CIs in the peer's Configure-Request.
-             */
-
-#if PAP_SUPPORT
-           if (cishort == PPP_PAP) {
-               /* we've already accepted CHAP or EAP */
-               if (0
-#if CHAP_SUPPORT
-                   || ho->neg_chap
-#endif /* CHAP_SUPPORT */
-#if EAP_SUPPORT
-                   || ho->neg_eap
-#endif /* EAP_SUPPORT */
-                   || cilen != CILEN_SHORT) {
-                   LCPDEBUG(("lcp_reqci: rcvd AUTHTYPE PAP, rejecting..."));
-                   orc = CONFREJ;
-                   break;
-               }
-               if (!ao->neg_upap) {    /* we don't want to do PAP */
-                   orc = CONFNAK;      /* NAK it and suggest CHAP or EAP */
-                   PUTCHAR(CI_AUTHTYPE, nakoutp);
-#if EAP_SUPPORT
-                   if (ao->neg_eap) {
-                       PUTCHAR(CILEN_SHORT, nakoutp);
-                       PUTSHORT(PPP_EAP, nakoutp);
-                   } else {
-#endif /* EAP_SUPPORT */
-#if CHAP_SUPPORT
-                       PUTCHAR(CILEN_CHAP, nakoutp);
-                       PUTSHORT(PPP_CHAP, nakoutp);
-                       PUTCHAR(CHAP_DIGEST(ao->chap_mdtype), nakoutp);
-#endif /* CHAP_SUPPORT */
-#if EAP_SUPPORT
-                   }
-#endif /* EAP_SUPPORT */
-                   break;
-               }
-               ho->neg_upap = 1;
-               break;
-           }
-#endif /* PAP_SUPPORT */
-#if CHAP_SUPPORT
-           if (cishort == PPP_CHAP) {
-               /* we've already accepted PAP or EAP */
-               if (
-#if PAP_SUPPORT
-                   ho->neg_upap ||
-#endif /* PAP_SUPPORT */
-#if EAP_SUPPORT
-                   ho->neg_eap ||
-#endif /* EAP_SUPPORT */
-                   cilen != CILEN_CHAP) {
-                   LCPDEBUG(("lcp_reqci: rcvd AUTHTYPE CHAP, rejecting..."));
-                   orc = CONFREJ;
-                   break;
-               }
-               if (!ao->neg_chap) {    /* we don't want to do CHAP */
-                   orc = CONFNAK;      /* NAK it and suggest EAP or PAP */
-                   PUTCHAR(CI_AUTHTYPE, nakoutp);
-                   PUTCHAR(CILEN_SHORT, nakoutp);
-#if EAP_SUPPORT
-                   if (ao->neg_eap) {
-                       PUTSHORT(PPP_EAP, nakoutp);
-                   } else
-#endif /* EAP_SUPPORT */
-#if PAP_SUPPORT
-                   if(1) {
-                       PUTSHORT(PPP_PAP, nakoutp);
-                   }
-                   else
-#endif /* PAP_SUPPORT */
-                   {}
-                   break;
-               }
-               GETCHAR(cichar, p);     /* get digest type */
-               if (!(CHAP_CANDIGEST(ao->chap_mdtype, cichar))) {
-                   /*
-                    * We can't/won't do the requested type,
-                    * suggest something else.
-                    */
-                   orc = CONFNAK;
-                   PUTCHAR(CI_AUTHTYPE, nakoutp);
-                   PUTCHAR(CILEN_CHAP, nakoutp);
-                   PUTSHORT(PPP_CHAP, nakoutp);
-                   PUTCHAR(CHAP_DIGEST(ao->chap_mdtype), nakoutp);
-                   break;
-               }
-               ho->chap_mdtype = CHAP_MDTYPE_D(cichar); /* save md type */
-               ho->neg_chap = 1;
-               break;
-           }
-#endif /* CHAP_SUPPORT */
-#if EAP_SUPPORT
-           if (cishort == PPP_EAP) {
-               /* we've already accepted CHAP or PAP */
-               if (
-#if CHAP_SUPPORT
-                   ho->neg_chap ||
-#endif /* CHAP_SUPPORT */
-#if PAP_SUPPORT
-                   ho->neg_upap ||
-#endif /* PAP_SUPPORT */
-                   cilen != CILEN_SHORT) {
-                   LCPDEBUG(("lcp_reqci: rcvd AUTHTYPE EAP, rejecting..."));
-                   orc = CONFREJ;
-                   break;
-               }
-               if (!ao->neg_eap) {     /* we don't want to do EAP */
-                   orc = CONFNAK;      /* NAK it and suggest CHAP or PAP */
-                   PUTCHAR(CI_AUTHTYPE, nakoutp);
-#if CHAP_SUPPORT
-                   if (ao->neg_chap) {
-                       PUTCHAR(CILEN_CHAP, nakoutp);
-                       PUTSHORT(PPP_CHAP, nakoutp);
-                       PUTCHAR(CHAP_DIGEST(ao->chap_mdtype), nakoutp);
-                   } else
-#endif /* CHAP_SUPPORT */
-#if PAP_SUPPORT
-                   if(1) {
-                       PUTCHAR(CILEN_SHORT, nakoutp);
-                       PUTSHORT(PPP_PAP, nakoutp);
-                   } else
-#endif /* PAP_SUPPORT */
-                   {}
-                   break;
-               }
-               ho->neg_eap = 1;
-               break;
-           }
-#endif /* EAP_SUPPORT */
-
-           /*
-            * We don't recognize the protocol they're asking for.
-            * Nak it with something we're willing to do.
-            * (At this point we know ao->neg_upap || ao->neg_chap ||
-            * ao->neg_eap.)
-            */
-           orc = CONFNAK;
-           PUTCHAR(CI_AUTHTYPE, nakoutp);
-
-#if EAP_SUPPORT
-           if (ao->neg_eap) {
-               PUTCHAR(CILEN_SHORT, nakoutp);
-               PUTSHORT(PPP_EAP, nakoutp);
-           } else
-#endif /* EAP_SUPPORT */
-#if CHAP_SUPPORT
-           if (ao->neg_chap) {
-               PUTCHAR(CILEN_CHAP, nakoutp);
-               PUTSHORT(PPP_CHAP, nakoutp);
-               PUTCHAR(CHAP_DIGEST(ao->chap_mdtype), nakoutp);
-           } else
-#endif /* CHAP_SUPPORT */
-#if PAP_SUPPORT
-           if(1) {
-               PUTCHAR(CILEN_SHORT, nakoutp);
-               PUTSHORT(PPP_PAP, nakoutp);
-           } else
-#endif /* PAP_SUPPORT */
-           {}
-           break;
-
-#if LQR_SUPPORT
-       case CI_QUALITY:
-           if (!ao->neg_lqr ||
-               cilen != CILEN_LQR) {
-               orc = CONFREJ;
-               break;
-           }
-
-           GETSHORT(cishort, p);
-           GETLONG(cilong, p);
-
-           /*
-            * Check the protocol and the reporting period.
-            * XXX When should we Nak this, and what with?
-            */
-           if (cishort != PPP_LQR) {
-               orc = CONFNAK;
-               PUTCHAR(CI_QUALITY, nakoutp);
-               PUTCHAR(CILEN_LQR, nakoutp);
-               PUTSHORT(PPP_LQR, nakoutp);
-               PUTLONG(ao->lqr_period, nakoutp);
-               break;
-           }
-           break;
-#endif /* LQR_SUPPORT */
-
-       case CI_MAGICNUMBER:
-           if (!(ao->neg_magicnumber || go->neg_magicnumber) ||
-               cilen != CILEN_LONG) {
-               orc = CONFREJ;
-               break;
-           }
-           GETLONG(cilong, p);
-
-           /*
-            * He must have a different magic number.
-            */
-           if (go->neg_magicnumber &&
-               cilong == go->magicnumber) {
-               cilong = magic();       /* Don't put magic() inside macro! */
-               orc = CONFNAK;
-               PUTCHAR(CI_MAGICNUMBER, nakoutp);
-               PUTCHAR(CILEN_LONG, nakoutp);
-               PUTLONG(cilong, nakoutp);
-               break;
-           }
-           ho->neg_magicnumber = 1;
-           ho->magicnumber = cilong;
-           break;
-
-
-       case CI_PCOMPRESSION:
-           if (!ao->neg_pcompression ||
-               cilen != CILEN_VOID) {
-               orc = CONFREJ;
-               break;
-           }
-           ho->neg_pcompression = 1;
-           break;
-
-       case CI_ACCOMPRESSION:
-           if (!ao->neg_accompression ||
-               cilen != CILEN_VOID) {
-               orc = CONFREJ;
-               break;
-           }
-           ho->neg_accompression = 1;
-           break;
-
-#ifdef HAVE_MULTILINK
-       case CI_MRRU:
-           if (!ao->neg_mrru
-               || !multilink
-               || cilen != CILEN_SHORT) {
-               orc = CONFREJ;
-               break;
-           }
-
-           GETSHORT(cishort, p);
-           /* possibly should insist on a minimum/maximum MRRU here */
-           ho->neg_mrru = 1;
-           ho->mrru = cishort;
-           break;
-#endif /* HAVE_MULTILINK */
-
-       case CI_SSNHF:
-           if (!ao->neg_ssnhf
-#ifdef HAVE_MULTILINK
-               || !multilink
-#endif /* HAVE_MULTILINK */
-               || cilen != CILEN_VOID) {
-               orc = CONFREJ;
-               break;
-           }
-           ho->neg_ssnhf = 1;
-           break;
-
-       case CI_EPDISC:
-           if (!ao->neg_endpoint ||
-               cilen < CILEN_CHAR ||
-               cilen > CILEN_CHAR + MAX_ENDP_LEN) {
-               orc = CONFREJ;
-               break;
-           }
-           GETCHAR(cichar, p);
-           cilen -= CILEN_CHAR;
-           ho->neg_endpoint = 1;
-           ho->endpoint.class_ = cichar;
-           ho->endpoint.length = cilen;
-           MEMCPY(ho->endpoint.value, p, cilen);
-           INCPTR(cilen, p);
-           break;
-
-       default:
-           LCPDEBUG(("lcp_reqci: rcvd unknown option %d", citype));
-           orc = CONFREJ;
-           break;
-       }
-
-endswitch:
-       if (orc == CONFACK &&           /* Good CI */
-           rc != CONFACK)              /*  but prior CI wasnt? */
-           continue;                   /* Don't send this one */
-
-       if (orc == CONFNAK) {           /* Nak this CI? */
-           if (reject_if_disagree      /* Getting fed up with sending NAKs? */
-               && citype != CI_MAGICNUMBER) {
-               orc = CONFREJ;          /* Get tough if so */
-           } else {
-               if (rc == CONFREJ)      /* Rejecting prior CI? */
-                   continue;           /* Don't send this one */
-               rc = CONFNAK;
-           }
-       }
-       if (orc == CONFREJ) {           /* Reject this CI */
-           rc = CONFREJ;
-           if (cip != rejp)            /* Need to move rejected CI? */
-               MEMCPY(rejp, cip, cilen); /* Move it */
-           INCPTR(cilen, rejp);        /* Update output pointer */
-       }
-    }
-
-    /*
-     * If we wanted to send additional NAKs (for unsent CIs), the
-     * code would go here.  The extra NAKs would go at *nakoutp.
-     * At present there are no cases where we want to ask the
-     * peer to negotiate an option.
-     */
-
-    switch (rc) {
-    case CONFACK:
-       *lenp = next - inp;
-       break;
-    case CONFNAK:
-       /*
-        * Copy the Nak'd options from the nak buffer to the caller's buffer.
-        */
-       *lenp = nakoutp - (u_char*)nakp->payload;
-       MEMCPY(inp, nakp->payload, *lenp);
-       break;
-    case CONFREJ:
-       *lenp = rejp - inp;
-       break;
-    default:
-       break;
-    }
-
-    pbuf_free(nakp);
-    LCPDEBUG(("lcp_reqci: returning CONF%s.", CODENAME(rc)));
-    return (rc);                       /* Return final code */
-}
-
-
-/*
- * lcp_up - LCP has come UP.
- */
-static void lcp_up(fsm *f) {
-    ppp_pcb *pcb = f->pcb;
-    lcp_options *wo = &pcb->lcp_wantoptions;
-    lcp_options *ho = &pcb->lcp_hisoptions;
-    lcp_options *go = &pcb->lcp_gotoptions;
-    lcp_options *ao = &pcb->lcp_allowoptions;
-    int mtu, mru;
-
-    if (!go->neg_magicnumber)
-       go->magicnumber = 0;
-    if (!ho->neg_magicnumber)
-       ho->magicnumber = 0;
-
-    /*
-     * Set our MTU to the smaller of the MTU we wanted and
-     * the MRU our peer wanted.  If we negotiated an MRU,
-     * set our MRU to the larger of value we wanted and
-     * the value we got in the negotiation.
-     * Note on the MTU: the link MTU can be the MRU the peer wanted,
-     * the interface MTU is set to the lowest of that, the
-     * MTU we want to use, and our link MRU.
-     */
-    mtu = ho->neg_mru? ho->mru: PPP_MRU;
-    mru = go->neg_mru? LWIP_MAX(wo->mru, go->mru): PPP_MRU;
-#ifdef HAVE_MULTILINK
-    if (!(multilink && go->neg_mrru && ho->neg_mrru))
-#endif /* HAVE_MULTILINK */
-       netif_set_mtu(pcb, LWIP_MIN(LWIP_MIN(mtu, mru), ao->mru));
-    ppp_send_config(pcb, mtu,
-                   (ho->neg_asyncmap? ho->asyncmap: 0xffffffff),
-                   ho->neg_pcompression, ho->neg_accompression);
-    ppp_recv_config(pcb, mru,
-                   (pcb->settings.lax_recv? 0: go->neg_asyncmap? go->asyncmap: 0xffffffff),
-                   go->neg_pcompression, go->neg_accompression);
-
-    if (ho->neg_mru)
-       pcb->peer_mru = ho->mru;
-
-    lcp_echo_lowerup(f->pcb);  /* Enable echo messages */
-
-    link_established(pcb);
-}
-
-
-/*
- * lcp_down - LCP has gone DOWN.
- *
- * Alert other protocols.
- */
-static void lcp_down(fsm *f) {
-    ppp_pcb *pcb = f->pcb;
-    lcp_options *go = &pcb->lcp_gotoptions;
-
-    lcp_echo_lowerdown(f->pcb);
-
-    link_down(pcb);
-
-    ppp_send_config(pcb, PPP_MRU, 0xffffffff, 0, 0);
-    ppp_recv_config(pcb, PPP_MRU,
-                   (go->neg_asyncmap? go->asyncmap: 0xffffffff),
-                   go->neg_pcompression, go->neg_accompression);
-    pcb->peer_mru = PPP_MRU;
-}
-
-
-/*
- * lcp_starting - LCP needs the lower layer up.
- */
-static void lcp_starting(fsm *f) {
-    ppp_pcb *pcb = f->pcb;
-    link_required(pcb);
-}
-
-
-/*
- * lcp_finished - LCP has finished with the lower layer.
- */
-static void lcp_finished(fsm *f) {
-    ppp_pcb *pcb = f->pcb;
-    link_terminated(pcb);
-}
-
-
-#if PRINTPKT_SUPPORT
-/*
- * lcp_printpkt - print the contents of an LCP packet.
- */
-static const char* const lcp_codenames[] = {
-    "ConfReq", "ConfAck", "ConfNak", "ConfRej",
-    "TermReq", "TermAck", "CodeRej", "ProtRej",
-    "EchoReq", "EchoRep", "DiscReq", "Ident",
-    "TimeRem"
-};
-
-static int lcp_printpkt(const u_char *p, int plen,
-               void (*printer) (void *, const char *, ...), void *arg) {
-    int code, id, len, olen, i;
-    const u_char *pstart, *optend;
-    u_short cishort;
-    u32_t cilong;
-
-    if (plen < HEADERLEN)
-       return 0;
-    pstart = p;
-    GETCHAR(code, p);
-    GETCHAR(id, p);
-    GETSHORT(len, p);
-    if (len < HEADERLEN || len > plen)
-       return 0;
-
-   if (code >= 1 && code <= (int)sizeof(lcp_codenames) / (int)sizeof(char *))
-       printer(arg, " %s", lcp_codenames[code-1]);
-    else
-       printer(arg, " code=0x%x", code);
-    printer(arg, " id=0x%x", id);
-    len -= HEADERLEN;
-    switch (code) {
-    case CONFREQ:
-    case CONFACK:
-    case CONFNAK:
-    case CONFREJ:
-       /* print option list */
-       while (len >= 2) {
-           GETCHAR(code, p);
-           GETCHAR(olen, p);
-           p -= 2;
-           if (olen < 2 || olen > len) {
-               break;
-           }
-           printer(arg, " <");
-           len -= olen;
-           optend = p + olen;
-           switch (code) {
-           case CI_MRU:
-               if (olen == CILEN_SHORT) {
-                   p += 2;
-                   GETSHORT(cishort, p);
-                   printer(arg, "mru %d", cishort);
-               }
-               break;
-           case CI_ASYNCMAP:
-               if (olen == CILEN_LONG) {
-                   p += 2;
-                   GETLONG(cilong, p);
-                   printer(arg, "asyncmap 0x%x", cilong);
-               }
-               break;
-           case CI_AUTHTYPE:
-               if (olen >= CILEN_SHORT) {
-                   p += 2;
-                   printer(arg, "auth ");
-                   GETSHORT(cishort, p);
-                   switch (cishort) {
-#if PAP_SUPPORT
-                   case PPP_PAP:
-                       printer(arg, "pap");
-                       break;
-#endif /* PAP_SUPPORT */
-#if CHAP_SUPPORT
-                   case PPP_CHAP:
-                       printer(arg, "chap");
-                       if (p < optend) {
-                           switch (*p) {
-                           case CHAP_MD5:
-                               printer(arg, " MD5");
-                               ++p;
-                               break;
-#if MSCHAP_SUPPORT
-                           case CHAP_MICROSOFT:
-                               printer(arg, " MS");
-                               ++p;
-                               break;
-
-                           case CHAP_MICROSOFT_V2:
-                               printer(arg, " MS-v2");
-                               ++p;
-                               break;
-#endif /* MSCHAP_SUPPORT */
-                           default:
-                               break;
-                           }
-                       }
-                       break;
-#endif /* CHAP_SUPPORT */
-#if EAP_SUPPORT
-                   case PPP_EAP:
-                       printer(arg, "eap");
-                       break;
-#endif /* EAP_SUPPORT */
-                   default:
-                       printer(arg, "0x%x", cishort);
-                   }
-               }
-               break;
-#if LQR_SUPPORT
-           case CI_QUALITY:
-               if (olen >= CILEN_SHORT) {
-                   p += 2;
-                   printer(arg, "quality ");
-                   GETSHORT(cishort, p);
-                   switch (cishort) {
-                   case PPP_LQR:
-                       printer(arg, "lqr");
-                       break;
-                   default:
-                       printer(arg, "0x%x", cishort);
-                   }
-               }
-               break;
-#endif /* LQR_SUPPORT */
-           case CI_CALLBACK:
-               if (olen >= CILEN_CHAR) {
-                   p += 2;
-                   printer(arg, "callback ");
-                   GETCHAR(cishort, p);
-                   switch (cishort) {
-                   case CBCP_OPT:
-                       printer(arg, "CBCP");
-                       break;
-                   default:
-                       printer(arg, "0x%x", cishort);
-                   }
-               }
-               break;
-           case CI_MAGICNUMBER:
-               if (olen == CILEN_LONG) {
-                   p += 2;
-                   GETLONG(cilong, p);
-                   printer(arg, "magic 0x%x", cilong);
-               }
-               break;
-           case CI_PCOMPRESSION:
-               if (olen == CILEN_VOID) {
-                   p += 2;
-                   printer(arg, "pcomp");
-               }
-               break;
-           case CI_ACCOMPRESSION:
-               if (olen == CILEN_VOID) {
-                   p += 2;
-                   printer(arg, "accomp");
-               }
-               break;
-           case CI_MRRU:
-               if (olen == CILEN_SHORT) {
-                   p += 2;
-                   GETSHORT(cishort, p);
-                   printer(arg, "mrru %d", cishort);
-               }
-               break;
-           case CI_SSNHF:
-               if (olen == CILEN_VOID) {
-                   p += 2;
-                   printer(arg, "ssnhf");
-               }
-               break;
-           case CI_EPDISC:
-#ifdef HAVE_MULTILINK
-               if (olen >= CILEN_CHAR) {
-                   struct epdisc epd;
-                   p += 2;
-                   GETCHAR(epd.class, p);
-                   epd.length = olen - CILEN_CHAR;
-                   if (epd.length > MAX_ENDP_LEN)
-                       epd.length = MAX_ENDP_LEN;
-                   if (epd.length > 0) {
-                       MEMCPY(epd.value, p, epd.length);
-                       p += epd.length;
-                   }
-                   printer(arg, "endpoint [%s]", epdisc_to_str(&epd));
-               }
-#else
-               printer(arg, "endpoint");
-#endif
-               break;
-           default:
-               break;
-           }
-           while (p < optend) {
-               GETCHAR(code, p);
-               printer(arg, " %.2x", code);
-           }
-           printer(arg, ">");
-       }
-       break;
-
-    case TERMACK:
-    case TERMREQ:
-       if (len > 0 && *p >= ' ' && *p < 0x7f) {
-           printer(arg, " ");
-           ppp_print_string(p, len, printer, arg);
-           p += len;
-           len = 0;
-       }
-       break;
-
-    case ECHOREQ:
-    case ECHOREP:
-    case DISCREQ:
-       if (len >= 4) {
-           GETLONG(cilong, p);
-           printer(arg, " magic=0x%x", cilong);
-           len -= 4;
-       }
-       break;
-
-    case IDENTIF:
-    case TIMEREM:
-       if (len >= 4) {
-           GETLONG(cilong, p);
-           printer(arg, " magic=0x%x", cilong);
-           len -= 4;
-       }
-       if (code == TIMEREM) {
-           if (len < 4)
-               break;
-           GETLONG(cilong, p);
-           printer(arg, " seconds=%u", cilong);
-           len -= 4;
-       }
-       if (len > 0) {
-           printer(arg, " ");
-           ppp_print_string(p, len, printer, arg);
-           p += len;
-           len = 0;
-       }
-       break;
-    default:
-       break;
-    }
-
-    /* print the rest of the bytes in the packet */
-    for (i = 0; i < len && i < 32; ++i) {
-       GETCHAR(code, p);
-       printer(arg, " %.2x", code);
-    }
-    if (i < len) {
-       printer(arg, " ...");
-       p += len - i;
-    }
-
-    return p - pstart;
-}
-#endif /* PRINTPKT_SUPPORT */
-
-/*
- * Time to shut down the link because there is nothing out there.
- */
-
-static void LcpLinkFailure(fsm *f) {
-    ppp_pcb *pcb = f->pcb;
-    if (f->state == PPP_FSM_OPENED) {
-       ppp_info("No response to %d echo-requests", pcb->lcp_echos_pending);
-        ppp_notice("Serial link appears to be disconnected.");
-       pcb->err_code = PPPERR_PEERDEAD;
-       lcp_close(pcb, "Peer not responding");
-    }
-}
-
-/*
- * Timer expired for the LCP echo requests from this process.
- */
-
-static void LcpEchoCheck(fsm *f) {
-    ppp_pcb *pcb = f->pcb;
-
-    LcpSendEchoRequest (f);
-    if (f->state != PPP_FSM_OPENED)
-       return;
-
-    /*
-     * Start the timer for the next interval.
-     */
-    if (pcb->lcp_echo_timer_running)
-       ppp_warn("assertion lcp_echo_timer_running==0 failed");
-    TIMEOUT (LcpEchoTimeout, f, pcb->settings.lcp_echo_interval);
-    pcb->lcp_echo_timer_running = 1;
-}
-
-/*
- * LcpEchoTimeout - Timer expired on the LCP echo
- */
-
-static void LcpEchoTimeout(void *arg) {
-    fsm *f = (fsm*)arg;
-    ppp_pcb *pcb = f->pcb;
-    if (pcb->lcp_echo_timer_running != 0) {
-        pcb->lcp_echo_timer_running = 0;
-        LcpEchoCheck ((fsm *) arg);
-    }
-}
-
-/*
- * LcpEchoReply - LCP has received a reply to the echo
- */
-
-static void lcp_received_echo_reply(fsm *f, int id, u_char *inp, int len) {
-    ppp_pcb *pcb = f->pcb;
-    lcp_options *go = &pcb->lcp_gotoptions;
-    u32_t magic_val;
-    LWIP_UNUSED_ARG(id);
-
-    /* Check the magic number - don't count replies from ourselves. */
-    if (len < 4) {
-       ppp_dbglog("lcp: received short Echo-Reply, length %d", len);
-       return;
-    }
-    GETLONG(magic_val, inp);
-    if (go->neg_magicnumber
-       && magic_val == go->magicnumber) {
-       ppp_warn("appear to have received our own echo-reply!");
-       return;
-    }
-
-    /* Reset the number of outstanding echo frames */
-    pcb->lcp_echos_pending = 0;
-}
-
-/*
- * LcpSendEchoRequest - Send an echo request frame to the peer
- */
-
-static void LcpSendEchoRequest(fsm *f) {
-    ppp_pcb *pcb = f->pcb;
-    lcp_options *go = &pcb->lcp_gotoptions;
-    u32_t lcp_magic;
-    u_char pkt[4], *pktp;
-
-    /*
-     * Detect the failure of the peer at this point.
-     */
-    if (pcb->settings.lcp_echo_fails != 0) {
-        if (pcb->lcp_echos_pending >= pcb->settings.lcp_echo_fails) {
-            LcpLinkFailure(f);
-            pcb->lcp_echos_pending = 0;
-       }
-    }
-
-#if PPP_LCP_ADAPTIVE
-    /*
-     * If adaptive echos have been enabled, only send the echo request if
-     * no traffic was received since the last one.
-     */
-    if (pcb->settings.lcp_echo_adaptive) {
-       static unsigned int last_pkts_in = 0;
-
-#if PPP_STATS_SUPPORT
-       update_link_stats(f->unit);
-       link_stats_valid = 0;
-#endif /* PPP_STATS_SUPPORT */
-
-       if (link_stats.pkts_in != last_pkts_in) {
-           last_pkts_in = link_stats.pkts_in;
-           return;
-       }
-    }
-#endif
-
-    /*
-     * Make and send the echo request frame.
-     */
-    if (f->state == PPP_FSM_OPENED) {
-        lcp_magic = go->magicnumber;
-       pktp = pkt;
-       PUTLONG(lcp_magic, pktp);
-        fsm_sdata(f, ECHOREQ, pcb->lcp_echo_number++, pkt, pktp - pkt);
-       ++pcb->lcp_echos_pending;
-    }
-}
-
-/*
- * lcp_echo_lowerup - Start the timer for the LCP frame
- */
-
-static void lcp_echo_lowerup(ppp_pcb *pcb) {
-    fsm *f = &pcb->lcp_fsm;
-
-    /* Clear the parameters for generating echo frames */
-    pcb->lcp_echos_pending      = 0;
-    pcb->lcp_echo_number        = 0;
-    pcb->lcp_echo_timer_running = 0;
-  
-    /* If a timeout interval is specified then start the timer */
-    if (pcb->settings.lcp_echo_interval != 0)
-        LcpEchoCheck (f);
-}
-
-/*
- * lcp_echo_lowerdown - Stop the timer for the LCP frame
- */
-
-static void lcp_echo_lowerdown(ppp_pcb *pcb) {
-    fsm *f = &pcb->lcp_fsm;
-
-    if (pcb->lcp_echo_timer_running != 0) {
-        UNTIMEOUT (LcpEchoTimeout, f);
-        pcb->lcp_echo_timer_running = 0;
-    }
-}
-
-#endif /* PPP_SUPPORT */
diff --git a/components/lwip/netif/ppp/magic.c b/components/lwip/netif/ppp/magic.c
deleted file mode 100644 (file)
index 826386c..0000000
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- * magic.c - PPP Magic Number routines.
- *
- * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The name "Carnegie Mellon University" must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission. For permission or any legal
- *    details, please contact
- *      Office of Technology Transfer
- *      Carnegie Mellon University
- *      5000 Forbes Avenue
- *      Pittsburgh, PA  15213-3890
- *      (412) 268-4387, fax: (412) 268-7395
- *      tech-transfer@andrew.cmu.edu
- *
- * 4. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by Computing Services
- *     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
- *
- * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
- * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-/*****************************************************************************
-* randm.c - Random number generator program file.
-*
-* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
-* Copyright (c) 1998 by Global Election Systems Inc.
-*
-* The authors hereby grant permission to use, copy, modify, distribute,
-* and license this software and its documentation for any purpose, provided
-* that existing copyright notices are retained in all copies and that this
-* notice and the following disclaimer are included verbatim in any
-* distributions. No written agreement, license, or royalty fee is required
-* for any of the authorized uses.
-*
-* THIS SOFTWARE IS PROVIDED BY THE 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 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.
-*
-******************************************************************************
-* REVISION HISTORY
-*
-* 03-01-01 Marc Boucher <marc@mbsi.ca>
-*   Ported to lwIP.
-* 98-06-03 Guy Lancaster <lancasterg@acm.org>, Global Election Systems Inc.
-*   Extracted from avos.
-*****************************************************************************/
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */
-
-#include "netif/ppp/ppp_impl.h"
-#include "netif/ppp/magic.h"
-
-#if PPP_MD5_RANDM /* Using MD5 for better randomness if enabled */
-
-#if LWIP_INCLUDED_POLARSSL_MD5
-#include "netif/ppp/polarssl/md5.h"
-#else
-#include "polarssl/md5.h"
-#endif
-
-#define MD5_HASH_SIZE 16
-static char magic_randpool[MD5_HASH_SIZE];   /* Pool of randomness. */
-static long magic_randcount;      /* Pseudo-random incrementer */
-static u32_t magic_randomseed;    /* Seed used for random number generation. */
-
-/*
- * Churn the randomness pool on a random event.  Call this early and often
- *  on random and semi-random system events to build randomness in time for
- *  usage.  For randomly timed events, pass a null pointer and a zero length
- *  and this will use the system timer and other sources to add randomness.
- *  If new random data is available, pass a pointer to that and it will be
- *  included.
- *
- * Ref: Applied Cryptography 2nd Ed. by Bruce Schneier p. 427
- */
-static void magic_churnrand(char *rand_data, u32_t rand_len) {
-  md5_context md5_ctx;
-
-  /* LWIP_DEBUGF(LOG_INFO, ("magic_churnrand: %u@%P\n", rand_len, rand_data)); */
-  md5_starts(&md5_ctx);
-  md5_update(&md5_ctx, (u_char *)magic_randpool, sizeof(magic_randpool));
-  if (rand_data) {
-    md5_update(&md5_ctx, (u_char *)rand_data, rand_len);
-  } else {
-    struct {
-      /* INCLUDE fields for any system sources of randomness */
-      u32_t jiffies;
-#ifdef LWIP_RAND
-      u32_t rand;
-#endif /* LWIP_RAND */
-    } sys_data;
-    magic_randomseed += sys_jiffies();
-    sys_data.jiffies = magic_randomseed;
-#ifdef LWIP_RAND
-    sys_data.rand = LWIP_RAND();
-#endif /* LWIP_RAND */
-    /* Load sys_data fields here. */
-    md5_update(&md5_ctx, (u_char *)&sys_data, sizeof(sys_data));
-  }
-  md5_finish(&md5_ctx, (u_char *)magic_randpool);
-/*  LWIP_DEBUGF(LOG_INFO, ("magic_churnrand: -> 0\n")); */
-}
-
-/*
- * Initialize the random number generator.
- */
-void magic_init(void) {
-  magic_churnrand(NULL, 0);
-}
-
-/*
- * Randomize our random seed value.
- */
-void magic_randomize(void) {
-  magic_churnrand(NULL, 0);
-}
-
-/*
- * magic_random_bytes - Fill a buffer with random bytes.
- *
- * Use the random pool to generate random data.  This degrades to pseudo
- *  random when used faster than randomness is supplied using magic_churnrand().
- * Note: It's important that there be sufficient randomness in magic_randpool
- *  before this is called for otherwise the range of the result may be
- *  narrow enough to make a search feasible.
- *
- * Ref: Applied Cryptography 2nd Ed. by Bruce Schneier p. 427
- *
- * XXX Why does he not just call magic_churnrand() for each block?  Probably
- *  so that you don't ever publish the seed which could possibly help
- *  predict future values.
- * XXX Why don't we preserve md5 between blocks and just update it with
- *  magic_randcount each time?  Probably there is a weakness but I wish that
- *  it was documented.
- */
-void magic_random_bytes(unsigned char *buf, u32_t buf_len) {
-  md5_context md5_ctx;
-  u_char tmp[MD5_HASH_SIZE];
-  u32_t n;
-
-  while (buf_len > 0) {
-    md5_starts(&md5_ctx);
-    md5_update(&md5_ctx, (u_char *)magic_randpool, sizeof(magic_randpool));
-    md5_update(&md5_ctx, (u_char *)&magic_randcount, sizeof(magic_randcount));
-    md5_finish(&md5_ctx, tmp);
-    magic_randcount++;
-    n = LWIP_MIN(buf_len, MD5_HASH_SIZE);
-    MEMCPY(buf, tmp, n);
-    buf += n;
-    buf_len -= n;
-  }
-}
-
-/*
- * Return a new random number.
- */
-u32_t magic(void) {
-  u32_t new_rand;
-
-  magic_random_bytes((unsigned char *)&new_rand, sizeof(new_rand));
-
-  return new_rand;
-}
-
-#else /* PPP_MD5_RANDM */
-
-/*****************************/
-/*** LOCAL DATA STRUCTURES ***/
-/*****************************/
-#ifndef LWIP_RAND
-static int  magic_randomized;       /* Set when truely randomized. */
-#endif /* LWIP_RAND */
-static u32_t magic_randomseed;      /* Seed used for random number generation. */
-
-
-/***********************************/
-/*** PUBLIC FUNCTION DEFINITIONS ***/
-/***********************************/
-
-/*
- * Initialize the random number generator.
- *
- * Here we attempt to compute a random number seed but even if
- * it isn't random, we'll randomize it later.
- *
- * The current method uses the fields from the real time clock,
- * the idle process counter, the millisecond counter, and the
- * hardware timer tick counter.  When this is invoked
- * in startup(), then the idle counter and timer values may
- * repeat after each boot and the real time clock may not be
- * operational.  Thus we call it again on the first random
- * event.
- */
-void magic_init(void) {
-  magic_randomseed += sys_jiffies();
-#ifndef LWIP_RAND
-  /* Initialize the Borland random number generator. */
-  srand((unsigned)magic_randomseed);
-#endif /* LWIP_RAND */
-}
-
-/*
- * magic_init - Initialize the magic number generator.
- *
- * Randomize our random seed value.  Here we use the fact that
- * this function is called at *truely random* times by the polling
- * and network functions.  Here we only get 16 bits of new random
- * value but we use the previous value to randomize the other 16
- * bits.
- */
-void magic_randomize(void) {
-#ifndef LWIP_RAND
-  if (!magic_randomized) {
-    magic_randomized = !0;
-    magic_init();
-    /* The initialization function also updates the seed. */
-  } else {
-#endif /* LWIP_RAND */
-    magic_randomseed += sys_jiffies();
-#ifndef LWIP_RAND
-  }
-#endif /* LWIP_RAND */
-}
-
-/*
- * Return a new random number.
- *
- * Here we use the Borland rand() function to supply a pseudo random
- * number which we make truely random by combining it with our own
- * seed which is randomized by truely random events.
- * Thus the numbers will be truely random unless there have been no
- * operator or network events in which case it will be pseudo random
- * seeded by the real time clock.
- */
-u32_t magic(void) {
-#ifdef LWIP_RAND
-  return LWIP_RAND() + magic_randomseed;
-#else /* LWIP_RAND */
-  return ((u32_t)rand() << 16) + (u32_t)rand() + magic_randomseed;
-#endif /* LWIP_RAND */
-}
-
-/*
- * magic_random_bytes - Fill a buffer with random bytes.
- */
-void magic_random_bytes(unsigned char *buf, u32_t buf_len) {
-  u32_t new_rand, n;
-
-  while (buf_len > 0) {
-    new_rand = magic();
-    n = LWIP_MIN(buf_len, sizeof(new_rand));
-    MEMCPY(buf, &new_rand, n);
-    buf += n;
-    buf_len -= n;
-  }
-}
-#endif /* PPP_MD5_RANDM */
-
-/*
- * Return a new random number between 0 and (2^pow)-1 included.
- */
-u32_t magic_pow(u8_t pow) {
-  return magic() & ~(~0UL<<pow);
-}
-
-#endif /* PPP_SUPPORT */
diff --git a/components/lwip/netif/ppp/mppe.c b/components/lwip/netif/ppp/mppe.c
deleted file mode 100644 (file)
index 804f6a7..0000000
+++ /dev/null
@@ -1,418 +0,0 @@
-/*
- * mppe.c - interface MPPE to the PPP code.
- *
- * By Frank Cusack <fcusack@fcusack.com>.
- * Copyright (c) 2002,2003,2004 Google, Inc.
- * All rights reserved.
- *
- * License:
- * Permission to use, copy, modify, and distribute this software and its
- * documentation is hereby granted, provided that the above copyright
- * notice appears in all copies.  This software is provided without any
- * warranty, express or implied.
- *
- * Changelog:
- *      08/12/05 - Matt Domsch <Matt_Domsch@dell.com>
- *                 Only need extra skb padding on transmit, not receive.
- *      06/18/04 - Matt Domsch <Matt_Domsch@dell.com>, Oleg Makarenko <mole@quadra.ru>
- *                 Use Linux kernel 2.6 arc4 and sha1 routines rather than
- *                 providing our own.
- *      2/15/04 - TS: added #include <version.h> and testing for Kernel
- *                    version before using
- *                    MOD_DEC_USAGE_COUNT/MOD_INC_USAGE_COUNT which are
- *                    deprecated in 2.6
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && MPPE_SUPPORT  /* don't build if not configured for use in lwipopts.h */
-
-#include <string.h>
-
-#include "lwip/err.h"
-
-#include "netif/ppp/ppp_impl.h"
-#include "netif/ppp/ccp.h"
-#include "netif/ppp/mppe.h"
-#include "netif/ppp/pppdebug.h"
-
-#if LWIP_INCLUDED_POLARSSL_SHA1
-#include "netif/ppp/polarssl/sha1.h"
-#else
-#include "polarssl/sha1.h"
-#endif
-
-#if LWIP_INCLUDED_POLARSSL_ARC4
-#include "netif/ppp/polarssl/arc4.h"
-#else
-#include "polarssl/arc4.h"
-#endif
-
-#define SHA1_SIGNATURE_SIZE 20
-
-/* ppp_mppe_state.bits definitions */
-#define MPPE_BIT_A     0x80    /* Encryption table were (re)inititalized */
-#define MPPE_BIT_B     0x40    /* MPPC only (not implemented) */
-#define MPPE_BIT_C     0x20    /* MPPC only (not implemented) */
-#define MPPE_BIT_D     0x10    /* This is an encrypted frame */
-
-#define MPPE_BIT_FLUSHED       MPPE_BIT_A
-#define MPPE_BIT_ENCRYPTED     MPPE_BIT_D
-
-#define MPPE_BITS(p) ((p)[0] & 0xf0)
-#define MPPE_CCOUNT(p) ((((p)[0] & 0x0f) << 8) + (p)[1])
-#define MPPE_CCOUNT_SPACE 0x1000       /* The size of the ccount space */
-
-#define MPPE_OVHD      2       /* MPPE overhead/packet */
-#define SANITY_MAX     1600    /* Max bogon factor we will tolerate */
-
-/*
- * Perform the MPPE rekey algorithm, from RFC 3078, sec. 7.3.
- * Well, not what's written there, but rather what they meant.
- */
-static void mppe_rekey(ppp_mppe_state * state, int initial_key)
-{
-       sha1_context sha1_ctx;
-       u8_t sha1_digest[SHA1_SIGNATURE_SIZE];
-
-       /*
-        * Key Derivation, from RFC 3078, RFC 3079.
-        * Equivalent to Get_Key() for MS-CHAP as described in RFC 3079.
-        */
-       sha1_starts(&sha1_ctx);
-       sha1_update(&sha1_ctx, state->master_key, state->keylen);
-       sha1_update(&sha1_ctx, mppe_sha1_pad1, SHA1_PAD_SIZE);
-       sha1_update(&sha1_ctx, state->session_key, state->keylen);
-       sha1_update(&sha1_ctx, mppe_sha1_pad2, SHA1_PAD_SIZE);
-       sha1_finish(&sha1_ctx, sha1_digest);
-       MEMCPY(state->session_key, sha1_digest, state->keylen);
-
-       if (!initial_key) {
-               arc4_setup(&state->arc4, sha1_digest, state->keylen);
-               arc4_crypt(&state->arc4, state->session_key, state->keylen);
-       }
-       if (state->keylen == 8) {
-               /* See RFC 3078 */
-               state->session_key[0] = 0xd1;
-               state->session_key[1] = 0x26;
-               state->session_key[2] = 0x9e;
-       }
-       arc4_setup(&state->arc4, state->session_key, state->keylen);
-}
-
-/*
- * Set key, used by MSCHAP before mppe_init() is actually called by CCP so we
- * don't have to keep multiple copies of keys.
- */
-void mppe_set_key(ppp_pcb *pcb, ppp_mppe_state *state, u8_t *key) {
-       LWIP_UNUSED_ARG(pcb);
-       MEMCPY(state->master_key, key, MPPE_MAX_KEY_LEN);
-}
-
-/*
- * Initialize (de)compressor state.
- */
-void
-mppe_init(ppp_pcb *pcb, ppp_mppe_state *state, u8_t options)
-{
-#if PPP_DEBUG
-       const u8_t *debugstr = (const u8_t*)"mppe_comp_init";
-       if (&pcb->mppe_decomp == state) {
-           debugstr = (const u8_t*)"mppe_decomp_init";
-       }
-#endif /* PPP_DEBUG */
-
-       /* Save keys. */
-       MEMCPY(state->session_key, state->master_key, sizeof(state->master_key));
-
-       if (options & MPPE_OPT_128)
-               state->keylen = 16;
-       else if (options & MPPE_OPT_40)
-               state->keylen = 8;
-       else {
-               PPPDEBUG(LOG_DEBUG, ("%s[%d]: unknown key length\n", debugstr,
-                       pcb->netif->num));
-               lcp_close(pcb, "MPPE required but peer negotiation failed");
-               return;
-       }
-       if (options & MPPE_OPT_STATEFUL)
-               state->stateful = 1;
-
-       /* Generate the initial session key. */
-       mppe_rekey(state, 1);
-
-#if PPP_DEBUG
-       {
-               int i;
-               char mkey[sizeof(state->master_key) * 2 + 1];
-               char skey[sizeof(state->session_key) * 2 + 1];
-
-               PPPDEBUG(LOG_DEBUG, ("%s[%d]: initialized with %d-bit %s mode\n",
-                      debugstr, pcb->netif->num, (state->keylen == 16) ? 128 : 40,
-                      (state->stateful) ? "stateful" : "stateless"));
-
-               for (i = 0; i < (int)sizeof(state->master_key); i++)
-                       sprintf(mkey + i * 2, "%02x", state->master_key[i]);
-               for (i = 0; i < (int)sizeof(state->session_key); i++)
-                       sprintf(skey + i * 2, "%02x", state->session_key[i]);
-               PPPDEBUG(LOG_DEBUG,
-                      ("%s[%d]: keys: master: %s initial session: %s\n",
-                      debugstr, pcb->netif->num, mkey, skey));
-       }
-#endif /* PPP_DEBUG */
-
-       /*
-        * Initialize the coherency count.  The initial value is not specified
-        * in RFC 3078, but we can make a reasonable assumption that it will
-        * start at 0.  Setting it to the max here makes the comp/decomp code
-        * do the right thing (determined through experiment).
-        */
-       state->ccount = MPPE_CCOUNT_SPACE - 1;
-
-       /*
-        * Note that even though we have initialized the key table, we don't
-        * set the FLUSHED bit.  This is contrary to RFC 3078, sec. 3.1.
-        */
-       state->bits = MPPE_BIT_ENCRYPTED;
-}
-
-/*
- * We received a CCP Reset-Request (actually, we are sending a Reset-Ack),
- * tell the compressor to rekey.  Note that we MUST NOT rekey for
- * every CCP Reset-Request; we only rekey on the next xmit packet.
- * We might get multiple CCP Reset-Requests if our CCP Reset-Ack is lost.
- * So, rekeying for every CCP Reset-Request is broken as the peer will not
- * know how many times we've rekeyed.  (If we rekey and THEN get another
- * CCP Reset-Request, we must rekey again.)
- */
-void mppe_comp_reset(ppp_pcb *pcb, ppp_mppe_state *state)
-{
-       LWIP_UNUSED_ARG(pcb);
-       state->bits |= MPPE_BIT_FLUSHED;
-}
-
-/*
- * Compress (encrypt) a packet.
- * It's strange to call this a compressor, since the output is always
- * MPPE_OVHD + 2 bytes larger than the input.
- */
-err_t
-mppe_compress(ppp_pcb *pcb, ppp_mppe_state *state, struct pbuf **pb, u16_t protocol)
-{
-       struct pbuf *n, *np;
-       u8_t *pl;
-       err_t err;
-
-       LWIP_UNUSED_ARG(pcb);
-
-       /* 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);
-       if (!np) {
-               return ERR_MEM;
-       }
-
-       /* Hide MPPE header + protocol */
-       pbuf_header(np, -(s16_t)(MPPE_OVHD + sizeof(protocol)));
-
-       if ((err = pbuf_copy(np, *pb)) != ERR_OK) {
-               pbuf_free(np);
-               return err;
-       }
-
-       /* Reveal MPPE header + protocol */
-       pbuf_header(np, (s16_t)(MPPE_OVHD + sizeof(protocol)));
-
-       *pb = np;
-       pl = (u8_t*)np->payload;
-
-       state->ccount = (state->ccount + 1) % MPPE_CCOUNT_SPACE;
-       PPPDEBUG(LOG_DEBUG, ("mppe_compress[%d]: ccount %d\n", pcb->netif->num, state->ccount));
-       /* FIXME: use PUT* macros */
-       pl[0] = state->ccount>>8;
-       pl[1] = state->ccount;
-
-       if (!state->stateful || /* stateless mode     */
-           ((state->ccount & 0xff) == 0xff) || /* "flag" packet      */
-           (state->bits & MPPE_BIT_FLUSHED)) { /* CCP Reset-Request  */
-               /* We must rekey */
-               if (state->stateful) {
-                       PPPDEBUG(LOG_DEBUG, ("mppe_compress[%d]: rekeying\n", pcb->netif->num));
-               }
-               mppe_rekey(state, 0);
-               state->bits |= MPPE_BIT_FLUSHED;
-       }
-       pl[0] |= state->bits;
-       state->bits &= ~MPPE_BIT_FLUSHED;       /* reset for next xmit */
-       pl += MPPE_OVHD;
-
-       /* Add protocol */
-       /* FIXME: add PFC support */
-       pl[0] = protocol >> 8;
-       pl[1] = protocol;
-
-       /* Hide MPPE header */
-       pbuf_header(np, -(s16_t)MPPE_OVHD);
-
-       /* Encrypt packet */
-       for (n = np; n != NULL; n = n->next) {
-               arc4_crypt(&state->arc4, (u8_t*)n->payload, n->len);
-               if (n->tot_len == n->len) {
-                       break;
-               }
-       }
-
-       /* Reveal MPPE header */
-       pbuf_header(np, (s16_t)MPPE_OVHD);
-
-       return ERR_OK;
-}
-
-/*
- * We received a CCP Reset-Ack.  Just ignore it.
- */
-void mppe_decomp_reset(ppp_pcb *pcb, ppp_mppe_state *state)
-{
-       LWIP_UNUSED_ARG(pcb);
-       LWIP_UNUSED_ARG(state);
-       return;
-}
-
-/*
- * Decompress (decrypt) an MPPE packet.
- */
-err_t
-mppe_decompress(ppp_pcb *pcb, ppp_mppe_state *state, struct pbuf **pb)
-{
-       struct pbuf *n0 = *pb, *n;
-       u8_t *pl;
-       u16_t ccount;
-       u8_t flushed;
-
-       /* MPPE Header */
-       if (n0->len < MPPE_OVHD) {
-               PPPDEBUG(LOG_DEBUG,
-                      ("mppe_decompress[%d]: short pkt (%d)\n",
-                      pcb->netif->num, n0->len));
-               state->sanity_errors += 100;
-               goto sanity_error;
-       }
-
-       pl = (u8_t*)n0->payload;
-       flushed = MPPE_BITS(pl) & MPPE_BIT_FLUSHED;
-       ccount = MPPE_CCOUNT(pl);
-       PPPDEBUG(LOG_DEBUG, ("mppe_decompress[%d]: ccount %d\n",
-              pcb->netif->num, ccount));
-
-       /* sanity checks -- terminate with extreme prejudice */
-       if (!(MPPE_BITS(pl) & MPPE_BIT_ENCRYPTED)) {
-               PPPDEBUG(LOG_DEBUG,
-                      ("mppe_decompress[%d]: ENCRYPTED bit not set!\n",
-                      pcb->netif->num));
-               state->sanity_errors += 100;
-               goto sanity_error;
-       }
-       if (!state->stateful && !flushed) {
-               PPPDEBUG(LOG_DEBUG, ("mppe_decompress[%d]: FLUSHED bit not set in "
-                      "stateless mode!\n", pcb->netif->num));
-               state->sanity_errors += 100;
-               goto sanity_error;
-       }
-       if (state->stateful && ((ccount & 0xff) == 0xff) && !flushed) {
-               PPPDEBUG(LOG_DEBUG, ("mppe_decompress[%d]: FLUSHED bit not set on "
-                      "flag packet!\n", pcb->netif->num));
-               state->sanity_errors += 100;
-               goto sanity_error;
-       }
-
-       /*
-        * Check the coherency count.
-        */
-
-       if (!state->stateful) {
-               /* Discard late packet */
-               if ((ccount - state->ccount) % MPPE_CCOUNT_SPACE > MPPE_CCOUNT_SPACE / 2) {
-                       state->sanity_errors++;
-                       goto sanity_error;
-               }
-
-               /* RFC 3078, sec 8.1.  Rekey for every packet. */
-               while (state->ccount != ccount) {
-                       mppe_rekey(state, 0);
-                       state->ccount = (state->ccount + 1) % MPPE_CCOUNT_SPACE;
-               }
-       } else {
-               /* RFC 3078, sec 8.2. */
-               if (!state->discard) {
-                       /* normal state */
-                       state->ccount = (state->ccount + 1) % MPPE_CCOUNT_SPACE;
-                       if (ccount != state->ccount) {
-                               /*
-                                * (ccount > state->ccount)
-                                * Packet loss detected, enter the discard state.
-                                * Signal the peer to rekey (by sending a CCP Reset-Request).
-                                */
-                               state->discard = 1;
-                               ccp_resetrequest(pcb);
-                               return ERR_BUF;
-                       }
-               } else {
-                       /* discard state */
-                       if (!flushed) {
-                               /* ccp.c will be silent (no additional CCP Reset-Requests). */
-                               return ERR_BUF;
-                       } else {
-                               /* Rekey for every missed "flag" packet. */
-                               while ((ccount & ~0xff) !=
-                                      (state->ccount & ~0xff)) {
-                                       mppe_rekey(state, 0);
-                                       state->ccount =
-                                           (state->ccount +
-                                            256) % MPPE_CCOUNT_SPACE;
-                               }
-
-                               /* reset */
-                               state->discard = 0;
-                               state->ccount = ccount;
-                               /*
-                                * Another problem with RFC 3078 here.  It implies that the
-                                * peer need not send a Reset-Ack packet.  But RFC 1962
-                                * requires it.  Hopefully, M$ does send a Reset-Ack; even
-                                * though it isn't required for MPPE synchronization, it is
-                                * required to reset CCP state.
-                                */
-                       }
-               }
-               if (flushed)
-                       mppe_rekey(state, 0);
-       }
-
-       /* Hide MPPE header */
-       pbuf_header(n0, -(s16_t)(MPPE_OVHD));
-
-       /* Decrypt the packet. */
-       for (n = n0; n != NULL; n = n->next) {
-               arc4_crypt(&state->arc4, (u8_t*)n->payload, n->len);
-               if (n->tot_len == n->len) {
-                       break;
-               }
-       }
-
-       /* good packet credit */
-       state->sanity_errors >>= 1;
-
-       return ERR_OK;
-
-sanity_error:
-       if (state->sanity_errors >= SANITY_MAX) {
-               /*
-                * Take LCP down if the peer is sending too many bogons.
-                * We don't want to do this for a single or just a few
-                * instances since it could just be due to packet corruption.
-                */
-               lcp_close(pcb, "Too many MPPE errors");
-       }
-       return ERR_BUF;
-}
-
-#endif /* PPP_SUPPORT && MPPE_SUPPORT */
diff --git a/components/lwip/netif/ppp/multilink.c b/components/lwip/netif/ppp/multilink.c
deleted file mode 100644 (file)
index 6be69e4..0000000
+++ /dev/null
@@ -1,609 +0,0 @@
-/*
- * multilink.c - support routines for multilink.
- *
- * Copyright (c) 2000-2002 Paul Mackerras. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. The name(s) of the authors of this software must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission.
- *
- * 3. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by Paul Mackerras
- *     <paulus@samba.org>".
- *
- * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && defined(HAVE_MULTILINK) /* don't build if not configured for use in lwipopts.h */
-
-/* Multilink support
- *
- * Multilink uses Samba TDB (Trivial Database Library), which
- * we cannot port, because it needs a filesystem.
- *
- * We have to choose between doing a memory-shared TDB-clone,
- * or dropping multilink support at all.
- */
-
-#include <string.h>
-#include <ctype.h>
-#include <stdlib.h>
-#include <netdb.h>
-#include <errno.h>
-#include <signal.h>
-#include <netinet/in.h>
-#include <unistd.h>
-
-#include "netif/ppp/ppp_impl.h"
-
-#include "netif/ppp/fsm.h"
-#include "netif/ppp/lcp.h"
-#include "netif/ppp/tdb.h"
-
-bool endpoint_specified;       /* user gave explicit endpoint discriminator */
-char *bundle_id;               /* identifier for our bundle */
-char *blinks_id;               /* key for the list of links */
-bool doing_multilink;          /* multilink was enabled and agreed to */
-bool multilink_master;         /* we own the multilink bundle */
-
-extern TDB_CONTEXT *pppdb;
-extern char db_key[];
-
-static void make_bundle_links (int append);
-static void remove_bundle_link (void);
-static void iterate_bundle_links (void (*func) (char *));
-
-static int get_default_epdisc (struct epdisc *);
-static int parse_num (char *str, const char *key, int *valp);
-static int owns_unit (TDB_DATA pid, int unit);
-
-#define set_ip_epdisc(ep, addr) do {   \
-       ep->length = 4;                 \
-       ep->value[0] = addr >> 24;      \
-       ep->value[1] = addr >> 16;      \
-       ep->value[2] = addr >> 8;       \
-       ep->value[3] = addr;            \
-} while (0)
-
-#define LOCAL_IP_ADDR(addr)                                              \
-       (((addr) & 0xff000000) == 0x0a000000            /* 10.x.x.x */    \
-        || ((addr) & 0xfff00000) == 0xac100000         /* 172.16.x.x */  \
-        || ((addr) & 0xffff0000) == 0xc0a80000)        /* 192.168.x.x */
-
-#define process_exists(n)      (kill((n), 0) == 0 || errno != ESRCH)
-
-void
-mp_check_options()
-{
-       lcp_options *wo = &lcp_wantoptions[0];
-       lcp_options *ao = &lcp_allowoptions[0];
-
-       doing_multilink = 0;
-       if (!multilink)
-               return;
-       /* if we're doing multilink, we have to negotiate MRRU */
-       if (!wo->neg_mrru) {
-               /* mrru not specified, default to mru */
-               wo->mrru = wo->mru;
-               wo->neg_mrru = 1;
-       }
-       ao->mrru = ao->mru;
-       ao->neg_mrru = 1;
-
-       if (!wo->neg_endpoint && !noendpoint) {
-               /* get a default endpoint value */
-               wo->neg_endpoint = get_default_epdisc(&wo->endpoint);
-       }
-}
-
-/*
- * Make a new bundle or join us to an existing bundle
- * if we are doing multilink.
- */
-int
-mp_join_bundle()
-{
-       lcp_options *go = &lcp_gotoptions[0];
-       lcp_options *ho = &lcp_hisoptions[0];
-       lcp_options *ao = &lcp_allowoptions[0];
-       int unit, pppd_pid;
-       int l, mtu;
-       char *p;
-       TDB_DATA key, pid, rec;
-
-       if (doing_multilink) {
-               /* have previously joined a bundle */
-               if (!go->neg_mrru || !ho->neg_mrru) {
-                       notice("oops, didn't get multilink on renegotiation");
-                       lcp_close(pcb, "multilink required");
-                       return 0;
-               }
-               /* XXX should check the peer_authname and ho->endpoint
-                  are the same as previously */
-               return 0;
-       }
-
-       if (!go->neg_mrru || !ho->neg_mrru) {
-               /* not doing multilink */
-               if (go->neg_mrru)
-                       notice("oops, multilink negotiated only for receive");
-               mtu = ho->neg_mru? ho->mru: PPP_MRU;
-               if (mtu > ao->mru)
-                       mtu = ao->mru;
-               if (demand) {
-                       /* already have a bundle */
-                       cfg_bundle(0, 0, 0, 0);
-                       netif_set_mtu(pcb, mtu);
-                       return 0;
-               }
-               make_new_bundle(0, 0, 0, 0);
-               set_ifunit(1);
-               netif_set_mtu(pcb, mtu);
-               return 0;
-       }
-
-       doing_multilink = 1;
-
-       /*
-        * Find the appropriate bundle or join a new one.
-        * First we make up a name for the bundle.
-        * The length estimate is worst-case assuming every
-        * character has to be quoted.
-        */
-       l = 4 * strlen(peer_authname) + 10;
-       if (ho->neg_endpoint)
-               l += 3 * ho->endpoint.length + 8;
-       if (bundle_name)
-               l += 3 * strlen(bundle_name) + 2;
-       bundle_id = mem_malloc(l);
-       if (bundle_id == 0)
-               novm("bundle identifier");
-
-       p = bundle_id;
-       p += slprintf(p, l-1, "BUNDLE=\"%q\"", peer_authname);
-       if (ho->neg_endpoint || bundle_name)
-               *p++ = '/';
-       if (ho->neg_endpoint)
-               p += slprintf(p, bundle_id+l-p, "%s",
-                             epdisc_to_str(&ho->endpoint));
-       if (bundle_name)
-               p += slprintf(p, bundle_id+l-p, "/%v", bundle_name);
-
-       /* Make the key for the list of links belonging to the bundle */
-       l = p - bundle_id;
-       blinks_id = mem_malloc(l + 7);
-       if (blinks_id == NULL)
-               novm("bundle links key");
-       slprintf(blinks_id, l + 7, "BUNDLE_LINKS=%s", bundle_id + 7);
-
-       /*
-        * For demand mode, we only need to configure the bundle
-        * and attach the link.
-        */
-       mtu = LWIP_MIN(ho->mrru, ao->mru);
-       if (demand) {
-               cfg_bundle(go->mrru, ho->mrru, go->neg_ssnhf, ho->neg_ssnhf);
-               netif_set_mtu(pcb, mtu);
-               script_setenv("BUNDLE", bundle_id + 7, 1);
-               return 0;
-       }
-
-       /*
-        * Check if the bundle ID is already in the database.
-        */
-       unit = -1;
-       lock_db();
-       key.dptr = bundle_id;
-       key.dsize = p - bundle_id;
-       pid = tdb_fetch(pppdb, key);
-       if (pid.dptr != NULL) {
-               /* bundle ID exists, see if the pppd record exists */
-               rec = tdb_fetch(pppdb, pid);
-               if (rec.dptr != NULL && rec.dsize > 0) {
-                       /* make sure the string is null-terminated */
-                       rec.dptr[rec.dsize-1] = 0;
-                       /* parse the interface number */
-                       parse_num(rec.dptr, "IFNAME=ppp", &unit);
-                       /* check the pid value */
-                       if (!parse_num(rec.dptr, "PPPD_PID=", &pppd_pid)
-                           || !process_exists(pppd_pid)
-                           || !owns_unit(pid, unit))
-                               unit = -1;
-                       free(rec.dptr);
-               }
-               free(pid.dptr);
-       }
-
-       if (unit >= 0) {
-               /* attach to existing unit */
-               if (bundle_attach(unit)) {
-                       set_ifunit(0);
-                       script_setenv("BUNDLE", bundle_id + 7, 0);
-                       make_bundle_links(1);
-                       unlock_db();
-                       info("Link attached to %s", ifname);
-                       return 1;
-               }
-               /* attach failed because bundle doesn't exist */
-       }
-
-       /* we have to make a new bundle */
-       make_new_bundle(go->mrru, ho->mrru, go->neg_ssnhf, ho->neg_ssnhf);
-       set_ifunit(1);
-       netif_set_mtu(pcb, mtu);
-       script_setenv("BUNDLE", bundle_id + 7, 1);
-       make_bundle_links(pcb);
-       unlock_db();
-       info("New bundle %s created", ifname);
-       multilink_master = 1;
-       return 0;
-}
-
-void mp_exit_bundle()
-{
-       lock_db();
-       remove_bundle_link();
-       unlock_db();
-}
-
-static void sendhup(char *str)
-{
-       int pid;
-
-       if (parse_num(str, "PPPD_PID=", &pid) && pid != getpid()) {
-               if (debug)
-                       dbglog("sending SIGHUP to process %d", pid);
-               kill(pid, SIGHUP);
-       }
-}
-
-void mp_bundle_terminated()
-{
-       TDB_DATA key;
-
-       bundle_terminating = 1;
-       upper_layers_down(pcb);
-       notice("Connection terminated.");
-#if PPP_STATS_SUPPORT
-       print_link_stats();
-#endif /* PPP_STATS_SUPPORT */
-       if (!demand) {
-               remove_pidfiles();
-               script_unsetenv("IFNAME");
-       }
-
-       lock_db();
-       destroy_bundle();
-       iterate_bundle_links(sendhup);
-       key.dptr = blinks_id;
-       key.dsize = strlen(blinks_id);
-       tdb_delete(pppdb, key);
-       unlock_db();
-
-       new_phase(PPP_PHASE_DEAD);
-
-       doing_multilink = 0;
-       multilink_master = 0;
-}
-
-static void make_bundle_links(int append)
-{
-       TDB_DATA key, rec;
-       char *p;
-       char entry[32];
-       int l;
-
-       key.dptr = blinks_id;
-       key.dsize = strlen(blinks_id);
-       slprintf(entry, sizeof(entry), "%s;", db_key);
-       p = entry;
-       if (append) {
-               rec = tdb_fetch(pppdb, key);
-               if (rec.dptr != NULL && rec.dsize > 0) {
-                       rec.dptr[rec.dsize-1] = 0;
-                       if (strstr(rec.dptr, db_key) != NULL) {
-                               /* already in there? strange */
-                               warn("link entry already exists in tdb");
-                               return;
-                       }
-                       l = rec.dsize + strlen(entry);
-                       p = mem_malloc(l);
-                       if (p == NULL)
-                               novm("bundle link list");
-                       slprintf(p, l, "%s%s", rec.dptr, entry);
-               } else {
-                       warn("bundle link list not found");
-               }
-               if (rec.dptr != NULL)
-                       free(rec.dptr);
-       }
-       rec.dptr = p;
-       rec.dsize = strlen(p) + 1;
-       if (tdb_store(pppdb, key, rec, TDB_REPLACE))
-               error("couldn't %s bundle link list",
-                     append? "update": "create");
-       if (p != entry)
-               free(p);
-}
-
-static void remove_bundle_link()
-{
-       TDB_DATA key, rec;
-       char entry[32];
-       char *p, *q;
-       int l;
-
-       key.dptr = blinks_id;
-       key.dsize = strlen(blinks_id);
-       slprintf(entry, sizeof(entry), "%s;", db_key);
-
-       rec = tdb_fetch(pppdb, key);
-       if (rec.dptr == NULL || rec.dsize <= 0) {
-               if (rec.dptr != NULL)
-                       free(rec.dptr);
-               return;
-       }
-       rec.dptr[rec.dsize-1] = 0;
-       p = strstr(rec.dptr, entry);
-       if (p != NULL) {
-               q = p + strlen(entry);
-               l = strlen(q) + 1;
-               memmove(p, q, l);
-               rec.dsize = p - rec.dptr + l;
-               if (tdb_store(pppdb, key, rec, TDB_REPLACE))
-                       error("couldn't update bundle link list (removal)");
-       }
-       free(rec.dptr);
-}
-
-static void iterate_bundle_links(void (*func)(char *))
-{
-       TDB_DATA key, rec, pp;
-       char *p, *q;
-
-       key.dptr = blinks_id;
-       key.dsize = strlen(blinks_id);
-       rec = tdb_fetch(pppdb, key);
-       if (rec.dptr == NULL || rec.dsize <= 0) {
-               error("bundle link list not found (iterating list)");
-               if (rec.dptr != NULL)
-                       free(rec.dptr);
-               return;
-       }
-       p = rec.dptr;
-       p[rec.dsize-1] = 0;
-       while ((q = strchr(p, ';')) != NULL) {
-               *q = 0;
-               key.dptr = p;
-               key.dsize = q - p;
-               pp = tdb_fetch(pppdb, key);
-               if (pp.dptr != NULL && pp.dsize > 0) {
-                       pp.dptr[pp.dsize-1] = 0;
-                       func(pp.dptr);
-               }
-               if (pp.dptr != NULL)
-                       free(pp.dptr);
-               p = q + 1;
-       }
-       free(rec.dptr);
-}
-
-static int
-parse_num(str, key, valp)
-     char *str;
-     const char *key;
-     int *valp;
-{
-       char *p, *endp;
-       int i;
-
-       p = strstr(str, key);
-       if (p != 0) {
-               p += strlen(key);
-               i = strtol(p, &endp, 10);
-               if (endp != p && (*endp == 0 || *endp == ';')) {
-                       *valp = i;
-                       return 1;
-               }
-       }
-       return 0;
-}
-
-/*
- * Check whether the pppd identified by `key' still owns ppp unit `unit'.
- */
-static int
-owns_unit(key, unit)
-     TDB_DATA key;
-     int unit;
-{
-       char ifkey[32];
-       TDB_DATA kd, vd;
-       int ret = 0;
-
-       slprintf(ifkey, sizeof(ifkey), "IFNAME=ppp%d", unit);
-       kd.dptr = ifkey;
-       kd.dsize = strlen(ifkey);
-       vd = tdb_fetch(pppdb, kd);
-       if (vd.dptr != NULL) {
-               ret = vd.dsize == key.dsize
-                       && memcmp(vd.dptr, key.dptr, vd.dsize) == 0;
-               free(vd.dptr);
-       }
-       return ret;
-}
-
-static int
-get_default_epdisc(ep)
-     struct epdisc *ep;
-{
-       char *p;
-       struct hostent *hp;
-       u32_t addr;
-
-       /* First try for an ethernet MAC address */
-       p = get_first_ethernet();
-       if (p != 0 && get_if_hwaddr(ep->value, p) >= 0) {
-               ep->class = EPD_MAC;
-               ep->length = 6;
-               return 1;
-       }
-
-       /* see if our hostname corresponds to a reasonable IP address */
-       hp = gethostbyname(hostname);
-       if (hp != NULL) {
-               addr = *(u32_t *)hp->h_addr;
-               if (!bad_ip_adrs(addr)) {
-                       addr = ntohl(addr);
-                       if (!LOCAL_IP_ADDR(addr)) {
-                               ep->class = EPD_IP;
-                               set_ip_epdisc(ep, addr);
-                               return 1;
-                       }
-               }
-       }
-
-       return 0;
-}
-
-/*
- * epdisc_to_str - make a printable string from an endpoint discriminator.
- */
-
-static char *endp_class_names[] = {
-    "null", "local", "IP", "MAC", "magic", "phone"
-};
-
-char *
-epdisc_to_str(ep)
-     struct epdisc *ep;
-{
-       static char str[MAX_ENDP_LEN*3+8];
-       u_char *p = ep->value;
-       int i, mask = 0;
-       char *q, c, c2;
-
-       if (ep->class == EPD_NULL && ep->length == 0)
-               return "null";
-       if (ep->class == EPD_IP && ep->length == 4) {
-               u32_t addr;
-
-               GETLONG(addr, p);
-               slprintf(str, sizeof(str), "IP:%I", htonl(addr));
-               return str;
-       }
-
-       c = ':';
-       c2 = '.';
-       if (ep->class == EPD_MAC && ep->length == 6)
-               c2 = ':';
-       else if (ep->class == EPD_MAGIC && (ep->length % 4) == 0)
-               mask = 3;
-       q = str;
-       if (ep->class <= EPD_PHONENUM)
-               q += slprintf(q, sizeof(str)-1, "%s",
-                             endp_class_names[ep->class]);
-       else
-               q += slprintf(q, sizeof(str)-1, "%d", ep->class);
-       c = ':';
-       for (i = 0; i < ep->length && i < MAX_ENDP_LEN; ++i) {
-               if ((i & mask) == 0) {
-                       *q++ = c;
-                       c = c2;
-               }
-               q += slprintf(q, str + sizeof(str) - q, "%.2x", ep->value[i]);
-       }
-       return str;
-}
-
-static int hexc_val(int c)
-{
-       if (c >= 'a')
-               return c - 'a' + 10;
-       if (c >= 'A')
-               return c - 'A' + 10;
-       return c - '0';
-}
-
-int
-str_to_epdisc(ep, str)
-     struct epdisc *ep;
-     char *str;
-{
-       int i, l;
-       char *p, *endp;
-
-       for (i = EPD_NULL; i <= EPD_PHONENUM; ++i) {
-               int sl = strlen(endp_class_names[i]);
-               if (strncasecmp(str, endp_class_names[i], sl) == 0) {
-                       str += sl;
-                       break;
-               }
-       }
-       if (i > EPD_PHONENUM) {
-               /* not a class name, try a decimal class number */
-               i = strtol(str, &endp, 10);
-               if (endp == str)
-                       return 0;       /* can't parse class number */
-               str = endp;
-       }
-       ep->class = i;
-       if (*str == 0) {
-               ep->length = 0;
-               return 1;
-       }
-       if (*str != ':' && *str != '.')
-               return 0;
-       ++str;
-
-       if (i == EPD_IP) {
-               u32_t addr;
-               i = parse_dotted_ip(str, &addr);
-               if (i == 0 || str[i] != 0)
-                       return 0;
-               set_ip_epdisc(ep, addr);
-               return 1;
-       }
-       if (i == EPD_MAC && get_if_hwaddr(ep->value, str) >= 0) {
-               ep->length = 6;
-               return 1;
-       }
-
-       p = str;
-       for (l = 0; l < MAX_ENDP_LEN; ++l) {
-               if (*str == 0)
-                       break;
-               if (p <= str)
-                       for (p = str; isxdigit(*p); ++p)
-                               ;
-               i = p - str;
-               if (i == 0)
-                       return 0;
-               ep->value[l] = hexc_val(*str++);
-               if ((i & 1) == 0)
-                       ep->value[l] = (ep->value[l] << 4) + hexc_val(*str++);
-               if (*str == ':' || *str == '.')
-                       ++str;
-       }
-       if (*str != 0 || (ep->class == EPD_MAC && l != 6))
-               return 0;
-       ep->length = l;
-       return 1;
-}
-
-#endif /* PPP_SUPPORT && HAVE_MULTILINK */
diff --git a/components/lwip/netif/ppp/polarssl/README b/components/lwip/netif/ppp/polarssl/README
deleted file mode 100644 (file)
index ff6e44d..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-About PolarSSL files into lwIP PPP support
-------------------------------------------
-
-This folder contains some files fetched from the latest BSD release of
-the PolarSSL project for ciphers and encryption methods we need for lwIP
-PPP support.
-
-The PolarSSL files were cleaned to contain only the necessary struct
-fields and functions needed for lwIP.
-
-
-The PolarSSL API was not changed at all, so if you are already using
-PolarSSL you can choose to skip the compilation of the included PolarSSL
-library into lwIP:
-
-The following defines are available for flexibility:
-
-LWIP_INCLUDED_POLARSSL_MD4   ; Use lwIP internal PolarSSL for MD4
-LWIP_INCLUDED_POLARSSL_MD5   ; Use lwIP internal PolarSSL for MD5
-LWIP_INCLUDED_POLARSSL_SHA1  ; Use lwIP internal PolarSSL for SHA1
-LWIP_INCLUDED_POLARSSL_DES   ; Use lwIP internal PolarSSL for DES
-LWIP_INCLUDED_POLARSSL_ARC4  ; Use lwIP internal PolarSSL for ARC4
-
-If set (=1), the default if required by another enabled PPP feature unless
-explicitly set to 0, using included lwIP PolarSSL.
-
-If clear (=0), not needed or using external PolarSSL.
-
-Beware of the stack requirements which can be a lot larger if you are not
-using our cleaned PolarSSL library.
-
-
-PolarSSL project website: http://polarssl.org/
diff --git a/components/lwip/netif/ppp/polarssl/arc4.c b/components/lwip/netif/ppp/polarssl/arc4.c
deleted file mode 100644 (file)
index ca5000e..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- *  An implementation of the ARCFOUR algorithm
- *
- *  Based on XySSL: Copyright (C) 2006-2008  Christophe Devine
- *
- *  Copyright (C) 2009  Paul Bakker <polarssl_maintainer at polarssl dot org>
- *
- *  All rights reserved.
- *
- *  Redistribution and use in source and binary forms, with or without
- *  modification, are permitted provided that the following conditions
- *  are met:
- *  
- *    * Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *    * Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *    * Neither the names of PolarSSL or XySSL nor the names of its contributors
- *      may be used to endorse or promote products derived from this software
- *      without specific prior written permission.
- *  
- *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *  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.
- */
-/*
- *  The ARCFOUR algorithm was publicly disclosed on 94/09.
- *
- *  http://groups.google.com/group/sci.crypt/msg/10a300c9d21afca0
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && LWIP_INCLUDED_POLARSSL_ARC4
-
-#include "netif/ppp/polarssl/arc4.h"
-/*
- * ARC4 key schedule
- */
-void arc4_setup( arc4_context *ctx, unsigned char *key, int keylen )
-{
-    int i, j, k, a;
-    unsigned char *m;
-
-    ctx->x = 0;
-    ctx->y = 0;
-    m = ctx->m;
-
-    for( i = 0; i < 256; i++ )
-        m[i] = (unsigned char) i;
-
-    j = k = 0;
-
-    for( i = 0; i < 256; i++, k++ )
-    {
-        if( k >= keylen ) k = 0;
-
-        a = m[i];
-        j = ( j + a + key[k] ) & 0xFF;
-        m[i] = m[j];
-        m[j] = (unsigned char) a;
-    }
-}
-
-/*
- * ARC4 cipher function
- */
-void arc4_crypt( arc4_context *ctx, unsigned char *buf, int buflen )
-{
-    int i, x, y, a, b;
-    unsigned char *m;
-
-    x = ctx->x;
-    y = ctx->y;
-    m = ctx->m;
-
-    for( i = 0; i < buflen; i++ )
-    {
-        x = ( x + 1 ) & 0xFF; a = m[x];
-        y = ( y + a ) & 0xFF; b = m[y];
-
-        m[x] = (unsigned char) b;
-        m[y] = (unsigned char) a;
-
-        buf[i] = (unsigned char)
-            ( buf[i] ^ m[(unsigned char)( a + b )] );
-    }
-
-    ctx->x = x;
-    ctx->y = y;
-}
-
-#endif /* PPP_SUPPORT && LWIP_INCLUDED_POLARSSL_DES */
diff --git a/components/lwip/netif/ppp/polarssl/des.c b/components/lwip/netif/ppp/polarssl/des.c
deleted file mode 100644 (file)
index 0d6af84..0000000
+++ /dev/null
@@ -1,422 +0,0 @@
-/*
- *  FIPS-46-3 compliant Triple-DES implementation
- *
- *  Based on XySSL: Copyright (C) 2006-2008  Christophe Devine
- *
- *  Copyright (C) 2009  Paul Bakker <polarssl_maintainer at polarssl dot org>
- *
- *  All rights reserved.
- *
- *  Redistribution and use in source and binary forms, with or without
- *  modification, are permitted provided that the following conditions
- *  are met:
- *  
- *    * Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *    * Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *    * Neither the names of PolarSSL or XySSL nor the names of its contributors
- *      may be used to endorse or promote products derived from this software
- *      without specific prior written permission.
- *  
- *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *  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.
- */
-/*
- *  DES, on which TDES is based, was originally designed by Horst Feistel
- *  at IBM in 1974, and was adopted as a standard by NIST (formerly NBS).
- *
- *  http://csrc.nist.gov/publications/fips/fips46-3/fips46-3.pdf
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && LWIP_INCLUDED_POLARSSL_DES
-
-#include "netif/ppp/polarssl/des.h"
-
-/*
- * 32-bit integer manipulation macros (big endian)
- */
-#ifndef GET_ULONG_BE
-#define GET_ULONG_BE(n,b,i)                             \
-{                                                       \
-    (n) = ( (unsigned long) (b)[(i)    ] << 24 )        \
-        | ( (unsigned long) (b)[(i) + 1] << 16 )        \
-        | ( (unsigned long) (b)[(i) + 2] <<  8 )        \
-        | ( (unsigned long) (b)[(i) + 3]       );       \
-}
-#endif
-
-#ifndef PUT_ULONG_BE
-#define PUT_ULONG_BE(n,b,i)                             \
-{                                                       \
-    (b)[(i)    ] = (unsigned char) ( (n) >> 24 );       \
-    (b)[(i) + 1] = (unsigned char) ( (n) >> 16 );       \
-    (b)[(i) + 2] = (unsigned char) ( (n) >>  8 );       \
-    (b)[(i) + 3] = (unsigned char) ( (n)       );       \
-}
-#endif
-
-/*
- * Expanded DES S-boxes
- */
-static const unsigned long SB1[64] =
-{
-    0x01010400, 0x00000000, 0x00010000, 0x01010404,
-    0x01010004, 0x00010404, 0x00000004, 0x00010000,
-    0x00000400, 0x01010400, 0x01010404, 0x00000400,
-    0x01000404, 0x01010004, 0x01000000, 0x00000004,
-    0x00000404, 0x01000400, 0x01000400, 0x00010400,
-    0x00010400, 0x01010000, 0x01010000, 0x01000404,
-    0x00010004, 0x01000004, 0x01000004, 0x00010004,
-    0x00000000, 0x00000404, 0x00010404, 0x01000000,
-    0x00010000, 0x01010404, 0x00000004, 0x01010000,
-    0x01010400, 0x01000000, 0x01000000, 0x00000400,
-    0x01010004, 0x00010000, 0x00010400, 0x01000004,
-    0x00000400, 0x00000004, 0x01000404, 0x00010404,
-    0x01010404, 0x00010004, 0x01010000, 0x01000404,
-    0x01000004, 0x00000404, 0x00010404, 0x01010400,
-    0x00000404, 0x01000400, 0x01000400, 0x00000000,
-    0x00010004, 0x00010400, 0x00000000, 0x01010004
-};
-
-static const unsigned long SB2[64] =
-{
-    0x80108020, 0x80008000, 0x00008000, 0x00108020,
-    0x00100000, 0x00000020, 0x80100020, 0x80008020,
-    0x80000020, 0x80108020, 0x80108000, 0x80000000,
-    0x80008000, 0x00100000, 0x00000020, 0x80100020,
-    0x00108000, 0x00100020, 0x80008020, 0x00000000,
-    0x80000000, 0x00008000, 0x00108020, 0x80100000,
-    0x00100020, 0x80000020, 0x00000000, 0x00108000,
-    0x00008020, 0x80108000, 0x80100000, 0x00008020,
-    0x00000000, 0x00108020, 0x80100020, 0x00100000,
-    0x80008020, 0x80100000, 0x80108000, 0x00008000,
-    0x80100000, 0x80008000, 0x00000020, 0x80108020,
-    0x00108020, 0x00000020, 0x00008000, 0x80000000,
-    0x00008020, 0x80108000, 0x00100000, 0x80000020,
-    0x00100020, 0x80008020, 0x80000020, 0x00100020,
-    0x00108000, 0x00000000, 0x80008000, 0x00008020,
-    0x80000000, 0x80100020, 0x80108020, 0x00108000
-};
-
-static const unsigned long SB3[64] =
-{
-    0x00000208, 0x08020200, 0x00000000, 0x08020008,
-    0x08000200, 0x00000000, 0x00020208, 0x08000200,
-    0x00020008, 0x08000008, 0x08000008, 0x00020000,
-    0x08020208, 0x00020008, 0x08020000, 0x00000208,
-    0x08000000, 0x00000008, 0x08020200, 0x00000200,
-    0x00020200, 0x08020000, 0x08020008, 0x00020208,
-    0x08000208, 0x00020200, 0x00020000, 0x08000208,
-    0x00000008, 0x08020208, 0x00000200, 0x08000000,
-    0x08020200, 0x08000000, 0x00020008, 0x00000208,
-    0x00020000, 0x08020200, 0x08000200, 0x00000000,
-    0x00000200, 0x00020008, 0x08020208, 0x08000200,
-    0x08000008, 0x00000200, 0x00000000, 0x08020008,
-    0x08000208, 0x00020000, 0x08000000, 0x08020208,
-    0x00000008, 0x00020208, 0x00020200, 0x08000008,
-    0x08020000, 0x08000208, 0x00000208, 0x08020000,
-    0x00020208, 0x00000008, 0x08020008, 0x00020200
-};
-
-static const unsigned long SB4[64] =
-{
-    0x00802001, 0x00002081, 0x00002081, 0x00000080,
-    0x00802080, 0x00800081, 0x00800001, 0x00002001,
-    0x00000000, 0x00802000, 0x00802000, 0x00802081,
-    0x00000081, 0x00000000, 0x00800080, 0x00800001,
-    0x00000001, 0x00002000, 0x00800000, 0x00802001,
-    0x00000080, 0x00800000, 0x00002001, 0x00002080,
-    0x00800081, 0x00000001, 0x00002080, 0x00800080,
-    0x00002000, 0x00802080, 0x00802081, 0x00000081,
-    0x00800080, 0x00800001, 0x00802000, 0x00802081,
-    0x00000081, 0x00000000, 0x00000000, 0x00802000,
-    0x00002080, 0x00800080, 0x00800081, 0x00000001,
-    0x00802001, 0x00002081, 0x00002081, 0x00000080,
-    0x00802081, 0x00000081, 0x00000001, 0x00002000,
-    0x00800001, 0x00002001, 0x00802080, 0x00800081,
-    0x00002001, 0x00002080, 0x00800000, 0x00802001,
-    0x00000080, 0x00800000, 0x00002000, 0x00802080
-};
-
-static const unsigned long SB5[64] =
-{
-    0x00000100, 0x02080100, 0x02080000, 0x42000100,
-    0x00080000, 0x00000100, 0x40000000, 0x02080000,
-    0x40080100, 0x00080000, 0x02000100, 0x40080100,
-    0x42000100, 0x42080000, 0x00080100, 0x40000000,
-    0x02000000, 0x40080000, 0x40080000, 0x00000000,
-    0x40000100, 0x42080100, 0x42080100, 0x02000100,
-    0x42080000, 0x40000100, 0x00000000, 0x42000000,
-    0x02080100, 0x02000000, 0x42000000, 0x00080100,
-    0x00080000, 0x42000100, 0x00000100, 0x02000000,
-    0x40000000, 0x02080000, 0x42000100, 0x40080100,
-    0x02000100, 0x40000000, 0x42080000, 0x02080100,
-    0x40080100, 0x00000100, 0x02000000, 0x42080000,
-    0x42080100, 0x00080100, 0x42000000, 0x42080100,
-    0x02080000, 0x00000000, 0x40080000, 0x42000000,
-    0x00080100, 0x02000100, 0x40000100, 0x00080000,
-    0x00000000, 0x40080000, 0x02080100, 0x40000100
-};
-
-static const unsigned long SB6[64] =
-{
-    0x20000010, 0x20400000, 0x00004000, 0x20404010,
-    0x20400000, 0x00000010, 0x20404010, 0x00400000,
-    0x20004000, 0x00404010, 0x00400000, 0x20000010,
-    0x00400010, 0x20004000, 0x20000000, 0x00004010,
-    0x00000000, 0x00400010, 0x20004010, 0x00004000,
-    0x00404000, 0x20004010, 0x00000010, 0x20400010,
-    0x20400010, 0x00000000, 0x00404010, 0x20404000,
-    0x00004010, 0x00404000, 0x20404000, 0x20000000,
-    0x20004000, 0x00000010, 0x20400010, 0x00404000,
-    0x20404010, 0x00400000, 0x00004010, 0x20000010,
-    0x00400000, 0x20004000, 0x20000000, 0x00004010,
-    0x20000010, 0x20404010, 0x00404000, 0x20400000,
-    0x00404010, 0x20404000, 0x00000000, 0x20400010,
-    0x00000010, 0x00004000, 0x20400000, 0x00404010,
-    0x00004000, 0x00400010, 0x20004010, 0x00000000,
-    0x20404000, 0x20000000, 0x00400010, 0x20004010
-};
-
-static const unsigned long SB7[64] =
-{
-    0x00200000, 0x04200002, 0x04000802, 0x00000000,
-    0x00000800, 0x04000802, 0x00200802, 0x04200800,
-    0x04200802, 0x00200000, 0x00000000, 0x04000002,
-    0x00000002, 0x04000000, 0x04200002, 0x00000802,
-    0x04000800, 0x00200802, 0x00200002, 0x04000800,
-    0x04000002, 0x04200000, 0x04200800, 0x00200002,
-    0x04200000, 0x00000800, 0x00000802, 0x04200802,
-    0x00200800, 0x00000002, 0x04000000, 0x00200800,
-    0x04000000, 0x00200800, 0x00200000, 0x04000802,
-    0x04000802, 0x04200002, 0x04200002, 0x00000002,
-    0x00200002, 0x04000000, 0x04000800, 0x00200000,
-    0x04200800, 0x00000802, 0x00200802, 0x04200800,
-    0x00000802, 0x04000002, 0x04200802, 0x04200000,
-    0x00200800, 0x00000000, 0x00000002, 0x04200802,
-    0x00000000, 0x00200802, 0x04200000, 0x00000800,
-    0x04000002, 0x04000800, 0x00000800, 0x00200002
-};
-
-static const unsigned long SB8[64] =
-{
-    0x10001040, 0x00001000, 0x00040000, 0x10041040,
-    0x10000000, 0x10001040, 0x00000040, 0x10000000,
-    0x00040040, 0x10040000, 0x10041040, 0x00041000,
-    0x10041000, 0x00041040, 0x00001000, 0x00000040,
-    0x10040000, 0x10000040, 0x10001000, 0x00001040,
-    0x00041000, 0x00040040, 0x10040040, 0x10041000,
-    0x00001040, 0x00000000, 0x00000000, 0x10040040,
-    0x10000040, 0x10001000, 0x00041040, 0x00040000,
-    0x00041040, 0x00040000, 0x10041000, 0x00001000,
-    0x00000040, 0x10040040, 0x00001000, 0x00041040,
-    0x10001000, 0x00000040, 0x10000040, 0x10040000,
-    0x10040040, 0x10000000, 0x00040000, 0x10001040,
-    0x00000000, 0x10041040, 0x00040040, 0x10000040,
-    0x10040000, 0x10001000, 0x10001040, 0x00000000,
-    0x10041040, 0x00041000, 0x00041000, 0x00001040,
-    0x00001040, 0x00040040, 0x10000000, 0x10041000
-};
-
-/*
- * PC1: left and right halves bit-swap
- */
-static const unsigned long LHs[16] =
-{
-    0x00000000, 0x00000001, 0x00000100, 0x00000101,
-    0x00010000, 0x00010001, 0x00010100, 0x00010101,
-    0x01000000, 0x01000001, 0x01000100, 0x01000101,
-    0x01010000, 0x01010001, 0x01010100, 0x01010101
-};
-
-static const unsigned long RHs[16] =
-{
-    0x00000000, 0x01000000, 0x00010000, 0x01010000,
-    0x00000100, 0x01000100, 0x00010100, 0x01010100,
-    0x00000001, 0x01000001, 0x00010001, 0x01010001,
-    0x00000101, 0x01000101, 0x00010101, 0x01010101,
-};
-
-/*
- * Initial Permutation macro
- */
-#define DES_IP(X,Y)                                             \
-{                                                               \
-    T = ((X >>  4) ^ Y) & 0x0F0F0F0F; Y ^= T; X ^= (T <<  4);   \
-    T = ((X >> 16) ^ Y) & 0x0000FFFF; Y ^= T; X ^= (T << 16);   \
-    T = ((Y >>  2) ^ X) & 0x33333333; X ^= T; Y ^= (T <<  2);   \
-    T = ((Y >>  8) ^ X) & 0x00FF00FF; X ^= T; Y ^= (T <<  8);   \
-    Y = ((Y << 1) | (Y >> 31)) & 0xFFFFFFFF;                    \
-    T = (X ^ Y) & 0xAAAAAAAA; Y ^= T; X ^= T;                   \
-    X = ((X << 1) | (X >> 31)) & 0xFFFFFFFF;                    \
-}
-
-/*
- * Final Permutation macro
- */
-#define DES_FP(X,Y)                                             \
-{                                                               \
-    X = ((X << 31) | (X >> 1)) & 0xFFFFFFFF;                    \
-    T = (X ^ Y) & 0xAAAAAAAA; X ^= T; Y ^= T;                   \
-    Y = ((Y << 31) | (Y >> 1)) & 0xFFFFFFFF;                    \
-    T = ((Y >>  8) ^ X) & 0x00FF00FF; X ^= T; Y ^= (T <<  8);   \
-    T = ((Y >>  2) ^ X) & 0x33333333; X ^= T; Y ^= (T <<  2);   \
-    T = ((X >> 16) ^ Y) & 0x0000FFFF; Y ^= T; X ^= (T << 16);   \
-    T = ((X >>  4) ^ Y) & 0x0F0F0F0F; Y ^= T; X ^= (T <<  4);   \
-}
-
-/*
- * DES round macro
- */
-#define DES_ROUND(X,Y)                          \
-{                                               \
-    T = *SK++ ^ X;                              \
-    Y ^= SB8[ (T      ) & 0x3F ] ^              \
-         SB6[ (T >>  8) & 0x3F ] ^              \
-         SB4[ (T >> 16) & 0x3F ] ^              \
-         SB2[ (T >> 24) & 0x3F ];               \
-                                                \
-    T = *SK++ ^ ((X << 28) | (X >> 4));         \
-    Y ^= SB7[ (T      ) & 0x3F ] ^              \
-         SB5[ (T >>  8) & 0x3F ] ^              \
-         SB3[ (T >> 16) & 0x3F ] ^              \
-         SB1[ (T >> 24) & 0x3F ];               \
-}
-
-#define SWAP(a,b) { unsigned long t = a; a = b; b = t; t = 0; }
-
-static void des_setkey( unsigned long SK[32], unsigned char key[8] )
-{
-    int i;
-    unsigned long X, Y, T;
-
-    GET_ULONG_BE( X, key, 0 );
-    GET_ULONG_BE( Y, key, 4 );
-
-    /*
-     * Permuted Choice 1
-     */
-    T =  ((Y >>  4) ^ X) & 0x0F0F0F0F;  X ^= T; Y ^= (T <<  4);
-    T =  ((Y      ) ^ X) & 0x10101010;  X ^= T; Y ^= (T      );
-
-    X =   (LHs[ (X      ) & 0xF] << 3) | (LHs[ (X >>  8) & 0xF ] << 2)
-        | (LHs[ (X >> 16) & 0xF] << 1) | (LHs[ (X >> 24) & 0xF ]     )
-        | (LHs[ (X >>  5) & 0xF] << 7) | (LHs[ (X >> 13) & 0xF ] << 6)
-        | (LHs[ (X >> 21) & 0xF] << 5) | (LHs[ (X >> 29) & 0xF ] << 4);
-
-    Y =   (RHs[ (Y >>  1) & 0xF] << 3) | (RHs[ (Y >>  9) & 0xF ] << 2)
-        | (RHs[ (Y >> 17) & 0xF] << 1) | (RHs[ (Y >> 25) & 0xF ]     )
-        | (RHs[ (Y >>  4) & 0xF] << 7) | (RHs[ (Y >> 12) & 0xF ] << 6)
-        | (RHs[ (Y >> 20) & 0xF] << 5) | (RHs[ (Y >> 28) & 0xF ] << 4);
-
-    X &= 0x0FFFFFFF;
-    Y &= 0x0FFFFFFF;
-
-    /*
-     * calculate subkeys
-     */
-    for( i = 0; i < 16; i++ )
-    {
-        if( i < 2 || i == 8 || i == 15 )
-        {
-            X = ((X <<  1) | (X >> 27)) & 0x0FFFFFFF;
-            Y = ((Y <<  1) | (Y >> 27)) & 0x0FFFFFFF;
-        }
-        else
-        {
-            X = ((X <<  2) | (X >> 26)) & 0x0FFFFFFF;
-            Y = ((Y <<  2) | (Y >> 26)) & 0x0FFFFFFF;
-        }
-
-        *SK++ =   ((X <<  4) & 0x24000000) | ((X << 28) & 0x10000000)
-                | ((X << 14) & 0x08000000) | ((X << 18) & 0x02080000)
-                | ((X <<  6) & 0x01000000) | ((X <<  9) & 0x00200000)
-                | ((X >>  1) & 0x00100000) | ((X << 10) & 0x00040000)
-                | ((X <<  2) & 0x00020000) | ((X >> 10) & 0x00010000)
-                | ((Y >> 13) & 0x00002000) | ((Y >>  4) & 0x00001000)
-                | ((Y <<  6) & 0x00000800) | ((Y >>  1) & 0x00000400)
-                | ((Y >> 14) & 0x00000200) | ((Y      ) & 0x00000100)
-                | ((Y >>  5) & 0x00000020) | ((Y >> 10) & 0x00000010)
-                | ((Y >>  3) & 0x00000008) | ((Y >> 18) & 0x00000004)
-                | ((Y >> 26) & 0x00000002) | ((Y >> 24) & 0x00000001);
-
-        *SK++ =   ((X << 15) & 0x20000000) | ((X << 17) & 0x10000000)
-                | ((X << 10) & 0x08000000) | ((X << 22) & 0x04000000)
-                | ((X >>  2) & 0x02000000) | ((X <<  1) & 0x01000000)
-                | ((X << 16) & 0x00200000) | ((X << 11) & 0x00100000)
-                | ((X <<  3) & 0x00080000) | ((X >>  6) & 0x00040000)
-                | ((X << 15) & 0x00020000) | ((X >>  4) & 0x00010000)
-                | ((Y >>  2) & 0x00002000) | ((Y <<  8) & 0x00001000)
-                | ((Y >> 14) & 0x00000808) | ((Y >>  9) & 0x00000400)
-                | ((Y      ) & 0x00000200) | ((Y <<  7) & 0x00000100)
-                | ((Y >>  7) & 0x00000020) | ((Y >>  3) & 0x00000011)
-                | ((Y <<  2) & 0x00000004) | ((Y >> 21) & 0x00000002);
-    }
-}
-
-/*
- * DES key schedule (56-bit, encryption)
- */
-void des_setkey_enc( des_context *ctx, unsigned char key[8] )
-{
-    des_setkey( ctx->sk, key );
-}
-
-/*
- * DES key schedule (56-bit, decryption)
- */
-void des_setkey_dec( des_context *ctx, unsigned char key[8] )
-{
-    int i;
-
-    des_setkey( ctx->sk, key );
-
-    for( i = 0; i < 16; i += 2 )
-    {
-        SWAP( ctx->sk[i    ], ctx->sk[30 - i] );
-        SWAP( ctx->sk[i + 1], ctx->sk[31 - i] );
-    }
-}
-
-/*
- * DES-ECB block encryption/decryption
- */
-void des_crypt_ecb( des_context *ctx,
-                    const unsigned char input[8],
-                    unsigned char output[8] )
-{
-    int i;
-    unsigned long X, Y, T, *SK;
-
-    SK = ctx->sk;
-
-    GET_ULONG_BE( X, input, 0 );
-    GET_ULONG_BE( Y, input, 4 );
-
-    DES_IP( X, Y );
-
-    for( i = 0; i < 8; i++ )
-    {
-        DES_ROUND( Y, X );
-        DES_ROUND( X, Y );
-    }
-
-    DES_FP( Y, X );
-
-    PUT_ULONG_BE( Y, output, 0 );
-    PUT_ULONG_BE( X, output, 4 );
-}
-
-#endif /* PPP_SUPPORT && LWIP_INCLUDED_POLARSSL_DES */
diff --git a/components/lwip/netif/ppp/polarssl/md4.c b/components/lwip/netif/ppp/polarssl/md4.c
deleted file mode 100644 (file)
index b134cba..0000000
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- *  RFC 1186/1320 compliant MD4 implementation
- *
- *  Based on XySSL: Copyright (C) 2006-2008  Christophe Devine
- *
- *  Copyright (C) 2009  Paul Bakker <polarssl_maintainer at polarssl dot org>
- *
- *  All rights reserved.
- *
- *  Redistribution and use in source and binary forms, with or without
- *  modification, are permitted provided that the following conditions
- *  are met:
- *  
- *    * Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *    * Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *    * Neither the names of PolarSSL or XySSL nor the names of its contributors
- *      may be used to endorse or promote products derived from this software
- *      without specific prior written permission.
- *  
- *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *  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.
- */
-/*
- *  The MD4 algorithm was designed by Ron Rivest in 1990.
- *
- *  http://www.ietf.org/rfc/rfc1186.txt
- *  http://www.ietf.org/rfc/rfc1320.txt
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && LWIP_INCLUDED_POLARSSL_MD4
-
-#include "netif/ppp/polarssl/md4.h"
-
-#include <string.h>
-
-/*
- * 32-bit integer manipulation macros (little endian)
- */
-#ifndef GET_ULONG_LE
-#define GET_ULONG_LE(n,b,i)                             \
-{                                                       \
-    (n) = ( (unsigned long) (b)[(i)    ]       )        \
-        | ( (unsigned long) (b)[(i) + 1] <<  8 )        \
-        | ( (unsigned long) (b)[(i) + 2] << 16 )        \
-        | ( (unsigned long) (b)[(i) + 3] << 24 );       \
-}
-#endif
-
-#ifndef PUT_ULONG_LE
-#define PUT_ULONG_LE(n,b,i)                             \
-{                                                       \
-    (b)[(i)    ] = (unsigned char) ( (n)       );       \
-    (b)[(i) + 1] = (unsigned char) ( (n) >>  8 );       \
-    (b)[(i) + 2] = (unsigned char) ( (n) >> 16 );       \
-    (b)[(i) + 3] = (unsigned char) ( (n) >> 24 );       \
-}
-#endif
-
-/*
- * MD4 context setup
- */
-void md4_starts( md4_context *ctx )
-{
-    ctx->total[0] = 0;
-    ctx->total[1] = 0;
-
-    ctx->state[0] = 0x67452301;
-    ctx->state[1] = 0xEFCDAB89;
-    ctx->state[2] = 0x98BADCFE;
-    ctx->state[3] = 0x10325476;
-}
-
-static void md4_process( md4_context *ctx, const unsigned char data[64] )
-{
-    unsigned long X[16], A, B, C, D;
-
-    GET_ULONG_LE( X[ 0], data,  0 );
-    GET_ULONG_LE( X[ 1], data,  4 );
-    GET_ULONG_LE( X[ 2], data,  8 );
-    GET_ULONG_LE( X[ 3], data, 12 );
-    GET_ULONG_LE( X[ 4], data, 16 );
-    GET_ULONG_LE( X[ 5], data, 20 );
-    GET_ULONG_LE( X[ 6], data, 24 );
-    GET_ULONG_LE( X[ 7], data, 28 );
-    GET_ULONG_LE( X[ 8], data, 32 );
-    GET_ULONG_LE( X[ 9], data, 36 );
-    GET_ULONG_LE( X[10], data, 40 );
-    GET_ULONG_LE( X[11], data, 44 );
-    GET_ULONG_LE( X[12], data, 48 );
-    GET_ULONG_LE( X[13], data, 52 );
-    GET_ULONG_LE( X[14], data, 56 );
-    GET_ULONG_LE( X[15], data, 60 );
-
-#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
-
-    A = ctx->state[0];
-    B = ctx->state[1];
-    C = ctx->state[2];
-    D = ctx->state[3];
-
-#define F(x, y, z) ((x & y) | ((~x) & z))
-#define P(a,b,c,d,x,s) { a += F(b,c,d) + x; a = S(a,s); }
-
-    P( A, B, C, D, X[ 0],  3 );
-    P( D, A, B, C, X[ 1],  7 );
-    P( C, D, A, B, X[ 2], 11 );
-    P( B, C, D, A, X[ 3], 19 );
-    P( A, B, C, D, X[ 4],  3 );
-    P( D, A, B, C, X[ 5],  7 );
-    P( C, D, A, B, X[ 6], 11 );
-    P( B, C, D, A, X[ 7], 19 );
-    P( A, B, C, D, X[ 8],  3 );
-    P( D, A, B, C, X[ 9],  7 );
-    P( C, D, A, B, X[10], 11 );
-    P( B, C, D, A, X[11], 19 );
-    P( A, B, C, D, X[12],  3 );
-    P( D, A, B, C, X[13],  7 );
-    P( C, D, A, B, X[14], 11 );
-    P( B, C, D, A, X[15], 19 );
-
-#undef P
-#undef F
-
-#define F(x,y,z) ((x & y) | (x & z) | (y & z))
-#define P(a,b,c,d,x,s) { a += F(b,c,d) + x + 0x5A827999; a = S(a,s); }
-
-    P( A, B, C, D, X[ 0],  3 );
-    P( D, A, B, C, X[ 4],  5 );
-    P( C, D, A, B, X[ 8],  9 );
-    P( B, C, D, A, X[12], 13 );
-    P( A, B, C, D, X[ 1],  3 );
-    P( D, A, B, C, X[ 5],  5 );
-    P( C, D, A, B, X[ 9],  9 );
-    P( B, C, D, A, X[13], 13 );
-    P( A, B, C, D, X[ 2],  3 );
-    P( D, A, B, C, X[ 6],  5 );
-    P( C, D, A, B, X[10],  9 );
-    P( B, C, D, A, X[14], 13 );
-    P( A, B, C, D, X[ 3],  3 );
-    P( D, A, B, C, X[ 7],  5 );
-    P( C, D, A, B, X[11],  9 );
-    P( B, C, D, A, X[15], 13 );
-
-#undef P
-#undef F
-
-#define F(x,y,z) (x ^ y ^ z)
-#define P(a,b,c,d,x,s) { a += F(b,c,d) + x + 0x6ED9EBA1; a = S(a,s); }
-
-    P( A, B, C, D, X[ 0],  3 );
-    P( D, A, B, C, X[ 8],  9 );
-    P( C, D, A, B, X[ 4], 11 );
-    P( B, C, D, A, X[12], 15 );
-    P( A, B, C, D, X[ 2],  3 );
-    P( D, A, B, C, X[10],  9 );
-    P( C, D, A, B, X[ 6], 11 );
-    P( B, C, D, A, X[14], 15 );
-    P( A, B, C, D, X[ 1],  3 );
-    P( D, A, B, C, X[ 9],  9 );
-    P( C, D, A, B, X[ 5], 11 );
-    P( B, C, D, A, X[13], 15 );
-    P( A, B, C, D, X[ 3],  3 );
-    P( D, A, B, C, X[11],  9 );
-    P( C, D, A, B, X[ 7], 11 );
-    P( B, C, D, A, X[15], 15 );
-
-#undef F
-#undef P
-
-    ctx->state[0] += A;
-    ctx->state[1] += B;
-    ctx->state[2] += C;
-    ctx->state[3] += D;
-}
-
-/*
- * MD4 process buffer
- */
-void md4_update( md4_context *ctx, const unsigned char *input, int ilen )
-{
-    int fill;
-    unsigned long left;
-
-    if( ilen <= 0 )
-        return;
-
-    left = ctx->total[0] & 0x3F;
-    fill = 64 - left;
-
-    ctx->total[0] += ilen;
-    ctx->total[0] &= 0xFFFFFFFF;
-
-    if( ctx->total[0] < (unsigned long) ilen )
-        ctx->total[1]++;
-
-    if( left && ilen >= fill )
-    {
-        MEMCPY( (void *) (ctx->buffer + left),
-                input, fill );
-        md4_process( ctx, ctx->buffer );
-        input += fill;
-        ilen  -= fill;
-        left = 0;
-    }
-
-    while( ilen >= 64 )
-    {
-        md4_process( ctx, input );
-        input += 64;
-        ilen  -= 64;
-    }
-
-    if( ilen > 0 )
-    {
-        MEMCPY( (void *) (ctx->buffer + left),
-                input, ilen );
-    }
-}
-
-static const unsigned char md4_padding[64] =
-{
- 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-};
-
-/*
- * MD4 final digest
- */
-void md4_finish( md4_context *ctx, unsigned char output[16] )
-{
-    unsigned long last, padn;
-    unsigned long high, low;
-    unsigned char msglen[8];
-
-    high = ( ctx->total[0] >> 29 )
-         | ( ctx->total[1] <<  3 );
-    low  = ( ctx->total[0] <<  3 );
-
-    PUT_ULONG_LE( low,  msglen, 0 );
-    PUT_ULONG_LE( high, msglen, 4 );
-
-    last = ctx->total[0] & 0x3F;
-    padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
-
-    md4_update( ctx, md4_padding, padn );
-    md4_update( ctx, msglen, 8 );
-
-    PUT_ULONG_LE( ctx->state[0], output,  0 );
-    PUT_ULONG_LE( ctx->state[1], output,  4 );
-    PUT_ULONG_LE( ctx->state[2], output,  8 );
-    PUT_ULONG_LE( ctx->state[3], output, 12 );
-}
-
-/*
- * output = MD4( input buffer )
- */
-void md4( unsigned char *input, int ilen, unsigned char output[16] )
-{
-    md4_context ctx;
-
-    md4_starts( &ctx );
-    md4_update( &ctx, input, ilen );
-    md4_finish( &ctx, output );
-}
-
-#endif /* PPP_SUPPORT && LWIP_INCLUDED_POLARSSL_MD4 */
diff --git a/components/lwip/netif/ppp/polarssl/md5.c b/components/lwip/netif/ppp/polarssl/md5.c
deleted file mode 100644 (file)
index ba103c4..0000000
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- *  RFC 1321 compliant MD5 implementation
- *
- *  Based on XySSL: Copyright (C) 2006-2008  Christophe Devine
- *
- *  Copyright (C) 2009  Paul Bakker <polarssl_maintainer at polarssl dot org>
- *
- *  All rights reserved.
- *
- *  Redistribution and use in source and binary forms, with or without
- *  modification, are permitted provided that the following conditions
- *  are met:
- *  
- *    * Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *    * Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *    * Neither the names of PolarSSL or XySSL nor the names of its contributors
- *      may be used to endorse or promote products derived from this software
- *      without specific prior written permission.
- *  
- *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *  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.
- */
-/*
- *  The MD5 algorithm was designed by Ron Rivest in 1991.
- *
- *  http://www.ietf.org/rfc/rfc1321.txt
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && LWIP_INCLUDED_POLARSSL_MD5
-
-#include "netif/ppp/polarssl/md5.h"
-
-#include <string.h>
-
-/*
- * 32-bit integer manipulation macros (little endian)
- */
-#ifndef GET_ULONG_LE
-#define GET_ULONG_LE(n,b,i)                             \
-{                                                       \
-    (n) = ( (unsigned long) (b)[(i)    ]       )        \
-        | ( (unsigned long) (b)[(i) + 1] <<  8 )        \
-        | ( (unsigned long) (b)[(i) + 2] << 16 )        \
-        | ( (unsigned long) (b)[(i) + 3] << 24 );       \
-}
-#endif
-
-#ifndef PUT_ULONG_LE
-#define PUT_ULONG_LE(n,b,i)                             \
-{                                                       \
-    (b)[(i)    ] = (unsigned char) ( (n)       );       \
-    (b)[(i) + 1] = (unsigned char) ( (n) >>  8 );       \
-    (b)[(i) + 2] = (unsigned char) ( (n) >> 16 );       \
-    (b)[(i) + 3] = (unsigned char) ( (n) >> 24 );       \
-}
-#endif
-
-/*
- * MD5 context setup
- */
-void md5_starts( md5_context *ctx )
-{
-    ctx->total[0] = 0;
-    ctx->total[1] = 0;
-
-    ctx->state[0] = 0x67452301;
-    ctx->state[1] = 0xEFCDAB89;
-    ctx->state[2] = 0x98BADCFE;
-    ctx->state[3] = 0x10325476;
-}
-
-static void md5_process( md5_context *ctx, const unsigned char data[64] )
-{
-    unsigned long X[16], A, B, C, D;
-
-    GET_ULONG_LE( X[ 0], data,  0 );
-    GET_ULONG_LE( X[ 1], data,  4 );
-    GET_ULONG_LE( X[ 2], data,  8 );
-    GET_ULONG_LE( X[ 3], data, 12 );
-    GET_ULONG_LE( X[ 4], data, 16 );
-    GET_ULONG_LE( X[ 5], data, 20 );
-    GET_ULONG_LE( X[ 6], data, 24 );
-    GET_ULONG_LE( X[ 7], data, 28 );
-    GET_ULONG_LE( X[ 8], data, 32 );
-    GET_ULONG_LE( X[ 9], data, 36 );
-    GET_ULONG_LE( X[10], data, 40 );
-    GET_ULONG_LE( X[11], data, 44 );
-    GET_ULONG_LE( X[12], data, 48 );
-    GET_ULONG_LE( X[13], data, 52 );
-    GET_ULONG_LE( X[14], data, 56 );
-    GET_ULONG_LE( X[15], data, 60 );
-
-#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
-
-#define P(a,b,c,d,k,s,t)                                \
-{                                                       \
-    a += F(b,c,d) + X[k] + t; a = S(a,s) + b;           \
-}
-
-    A = ctx->state[0];
-    B = ctx->state[1];
-    C = ctx->state[2];
-    D = ctx->state[3];
-
-#define F(x,y,z) (z ^ (x & (y ^ z)))
-
-    P( A, B, C, D,  0,  7, 0xD76AA478 );
-    P( D, A, B, C,  1, 12, 0xE8C7B756 );
-    P( C, D, A, B,  2, 17, 0x242070DB );
-    P( B, C, D, A,  3, 22, 0xC1BDCEEE );
-    P( A, B, C, D,  4,  7, 0xF57C0FAF );
-    P( D, A, B, C,  5, 12, 0x4787C62A );
-    P( C, D, A, B,  6, 17, 0xA8304613 );
-    P( B, C, D, A,  7, 22, 0xFD469501 );
-    P( A, B, C, D,  8,  7, 0x698098D8 );
-    P( D, A, B, C,  9, 12, 0x8B44F7AF );
-    P( C, D, A, B, 10, 17, 0xFFFF5BB1 );
-    P( B, C, D, A, 11, 22, 0x895CD7BE );
-    P( A, B, C, D, 12,  7, 0x6B901122 );
-    P( D, A, B, C, 13, 12, 0xFD987193 );
-    P( C, D, A, B, 14, 17, 0xA679438E );
-    P( B, C, D, A, 15, 22, 0x49B40821 );
-
-#undef F
-
-#define F(x,y,z) (y ^ (z & (x ^ y)))
-
-    P( A, B, C, D,  1,  5, 0xF61E2562 );
-    P( D, A, B, C,  6,  9, 0xC040B340 );
-    P( C, D, A, B, 11, 14, 0x265E5A51 );
-    P( B, C, D, A,  0, 20, 0xE9B6C7AA );
-    P( A, B, C, D,  5,  5, 0xD62F105D );
-    P( D, A, B, C, 10,  9, 0x02441453 );
-    P( C, D, A, B, 15, 14, 0xD8A1E681 );
-    P( B, C, D, A,  4, 20, 0xE7D3FBC8 );
-    P( A, B, C, D,  9,  5, 0x21E1CDE6 );
-    P( D, A, B, C, 14,  9, 0xC33707D6 );
-    P( C, D, A, B,  3, 14, 0xF4D50D87 );
-    P( B, C, D, A,  8, 20, 0x455A14ED );
-    P( A, B, C, D, 13,  5, 0xA9E3E905 );
-    P( D, A, B, C,  2,  9, 0xFCEFA3F8 );
-    P( C, D, A, B,  7, 14, 0x676F02D9 );
-    P( B, C, D, A, 12, 20, 0x8D2A4C8A );
-
-#undef F
-    
-#define F(x,y,z) (x ^ y ^ z)
-
-    P( A, B, C, D,  5,  4, 0xFFFA3942 );
-    P( D, A, B, C,  8, 11, 0x8771F681 );
-    P( C, D, A, B, 11, 16, 0x6D9D6122 );
-    P( B, C, D, A, 14, 23, 0xFDE5380C );
-    P( A, B, C, D,  1,  4, 0xA4BEEA44 );
-    P( D, A, B, C,  4, 11, 0x4BDECFA9 );
-    P( C, D, A, B,  7, 16, 0xF6BB4B60 );
-    P( B, C, D, A, 10, 23, 0xBEBFBC70 );
-    P( A, B, C, D, 13,  4, 0x289B7EC6 );
-    P( D, A, B, C,  0, 11, 0xEAA127FA );
-    P( C, D, A, B,  3, 16, 0xD4EF3085 );
-    P( B, C, D, A,  6, 23, 0x04881D05 );
-    P( A, B, C, D,  9,  4, 0xD9D4D039 );
-    P( D, A, B, C, 12, 11, 0xE6DB99E5 );
-    P( C, D, A, B, 15, 16, 0x1FA27CF8 );
-    P( B, C, D, A,  2, 23, 0xC4AC5665 );
-
-#undef F
-
-#define F(x,y,z) (y ^ (x | ~z))
-
-    P( A, B, C, D,  0,  6, 0xF4292244 );
-    P( D, A, B, C,  7, 10, 0x432AFF97 );
-    P( C, D, A, B, 14, 15, 0xAB9423A7 );
-    P( B, C, D, A,  5, 21, 0xFC93A039 );
-    P( A, B, C, D, 12,  6, 0x655B59C3 );
-    P( D, A, B, C,  3, 10, 0x8F0CCC92 );
-    P( C, D, A, B, 10, 15, 0xFFEFF47D );
-    P( B, C, D, A,  1, 21, 0x85845DD1 );
-    P( A, B, C, D,  8,  6, 0x6FA87E4F );
-    P( D, A, B, C, 15, 10, 0xFE2CE6E0 );
-    P( C, D, A, B,  6, 15, 0xA3014314 );
-    P( B, C, D, A, 13, 21, 0x4E0811A1 );
-    P( A, B, C, D,  4,  6, 0xF7537E82 );
-    P( D, A, B, C, 11, 10, 0xBD3AF235 );
-    P( C, D, A, B,  2, 15, 0x2AD7D2BB );
-    P( B, C, D, A,  9, 21, 0xEB86D391 );
-
-#undef F
-
-    ctx->state[0] += A;
-    ctx->state[1] += B;
-    ctx->state[2] += C;
-    ctx->state[3] += D;
-}
-
-/*
- * MD5 process buffer
- */
-void md5_update( md5_context *ctx, const unsigned char *input, int ilen )
-{
-    int fill;
-    unsigned long left;
-
-    if( ilen <= 0 )
-        return;
-
-    left = ctx->total[0] & 0x3F;
-    fill = 64 - left;
-
-    ctx->total[0] += ilen;
-    ctx->total[0] &= 0xFFFFFFFF;
-
-    if( ctx->total[0] < (unsigned long) ilen )
-        ctx->total[1]++;
-
-    if( left && ilen >= fill )
-    {
-        MEMCPY( (void *) (ctx->buffer + left),
-                input, fill );
-        md5_process( ctx, ctx->buffer );
-        input += fill;
-        ilen  -= fill;
-        left = 0;
-    }
-
-    while( ilen >= 64 )
-    {
-        md5_process( ctx, input );
-        input += 64;
-        ilen  -= 64;
-    }
-
-    if( ilen > 0 )
-    {
-        MEMCPY( (void *) (ctx->buffer + left),
-                input, ilen );
-    }
-}
-
-static const unsigned char md5_padding[64] =
-{
- 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-};
-
-/*
- * MD5 final digest
- */
-void md5_finish( md5_context *ctx, unsigned char output[16] )
-{
-    unsigned long last, padn;
-    unsigned long high, low;
-    unsigned char msglen[8];
-
-    high = ( ctx->total[0] >> 29 )
-         | ( ctx->total[1] <<  3 );
-    low  = ( ctx->total[0] <<  3 );
-
-    PUT_ULONG_LE( low,  msglen, 0 );
-    PUT_ULONG_LE( high, msglen, 4 );
-
-    last = ctx->total[0] & 0x3F;
-    padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
-
-    md5_update( ctx, md5_padding, padn );
-    md5_update( ctx, msglen, 8 );
-
-    PUT_ULONG_LE( ctx->state[0], output,  0 );
-    PUT_ULONG_LE( ctx->state[1], output,  4 );
-    PUT_ULONG_LE( ctx->state[2], output,  8 );
-    PUT_ULONG_LE( ctx->state[3], output, 12 );
-}
-
-/*
- * output = MD5( input buffer )
- */
-void md5( unsigned char *input, int ilen, unsigned char output[16] )
-{
-    md5_context ctx;
-
-    md5_starts( &ctx );
-    md5_update( &ctx, input, ilen );
-    md5_finish( &ctx, output );
-}
-
-#endif /* PPP_SUPPORT && LWIP_INCLUDED_POLARSSL_MD5 */
diff --git a/components/lwip/netif/ppp/polarssl/sha1.c b/components/lwip/netif/ppp/polarssl/sha1.c
deleted file mode 100644 (file)
index 313b756..0000000
+++ /dev/null
@@ -1,335 +0,0 @@
-/*
- *  FIPS-180-1 compliant SHA-1 implementation
- *
- *  Based on XySSL: Copyright (C) 2006-2008  Christophe Devine
- *
- *  Copyright (C) 2009  Paul Bakker <polarssl_maintainer at polarssl dot org>
- *
- *  All rights reserved.
- *
- *  Redistribution and use in source and binary forms, with or without
- *  modification, are permitted provided that the following conditions
- *  are met:
- *  
- *    * Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *    * Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *    * Neither the names of PolarSSL or XySSL nor the names of its contributors
- *      may be used to endorse or promote products derived from this software
- *      without specific prior written permission.
- *  
- *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *  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.
- */
-/*
- *  The SHA-1 standard was published by NIST in 1993.
- *
- *  http://www.itl.nist.gov/fipspubs/fip180-1.htm
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && LWIP_INCLUDED_POLARSSL_SHA1
-
-#include "netif/ppp/polarssl/sha1.h"
-
-#include <string.h>
-
-/*
- * 32-bit integer manipulation macros (big endian)
- */
-#ifndef GET_ULONG_BE
-#define GET_ULONG_BE(n,b,i)                             \
-{                                                       \
-    (n) = ( (unsigned long) (b)[(i)    ] << 24 )        \
-        | ( (unsigned long) (b)[(i) + 1] << 16 )        \
-        | ( (unsigned long) (b)[(i) + 2] <<  8 )        \
-        | ( (unsigned long) (b)[(i) + 3]       );       \
-}
-#endif
-
-#ifndef PUT_ULONG_BE
-#define PUT_ULONG_BE(n,b,i)                             \
-{                                                       \
-    (b)[(i)    ] = (unsigned char) ( (n) >> 24 );       \
-    (b)[(i) + 1] = (unsigned char) ( (n) >> 16 );       \
-    (b)[(i) + 2] = (unsigned char) ( (n) >>  8 );       \
-    (b)[(i) + 3] = (unsigned char) ( (n)       );       \
-}
-#endif
-
-/*
- * SHA-1 context setup
- */
-void sha1_starts( sha1_context *ctx )
-{
-    ctx->total[0] = 0;
-    ctx->total[1] = 0;
-
-    ctx->state[0] = 0x67452301;
-    ctx->state[1] = 0xEFCDAB89;
-    ctx->state[2] = 0x98BADCFE;
-    ctx->state[3] = 0x10325476;
-    ctx->state[4] = 0xC3D2E1F0;
-}
-
-static void sha1_process( sha1_context *ctx, const unsigned char data[64] )
-{
-    unsigned long temp, W[16], A, B, C, D, E;
-
-    GET_ULONG_BE( W[ 0], data,  0 );
-    GET_ULONG_BE( W[ 1], data,  4 );
-    GET_ULONG_BE( W[ 2], data,  8 );
-    GET_ULONG_BE( W[ 3], data, 12 );
-    GET_ULONG_BE( W[ 4], data, 16 );
-    GET_ULONG_BE( W[ 5], data, 20 );
-    GET_ULONG_BE( W[ 6], data, 24 );
-    GET_ULONG_BE( W[ 7], data, 28 );
-    GET_ULONG_BE( W[ 8], data, 32 );
-    GET_ULONG_BE( W[ 9], data, 36 );
-    GET_ULONG_BE( W[10], data, 40 );
-    GET_ULONG_BE( W[11], data, 44 );
-    GET_ULONG_BE( W[12], data, 48 );
-    GET_ULONG_BE( W[13], data, 52 );
-    GET_ULONG_BE( W[14], data, 56 );
-    GET_ULONG_BE( W[15], data, 60 );
-
-#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
-
-#define R(t)                                            \
-(                                                       \
-    temp = W[(t -  3) & 0x0F] ^ W[(t - 8) & 0x0F] ^     \
-           W[(t - 14) & 0x0F] ^ W[ t      & 0x0F],      \
-    ( W[t & 0x0F] = S(temp,1) )                         \
-)
-
-#define P(a,b,c,d,e,x)                                  \
-{                                                       \
-    e += S(a,5) + F(b,c,d) + K + x; b = S(b,30);        \
-}
-
-    A = ctx->state[0];
-    B = ctx->state[1];
-    C = ctx->state[2];
-    D = ctx->state[3];
-    E = ctx->state[4];
-
-#define F(x,y,z) (z ^ (x & (y ^ z)))
-#define K 0x5A827999
-
-    P( A, B, C, D, E, W[0]  );
-    P( E, A, B, C, D, W[1]  );
-    P( D, E, A, B, C, W[2]  );
-    P( C, D, E, A, B, W[3]  );
-    P( B, C, D, E, A, W[4]  );
-    P( A, B, C, D, E, W[5]  );
-    P( E, A, B, C, D, W[6]  );
-    P( D, E, A, B, C, W[7]  );
-    P( C, D, E, A, B, W[8]  );
-    P( B, C, D, E, A, W[9]  );
-    P( A, B, C, D, E, W[10] );
-    P( E, A, B, C, D, W[11] );
-    P( D, E, A, B, C, W[12] );
-    P( C, D, E, A, B, W[13] );
-    P( B, C, D, E, A, W[14] );
-    P( A, B, C, D, E, W[15] );
-    P( E, A, B, C, D, R(16) );
-    P( D, E, A, B, C, R(17) );
-    P( C, D, E, A, B, R(18) );
-    P( B, C, D, E, A, R(19) );
-
-#undef K
-#undef F
-
-#define F(x,y,z) (x ^ y ^ z)
-#define K 0x6ED9EBA1
-
-    P( A, B, C, D, E, R(20) );
-    P( E, A, B, C, D, R(21) );
-    P( D, E, A, B, C, R(22) );
-    P( C, D, E, A, B, R(23) );
-    P( B, C, D, E, A, R(24) );
-    P( A, B, C, D, E, R(25) );
-    P( E, A, B, C, D, R(26) );
-    P( D, E, A, B, C, R(27) );
-    P( C, D, E, A, B, R(28) );
-    P( B, C, D, E, A, R(29) );
-    P( A, B, C, D, E, R(30) );
-    P( E, A, B, C, D, R(31) );
-    P( D, E, A, B, C, R(32) );
-    P( C, D, E, A, B, R(33) );
-    P( B, C, D, E, A, R(34) );
-    P( A, B, C, D, E, R(35) );
-    P( E, A, B, C, D, R(36) );
-    P( D, E, A, B, C, R(37) );
-    P( C, D, E, A, B, R(38) );
-    P( B, C, D, E, A, R(39) );
-
-#undef K
-#undef F
-
-#define F(x,y,z) ((x & y) | (z & (x | y)))
-#define K 0x8F1BBCDC
-
-    P( A, B, C, D, E, R(40) );
-    P( E, A, B, C, D, R(41) );
-    P( D, E, A, B, C, R(42) );
-    P( C, D, E, A, B, R(43) );
-    P( B, C, D, E, A, R(44) );
-    P( A, B, C, D, E, R(45) );
-    P( E, A, B, C, D, R(46) );
-    P( D, E, A, B, C, R(47) );
-    P( C, D, E, A, B, R(48) );
-    P( B, C, D, E, A, R(49) );
-    P( A, B, C, D, E, R(50) );
-    P( E, A, B, C, D, R(51) );
-    P( D, E, A, B, C, R(52) );
-    P( C, D, E, A, B, R(53) );
-    P( B, C, D, E, A, R(54) );
-    P( A, B, C, D, E, R(55) );
-    P( E, A, B, C, D, R(56) );
-    P( D, E, A, B, C, R(57) );
-    P( C, D, E, A, B, R(58) );
-    P( B, C, D, E, A, R(59) );
-
-#undef K
-#undef F
-
-#define F(x,y,z) (x ^ y ^ z)
-#define K 0xCA62C1D6
-
-    P( A, B, C, D, E, R(60) );
-    P( E, A, B, C, D, R(61) );
-    P( D, E, A, B, C, R(62) );
-    P( C, D, E, A, B, R(63) );
-    P( B, C, D, E, A, R(64) );
-    P( A, B, C, D, E, R(65) );
-    P( E, A, B, C, D, R(66) );
-    P( D, E, A, B, C, R(67) );
-    P( C, D, E, A, B, R(68) );
-    P( B, C, D, E, A, R(69) );
-    P( A, B, C, D, E, R(70) );
-    P( E, A, B, C, D, R(71) );
-    P( D, E, A, B, C, R(72) );
-    P( C, D, E, A, B, R(73) );
-    P( B, C, D, E, A, R(74) );
-    P( A, B, C, D, E, R(75) );
-    P( E, A, B, C, D, R(76) );
-    P( D, E, A, B, C, R(77) );
-    P( C, D, E, A, B, R(78) );
-    P( B, C, D, E, A, R(79) );
-
-#undef K
-#undef F
-
-    ctx->state[0] += A;
-    ctx->state[1] += B;
-    ctx->state[2] += C;
-    ctx->state[3] += D;
-    ctx->state[4] += E;
-}
-
-/*
- * SHA-1 process buffer
- */
-void sha1_update( sha1_context *ctx, const unsigned char *input, int ilen )
-{
-    int fill;
-    unsigned long left;
-
-    if( ilen <= 0 )
-        return;
-
-    left = ctx->total[0] & 0x3F;
-    fill = 64 - left;
-
-    ctx->total[0] += ilen;
-    ctx->total[0] &= 0xFFFFFFFF;
-
-    if( ctx->total[0] < (unsigned long) ilen )
-        ctx->total[1]++;
-
-    if( left && ilen >= fill )
-    {
-        MEMCPY( (void *) (ctx->buffer + left),
-                input, fill );
-        sha1_process( ctx, ctx->buffer );
-        input += fill;
-        ilen  -= fill;
-        left = 0;
-    }
-
-    while( ilen >= 64 )
-    {
-        sha1_process( ctx, input );
-        input += 64;
-        ilen  -= 64;
-    }
-
-    if( ilen > 0 )
-    {
-        MEMCPY( (void *) (ctx->buffer + left),
-                input, ilen );
-    }
-}
-
-static const unsigned char sha1_padding[64] =
-{
- 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-};
-
-/*
- * SHA-1 final digest
- */
-void sha1_finish( sha1_context *ctx, unsigned char output[20] )
-{
-    unsigned long last, padn;
-    unsigned long high, low;
-    unsigned char msglen[8];
-
-    high = ( ctx->total[0] >> 29 )
-         | ( ctx->total[1] <<  3 );
-    low  = ( ctx->total[0] <<  3 );
-
-    PUT_ULONG_BE( high, msglen, 0 );
-    PUT_ULONG_BE( low,  msglen, 4 );
-
-    last = ctx->total[0] & 0x3F;
-    padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
-
-    sha1_update( ctx, sha1_padding, padn );
-    sha1_update( ctx, msglen, 8 );
-
-    PUT_ULONG_BE( ctx->state[0], output,  0 );
-    PUT_ULONG_BE( ctx->state[1], output,  4 );
-    PUT_ULONG_BE( ctx->state[2], output,  8 );
-    PUT_ULONG_BE( ctx->state[3], output, 12 );
-    PUT_ULONG_BE( ctx->state[4], output, 16 );
-}
-
-/*
- * output = SHA-1( input buffer )
- */
-void sha1( unsigned char *input, int ilen, unsigned char output[20] )
-{
-    sha1_context ctx;
-
-    sha1_starts( &ctx );
-    sha1_update( &ctx, input, ilen );
-    sha1_finish( &ctx, output );
-}
-
-#endif /* PPP_SUPPORT && LWIP_INCLUDED_POLARSSL_SHA1 */
diff --git a/components/lwip/netif/ppp/ppp.c b/components/lwip/netif/ppp/ppp.c
deleted file mode 100644 (file)
index 031556a..0000000
+++ /dev/null
@@ -1,1600 +0,0 @@
-/*****************************************************************************
-* ppp.c - Network Point to Point Protocol program file.
-*
-* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
-* portions Copyright (c) 1997 by Global Election Systems Inc.
-*
-* The authors hereby grant permission to use, copy, modify, distribute,
-* and license this software and its documentation for any purpose, provided
-* that existing copyright notices are retained in all copies and that this
-* notice and the following disclaimer are included verbatim in any
-* distributions. No written agreement, license, or royalty fee is required
-* for any of the authorized uses.
-*
-* THIS SOFTWARE IS PROVIDED BY THE 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 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.
-*
-******************************************************************************
-* REVISION HISTORY
-*
-* 03-01-01 Marc Boucher <marc@mbsi.ca>
-*   Ported to lwIP.
-* 97-11-05 Guy Lancaster <lancasterg@acm.org>, Global Election Systems Inc.
-*   Original.
-*****************************************************************************/
-
-/*
- * ppp_defs.h - PPP definitions.
- *
- * if_pppvar.h - private structures and declarations for PPP.
- *
- * Copyright (c) 1994 The Australian National University.
- * All rights reserved.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation is hereby granted, provided that the above copyright
- * notice appears in all copies.  This software is provided without any
- * warranty, express or implied. The Australian National University
- * makes no representations about the suitability of this software for
- * any purpose.
- *
- * IN NO EVENT SHALL THE AUSTRALIAN NATIONAL UNIVERSITY BE LIABLE TO ANY
- * PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
- * THE AUSTRALIAN NATIONAL UNIVERSITY HAVE BEEN ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * THE AUSTRALIAN NATIONAL UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE AUSTRALIAN NATIONAL UNIVERSITY HAS NO
- * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
- * OR MODIFICATIONS.
- */
-
-/*
- * if_ppp.h - Point-to-Point Protocol definitions.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University.  The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/pbuf.h"
-#include "lwip/stats.h"
-#include "lwip/sys.h"
-#include "lwip/tcpip.h"
-#include "lwip/api.h"
-#include "lwip/snmp.h"
-#include "lwip/sio.h"
-#include "lwip/sys.h"
-#include "lwip/ip4.h" /* for ip4_input() */
-#if PPP_IPV6_SUPPORT
-#include "lwip/ip6.h" /* for ip6_input() */
-#endif /* PPP_IPV6_SUPPORT */
-#include "lwip/dns.h"
-
-#include "netif/ppp/ppp_impl.h"
-#include "netif/ppp/pppos.h"
-
-#include "netif/ppp/fsm.h"
-#include "netif/ppp/lcp.h"
-#include "netif/ppp/magic.h"
-
-#if PAP_SUPPORT
-#include "netif/ppp/upap.h"
-#endif /* PAP_SUPPORT */
-#if CHAP_SUPPORT
-#include "netif/ppp/chap-new.h"
-#endif /* CHAP_SUPPORT */
-#if EAP_SUPPORT
-#include "netif/ppp/eap.h"
-#endif /* EAP_SUPPORT */
-#if CCP_SUPPORT
-#include "netif/ppp/ccp.h"
-#endif /* CCP_SUPPORT */
-#if MPPE_SUPPORT
-#include "netif/ppp/mppe.h"
-#endif /* MPPE_SUPPORT */
-#if ECP_SUPPORT
-#include "netif/ppp/ecp.h"
-#endif /* EAP_SUPPORT */
-#if VJ_SUPPORT
-#include "netif/ppp/vj.h"
-#endif /* VJ_SUPPORT */
-#if PPP_IPV4_SUPPORT
-#include "netif/ppp/ipcp.h"
-#endif /* PPP_IPV4_SUPPORT */
-#if PPP_IPV6_SUPPORT
-#include "netif/ppp/ipv6cp.h"
-#endif /* PPP_IPV6_SUPPORT */
-
-/*************************/
-/*** LOCAL DEFINITIONS ***/
-/*************************/
-
-/* FIXME: add stats per PPP session */
-#if PPP_STATS_SUPPORT
-static struct timeval start_time; /* Time when link was started. */
-static struct pppd_stats old_link_stats;
-struct pppd_stats link_stats;
-unsigned link_connect_time;
-int link_stats_valid;
-#endif /* PPP_STATS_SUPPORT */
-
-/*
- * PPP Data Link Layer "protocol" table.
- * One entry per supported protocol.
- * The last entry must be NULL.
- */
-const struct protent* const protocols[] = {
-    &lcp_protent,
-#if PAP_SUPPORT
-    &pap_protent,
-#endif /* PAP_SUPPORT */
-#if CHAP_SUPPORT
-    &chap_protent,
-#endif /* CHAP_SUPPORT */
-#if CBCP_SUPPORT
-    &cbcp_protent,
-#endif /* CBCP_SUPPORT */
-#if PPP_IPV4_SUPPORT
-    &ipcp_protent,
-#endif /* PPP_IPV4_SUPPORT */
-#if PPP_IPV6_SUPPORT
-    &ipv6cp_protent,
-#endif /* PPP_IPV6_SUPPORT */
-#if CCP_SUPPORT
-    &ccp_protent,
-#endif /* CCP_SUPPORT */
-#if ECP_SUPPORT
-    &ecp_protent,
-#endif /* ECP_SUPPORT */
-#ifdef AT_CHANGE
-    &atcp_protent,
-#endif /* AT_CHANGE */
-#if EAP_SUPPORT
-    &eap_protent,
-#endif /* EAP_SUPPORT */
-    NULL
-};
-
-/* 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
-static err_t ppp_netif_output_ip4(struct netif *netif, struct pbuf *pb, const ip4_addr_t *ipaddr);
-#endif /* LWIP_IPV4 */
-#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 */
-static err_t ppp_netif_output(struct netif *netif, struct pbuf *pb, u16_t protocol);
-
-/***********************************/
-/*** PUBLIC FUNCTION DEFINITIONS ***/
-/***********************************/
-void ppp_set_auth(ppp_pcb *pcb, u8_t authtype, const char *user, const char *passwd) {
-#if PPP_AUTH_SUPPORT
-#if PAP_SUPPORT
-  pcb->settings.refuse_pap = !(authtype & PPPAUTHTYPE_PAP);
-#endif /* PAP_SUPPORT */
-#if CHAP_SUPPORT
-  pcb->settings.refuse_chap = !(authtype & PPPAUTHTYPE_CHAP);
-#if MSCHAP_SUPPORT
-  pcb->settings.refuse_mschap = !(authtype & PPPAUTHTYPE_MSCHAP);
-  pcb->settings.refuse_mschap_v2 = !(authtype & PPPAUTHTYPE_MSCHAP_V2);
-#endif /* MSCHAP_SUPPORT */
-#endif /* CHAP_SUPPORT */
-#if EAP_SUPPORT
-  pcb->settings.refuse_eap = !(authtype & PPPAUTHTYPE_EAP);
-#endif /* EAP_SUPPORT */
-  pcb->settings.user = user;
-  pcb->settings.passwd = passwd;
-#else /* PPP_AUTH_SUPPORT */
-  LWIP_UNUSED_ARG(pcb);
-  LWIP_UNUSED_ARG(authtype);
-  LWIP_UNUSED_ARG(user);
-  LWIP_UNUSED_ARG(passwd);
-#endif /* PPP_AUTH_SUPPORT */
-}
-
-#if PPP_NOTIFY_PHASE
-void ppp_set_notify_phase_callback(ppp_pcb *pcb, ppp_notify_phase_cb_fn notify_phase_cb) {
-  pcb->notify_phase_cb = notify_phase_cb;
-  notify_phase_cb(pcb, pcb->phase, pcb->ctx_cb);
-}
-#endif /* PPP_NOTIFY_PHASE */
-
-/*
- * Initiate a PPP connection.
- *
- * This can only be called if PPP is in the dead phase.
- *
- * Holdoff is the time to wait (in seconds) before initiating
- * the connection.
- *
- * If this port connects to a modem, the modem connection must be
- * established before calling this.
- */
-err_t ppp_connect(ppp_pcb *pcb, u16_t holdoff) {
-  if (pcb->phase != PPP_PHASE_DEAD) {
-    return ERR_ALREADY;
-  }
-
-  PPPDEBUG(LOG_DEBUG, ("ppp_connect[%d]: holdoff=%d\n", pcb->netif->num, holdoff));
-
-  if (holdoff == 0) {
-    return pcb->link_cb->connect(pcb, pcb->link_ctx_cb);
-  }
-
-  new_phase(pcb, PPP_PHASE_HOLDOFF);
-  sys_timeout((u32_t)(holdoff*1000), ppp_do_connect, pcb);
-  return ERR_OK;
-}
-
-#if PPP_SERVER
-/*
- * Listen for an incoming PPP connection.
- *
- * This can only be called if PPP is in the dead phase.
- *
- * Local and remote interface IP addresses, as well as DNS are
- * provided through a previously filled struct ppp_addrs.
- *
- * If this port connects to a modem, the modem connection must be
- * established before calling this.
- */
-err_t ppp_listen(ppp_pcb *pcb, struct ppp_addrs *addrs) {
-  if (pcb->phase != PPP_PHASE_DEAD) {
-    return ERR_ALREADY;
-  }
-
-  PPPDEBUG(LOG_DEBUG, ("ppp_listen[%d]\n", pcb->netif->num));
-
-  if (pcb->link_cb->listen) {
-    return pcb->link_cb->listen(pcb, pcb->link_ctx_cb, addrs);
-  }
-  return ERR_IF;
-}
-#endif /* PPP_SERVER */
-
-/*
- * Initiate the end of a PPP connection.
- * Any outstanding packets in the queues are dropped.
- *
- * Setting nocarrier to 1 close the PPP connection without initiating the
- * shutdown procedure. Always using nocarrier = 0 is still recommended,
- * this is going to take a little longer time if your link is down, but
- * is a safer choice for the PPP state machine.
- *
- * Return 0 on success, an error code on failure.
- */
-err_t
-ppp_close(ppp_pcb *pcb, u8_t nocarrier)
-{
-  pcb->err_code = PPPERR_USER;
-
-  /* holdoff phase, cancel the reconnection */
-  if (pcb->phase == PPP_PHASE_HOLDOFF) {
-    sys_untimeout(ppp_do_connect, pcb);
-    new_phase(pcb, PPP_PHASE_DEAD);
-  }
-
-  /* dead phase, nothing to do, call the status callback to be consistent */
-  if (pcb->phase == PPP_PHASE_DEAD) {
-    pcb->link_status_cb(pcb, pcb->err_code, pcb->ctx_cb);
-    return ERR_OK;
-  }
-
-  /*
-   * Only accept carrier lost signal on the stable running phase in order
-   * to prevent changing the PPP phase FSM in transition phases.
-   *
-   * Always using nocarrier = 0 is still recommended, this is going to
-   * take a little longer time, but is a safer choice from FSM point of view.
-   */
-  if (nocarrier && pcb->phase == PPP_PHASE_RUNNING) {
-    PPPDEBUG(LOG_DEBUG, ("ppp_close[%d]: carrier lost -> lcp_lowerdown\n", pcb->netif->num));
-    lcp_lowerdown(pcb);
-    /* forced link termination, this will leave us at PPP_PHASE_DEAD. */
-    link_terminated(pcb);
-    return ERR_OK;
-  }
-
-  /* Disconnect */
-  PPPDEBUG(LOG_DEBUG, ("ppp_close[%d]: kill_link -> lcp_close\n", pcb->netif->num));
-  /* LCP close request, this will leave us at PPP_PHASE_DEAD. */
-  lcp_close(pcb, "User request");
-  return ERR_OK;
-}
-
-/*
- * Release the control block.
- *
- * This can only be called if PPP is in the dead phase.
- *
- * You must use ppp_close() before if you wish to terminate
- * an established PPP session.
- *
- * Return 0 on success, an error code on failure.
- */
-err_t ppp_free(ppp_pcb *pcb) {
-  err_t err;
-  if (pcb->phase != PPP_PHASE_DEAD) {
-    return ERR_CONN;
-  }
-
-  PPPDEBUG(LOG_DEBUG, ("ppp_free[%d]\n", pcb->netif->num));
-
-  netif_remove(pcb->netif);
-
-  err = pcb->link_cb->free(pcb, pcb->link_ctx_cb);
-
-  memp_free(MEMP_PPP_PCB, pcb);
-  return err;
-}
-
-/* Get and set parameters for the given connection.
- * Return 0 on success, an error code on failure. */
-err_t
-ppp_ioctl(ppp_pcb *pcb, u8_t cmd, void *arg)
-{
-  if (pcb == NULL) {
-    return ERR_VAL;
-  }
-
-  switch(cmd) {
-    case PPPCTLG_UPSTATUS:      /* Get the PPP up status. */
-      if (!arg) {
-        goto fail;
-      }
-      *(int *)arg = (int)(0
-#if PPP_IPV4_SUPPORT
-           || pcb->if4_up
-#endif /* PPP_IPV4_SUPPORT */
-#if PPP_IPV6_SUPPORT
-           || pcb->if6_up
-#endif /* PPP_IPV6_SUPPORT */
-           );
-      return ERR_OK;
-
-    case PPPCTLG_ERRCODE:       /* Get the PPP error code. */
-      if (!arg) {
-        goto fail;
-      }
-      *(int *)arg = (int)(pcb->err_code);
-      return ERR_OK;
-
-    default:
-      goto fail;
-  }
-
-fail:
-  return ERR_VAL;
-}
-
-
-/**********************************/
-/*** LOCAL FUNCTION DEFINITIONS ***/
-/**********************************/
-
-static void ppp_do_connect(void *arg) {
-  ppp_pcb *pcb = (ppp_pcb*)arg;
-
-  LWIP_ASSERT("pcb->phase == PPP_PHASE_DEAD || pcb->phase == PPP_PHASE_HOLDOFF", pcb->phase == PPP_PHASE_DEAD || pcb->phase == PPP_PHASE_HOLDOFF);
-
-  pcb->link_cb->connect(pcb, pcb->link_ctx_cb);
-}
-
-/*
- * ppp_netif_init_cb - netif init callback
- */
-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 */
-  netif->output = ppp_netif_output_ip4;
-#endif /* LWIP_IPV4 */
-#if PPP_IPV6_SUPPORT
-  netif->output_ip6 = ppp_netif_output_ip6;
-#endif /* PPP_IPV6_SUPPORT */
-  netif->flags = NETIF_FLAG_UP;
-#if LWIP_NETIF_HOSTNAME
-  /* @todo: Initialize interface hostname */
-  /* netif_set_hostname(netif, "lwip"); */
-#endif /* LWIP_NETIF_HOSTNAME */
-  return ERR_OK;
-}
-
-#if LWIP_IPV4
-/*
- * 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 */
-
-#if PPP_IPV6_SUPPORT
-/*
- * Send an IPv6 packet on the given connection.
- */
-static err_t ppp_netif_output_ip6(struct netif *netif, struct pbuf *pb, const ip6_addr_t *ipaddr) {
-  LWIP_UNUSED_ARG(ipaddr);
-  return ppp_netif_output(netif, pb, PPP_IPV6);
-}
-#endif /* PPP_IPV6_SUPPORT */
-
-static err_t ppp_netif_output(struct netif *netif, struct pbuf *pb, u16_t protocol) {
-  ppp_pcb *pcb = (ppp_pcb*)netif->state;
-  err_t err;
-  struct pbuf *fpb = NULL;
-
-  /* Check that the link is up. */
-  if (0
-#if PPP_IPV4_SUPPORT
-      || (protocol == PPP_IP && !pcb->if4_up)
-#endif /* PPP_IPV4_SUPPORT */
-#if PPP_IPV6_SUPPORT
-      || (protocol == PPP_IPV6 && !pcb->if6_up)
-#endif /* PPP_IPV6_SUPPORT */
-      ) {
-    PPPDEBUG(LOG_ERR, ("ppp_netif_output[%d]: link not up\n", pcb->netif->num));
-    goto err_rte_drop;
-  }
-
-#if MPPE_SUPPORT
-  /* If MPPE is required, refuse any IP packet until we are able to crypt them. */
-  if (pcb->settings.require_mppe && pcb->ccp_transmit_method != CI_MPPE) {
-    PPPDEBUG(LOG_ERR, ("ppp_netif_output[%d]: MPPE required, not up\n", pcb->netif->num));
-    goto err_rte_drop;
-  }
-#endif /* MPPE_SUPPORT */
-
-#if VJ_SUPPORT && LWIP_TCP
-  /*
-   * Attempt Van Jacobson header compression if VJ is configured and
-   * this is an IP packet.
-   */
-  if (protocol == PPP_IP && pcb->vj_enabled) {
-    switch (vj_compress_tcp(&pcb->vj_comp, &pb)) {
-      case TYPE_IP:
-        /* No change...
-           protocol = PPP_IP; */
-        break;
-      case TYPE_COMPRESSED_TCP:
-        /* vj_compress_tcp() returns a new allocated pbuf, indicate we should free
-         * our duplicated pbuf later */
-        fpb = pb;
-        protocol = PPP_VJC_COMP;
-        break;
-      case TYPE_UNCOMPRESSED_TCP:
-        /* vj_compress_tcp() returns a new allocated pbuf, indicate we should free
-         * our duplicated pbuf later */
-        fpb = pb;
-        protocol = PPP_VJC_UNCOMP;
-        break;
-      default:
-        PPPDEBUG(LOG_WARNING, ("ppp_netif_output[%d]: bad IP packet\n", pcb->netif->num));
-        LINK_STATS_INC(link.proterr);
-        LINK_STATS_INC(link.drop);
-        MIB2_STATS_NETIF_INC(pcb->netif, ifoutdiscards);
-        return ERR_VAL;
-    }
-  }
-#endif /* VJ_SUPPORT && LWIP_TCP */
-
-#if CCP_SUPPORT
-  switch (pcb->ccp_transmit_method) {
-  case 0:
-    break; /* Don't compress */
-#if MPPE_SUPPORT
-  case CI_MPPE:
-    if ((err = mppe_compress(pcb, &pcb->mppe_comp, &pb, protocol)) != ERR_OK) {
-      LINK_STATS_INC(link.memerr);
-      LINK_STATS_INC(link.drop);
-      MIB2_STATS_NETIF_INC(netif, ifoutdiscards);
-      goto err;
-    }
-    /* if VJ compressor returned a new allocated pbuf, free it */
-    if (fpb) {
-      pbuf_free(fpb);
-    }
-    /* mppe_compress() returns a new allocated pbuf, indicate we should free
-     * our duplicated pbuf later */
-    fpb = pb;
-    protocol = PPP_COMP;
-    break;
-#endif /* MPPE_SUPPORT */
-  default:
-    PPPDEBUG(LOG_ERR, ("ppp_netif_output[%d]: bad CCP transmit method\n", pcb->netif->num));
-    goto err_rte_drop; /* Cannot really happen, we only negotiate what we are able to do */
-  }
-#endif /* CCP_SUPPORT */
-
-  err = pcb->link_cb->netif_output(pcb, pcb->link_ctx_cb, pb, protocol);
-  goto err;
-
-err_rte_drop:
-  err = ERR_RTE;
-  LINK_STATS_INC(link.rterr);
-  LINK_STATS_INC(link.drop);
-  MIB2_STATS_NETIF_INC(netif, ifoutdiscards);
-err:
-  if (fpb) {
-    pbuf_free(fpb);
-  }
-  return err;
-}
-
-/************************************/
-/*** PRIVATE FUNCTION DEFINITIONS ***/
-/************************************/
-
-/* Initialize the PPP subsystem. */
-int ppp_init(void) {
-
-    /*
-     * Initialize magic number generator now so that protocols may
-     * use magic numbers in initialization.
-     */
-    magic_init();
-
-    return 0;
-}
-
-/*
- * Create a new PPP control block.
- *
- * This initializes the PPP control block but does not
- * attempt to negotiate the LCP session.
- *
- * Return a new PPP connection control block pointer
- * on success or a null pointer on failure.
- */
-ppp_pcb *ppp_new(struct netif *pppif, const struct link_callbacks *callbacks, void *link_ctx_cb, ppp_link_status_cb_fn link_status_cb, void *ctx_cb) {
-  ppp_pcb *pcb;
-
-  /* PPP is single-threaded: without a callback,
-   * there is no way to know when the link is up. */
-  if (link_status_cb == NULL) {
-    return NULL;
-  }
-
-  pcb = (ppp_pcb*)memp_malloc(MEMP_PPP_PCB);
-  if (pcb == NULL) {
-    return NULL;
-  }
-
-  memset(pcb, 0, sizeof(ppp_pcb));
-
-  /* default configuration */
-#if LWIP_DNS
-  pcb->settings.usepeerdns = 1;
-#endif /* LWIP_DNS */
-
-#if PAP_SUPPORT
-  pcb->settings.pap_timeout_time = UPAP_DEFTIMEOUT;
-  pcb->settings.pap_max_transmits = UPAP_DEFTRANSMITS;
-#if PPP_SERVER
-  pcb->settings.pap_req_timeout = UPAP_DEFREQTIME;
-#endif /* PPP_SERVER */
-#endif /* PAP_SUPPORT */
-
-#if CHAP_SUPPORT
-  pcb->settings.chap_timeout_time = CHAP_DEFTIMEOUT;
-  pcb->settings.chap_max_transmits = CHAP_DEFTRANSMITS;
-#if PPP_SERVER
-  pcb->settings.chap_rechallenge_time = CHAP_DEFRECHALLENGETIME;
-#endif /* PPP_SERVER */
-#endif /* CHAP_SUPPPORT */
-
-#if EAP_SUPPORT
-  pcb->settings.eap_req_time = EAP_DEFREQTIME;
-  pcb->settings.eap_allow_req = EAP_DEFALLOWREQ;
-#if PPP_SERVER
-  pcb->settings.eap_timeout_time = EAP_DEFTIMEOUT;
-  pcb->settings.eap_max_transmits = EAP_DEFTRANSMITS;
-#endif /* PPP_SERVER */
-#endif /* EAP_SUPPORT */
-
-#if MPPE_SUPPORT
-  pcb->settings.refuse_mppe_stateful = 1;
-#endif /* MPPE_SUPPORT */
-
-  pcb->settings.lcp_loopbackfail = LCP_DEFLOOPBACKFAIL;
-  pcb->settings.lcp_echo_interval = LCP_ECHOINTERVAL;
-  pcb->settings.lcp_echo_fails = LCP_MAXECHOFAILS;
-
-  pcb->settings.fsm_timeout_time = FSM_DEFTIMEOUT;
-  pcb->settings.fsm_max_conf_req_transmits = FSM_DEFMAXCONFREQS;
-  pcb->settings.fsm_max_term_transmits = FSM_DEFMAXTERMREQS;
-  pcb->settings.fsm_max_nak_loops = FSM_DEFMAXNAKLOOPS;
-
-  pcb->netif = pppif;
-  MIB2_INIT_NETIF(pppif, snmp_ifType_ppp, 0);
-  if (!netif_add(pcb->netif,
-#if LWIP_IPV4
-                 IP4_ADDR_ANY, IP4_ADDR_BROADCAST, IP4_ADDR_ANY,
-#endif /* LWIP_IPV4 */
-                 (void *)pcb, ppp_netif_init_cb, NULL)) {
-    memp_free(MEMP_PPP_PCB, pcb);
-    PPPDEBUG(LOG_ERR, ("ppp_new: netif_add failed\n"));
-    return NULL;
-  }
-
-  pcb->link_cb = callbacks;
-  pcb->link_ctx_cb = link_ctx_cb;
-  pcb->link_status_cb = link_status_cb;
-  pcb->ctx_cb = ctx_cb;
-  new_phase(pcb, PPP_PHASE_DEAD);
-  return pcb;
-}
-
-/* Set a PPP PCB to its initial state */
-void ppp_clear(ppp_pcb *pcb) {
-  const struct protent *protp;
-  int i;
-
-  LWIP_ASSERT("pcb->phase == PPP_PHASE_DEAD || pcb->phase == PPP_PHASE_HOLDOFF", pcb->phase == PPP_PHASE_DEAD || pcb->phase == PPP_PHASE_HOLDOFF);
-
-#if PPP_STATS_SUPPORT
-  link_stats_valid = 0;
-#endif /* PPP_STATS_SUPPORT */
-
-  memset(&pcb->phase, 0, sizeof(ppp_pcb) - ( (char*)&((ppp_pcb*)0)->phase - (char*)0 ) );
-
-  /*
-   * Initialize each protocol.
-   */
-  for (i = 0; (protp = protocols[i]) != NULL; ++i) {
-      (*protp->init)(pcb);
-  }
-
-#if VJ_SUPPORT && LWIP_TCP
-  vj_compress_init(&pcb->vj_comp);
-#endif /* VJ_SUPPORT && LWIP_TCP */
-
-  new_phase(pcb, PPP_PHASE_INITIALIZE);
-}
-
-/** Initiate LCP open request */
-void ppp_start(ppp_pcb *pcb) {
-  PPPDEBUG(LOG_DEBUG, ("ppp_start[%d]\n", pcb->netif->num));
-  lcp_open(pcb); /* Start protocol */
-  lcp_lowerup(pcb);
-  PPPDEBUG(LOG_DEBUG, ("ppp_start[%d]: finished\n", pcb->netif->num));
-}
-
-/** Called when link failed to setup */
-void ppp_link_failed(ppp_pcb *pcb) {
-  PPPDEBUG(LOG_DEBUG, ("ppp_failed[%d]\n", pcb->netif->num));
-  new_phase(pcb, PPP_PHASE_DEAD);
-  pcb->err_code = PPPERR_OPEN;
-  pcb->link_status_cb(pcb, pcb->err_code, pcb->ctx_cb);
-}
-
-/** Called when link is normally down (i.e. it was asked to end) */
-void ppp_link_end(ppp_pcb *pcb) {
-  PPPDEBUG(LOG_DEBUG, ("ppp_end[%d]\n", pcb->netif->num));
-  if (pcb->err_code == PPPERR_NONE) {
-    pcb->err_code = PPPERR_CONNECT;
-  }
-  pcb->link_status_cb(pcb, pcb->err_code, pcb->ctx_cb);
-}
-
-/*
- * Pass the processed input packet to the appropriate handler.
- * This function and all handlers run in the context of the tcpip_thread
- */
-void ppp_input(ppp_pcb *pcb, struct pbuf *pb) {
-  u16_t protocol;
-#if PPP_DEBUG && PPP_PROTOCOLNAME
-    const char *pname;
-#endif /* PPP_DEBUG && PPP_PROTOCOLNAME */
-
-  magic_randomize();
-
-  if (pb->len < 2) {
-    PPPDEBUG(LOG_ERR, ("ppp_input[%d]: packet too short\n", pcb->netif->num));
-    goto drop;
-  }
-  protocol = (((u8_t *)pb->payload)[0] << 8) | ((u8_t*)pb->payload)[1];
-
-#if PRINTPKT_SUPPORT
-  ppp_dump_packet("rcvd", (unsigned char *)pb->payload, pb->len);
-#endif /* PRINTPKT_SUPPORT */
-
-  pbuf_header(pb, -(s16_t)sizeof(protocol));
-
-  LINK_STATS_INC(link.recv);
-  MIB2_STATS_NETIF_INC(pcb->netif, ifinucastpkts);
-  MIB2_STATS_NETIF_ADD(pcb->netif, ifinoctets, pb->tot_len);
-
-  /*
-   * Toss all non-LCP packets unless LCP is OPEN.
-   */
-  if (protocol != PPP_LCP && pcb->lcp_fsm.state != PPP_FSM_OPENED) {
-    ppp_dbglog("Discarded non-LCP packet when LCP not open");
-    goto drop;
-  }
-
-  /*
-   * Until we get past the authentication phase, toss all packets
-   * except LCP, LQR and authentication packets.
-   */
-  if (pcb->phase <= PPP_PHASE_AUTHENTICATE
-   && !(protocol == PPP_LCP
-#if LQR_SUPPORT
-   || protocol == PPP_LQR
-#endif /* LQR_SUPPORT */
-#if PAP_SUPPORT
-   || protocol == PPP_PAP
-#endif /* PAP_SUPPORT */
-#if CHAP_SUPPORT
-   || protocol == PPP_CHAP
-#endif /* CHAP_SUPPORT */
-#if EAP_SUPPORT
-   || protocol == PPP_EAP
-#endif /* EAP_SUPPORT */
-   )) {
-    ppp_dbglog("discarding proto 0x%x in phase %d", protocol, pcb->phase);
-    goto drop;
-  }
-
-#if CCP_SUPPORT
-#if MPPE_SUPPORT
-  /*
-   * MPPE is required and unencrypted data has arrived (this
-   * should never happen!). We should probably drop the link if
-   * the protocol is in the range of what should be encrypted.
-   * At the least, we drop this packet.
-   */
-  if (pcb->settings.require_mppe && protocol != PPP_COMP && protocol < 0x8000) {
-    PPPDEBUG(LOG_ERR, ("ppp_input[%d]: MPPE required, received unencrypted data!\n", pcb->netif->num));
-    goto drop;
-  }
-#endif /* MPPE_SUPPORT */
-
-  if (protocol == PPP_COMP) {
-    u8_t *pl;
-
-    switch (pcb->ccp_receive_method) {
-#if MPPE_SUPPORT
-    case CI_MPPE:
-      if (mppe_decompress(pcb, &pcb->mppe_decomp, &pb) != ERR_OK) {
-        goto drop;
-      }
-      break;
-#endif /* MPPE_SUPPORT */
-    default:
-      PPPDEBUG(LOG_ERR, ("ppp_input[%d]: bad CCP receive method\n", pcb->netif->num));
-      goto drop; /* Cannot really happen, we only negotiate what we are able to do */
-    }
-
-    /* Assume no PFC */
-    if (pb->len < 2) {
-      goto drop;
-    }
-
-    /* Extract and hide protocol (do PFC decompression if necessary) */
-    pl = (u8_t*)pb->payload;
-    if (pl[0] & 0x01) {
-      protocol = pl[0];
-      pbuf_header(pb, -(s16_t)1);
-    } else {
-      protocol = (pl[0] << 8) | pl[1];
-      pbuf_header(pb, -(s16_t)2);
-    }
-  }
-#endif /* CCP_SUPPORT */
-
-  switch(protocol) {
-
-#if PPP_IPV4_SUPPORT
-    case PPP_IP:            /* Internet Protocol */
-      PPPDEBUG(LOG_INFO, ("ppp_input[%d]: ip in pbuf len=%d\n", pcb->netif->num, pb->tot_len));
-      ip4_input(pb, pcb->netif);
-      return;
-#endif /* PPP_IPV4_SUPPORT */
-
-#if PPP_IPV6_SUPPORT
-    case PPP_IPV6:          /* Internet Protocol Version 6 */
-      PPPDEBUG(LOG_INFO, ("ppp_input[%d]: ip6 in pbuf len=%d\n", pcb->netif->num, pb->tot_len));
-      ip6_input(pb, pcb->netif);
-      return;
-#endif /* PPP_IPV6_SUPPORT */
-
-#if VJ_SUPPORT && LWIP_TCP
-    case PPP_VJC_COMP:      /* VJ compressed TCP */
-      /*
-       * Clip off the VJ header and prepend the rebuilt TCP/IP header and
-       * pass the result to IP.
-       */
-      PPPDEBUG(LOG_INFO, ("ppp_input[%d]: vj_comp in pbuf len=%d\n", pcb->netif->num, pb->tot_len));
-      if (pcb->vj_enabled && vj_uncompress_tcp(&pb, &pcb->vj_comp) >= 0) {
-        ip4_input(pb, pcb->netif);
-        return;
-      }
-      /* Something's wrong so drop it. */
-      PPPDEBUG(LOG_WARNING, ("ppp_input[%d]: Dropping VJ compressed\n", pcb->netif->num));
-      break;
-
-    case PPP_VJC_UNCOMP:    /* VJ uncompressed TCP */
-      /*
-       * Process the TCP/IP header for VJ header compression and then pass
-       * the packet to IP.
-       */
-      PPPDEBUG(LOG_INFO, ("ppp_input[%d]: vj_un in pbuf len=%d\n", pcb->netif->num, pb->tot_len));
-      if (pcb->vj_enabled && vj_uncompress_uncomp(pb, &pcb->vj_comp) >= 0) {
-        ip4_input(pb, pcb->netif);
-        return;
-      }
-      /* Something's wrong so drop it. */
-      PPPDEBUG(LOG_WARNING, ("ppp_input[%d]: Dropping VJ uncompressed\n", pcb->netif->num));
-      break;
-#endif /* VJ_SUPPORT && LWIP_TCP */
-
-    default: {
-      int i;
-      const struct protent *protp;
-
-      /*
-       * Upcall the proper protocol input routine.
-       */
-      for (i = 0; (protp = protocols[i]) != NULL; ++i) {
-        if (protp->protocol == protocol) {
-          pb = ppp_singlebuf(pb);
-          (*protp->input)(pcb, (u8_t*)pb->payload, pb->len);
-          goto out;
-        }
-#if 0   /* UNUSED
-         *
-         * This is actually a (hacked?) way for the Linux kernel to pass a data
-         * packet to pppd. pppd in normal condition only do signaling
-         * (LCP, PAP, CHAP, IPCP, ...) and does not handle any data packet at all.
-         *
-         * We don't even need this interface, which is only there because of PPP
-         * interface limitation between Linux kernel and pppd. For MPPE, which uses
-         * CCP to negotiate although it is not really a (de)compressor, we added
-         * ccp_resetrequest() in CCP and MPPE input data flow is calling either
-         * ccp_resetrequest() or lcp_close() if the issue is, respectively, non-fatal
-         * or fatal, this is what ccp_datainput() really do.
-         */
-        if (protocol == (protp->protocol & ~0x8000)
-          && protp->datainput != NULL) {
-          (*protp->datainput)(pcb, pb->payload, pb->len);
-          goto out;
-        }
-#endif /* UNUSED */
-      }
-
-#if PPP_DEBUG
-#if PPP_PROTOCOLNAME
-      pname = protocol_name(protocol);
-      if (pname != NULL) {
-        ppp_warn("Unsupported protocol '%s' (0x%x) received", pname, protocol);
-      } else
-#endif /* PPP_PROTOCOLNAME */
-        ppp_warn("Unsupported protocol 0x%x received", protocol);
-#endif /* PPP_DEBUG */
-        pbuf_header(pb, (s16_t)sizeof(protocol));
-        lcp_sprotrej(pcb, (u8_t*)pb->payload, pb->len);
-      }
-      break;
-  }
-
-drop:
-  LINK_STATS_INC(link.drop);
-  MIB2_STATS_NETIF_INC(pcb->netif, ifindiscards);
-
-out:
-  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.
- *
- * IPv4 and IPv6 packets from lwIP are sent, respectively,
- * with ppp_netif_output_ip4() and ppp_netif_output_ip6()
- * functions (which are callbacks of the netif PPP interface).
- *
- *  RETURN: >= 0 Number of characters written
- *           -1 Failed to write to device
- */
-err_t ppp_write(ppp_pcb *pcb, struct pbuf *p) {
-#if PRINTPKT_SUPPORT
-  ppp_dump_packet("sent", (unsigned char *)p->payload+2, p->len-2);
-#endif /* PRINTPKT_SUPPORT */
-  return pcb->link_cb->write(pcb, pcb->link_ctx_cb, p);
-}
-
-void ppp_link_terminated(ppp_pcb *pcb) {
-  PPPDEBUG(LOG_DEBUG, ("ppp_link_terminated[%d]\n", pcb->netif->num));
-  pcb->link_cb->disconnect(pcb, pcb->link_ctx_cb);
-  PPPDEBUG(LOG_DEBUG, ("ppp_link_terminated[%d]: finished.\n", pcb->netif->num));
-}
-
-
-/************************************************************************
- * Functions called by various PPP subsystems to configure
- * the PPP interface or change the PPP phase.
- */
-
-/*
- * new_phase - signal the start of a new phase of pppd's operation.
- */
-void new_phase(ppp_pcb *pcb, int p) {
-  pcb->phase = p;
-  PPPDEBUG(LOG_DEBUG, ("ppp phase changed[%d]: phase=%d\n", pcb->netif->num, pcb->phase));
-#if PPP_NOTIFY_PHASE
-  if (pcb->notify_phase_cb != NULL) {
-    pcb->notify_phase_cb(pcb, p, pcb->ctx_cb);
-  }
-#endif /* PPP_NOTIFY_PHASE */
-}
-
-/*
- * ppp_send_config - configure the transmit-side characteristics of
- * the ppp interface.
- */
-int ppp_send_config(ppp_pcb *pcb, int mtu, u32_t accm, int pcomp, int accomp) {
-  LWIP_UNUSED_ARG(mtu);
-  /* pcb->mtu = mtu; -- set correctly with netif_set_mtu */
-
-  if (pcb->link_cb->send_config) {
-    pcb->link_cb->send_config(pcb, pcb->link_ctx_cb, accm, pcomp, accomp);
-  }
-
-  PPPDEBUG(LOG_INFO, ("ppp_send_config[%d]\n", pcb->netif->num) );
-  return 0;
-}
-
-/*
- * ppp_recv_config - configure the receive-side characteristics of
- * the ppp interface.
- */
-int ppp_recv_config(ppp_pcb *pcb, int mru, u32_t accm, int pcomp, int accomp) {
-  LWIP_UNUSED_ARG(mru);
-
-  if (pcb->link_cb->recv_config) {
-    pcb->link_cb->recv_config(pcb, pcb->link_ctx_cb, accm, pcomp, accomp);
-  }
-
-  PPPDEBUG(LOG_INFO, ("ppp_recv_config[%d]\n", pcb->netif->num));
-  return 0;
-}
-
-#if PPP_IPV4_SUPPORT
-/*
- * sifaddr - Config the interface IP addresses and netmask.
- */
-int sifaddr(ppp_pcb *pcb, u32_t our_adr, u32_t his_adr, u32_t netmask) {
-  ip4_addr_t ip, nm, gw;
-
-  ip4_addr_set_u32(&ip, our_adr);
-  ip4_addr_set_u32(&nm, netmask);
-  ip4_addr_set_u32(&gw, his_adr);
-  netif_set_addr(pcb->netif, &ip, &nm, &gw);
-  return 1;
-}
-
-/********************************************************************
- *
- * cifaddr - Clear the interface IP addresses, and delete routes
- * through the interface if possible.
- */
-int cifaddr(ppp_pcb *pcb, u32_t our_adr, u32_t his_adr) {
-  LWIP_UNUSED_ARG(our_adr);
-  LWIP_UNUSED_ARG(his_adr);
-
-  netif_set_addr(pcb->netif, IP4_ADDR_ANY, IP4_ADDR_BROADCAST, IP4_ADDR_ANY);
-  return 1;
-}
-
-#if 0 /* UNUSED - PROXY ARP */
-/********************************************************************
- *
- * sifproxyarp - Make a proxy ARP entry for the peer.
- */
-
-int sifproxyarp(ppp_pcb *pcb, u32_t his_adr) {
-  LWIP_UNUSED_ARG(pcb);
-  LWIP_UNUSED_ARG(his_adr);
-  return 0;
-}
-
-/********************************************************************
- *
- * cifproxyarp - Delete the proxy ARP entry for the peer.
- */
-
-int cifproxyarp(ppp_pcb *pcb, u32_t his_adr) {
-  LWIP_UNUSED_ARG(pcb);
-  LWIP_UNUSED_ARG(his_adr);
-  return 0;
-}
-#endif /* UNUSED - PROXY ARP */
-
-#if LWIP_DNS
-/*
- * sdns - Config the DNS servers
- */
-int sdns(ppp_pcb *pcb, u32_t ns1, u32_t ns2) {
-  ip_addr_t ns;
-  LWIP_UNUSED_ARG(pcb);
-
-  ip_addr_set_ip4_u32(&ns, ns1);
-  dns_setserver(0, &ns);
-  ip_addr_set_ip4_u32(&ns, ns2);
-  dns_setserver(1, &ns);
-  return 1;
-}
-
-/********************************************************************
- *
- * cdns - Clear the DNS servers
- */
-int cdns(ppp_pcb *pcb, u32_t ns1, u32_t ns2) {
-  ip_addr_t nsa, nsb;
-  LWIP_UNUSED_ARG(pcb);
-
-  nsa = dns_getserver(0);
-  ip_addr_set_ip4_u32(&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);
-  if (ip_addr_cmp(&nsa, &nsb)) {
-    dns_setserver(1, IP_ADDR_ANY);
-  }
-  return 1;
-}
-#endif /* LWIP_DNS */
-
-#if VJ_SUPPORT
-/********************************************************************
- *
- * sifvjcomp - config tcp header compression
- */
-int sifvjcomp(ppp_pcb *pcb, int vjcomp, int cidcomp, int maxcid) {
-  pcb->vj_enabled = vjcomp;
-  pcb->vj_comp.compressSlot = cidcomp;
-  pcb->vj_comp.maxSlotIndex = maxcid;
-  PPPDEBUG(LOG_INFO, ("sifvjcomp[%d]: VJ compress enable=%d slot=%d max slot=%d\n",
-            pcb->netif->num, vjcomp, cidcomp, maxcid));
-  return 0;
-}
-#endif /* VJ_SUPPORT */
-
-/*
- * sifup - Config the interface up and enable IP packets to pass.
- */
-int sifup(ppp_pcb *pcb) {
-  pcb->if4_up = 1;
-  pcb->err_code = PPPERR_NONE;
-  netif_set_link_up(pcb->netif);
-
-  PPPDEBUG(LOG_DEBUG, ("sifup[%d]: err_code=%d\n", pcb->netif->num, pcb->err_code));
-  pcb->link_status_cb(pcb, pcb->err_code, pcb->ctx_cb);
-  return 1;
-}
-
-/********************************************************************
- *
- * sifdown - Disable the indicated protocol and config the interface
- *           down if there are no remaining protocols.
- */
-int sifdown(ppp_pcb *pcb) {
-
-  pcb->if4_up = 0;
-
-  if (1
-#if PPP_IPV6_SUPPORT
-   /* set the interface down if IPv6 is down as well */
-   && !pcb->if6_up
-#endif /* PPP_IPV6_SUPPORT */
-  ) {
-    /* make sure the netif link callback is called */
-    netif_set_link_down(pcb->netif);
-  }
-  PPPDEBUG(LOG_DEBUG, ("sifdown[%d]: err_code=%d\n", pcb->netif->num, pcb->err_code));
-  return 1;
-}
-
-/********************************************************************
- *
- * Return user specified netmask, modified by any mask we might determine
- * for address `addr' (in network byte order).
- * Here we scan through the system's list of interfaces, looking for
- * any non-point-to-point interfaces which might appear to be on the same
- * network as `addr'.  If we find any, we OR in their netmask to the
- * user-specified netmask.
- */
-u32_t get_mask(u32_t addr) {
-#if 0
-  u32_t mask, nmask;
-
-  addr = htonl(addr);
-  if (IP_CLASSA(addr)) { /* determine network mask for address class */
-    nmask = IP_CLASSA_NET;
-  } else if (IP_CLASSB(addr)) {
-    nmask = IP_CLASSB_NET;
-  } else {
-    nmask = IP_CLASSC_NET;
-  }
-
-  /* class D nets are disallowed by bad_ip_adrs */
-  mask = PP_HTONL(0xffffff00UL) | htonl(nmask);
-
-  /* XXX
-   * Scan through the system's network interfaces.
-   * Get each netmask and OR them into our mask.
-   */
-  /* return mask; */
-  return mask;
-#endif /* 0 */
-  LWIP_UNUSED_ARG(addr);
-  return IPADDR_BROADCAST;
-}
-#endif /* PPP_IPV4_SUPPORT */
-
-#if PPP_IPV6_SUPPORT
-#define IN6_LLADDR_FROM_EUI64(ip6, eui64) do {    \
-  ip6.addr[0] = PP_HTONL(0xfe800000);             \
-  ip6.addr[1] = 0;                                \
-  eui64_copy(eui64, ip6.addr[2]);                 \
-  } while (0)
-
-/********************************************************************
- *
- * sif6addr - Config the interface with an IPv6 link-local address
- */
-int sif6addr(ppp_pcb *pcb, eui64_t our_eui64, eui64_t his_eui64) {
-  ip6_addr_t ip6;
-  LWIP_UNUSED_ARG(his_eui64);
-
-  IN6_LLADDR_FROM_EUI64(ip6, our_eui64);
-  netif_ip6_addr_set(pcb->netif, 0, &ip6);
-  netif_ip6_addr_set_state(pcb->netif, 0, IP6_ADDR_PREFERRED);
-  /* FIXME: should we add an IPv6 static neighbor using his_eui64 ? */
-  return 1;
-}
-
-/********************************************************************
- *
- * cif6addr - Remove IPv6 address from interface
- */
-int cif6addr(ppp_pcb *pcb, eui64_t our_eui64, eui64_t his_eui64) {
-  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);
-  return 1;
-}
-
-/*
- * sif6up - Config the interface up and enable IPv6 packets to pass.
- */
-int sif6up(ppp_pcb *pcb) {
-
-  pcb->if6_up = 1;
-  pcb->err_code = PPPERR_NONE;
-  netif_set_link_up(pcb->netif);
-
-  PPPDEBUG(LOG_DEBUG, ("sif6up[%d]: err_code=%d\n", pcb->netif->num, pcb->err_code));
-  pcb->link_status_cb(pcb, pcb->err_code, pcb->ctx_cb);
-  return 1;
-}
-
-/********************************************************************
- *
- * sif6down - Disable the indicated protocol and config the interface
- *            down if there are no remaining protocols.
- */
-int sif6down(ppp_pcb *pcb) {
-
-  pcb->if6_up = 0;
-
-  if (1
-#if PPP_IPV4_SUPPORT
-   /* set the interface down if IPv4 is down as well */
-   && !pcb->if4_up
-#endif /* PPP_IPV4_SUPPORT */
-  ) {
-    /* make sure the netif link callback is called */
-    netif_set_link_down(pcb->netif);
-  }
-  PPPDEBUG(LOG_DEBUG, ("sif6down[%d]: err_code=%d\n", pcb->netif->num, pcb->err_code));
-  return 1;
-}
-#endif /* PPP_IPV6_SUPPORT */
-
-#if DEMAND_SUPPORT
-/*
- * sifnpmode - Set the mode for handling packets for a given NP.
- */
-int sifnpmode(ppp_pcb *pcb, int proto, enum NPmode mode) {
-  LWIP_UNUSED_ARG(pcb);
-  LWIP_UNUSED_ARG(proto);
-  LWIP_UNUSED_ARG(mode);
-  return 0;
-}
-#endif /* DEMAND_SUPPORT */
-
-/*
- * netif_set_mtu - set the MTU on the PPP network interface.
- */
-void netif_set_mtu(ppp_pcb *pcb, int mtu) {
-
-  pcb->netif->mtu = mtu;
-  PPPDEBUG(LOG_INFO, ("netif_set_mtu[%d]: mtu=%d\n", pcb->netif->num, mtu));
-}
-
-/*
- * netif_get_mtu - get PPP interface MTU
- */
-int netif_get_mtu(ppp_pcb *pcb) {
-
-  return pcb->netif->mtu;
-}
-
-#if CCP_SUPPORT
-#if 0 /* unused */
-/*
- * ccp_test - whether a given compression method is acceptable for use.
- */
-int
-ccp_test(ppp_pcb *pcb, u_char *opt_ptr, int opt_len, int for_transmit)
-{
-  LWIP_UNUSED_ARG(pcb);
-  LWIP_UNUSED_ARG(opt_ptr);
-  LWIP_UNUSED_ARG(opt_len);
-  LWIP_UNUSED_ARG(for_transmit);
-  return -1;
-}
-#endif /* unused */
-
-/*
- * ccp_set - inform about the current state of CCP.
- */
-void
-ccp_set(ppp_pcb *pcb, u8_t isopen, u8_t isup, u8_t receive_method, u8_t transmit_method)
-{
-  LWIP_UNUSED_ARG(isopen);
-  LWIP_UNUSED_ARG(isup);
-  pcb->ccp_receive_method = receive_method;
-  pcb->ccp_transmit_method = transmit_method;
-  PPPDEBUG(LOG_DEBUG, ("ccp_set[%d]: is_open=%d, is_up=%d, receive_method=%u, transmit_method=%u\n",
-           pcb->netif->num, isopen, isup, receive_method, transmit_method));
-}
-
-void
-ccp_reset_comp(ppp_pcb *pcb)
-{
-  switch (pcb->ccp_transmit_method) {
-#if MPPE_SUPPORT
-  case CI_MPPE:
-    mppe_comp_reset(pcb, &pcb->mppe_comp);
-    break;
-#endif /* MPPE_SUPPORT */
-  default:
-    break;
-  }
-}
-
-void
-ccp_reset_decomp(ppp_pcb *pcb)
-{
-  switch (pcb->ccp_receive_method) {
-#if MPPE_SUPPORT
-  case CI_MPPE:
-    mppe_decomp_reset(pcb, &pcb->mppe_decomp);
-    break;
-#endif /* MPPE_SUPPORT */
-  default:
-    break;
-  }
-}
-
-#if 0 /* unused */
-/*
- * ccp_fatal_error - returns 1 if decompression was disabled as a
- * result of an error detected after decompression of a packet,
- * 0 otherwise.  This is necessary because of patent nonsense.
- */
-int
-ccp_fatal_error(ppp_pcb *pcb)
-{
-  LWIP_UNUSED_ARG(pcb);
-  return 1;
-}
-#endif /* unused */
-#endif /* CCP_SUPPORT */
-
-#if PPP_IDLETIMELIMIT
-/********************************************************************
- *
- * get_idle_time - return how long the link has been idle.
- */
-int get_idle_time(ppp_pcb *pcb, struct ppp_idle *ip) {
-  /* FIXME: add idle time support and make it optional */
-  LWIP_UNUSED_ARG(pcb);
-  LWIP_UNUSED_ARG(ip);
-  return 1;
-}
-#endif /* PPP_IDLETIMELIMIT */
-
-#if DEMAND_SUPPORT
-/********************************************************************
- *
- * get_loop_output - get outgoing packets from the ppp device,
- * and detect when we want to bring the real link up.
- * Return value is 1 if we need to bring up the link, 0 otherwise.
- */
-int get_loop_output(void) {
-  return 0;
-}
-#endif /* DEMAND_SUPPORT */
-
-#if PPP_PROTOCOLNAME
-/* List of protocol names, to make our messages a little more informative. */
-struct protocol_list {
-  u_short proto;
-  const char *name;
-} protocol_list[] = {
-  { 0x21, "IP" },
-  { 0x23, "OSI Network Layer" },
-  { 0x25, "Xerox NS IDP" },
-  { 0x27, "DECnet Phase IV" },
-  { 0x29, "Appletalk" },
-  { 0x2b, "Novell IPX" },
-  { 0x2d, "VJ compressed TCP/IP" },
-  { 0x2f, "VJ uncompressed TCP/IP" },
-  { 0x31, "Bridging PDU" },
-  { 0x33, "Stream Protocol ST-II" },
-  { 0x35, "Banyan Vines" },
-  { 0x39, "AppleTalk EDDP" },
-  { 0x3b, "AppleTalk SmartBuffered" },
-  { 0x3d, "Multi-Link" },
-  { 0x3f, "NETBIOS Framing" },
-  { 0x41, "Cisco Systems" },
-  { 0x43, "Ascom Timeplex" },
-  { 0x45, "Fujitsu Link Backup and Load Balancing (LBLB)" },
-  { 0x47, "DCA Remote Lan" },
-  { 0x49, "Serial Data Transport Protocol (PPP-SDTP)" },
-  { 0x4b, "SNA over 802.2" },
-  { 0x4d, "SNA" },
-  { 0x4f, "IP6 Header Compression" },
-  { 0x51, "KNX Bridging Data" },
-  { 0x53, "Encryption" },
-  { 0x55, "Individual Link Encryption" },
-  { 0x57, "IPv6" },
-  { 0x59, "PPP Muxing" },
-  { 0x5b, "Vendor-Specific Network Protocol" },
-  { 0x61, "RTP IPHC Full Header" },
-  { 0x63, "RTP IPHC Compressed TCP" },
-  { 0x65, "RTP IPHC Compressed non-TCP" },
-  { 0x67, "RTP IPHC Compressed UDP 8" },
-  { 0x69, "RTP IPHC Compressed RTP 8" },
-  { 0x6f, "Stampede Bridging" },
-  { 0x73, "MP+" },
-  { 0xc1, "NTCITS IPI" },
-  { 0xfb, "single-link compression" },
-  { 0xfd, "Compressed Datagram" },
-  { 0x0201, "802.1d Hello Packets" },
-  { 0x0203, "IBM Source Routing BPDU" },
-  { 0x0205, "DEC LANBridge100 Spanning Tree" },
-  { 0x0207, "Cisco Discovery Protocol" },
-  { 0x0209, "Netcs Twin Routing" },
-  { 0x020b, "STP - Scheduled Transfer Protocol" },
-  { 0x020d, "EDP - Extreme Discovery Protocol" },
-  { 0x0211, "Optical Supervisory Channel Protocol" },
-  { 0x0213, "Optical Supervisory Channel Protocol" },
-  { 0x0231, "Luxcom" },
-  { 0x0233, "Sigma Network Systems" },
-  { 0x0235, "Apple Client Server Protocol" },
-  { 0x0281, "MPLS Unicast" },
-  { 0x0283, "MPLS Multicast" },
-  { 0x0285, "IEEE p1284.4 standard - data packets" },
-  { 0x0287, "ETSI TETRA Network Protocol Type 1" },
-  { 0x0289, "Multichannel Flow Treatment Protocol" },
-  { 0x2063, "RTP IPHC Compressed TCP No Delta" },
-  { 0x2065, "RTP IPHC Context State" },
-  { 0x2067, "RTP IPHC Compressed UDP 16" },
-  { 0x2069, "RTP IPHC Compressed RTP 16" },
-  { 0x4001, "Cray Communications Control Protocol" },
-  { 0x4003, "CDPD Mobile Network Registration Protocol" },
-  { 0x4005, "Expand accelerator protocol" },
-  { 0x4007, "ODSICP NCP" },
-  { 0x4009, "DOCSIS DLL" },
-  { 0x400B, "Cetacean Network Detection Protocol" },
-  { 0x4021, "Stacker LZS" },
-  { 0x4023, "RefTek Protocol" },
-  { 0x4025, "Fibre Channel" },
-  { 0x4027, "EMIT Protocols" },
-  { 0x405b, "Vendor-Specific Protocol (VSP)" },
-  { 0x8021, "Internet Protocol Control Protocol" },
-  { 0x8023, "OSI Network Layer Control Protocol" },
-  { 0x8025, "Xerox NS IDP Control Protocol" },
-  { 0x8027, "DECnet Phase IV Control Protocol" },
-  { 0x8029, "Appletalk Control Protocol" },
-  { 0x802b, "Novell IPX Control Protocol" },
-  { 0x8031, "Bridging NCP" },
-  { 0x8033, "Stream Protocol Control Protocol" },
-  { 0x8035, "Banyan Vines Control Protocol" },
-  { 0x803d, "Multi-Link Control Protocol" },
-  { 0x803f, "NETBIOS Framing Control Protocol" },
-  { 0x8041, "Cisco Systems Control Protocol" },
-  { 0x8043, "Ascom Timeplex" },
-  { 0x8045, "Fujitsu LBLB Control Protocol" },
-  { 0x8047, "DCA Remote Lan Network Control Protocol (RLNCP)" },
-  { 0x8049, "Serial Data Control Protocol (PPP-SDCP)" },
-  { 0x804b, "SNA over 802.2 Control Protocol" },
-  { 0x804d, "SNA Control Protocol" },
-  { 0x804f, "IP6 Header Compression Control Protocol" },
-  { 0x8051, "KNX Bridging Control Protocol" },
-  { 0x8053, "Encryption Control Protocol" },
-  { 0x8055, "Individual Link Encryption Control Protocol" },
-  { 0x8057, "IPv6 Control Protocol" },
-  { 0x8059, "PPP Muxing Control Protocol" },
-  { 0x805b, "Vendor-Specific Network Control Protocol (VSNCP)" },
-  { 0x806f, "Stampede Bridging Control Protocol" },
-  { 0x8073, "MP+ Control Protocol" },
-  { 0x80c1, "NTCITS IPI Control Protocol" },
-  { 0x80fb, "Single Link Compression Control Protocol" },
-  { 0x80fd, "Compression Control Protocol" },
-  { 0x8207, "Cisco Discovery Protocol Control" },
-  { 0x8209, "Netcs Twin Routing" },
-  { 0x820b, "STP - Control Protocol" },
-  { 0x820d, "EDPCP - Extreme Discovery Protocol Ctrl Prtcl" },
-  { 0x8235, "Apple Client Server Protocol Control" },
-  { 0x8281, "MPLSCP" },
-  { 0x8285, "IEEE p1284.4 standard - Protocol Control" },
-  { 0x8287, "ETSI TETRA TNP1 Control Protocol" },
-  { 0x8289, "Multichannel Flow Treatment Protocol" },
-  { 0xc021, "Link Control Protocol" },
-  { 0xc023, "Password Authentication Protocol" },
-  { 0xc025, "Link Quality Report" },
-  { 0xc027, "Shiva Password Authentication Protocol" },
-  { 0xc029, "CallBack Control Protocol (CBCP)" },
-  { 0xc02b, "BACP Bandwidth Allocation Control Protocol" },
-  { 0xc02d, "BAP" },
-  { 0xc05b, "Vendor-Specific Authentication Protocol (VSAP)" },
-  { 0xc081, "Container Control Protocol" },
-  { 0xc223, "Challenge Handshake Authentication Protocol" },
-  { 0xc225, "RSA Authentication Protocol" },
-  { 0xc227, "Extensible Authentication Protocol" },
-  { 0xc229, "Mitsubishi Security Info Exch Ptcl (SIEP)" },
-  { 0xc26f, "Stampede Bridging Authorization Protocol" },
-  { 0xc281, "Proprietary Authentication Protocol" },
-  { 0xc283, "Proprietary Authentication Protocol" },
-  { 0xc481, "Proprietary Node ID Authentication Protocol" },
-  { 0, NULL },
-};
-
-/*
- * protocol_name - find a name for a PPP protocol.
- */
-const char * protocol_name(int proto) {
-  struct protocol_list *lp;
-
-  for (lp = protocol_list; lp->proto != 0; ++lp) {
-    if (proto == lp->proto) {
-      return lp->name;
-    }
-  }
-  return NULL;
-}
-#endif /* PPP_PROTOCOLNAME */
-
-#if PPP_STATS_SUPPORT
-
-/* ---- Note on PPP Stats support ----
- *
- * The one willing link stats support should add the get_ppp_stats()
- * to fetch statistics from lwIP.
- */
-
-/*
- * reset_link_stats - "reset" stats when link goes up.
- */
-void reset_link_stats(int u) {
-  if (!get_ppp_stats(u, &old_link_stats)) {
-    return;
-  }
-  gettimeofday(&start_time, NULL);
-}
-
-/*
- * update_link_stats - get stats at link termination.
- */
-void update_link_stats(int u) {
-  struct timeval now;
-  char numbuf[32];
-
-  if (!get_ppp_stats(u, &link_stats) || gettimeofday(&now, NULL) < 0) {
-    return;
-  }
-  link_connect_time = now.tv_sec - start_time.tv_sec;
-  link_stats_valid = 1;
-
-  link_stats.bytes_in  -= old_link_stats.bytes_in;
-  link_stats.bytes_out -= old_link_stats.bytes_out;
-  link_stats.pkts_in   -= old_link_stats.pkts_in;
-  link_stats.pkts_out  -= old_link_stats.pkts_out;
-}
-
-void print_link_stats() {
-  /*
-   * Print connect time and statistics.
-   */
-  if (link_stats_valid) {
-    int t = (link_connect_time + 5) / 6;    /* 1/10ths of minutes */
-    info("Connect time %d.%d minutes.", t/10, t%10);
-    info("Sent %u bytes, received %u bytes.", link_stats.bytes_out, link_stats.bytes_in);
-    link_stats_valid = 0;
-  }
-}
-#endif /* PPP_STATS_SUPPORT */
-
-#endif /* PPP_SUPPORT */
diff --git a/components/lwip/netif/ppp/pppcrypt.c b/components/lwip/netif/ppp/pppcrypt.c
deleted file mode 100644 (file)
index 097f702..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * pppcrypt.c - PPP/DES linkage for MS-CHAP and EAP SRP-SHA1
- *
- * Extracted from chap_ms.c by James Carlson.
- *
- * Copyright (c) 1995 Eric Rosenquist.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The name(s) of the authors of this software must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission.
- *
- * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && MSCHAP_SUPPORT /* don't build if not necessary */
-
-#include "netif/ppp/ppp_impl.h"
-
-#include "netif/ppp/pppcrypt.h"
-
-
-static u_char pppcrypt_get_7bits(u_char *input, int startBit) {
-       unsigned int word;
-
-       word  = (unsigned)input[startBit / 8] << 8;
-       word |= (unsigned)input[startBit / 8 + 1];
-
-       word >>= 15 - (startBit % 8 + 7);
-
-       return word & 0xFE;
-}
-
-/* IN  56 bit DES key missing parity bits
- * OUT 64 bit DES key with parity bits added
- */
-void pppcrypt_56_to_64_bit_key(u_char *key, u_char * des_key) {
-       des_key[0] = pppcrypt_get_7bits(key,  0);
-       des_key[1] = pppcrypt_get_7bits(key,  7);
-       des_key[2] = pppcrypt_get_7bits(key, 14);
-       des_key[3] = pppcrypt_get_7bits(key, 21);
-       des_key[4] = pppcrypt_get_7bits(key, 28);
-       des_key[5] = pppcrypt_get_7bits(key, 35);
-       des_key[6] = pppcrypt_get_7bits(key, 42);
-       des_key[7] = pppcrypt_get_7bits(key, 49);
-}
-
-#endif /* PPP_SUPPORT && MSCHAP_SUPPORT */
diff --git a/components/lwip/netif/ppp/pppoe.c b/components/lwip/netif/ppp/pppoe.c
deleted file mode 100644 (file)
index 586708b..0000000
+++ /dev/null
@@ -1,1250 +0,0 @@
-/*****************************************************************************
-* pppoe.c - PPP Over Ethernet implementation for lwIP.
-*
-* Copyright (c) 2006 by Marc Boucher, Services Informatiques (MBSI) inc.
-*
-* The authors hereby grant permission to use, copy, modify, distribute,
-* and license this software and its documentation for any purpose, provided
-* that existing copyright notices are retained in all copies and that this
-* notice and the following disclaimer are included verbatim in any 
-* distributions. No written agreement, license, or royalty fee is required
-* for any of the authorized uses.
-*
-* THIS SOFTWARE IS PROVIDED BY THE 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 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.
-*
-******************************************************************************
-* REVISION HISTORY
-*
-* 06-01-01 Marc Boucher <marc@mbsi.ca>
-*   Ported to lwIP.
-*****************************************************************************/
-
-
-
-/* based on NetBSD: if_pppoe.c,v 1.64 2006/01/31 23:50:15 martin Exp */
-
-/*-
- * Copyright (c) 2002 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Martin Husemann <martin@NetBSD.org>.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *        This product includes software developed by the NetBSD
- *        Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && PPPOE_SUPPORT /* don't build if not configured for use in lwipopts.h */
-
-#if 0 /* UNUSED */
-#include <string.h>
-#include <stdio.h>
-#endif /* UNUSED */
-
-#include "lwip/timers.h"
-#include "lwip/memp.h"
-#include "lwip/stats.h"
-#include "lwip/snmp.h"
-
-#include "netif/ppp/ppp_impl.h"
-#include "netif/ppp/lcp.h"
-#include "netif/ppp/ipcp.h"
-#include "netif/ppp/pppoe.h"
-
-/* Add a 16 bit unsigned value to a buffer pointed to by PTR */
-#define PPPOE_ADD_16(PTR, VAL) \
-    *(PTR)++ = (u8_t)((VAL) / 256);    \
-    *(PTR)++ = (u8_t)((VAL) % 256)
-
-/* Add a complete PPPoE header to the buffer pointed to by PTR */
-#define PPPOE_ADD_HEADER(PTR, CODE, SESS, LEN)  \
-    *(PTR)++ = PPPOE_VERTYPE;  \
-    *(PTR)++ = (CODE);         \
-    PPPOE_ADD_16(PTR, SESS);   \
-    PPPOE_ADD_16(PTR, LEN)
-
-#define PPPOE_DISC_TIMEOUT (5*1000)  /* base for quick timeout calculation */
-#define PPPOE_SLOW_RETRY   (60*1000) /* persistent retry interval */
-#define PPPOE_DISC_MAXPADI  4        /* retry PADI four times (quickly) */
-#define PPPOE_DISC_MAXPADR  2        /* retry PADR twice */
-
-#ifdef PPPOE_SERVER
-#error "PPPOE_SERVER is not yet supported under lwIP!"
-/* from if_spppsubr.c */
-#define IFF_PASSIVE IFF_LINK0 /* wait passively for connection */
-#endif
-
-#define PPPOE_ERRORSTRING_LEN     64
-
-
-/* callbacks called from PPP core */
-static err_t pppoe_write(ppp_pcb *ppp, void *ctx, struct pbuf *p);
-static err_t pppoe_netif_output(ppp_pcb *ppp, void *ctx, struct pbuf *p, u_short protocol);
-static err_t pppoe_connect(ppp_pcb *ppp, void *ctx);
-static void pppoe_disconnect(ppp_pcb *ppp, void *ctx);
-static err_t pppoe_destroy(ppp_pcb *ppp, void *ctx);
-
-/* management routines */
-static void pppoe_abort_connect(struct pppoe_softc *);
-#if 0 /* UNUSED */
-static void pppoe_clear_softc(struct pppoe_softc *, const char *);
-#endif /* UNUSED */
-
-/* internal timeout handling */
-static void pppoe_timeout(void *);
-
-/* sending actual protocol controll packets */
-static err_t pppoe_send_padi(struct pppoe_softc *);
-static err_t pppoe_send_padr(struct pppoe_softc *);
-#ifdef PPPOE_SERVER
-static err_t pppoe_send_pado(struct pppoe_softc *);
-static err_t pppoe_send_pads(struct pppoe_softc *);
-#endif
-static err_t pppoe_send_padt(struct netif *, u_int, const u8_t *);
-
-/* internal helper functions */
-static err_t pppoe_xmit(struct pppoe_softc *sc, struct pbuf *pb);
-static struct pppoe_softc* pppoe_find_softc_by_session(u_int session, struct netif *rcvif);
-static struct pppoe_softc* pppoe_find_softc_by_hunique(u8_t *token, size_t len, struct netif *rcvif);
-
-/** linked list of created pppoe interfaces */
-static struct pppoe_softc *pppoe_softc_list;
-
-/* Callbacks structure for PPP core */
-static const struct link_callbacks pppoe_callbacks = {
-  pppoe_connect,
-#if PPP_SERVER
-  NULL,
-#endif /* PPP_SERVER */
-  pppoe_disconnect,
-  pppoe_destroy,
-  pppoe_write,
-  pppoe_netif_output,
-  NULL,
-  NULL
-};
-
-/*
- * Create a new PPP Over Ethernet (PPPoE) connection.
- *
- * Return 0 on success, an error code on failure.
- */
-ppp_pcb *pppoe_create(struct netif *pppif,
-       struct netif *ethif,
-       const char *service_name, const char *concentrator_name,
-       ppp_link_status_cb_fn link_status_cb, void *ctx_cb)
-{
-  ppp_pcb *ppp;
-  struct pppoe_softc *sc;
-  LWIP_UNUSED_ARG(service_name);
-  LWIP_UNUSED_ARG(concentrator_name);
-
-  sc = (struct pppoe_softc *)memp_malloc(MEMP_PPPOE_IF);
-  if (sc == NULL) {
-    return NULL;
-  }
-
-  ppp = ppp_new(pppif, &pppoe_callbacks, sc, link_status_cb, ctx_cb);
-  if (ppp == NULL) {
-    memp_free(MEMP_PPPOE_IF, sc);
-    return NULL;
-  }
-
-  memset(sc, 0, sizeof(struct pppoe_softc));
-  /* changed to real address later */
-  MEMCPY(&sc->sc_dest, ethbroadcast.addr, sizeof(sc->sc_dest));
-  sc->pcb = ppp;
-  sc->sc_ethif = ethif;
-  /* put the new interface at the head of the list */
-  sc->next = pppoe_softc_list;
-  pppoe_softc_list = sc;
-  return ppp;
-}
-
-/* Called by PPP core */
-static err_t pppoe_write(ppp_pcb *ppp, void *ctx, struct pbuf *p) {
-  struct pppoe_softc *sc = (struct pppoe_softc *)ctx;
-  struct pbuf *ph; /* Ethernet + PPPoE header */
-  err_t ret;
-#if MIB2_STATS
-  u16_t tot_len;
-#else /* MIB2_STATS */
-  LWIP_UNUSED_ARG(ppp);
-#endif /* MIB2_STATS */
-
-  /* skip address & flags */
-  pbuf_header(p, -(s16_t)2);
-
-  ph = pbuf_alloc(PBUF_LINK, (u16_t)(PPPOE_HEADERLEN), PBUF_RAM);
-  if(!ph) {
-    LINK_STATS_INC(link.memerr);
-    LINK_STATS_INC(link.proterr);
-    MIB2_STATS_NETIF_INC(ppp->netif, ifoutdiscards);
-    pbuf_free(p);
-    return ERR_MEM;
-  }
-
-  pbuf_header(ph, -(s16_t)PPPOE_HEADERLEN); /* hide PPPoE header */
-  pbuf_cat(ph, p);
-#if MIB2_STATS
-  tot_len = ph->tot_len;
-#endif /* MIB2_STATS */
-
-  ret = pppoe_xmit(sc, ph);
-  if (ret != ERR_OK) {
-    LINK_STATS_INC(link.err);
-    MIB2_STATS_NETIF_INC(ppp->netif, ifoutdiscards);
-    return ret;
-  }
-
-  MIB2_STATS_NETIF_ADD(ppp->netif, ifoutoctets, (u16_t)tot_len);
-  MIB2_STATS_NETIF_INC(ppp->netif, ifoutucastpkts);
-  LINK_STATS_INC(link.xmit);
-  return ERR_OK;
-}
-
-/* Called by PPP core */
-static err_t pppoe_netif_output(ppp_pcb *ppp, void *ctx, struct pbuf *p, u_short protocol) {
-  struct pppoe_softc *sc = (struct pppoe_softc *)ctx;
-  struct pbuf *pb;
-  u8_t *pl;
-  err_t err;
-#if MIB2_STATS
-  u16_t tot_len;
-#else /* MIB2_STATS */
-  LWIP_UNUSED_ARG(ppp);
-#endif /* MIB2_STATS */
-
-  /* @todo: try to use pbuf_header() here! */
-  pb = pbuf_alloc(PBUF_LINK, PPPOE_HEADERLEN + sizeof(protocol), PBUF_RAM);
-  if(!pb) {
-    LINK_STATS_INC(link.memerr);
-    LINK_STATS_INC(link.proterr);
-    MIB2_STATS_NETIF_INC(ppp->netif, ifoutdiscards);
-    return ERR_MEM;
-  }
-
-  pbuf_header(pb, -(s16_t)PPPOE_HEADERLEN);
-
-  pl = (u8_t*)pb->payload;
-  PUTSHORT(protocol, pl);
-
-  pbuf_chain(pb, p);
-#if MIB2_STATS
-  tot_len = pb->tot_len;
-#endif /* MIB2_STATS */
-
-  if( (err = pppoe_xmit(sc, pb)) != ERR_OK) {
-    LINK_STATS_INC(link.err);
-    MIB2_STATS_NETIF_INC(ppp->netif, ifoutdiscards);
-    return err;
-  }
-
-  MIB2_STATS_NETIF_ADD(ppp->netif, ifoutoctets, tot_len);
-  MIB2_STATS_NETIF_INC(ppp->netif, ifoutucastpkts);
-  LINK_STATS_INC(link.xmit);
-  return ERR_OK;
-}
-
-static err_t
-pppoe_destroy(ppp_pcb *ppp, void *ctx)
-{
-  struct pppoe_softc *sc = (struct pppoe_softc *)ctx;
-  struct pppoe_softc **copp, *freep;
-  LWIP_UNUSED_ARG(ppp);
-
-  sys_untimeout(pppoe_timeout, sc);
-
-  /* remove interface from list */
-  for (copp = &pppoe_softc_list; (freep = *copp); copp = &freep->next) {
-    if (freep == sc) {
-       *copp = freep->next;
-       break;
-    }
-  }
-
-#ifdef PPPOE_TODO
-  if (sc->sc_concentrator_name) {
-    mem_free(sc->sc_concentrator_name);
-  }
-  if (sc->sc_service_name) {
-    mem_free(sc->sc_service_name);
-  }
-#endif /* PPPOE_TODO */
-  memp_free(MEMP_PPPOE_IF, sc);
-
-  return ERR_OK;
-}
-
-/*
- * Find the interface handling the specified session.
- * Note: O(number of sessions open), this is a client-side only, mean
- * and lean implementation, so number of open sessions typically should
- * be 1.
- */
-static struct pppoe_softc* pppoe_find_softc_by_session(u_int session, struct netif *rcvif) {
-  struct pppoe_softc *sc;
-
-  if (session == 0) {
-    return NULL;
-  }
-
-  for (sc = pppoe_softc_list; sc != NULL; sc = sc->next) {
-    if (sc->sc_state == PPPOE_STATE_SESSION
-        && sc->sc_session == session
-         && sc->sc_ethif == rcvif) {
-           return sc;
-      }
-  }
-  return NULL;
-}
-
-/* Check host unique token passed and return appropriate softc pointer,
- * or NULL if token is bogus. */
-static struct pppoe_softc* pppoe_find_softc_by_hunique(u8_t *token, size_t len, struct netif *rcvif) {
-  struct pppoe_softc *sc, *t;
-
-  if (pppoe_softc_list == NULL) {
-    return NULL;
-  }
-
-  if (len != sizeof sc) {
-    return NULL;
-  }
-  MEMCPY(&t, token, len);
-
-  for (sc = pppoe_softc_list; sc != NULL; sc = sc->next) {
-    if (sc == t) {
-      break;
-    }
-  }
-
-  if (sc == NULL) {
-    PPPDEBUG(LOG_DEBUG, ("pppoe: alien host unique tag, no session found\n"));
-    return NULL;
-  }
-
-  /* should be safe to access *sc now */
-  if (sc->sc_state < PPPOE_STATE_PADI_SENT || sc->sc_state >= PPPOE_STATE_SESSION) {
-    PPPDEBUG(LOG_DEBUG, ("%c%c%"U16_F": host unique tag found, but it belongs to a connection in state %d\n",
-      sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, sc->sc_state));
-    return NULL;
-  }
-  if (sc->sc_ethif != rcvif) {
-    PPPDEBUG(LOG_DEBUG, ("%c%c%"U16_F": wrong interface, not accepting host unique\n",
-      sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num));
-    return NULL;
-  }
-  return sc;
-}
-
-/* analyze and handle a single received packet while not in session state */
-void
-pppoe_disc_input(struct netif *netif, struct pbuf *pb)
-{
-  u16_t tag, len;
-  u16_t session, plen;
-  struct pppoe_softc *sc;
-#if PPP_DEBUG
-  const char *err_msg = NULL;
-#endif /* PPP_DEBUG */
-  u8_t *ac_cookie;
-  u16_t ac_cookie_len;
-#ifdef PPPOE_SERVER
-  u8_t *hunique;
-  size_t hunique_len;
-#endif
-  struct pppoehdr *ph;
-  struct pppoetag pt;
-  int off, err;
-  struct eth_hdr *ethhdr;
-
-  /* don't do anything if there is not a single PPPoE instance */
-  if (pppoe_softc_list == NULL) {
-    pbuf_free(pb);
-    return;
-  }
-
-  pb = ppp_singlebuf(pb);
-
-  if (pb->len < sizeof(*ethhdr)) {
-    goto done;
-  }
-  ethhdr = (struct eth_hdr *)pb->payload;
-  off = sizeof(*ethhdr);
-
-  ac_cookie = NULL;
-  ac_cookie_len = 0;
-#ifdef PPPOE_SERVER
-  hunique = NULL;
-  hunique_len = 0;
-#endif
-  session = 0;
-  if (pb->len - off < (u16_t)PPPOE_HEADERLEN) {
-    PPPDEBUG(LOG_DEBUG, ("pppoe: packet too short: %d\n", pb->len));
-    goto done;
-  }
-
-  ph = (struct pppoehdr *) (ethhdr + 1);
-  if (ph->vertype != PPPOE_VERTYPE) {
-    PPPDEBUG(LOG_DEBUG, ("pppoe: unknown version/type packet: 0x%x\n", ph->vertype));
-    goto done;
-  }
-  session = ntohs(ph->session);
-  plen = ntohs(ph->plen);
-  off += sizeof(*ph);
-
-  if (plen + off > pb->len) {
-    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 */
-  }
-  tag = 0;
-  len = 0;
-  sc = NULL;
-  while (off + sizeof(pt) <= pb->len) {
-    MEMCPY(&pt, (u8_t*)pb->payload + off, sizeof(pt));
-    tag = ntohs(pt.tag);
-    len = ntohs(pt.len);
-    if (off + sizeof(pt) + len > pb->len) {
-      PPPDEBUG(LOG_DEBUG, ("pppoe: tag 0x%x len 0x%x is too long\n", tag, len));
-      goto done;
-    }
-    switch (tag) {
-      case PPPOE_TAG_EOL:
-        goto breakbreak;
-      case PPPOE_TAG_SNAME:
-        break;  /* ignored */
-      case PPPOE_TAG_ACNAME:
-        break;  /* ignored */
-      case PPPOE_TAG_HUNIQUE:
-        if (sc != NULL) {
-          break;
-        }
-#ifdef PPPOE_SERVER
-        hunique = (u8_t*)pb->payload + off + sizeof(pt);
-        hunique_len = len;
-#endif
-        sc = pppoe_find_softc_by_hunique((u8_t*)pb->payload + off + sizeof(pt), len, netif);
-        break;
-      case PPPOE_TAG_ACCOOKIE:
-        if (ac_cookie == NULL) {
-          ac_cookie = (u8_t*)pb->payload + off + sizeof(pt);
-          ac_cookie_len = len;
-        }
-        break;
-#if PPP_DEBUG
-      case PPPOE_TAG_SNAME_ERR:
-        err_msg = "SERVICE NAME ERROR";
-        break;
-      case PPPOE_TAG_ACSYS_ERR:
-        err_msg = "AC SYSTEM ERROR";
-        break;
-      case PPPOE_TAG_GENERIC_ERR:
-        err_msg = "GENERIC ERROR";
-        break;
-#endif /* PPP_DEBUG */
-      default:
-        break;
-    }
-#if PPP_DEBUG
-    if (err_msg != NULL) {
-      char error_tmp[PPPOE_ERRORSTRING_LEN];
-      u16_t error_len = LWIP_MIN(len, sizeof(error_tmp)-1);
-      strncpy(error_tmp, (char*)pb->payload + off + sizeof(pt), error_len);
-      error_tmp[error_len] = '\0';
-      if (sc) {
-        PPPDEBUG(LOG_DEBUG, ("pppoe: %c%c%"U16_F": %s: %s\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, err_msg, error_tmp));
-      } else {
-        PPPDEBUG(LOG_DEBUG, ("pppoe: %s: %s\n", err_msg, error_tmp));
-      }
-    }
-#endif /* PPP_DEBUG */
-    off += sizeof(pt) + len;
-  }
-
-breakbreak:;
-  switch (ph->code) {
-    case PPPOE_CODE_PADI:
-#ifdef PPPOE_SERVER
-      /*
-       * got service name, concentrator name, and/or host unique.
-       * ignore if we have no interfaces with IFF_PASSIVE|IFF_UP.
-       */
-      if (LIST_EMPTY(&pppoe_softc_list)) {
-        goto done;
-      }
-      LIST_FOREACH(sc, &pppoe_softc_list, sc_list) {
-        if (!(sc->sc_sppp.pp_if.if_flags & IFF_UP)) {
-          continue;
-        }
-        if (!(sc->sc_sppp.pp_if.if_flags & IFF_PASSIVE)) {
-          continue;
-        }
-        if (sc->sc_state == PPPOE_STATE_INITIAL) {
-          break;
-        }
-      }
-      if (sc == NULL) {
-        /* PPPDEBUG(LOG_DEBUG, ("pppoe: free passive interface is not found\n")); */
-        goto done;
-      }
-      if (hunique) {
-        if (sc->sc_hunique) {
-          mem_free(sc->sc_hunique);
-        }
-        sc->sc_hunique = mem_malloc(hunique_len);
-        if (sc->sc_hunique == NULL) {
-          goto done;
-        }
-        sc->sc_hunique_len = hunique_len;
-        MEMCPY(sc->sc_hunique, hunique, hunique_len);
-      }
-      MEMCPY(&sc->sc_dest, eh->ether_shost, sizeof sc->sc_dest);
-      sc->sc_state = PPPOE_STATE_PADO_SENT;
-      pppoe_send_pado(sc);
-      break;
-#endif /* PPPOE_SERVER */
-    case PPPOE_CODE_PADR:
-#ifdef PPPOE_SERVER
-      /*
-       * get sc from ac_cookie if IFF_PASSIVE
-       */
-      if (ac_cookie == NULL) {
-        /* be quiet if there is not a single pppoe instance */
-        PPPDEBUG(LOG_DEBUG, ("pppoe: received PADR but not includes ac_cookie\n"));
-        goto done;
-      }
-      sc = pppoe_find_softc_by_hunique(ac_cookie, ac_cookie_len, netif);
-      if (sc == NULL) {
-        /* be quiet if there is not a single pppoe instance */
-        if (!LIST_EMPTY(&pppoe_softc_list)) {
-          PPPDEBUG(LOG_DEBUG, ("pppoe: received PADR but could not find request for it\n"));
-        }
-        goto done;
-      }
-      if (sc->sc_state != PPPOE_STATE_PADO_SENT) {
-        PPPDEBUG(LOG_DEBUG, ("%c%c%"U16_F": received unexpected PADR\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num));
-        goto done;
-      }
-      if (hunique) {
-        if (sc->sc_hunique) {
-          mem_free(sc->sc_hunique);
-        }
-        sc->sc_hunique = mem_malloc(hunique_len);
-        if (sc->sc_hunique == NULL) {
-          goto done;
-        }
-        sc->sc_hunique_len = hunique_len;
-        MEMCPY(sc->sc_hunique, hunique, hunique_len);
-      }
-      pppoe_send_pads(sc);
-      sc->sc_state = PPPOE_STATE_SESSION;
-      ppp_start(sc->pcb); /* notify upper layers */
-      break;
-#else
-      /* ignore, we are no access concentrator */
-      goto done;
-#endif /* PPPOE_SERVER */
-    case PPPOE_CODE_PADO:
-      if (sc == NULL) {
-        /* be quiet if there is not a single pppoe instance */
-        if (pppoe_softc_list != NULL) {
-          PPPDEBUG(LOG_DEBUG, ("pppoe: received PADO but could not find request for it\n"));
-        }
-        goto done;
-      }
-      if (sc->sc_state != PPPOE_STATE_PADI_SENT) {
-        PPPDEBUG(LOG_DEBUG, ("%c%c%"U16_F": received unexpected PADO\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num));
-        goto done;
-      }
-      if (ac_cookie) {
-        sc->sc_ac_cookie_len = ac_cookie_len;
-        MEMCPY(sc->sc_ac_cookie, ac_cookie, ac_cookie_len);
-      }
-      MEMCPY(&sc->sc_dest, ethhdr->src.addr, sizeof(sc->sc_dest.addr));
-      sys_untimeout(pppoe_timeout, sc);
-      sc->sc_padr_retried = 0;
-      sc->sc_state = PPPOE_STATE_PADR_SENT;
-      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));
-      }
-      sys_timeout(PPPOE_DISC_TIMEOUT * (1 + sc->sc_padr_retried), pppoe_timeout, sc);
-      break;
-    case PPPOE_CODE_PADS:
-      if (sc == NULL) {
-        goto done;
-      }
-      sc->sc_session = session;
-      sys_untimeout(pppoe_timeout, sc);
-      PPPDEBUG(LOG_DEBUG, ("pppoe: %c%c%"U16_F": session 0x%x connected\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, session));
-      sc->sc_state = PPPOE_STATE_SESSION;
-      ppp_start(sc->pcb); /* notify upper layers */
-      break;
-    case PPPOE_CODE_PADT:
-      /* Don't disconnect here, we let the LCP Echo/Reply find the fact
-       * that PPP session is down. Asking the PPP stack to end the session
-       * require strict checking about the PPP phase to prevent endless
-       * disconnection loops.
-       */
-#if 0 /* UNUSED */
-      if (sc == NULL) { /* PADT frames are rarely sent with a hunique tag, this is actually almost always true */
-        goto done;
-      }
-      pppoe_clear_softc(sc, "received PADT");
-#endif /* UNUSED */
-      break;
-    default:
-      if(sc) {
-        PPPDEBUG(LOG_DEBUG, ("%c%c%"U16_F": unknown code (0x%"X16_F") session = 0x%"X16_F"\n",
-            sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num,
-            (u16_t)ph->code, session));
-      } else {
-        PPPDEBUG(LOG_DEBUG, ("pppoe: unknown code (0x%"X16_F") session = 0x%"X16_F"\n", (u16_t)ph->code, session));
-      }
-      break;
-  }
-
-done:
-  pbuf_free(pb);
-  return;
-}
-
-void
-pppoe_data_input(struct netif *netif, struct pbuf *pb)
-{
-  u16_t session, plen;
-  struct pppoe_softc *sc;
-  struct pppoehdr *ph;
-#ifdef PPPOE_TERM_UNKNOWN_SESSIONS
-  u8_t shost[ETHER_ADDR_LEN];
-#endif
-
-#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) {
-    /* bail out */
-    PPPDEBUG(LOG_ERR, ("pppoe_data_input: pbuf_header failed\n"));
-    LINK_STATS_INC(link.lenerr);
-    goto drop;
-  } 
-
-  if (pb->len < sizeof(*ph)) {
-    PPPDEBUG(LOG_DEBUG, ("pppoe_data_input: could not get PPPoE header\n"));
-    goto drop;
-  }
-  ph = (struct pppoehdr *)pb->payload;
-
-  if (ph->vertype != PPPOE_VERTYPE) {
-    PPPDEBUG(LOG_DEBUG, ("pppoe (data): unknown version/type packet: 0x%x\n", ph->vertype));
-    goto drop;
-  }
-  if (ph->code != 0) {
-    goto drop;
-  }
-
-  session = ntohs(ph->session);
-  sc = pppoe_find_softc_by_session(session, netif);
-  if (sc == NULL) {
-#ifdef PPPOE_TERM_UNKNOWN_SESSIONS
-    PPPDEBUG(LOG_DEBUG, ("pppoe: input for unknown session 0x%x, sending PADT\n", session));
-    pppoe_send_padt(netif, session, shost);
-#endif
-    goto drop;
-  }
-
-  plen = ntohs(ph->plen);
-
-  if (pbuf_header(pb, -(s16_t)(PPPOE_HEADERLEN)) != 0) {
-    /* bail out */
-    PPPDEBUG(LOG_ERR, ("pppoe_data_input: pbuf_header PPPOE_HEADERLEN failed\n"));
-    LINK_STATS_INC(link.lenerr);
-    goto drop;
-  } 
-
-  PPPDEBUG(LOG_DEBUG, ("pppoe_data_input: %c%c%"U16_F": pkthdr.len=%d, pppoe.len=%d\n",
-        sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num,
-        pb->len, plen));
-
-  if (pb->tot_len < plen) {
-    goto drop;
-  }
-
-  /* Dispatch the packet thereby consuming it. */
-  ppp_input(sc->pcb, pb);
-  return;
-
-drop:
-  pbuf_free(pb);
-}
-
-static err_t
-pppoe_output(struct pppoe_softc *sc, struct pbuf *pb)
-{
-  struct eth_hdr *ethhdr;
-  u16_t etype;
-  err_t res;
-
-  if (!sc->sc_ethif) {
-    pbuf_free(pb);
-    return ERR_IF;
-  }
-
-  /* make room for Ethernet header - should not fail */
-  if (pbuf_header(pb, (s16_t)(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);
-    pbuf_free(pb);
-    return ERR_BUF;
-  }
-  ethhdr = (struct eth_hdr *)pb->payload;
-  etype = sc->sc_state == PPPOE_STATE_SESSION ? ETHTYPE_PPPOE : ETHTYPE_PPPOEDISC;
-  ethhdr->type = htons(etype);
-  MEMCPY(&ethhdr->dest.addr, &sc->sc_dest.addr, sizeof(ethhdr->dest.addr));
-  MEMCPY(&ethhdr->src.addr, &sc->sc_ethif->hwaddr, sizeof(ethhdr->src.addr));
-
-  PPPDEBUG(LOG_DEBUG, ("pppoe: %c%c%"U16_F" (%x) state=%d, session=0x%x output -> %02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F", len=%d\n",
-      sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, etype,
-      sc->sc_state, sc->sc_session,
-      sc->sc_dest.addr[0], sc->sc_dest.addr[1], sc->sc_dest.addr[2], sc->sc_dest.addr[3], sc->sc_dest.addr[4], sc->sc_dest.addr[5],
-      pb->tot_len));
-
-  res = sc->sc_ethif->linkoutput(sc->sc_ethif, pb);
-
-  pbuf_free(pb);
-
-  return res;
-}
-
-static err_t
-pppoe_send_padi(struct pppoe_softc *sc)
-{
-  struct pbuf *pb;
-  u8_t *p;
-  int len;
-#ifdef PPPOE_TODO
-  int l1 = 0, l2 = 0; /* XXX: gcc */
-#endif /* PPPOE_TODO */
-
-  if (sc->sc_state >PPPOE_STATE_PADI_SENT) {
-    PPPDEBUG(LOG_ERR, ("ERROR: pppoe_send_padi in state %d", sc->sc_state));
-  }
-
-  /* calculate length of frame (excluding ethernet header + pppoe header) */
-  len = 2 + 2 + 2 + 2 + sizeof sc;  /* service name tag is required, host unique is send too */
-#ifdef PPPOE_TODO
-  if (sc->sc_service_name != NULL) {
-    l1 = (int)strlen(sc->sc_service_name);
-    len += l1;
-  }
-  if (sc->sc_concentrator_name != NULL) {
-    l2 = (int)strlen(sc->sc_concentrator_name);
-    len += 2 + 2 + l2;
-  }
-#endif /* PPPOE_TODO */
-  LWIP_ASSERT("sizeof(struct eth_hdr) + PPPOE_HEADERLEN + len <= 0xffff",
-    sizeof(struct eth_hdr) + PPPOE_HEADERLEN + len <= 0xffff);
-
-  /* allocate a buffer */
-  pb = pbuf_alloc(PBUF_LINK, (u16_t)(PPPOE_HEADERLEN + len), PBUF_RAM);
-  if (!pb) {
-    return ERR_MEM;
-  }
-  LWIP_ASSERT("pb->tot_len == pb->len", pb->tot_len == pb->len);
-
-  p = (u8_t*)pb->payload;
-  /* fill in pkt */
-  PPPOE_ADD_HEADER(p, PPPOE_CODE_PADI, 0, (u16_t)len);
-  PPPOE_ADD_16(p, PPPOE_TAG_SNAME);
-#ifdef PPPOE_TODO
-  if (sc->sc_service_name != NULL) {
-    PPPOE_ADD_16(p, l1);
-    MEMCPY(p, sc->sc_service_name, l1);
-    p += l1;
-  } else
-#endif /* PPPOE_TODO */
-  {
-    PPPOE_ADD_16(p, 0);
-  }
-#ifdef PPPOE_TODO
-  if (sc->sc_concentrator_name != NULL) {
-    PPPOE_ADD_16(p, PPPOE_TAG_ACNAME);
-    PPPOE_ADD_16(p, l2);
-    MEMCPY(p, sc->sc_concentrator_name, l2);
-    p += l2;
-  }
-#endif /* PPPOE_TODO */
-  PPPOE_ADD_16(p, PPPOE_TAG_HUNIQUE);
-  PPPOE_ADD_16(p, sizeof(sc));
-  MEMCPY(p, &sc, sizeof sc);
-
-  /* send pkt */
-  return pppoe_output(sc, pb);
-}
-
-static void
-pppoe_timeout(void *arg)
-{
-  u32_t retry_wait;
-  int err;
-  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));
-
-  switch (sc->sc_state) {
-    case PPPOE_STATE_PADI_SENT:
-      /*
-       * We have two basic ways of retrying:
-       *  - Quick retry mode: try a few times in short sequence
-       *  - Slow retry mode: we already had a connection successfully
-       *    established and will try infinitely (without user
-       *    intervention)
-       * We only enter slow retry mode if IFF_LINK1 (aka autodial)
-       * is not set.
-       */
-      if (sc->sc_padi_retried < 0xff) {
-        sc->sc_padi_retried++;
-      }
-      if (!sc->pcb->settings.persist && sc->sc_padi_retried >= PPPOE_DISC_MAXPADI) {
-#if 0
-        if ((sc->sc_sppp.pp_if.if_flags & IFF_LINK1) == 0) {
-          /* slow retry mode */
-          retry_wait = PPPOE_SLOW_RETRY;
-        } else
-#endif
-        {
-          pppoe_abort_connect(sc);
-          return;
-        }
-      }
-      /* initialize for quick retry mode */
-      retry_wait = LWIP_MIN(PPPOE_DISC_TIMEOUT * sc->sc_padi_retried, PPPOE_SLOW_RETRY);
-      if ((err = pppoe_send_padi(sc)) != 0) {
-        sc->sc_padi_retried--;
-        PPPDEBUG(LOG_DEBUG, ("pppoe: %c%c%"U16_F": failed to transmit PADI, error=%d\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, err));
-      }
-      sys_timeout(retry_wait, pppoe_timeout, sc);
-      break;
-
-    case PPPOE_STATE_PADR_SENT:
-      sc->sc_padr_retried++;
-      if (sc->sc_padr_retried >= PPPOE_DISC_MAXPADR) {
-        MEMCPY(&sc->sc_dest, ethbroadcast.addr, sizeof(sc->sc_dest));
-        sc->sc_state = PPPOE_STATE_PADI_SENT;
-        sc->sc_padr_retried = 0;
-        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));
-        }
-        sys_timeout(PPPOE_DISC_TIMEOUT * (1 + sc->sc_padi_retried), pppoe_timeout, sc);
-        return;
-      }
-      if ((err = pppoe_send_padr(sc)) != 0) {
-        sc->sc_padr_retried--;
-        PPPDEBUG(LOG_DEBUG, ("pppoe: %c%c%"U16_F": failed to send PADR, error=%d\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, err));
-      }
-      sys_timeout(PPPOE_DISC_TIMEOUT * (1 + sc->sc_padr_retried), pppoe_timeout, sc);
-      break;
-    default:
-      return;  /* all done, work in peace */
-  }
-}
-
-/* Start a connection (i.e. initiate discovery phase) */
-static err_t
-pppoe_connect(ppp_pcb *ppp, void *ctx)
-{
-  int err;
-  struct pppoe_softc *sc = (struct pppoe_softc *)ctx;
-  lcp_options *lcp_wo;
-  lcp_options *lcp_ao;
-#if PPP_IPV4_SUPPORT && VJ_SUPPORT
-  ipcp_options *ipcp_wo;
-  ipcp_options *ipcp_ao;
-#endif /* PPP_IPV4_SUPPORT && VJ_SUPPORT */
-
-  if (sc->sc_state != PPPOE_STATE_INITIAL) {
-    return EBUSY;
-  }
-
-  /* stop any timer */
-  sys_untimeout(pppoe_timeout, sc);
-  sc->sc_session = 0;
-  sc->sc_padi_retried = 0;
-  sc->sc_padr_retried = 0;
-#ifdef PPPOE_SERVER
-  /* wait PADI if IFF_PASSIVE */
-  if ((sc->sc_sppp.pp_if.if_flags & IFF_PASSIVE)) {
-    return 0;
-  }
-#endif
-
-  ppp_clear(ppp);
-
-  lcp_wo = &ppp->lcp_wantoptions;
-  lcp_wo->mru = sc->sc_ethif->mtu-PPPOE_HEADERLEN-2; /* two byte PPP protocol discriminator, then IP data */
-  lcp_wo->neg_asyncmap = 0;
-  lcp_wo->neg_pcompression = 0;
-  lcp_wo->neg_accompression = 0;
-
-  lcp_ao = &ppp->lcp_allowoptions;
-  lcp_ao->mru = sc->sc_ethif->mtu-PPPOE_HEADERLEN-2; /* two byte PPP protocol discriminator, then IP data */
-  lcp_ao->neg_asyncmap = 0;
-  lcp_ao->neg_pcompression = 0;
-  lcp_ao->neg_accompression = 0;
-
-#if PPP_IPV4_SUPPORT && VJ_SUPPORT
-  ipcp_wo = &ppp->ipcp_wantoptions;
-  ipcp_wo->neg_vj = 0;
-  ipcp_wo->old_vj = 0;
-
-  ipcp_ao = &ppp->ipcp_allowoptions;
-  ipcp_ao->neg_vj = 0;
-  ipcp_ao->old_vj = 0;
-#endif /* PPP_IPV4_SUPPORT && VJ_SUPPORT */
-
-  /* save state, in case we fail to send PADI */
-  sc->sc_state = PPPOE_STATE_PADI_SENT;
-  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));
-  }
-  sys_timeout(PPPOE_DISC_TIMEOUT, pppoe_timeout, sc);
-  return err;
-}
-
-/* disconnect */
-static void
-pppoe_disconnect(ppp_pcb *ppp, void *ctx)
-{
-  struct pppoe_softc *sc = (struct pppoe_softc *)ctx;
-
-  if (sc->sc_state < PPPOE_STATE_SESSION) {
-    return;
-  }
-
-  PPPDEBUG(LOG_DEBUG, ("pppoe: %c%c%"U16_F": disconnecting\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num));
-  pppoe_send_padt(sc->sc_ethif, sc->sc_session, (const u8_t *)&sc->sc_dest);
-
-  /* cleanup softc */
-  sc->sc_state = PPPOE_STATE_INITIAL;
-  MEMCPY(&sc->sc_dest, ethbroadcast.addr, sizeof(sc->sc_dest));
-  sc->sc_ac_cookie_len = 0;
-#ifdef PPPOE_SERVER
-  if (sc->sc_hunique) {
-    mem_free(sc->sc_hunique);
-    sc->sc_hunique = NULL;
-  }
-  sc->sc_hunique_len = 0;
-#endif
-  sc->sc_session = 0;
-  sc->sc_padi_retried = 0;
-  sc->sc_padr_retried = 0;
-
-  ppp_link_end(ppp); /* notify upper layers */
-  return;
-}
-
-/* Connection attempt aborted */
-static void
-pppoe_abort_connect(struct pppoe_softc *sc)
-{
-  PPPDEBUG(LOG_DEBUG, ("%c%c%"U16_F": could not establish connection\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num));
-
-  /* clear connection state */
-  sc->sc_state = PPPOE_STATE_INITIAL;
-  MEMCPY(&sc->sc_dest, ethbroadcast.addr, sizeof(sc->sc_dest));
-  sc->sc_ac_cookie_len = 0;
-  sc->sc_session = 0;
-  sc->sc_padi_retried = 0;
-  sc->sc_padr_retried = 0;
-
-  ppp_link_failed(sc->pcb); /* notify upper layers */
-}
-
-/* Send a PADR packet */
-static err_t
-pppoe_send_padr(struct pppoe_softc *sc)
-{
-  struct pbuf *pb;
-  u8_t *p;
-  size_t len;
-#ifdef PPPOE_TODO
-  size_t l1 = 0; /* XXX: gcc */
-#endif /* PPPOE_TODO */
-
-  if (sc->sc_state != PPPOE_STATE_PADR_SENT) {
-    return ERR_CONN;
-  }
-
-  len = 2 + 2 + 2 + 2 + sizeof(sc);    /* service name, host unique */
-#ifdef PPPOE_TODO
-  if (sc->sc_service_name != NULL) {    /* service name tag maybe empty */
-    l1 = strlen(sc->sc_service_name);
-    len += l1;
-  }
-#endif /* PPPOE_TODO */
-  if (sc->sc_ac_cookie_len > 0) {
-    len += 2 + 2 + sc->sc_ac_cookie_len;  /* AC cookie */
-  }
-  LWIP_ASSERT("sizeof(struct eth_hdr) + PPPOE_HEADERLEN + len <= 0xffff",
-    sizeof(struct eth_hdr) + PPPOE_HEADERLEN + len <= 0xffff);
-  pb = pbuf_alloc(PBUF_LINK, (u16_t)(PPPOE_HEADERLEN + len), PBUF_RAM);
-  if (!pb) {
-    return ERR_MEM;
-  }
-  LWIP_ASSERT("pb->tot_len == pb->len", pb->tot_len == pb->len);
-  p = (u8_t*)pb->payload;
-  PPPOE_ADD_HEADER(p, PPPOE_CODE_PADR, 0, len);
-  PPPOE_ADD_16(p, PPPOE_TAG_SNAME);
-#ifdef PPPOE_TODO
-  if (sc->sc_service_name != NULL) {
-    PPPOE_ADD_16(p, l1);
-    MEMCPY(p, sc->sc_service_name, l1);
-    p += l1;
-  } else
-#endif /* PPPOE_TODO */
-  {
-    PPPOE_ADD_16(p, 0);
-  }
-  if (sc->sc_ac_cookie_len > 0) {
-    PPPOE_ADD_16(p, PPPOE_TAG_ACCOOKIE);
-    PPPOE_ADD_16(p, sc->sc_ac_cookie_len);
-    MEMCPY(p, sc->sc_ac_cookie, sc->sc_ac_cookie_len);
-    p += sc->sc_ac_cookie_len;
-  }
-  PPPOE_ADD_16(p, PPPOE_TAG_HUNIQUE);
-  PPPOE_ADD_16(p, sizeof(sc));
-  MEMCPY(p, &sc, sizeof sc);
-
-  return pppoe_output(sc, pb);
-}
-
-/* send a PADT packet */
-static err_t
-pppoe_send_padt(struct netif *outgoing_if, u_int session, const u8_t *dest)
-{
-  struct pbuf *pb;
-  struct eth_hdr *ethhdr;
-  err_t res;
-  u8_t *p;
-
-  pb = pbuf_alloc(PBUF_LINK, (u16_t)(PPPOE_HEADERLEN), PBUF_RAM);
-  if (!pb) {
-    return ERR_MEM;
-  }
-  LWIP_ASSERT("pb->tot_len == pb->len", pb->tot_len == pb->len);
-
-  pbuf_header(pb, (s16_t)sizeof(struct eth_hdr));
-  ethhdr = (struct eth_hdr *)pb->payload;
-  ethhdr->type = PP_HTONS(ETHTYPE_PPPOEDISC);
-  MEMCPY(&ethhdr->dest.addr, dest, sizeof(ethhdr->dest.addr));
-  MEMCPY(&ethhdr->src.addr, &outgoing_if->hwaddr, sizeof(ethhdr->src.addr));
-
-  p = (u8_t*)(ethhdr + 1);
-  PPPOE_ADD_HEADER(p, PPPOE_CODE_PADT, session, 0);
-
-  res = outgoing_if->linkoutput(outgoing_if, pb);
-
-  pbuf_free(pb);
-
-  return res;
-}
-
-#ifdef PPPOE_SERVER
-static err_t
-pppoe_send_pado(struct pppoe_softc *sc)
-{
-  struct pbuf *pb;
-  u8_t *p;
-  size_t len;
-
-  if (sc->sc_state != PPPOE_STATE_PADO_SENT) {
-    return ERR_CONN;
-  }
-
-  /* calc length */
-  len = 0;
-  /* include ac_cookie */
-  len += 2 + 2 + sizeof(sc);
-  /* include hunique */
-  len += 2 + 2 + sc->sc_hunique_len;
-  pb = pbuf_alloc(PBUF_LINK, (u16_t)(PPPOE_HEADERLEN + len), PBUF_RAM);
-  if (!pb) {
-    return ERR_MEM;
-  }
-  LWIP_ASSERT("pb->tot_len == pb->len", pb->tot_len == pb->len);
-  p = (u8_t*)pb->payload;
-  PPPOE_ADD_HEADER(p, PPPOE_CODE_PADO, 0, len);
-  PPPOE_ADD_16(p, PPPOE_TAG_ACCOOKIE);
-  PPPOE_ADD_16(p, sizeof(sc));
-  MEMCPY(p, &sc, sizeof(sc));
-  p += sizeof(sc);
-  PPPOE_ADD_16(p, PPPOE_TAG_HUNIQUE);
-  PPPOE_ADD_16(p, sc->sc_hunique_len);
-  MEMCPY(p, sc->sc_hunique, sc->sc_hunique_len);
-  return pppoe_output(sc, pb);
-}
-
-static err_t
-pppoe_send_pads(struct pppoe_softc *sc)
-{
-  struct pbuf *pb;
-  u8_t *p;
-  size_t len, l1 = 0;  /* XXX: gcc */
-
-  if (sc->sc_state != PPPOE_STATE_PADO_SENT) {
-    return ERR_CONN;
-  }
-
-  sc->sc_session = mono_time.tv_sec % 0xff + 1;
-  /* calc length */
-  len = 0;
-  /* include hunique */
-  len += 2 + 2 + 2 + 2 + sc->sc_hunique_len;  /* service name, host unique*/
-  if (sc->sc_service_name != NULL) {    /* service name tag maybe empty */
-    l1 = strlen(sc->sc_service_name);
-    len += l1;
-  }
-  pb = pbuf_alloc(PBUF_LINK, (u16_t)(PPPOE_HEADERLEN + len), PBUF_RAM);
-  if (!pb) {
-    return ERR_MEM;
-  }
-  LWIP_ASSERT("pb->tot_len == pb->len", pb->tot_len == pb->len);
-  p = (u8_t*)pb->payload;
-  PPPOE_ADD_HEADER(p, PPPOE_CODE_PADS, sc->sc_session, len);
-  PPPOE_ADD_16(p, PPPOE_TAG_SNAME);
-  if (sc->sc_service_name != NULL) {
-    PPPOE_ADD_16(p, l1);
-    MEMCPY(p, sc->sc_service_name, l1);
-    p += l1;
-  } else {
-    PPPOE_ADD_16(p, 0);
-  }
-  PPPOE_ADD_16(p, PPPOE_TAG_HUNIQUE);
-  PPPOE_ADD_16(p, sc->sc_hunique_len);
-  MEMCPY(p, sc->sc_hunique, sc->sc_hunique_len);
-  return pppoe_output(sc, pb);
-}
-#endif
-
-static err_t
-pppoe_xmit(struct pppoe_softc *sc, struct pbuf *pb)
-{
-  u8_t *p;
-  size_t len;
-
-  /* are we ready to process data yet? */
-  if (sc->sc_state < PPPOE_STATE_SESSION) {
-    /*sppp_flush(&sc->sc_sppp.pp_if);*/
-    pbuf_free(pb);
-    return ERR_CONN;
-  }
-
-  len = pb->tot_len;
-
-  /* make room for PPPoE header - should not fail */
-  if (pbuf_header(pb, (s16_t)(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);
-    pbuf_free(pb);
-    return ERR_BUF;
-  }
-
-  p = (u8_t*)pb->payload;
-  PPPOE_ADD_HEADER(p, 0, sc->sc_session, len);
-
-  return pppoe_output(sc, pb);
-}
-
-#if 0 /*def PFIL_HOOKS*/
-static int
-pppoe_ifattach_hook(void *arg, struct pbuf **mp, struct netif *ifp, int dir)
-{
-  struct pppoe_softc *sc;
-  int s;
-
-  if (mp != (struct pbuf **)PFIL_IFNET_DETACH) {
-    return 0;
-  }
-
-  LIST_FOREACH(sc, &pppoe_softc_list, sc_list) {
-    if (sc->sc_ethif != ifp) {
-      continue;
-    }
-    if (sc->sc_sppp.pp_if.if_flags & IFF_UP) {
-      sc->sc_sppp.pp_if.if_flags &= ~(IFF_UP|IFF_RUNNING);
-      PPPDEBUG(LOG_DEBUG, ("%c%c%"U16_F": ethernet interface detached, going down\n",
-          sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num));
-    }
-    sc->sc_ethif = NULL;
-    pppoe_clear_softc(sc, "ethernet interface detached");
-  }
-
-  return 0;
-}
-#endif
-
-#if 0 /* UNUSED */
-static void
-pppoe_clear_softc(struct pppoe_softc *sc, const char *message)
-{
-  LWIP_UNUSED_ARG(message);
-
-  /* stop timer */
-  sys_untimeout(pppoe_timeout, sc);
-  PPPDEBUG(LOG_DEBUG, ("pppoe: %c%c%"U16_F": session 0x%x terminated, %s\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, sc->sc_session, message));
-  /* fix our state */
-  sc->sc_state = PPPOE_STATE_INITIAL;
-
-  /* notify upper layers */
-  ppp_link_end(sc->pcb);  /* /!\ dangerous /!\ */
-
-  /* clean up softc */
-  MEMCPY(&sc->sc_dest, ethbroadcast.addr, sizeof(sc->sc_dest));
-  sc->sc_ac_cookie_len = 0;
-  sc->sc_session = 0;
-  sc->sc_padi_retried = 0;
-  sc->sc_padr_retried = 0;
-}
-#endif /* UNUSED */
-#endif /* PPP_SUPPORT && PPPOE_SUPPORT */
diff --git a/components/lwip/netif/ppp/pppol2tp.c b/components/lwip/netif/ppp/pppol2tp.c
deleted file mode 100644 (file)
index 99b4e5f..0000000
+++ /dev/null
@@ -1,1151 +0,0 @@
-/**
- * @file
- * Network Point to Point Protocol over Layer 2 Tunneling Protocol program file.
- *
- */
-
-/*
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- */
-
-/*
- * L2TP Support status:
- *
- * Supported:
- * - L2TPv2 (PPP over L2TP, a.k.a. UDP tunnels)
- * - LAC
- *
- * Not supported:
- * - LNS (require PPP server support)
- * - L2TPv3 ethernet pseudowires
- * - L2TPv3 VLAN pseudowire
- * - L2TPv3 PPP pseudowires
- * - L2TPv3 IP encapsulation
- * - L2TPv3 IP pseudowire
- * - L2TP tunnel switching - http://tools.ietf.org/html/draft-ietf-l2tpext-tunnel-switching-08
- * - Multiple tunnels per UDP socket, as well as multiple sessions per tunnel
- * - Hidden AVPs
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && PPPOL2TP_SUPPORT /* don't build if not configured for use in lwipopts.h */
-
-#include "lwip/err.h"
-#include "lwip/memp.h"
-#include "lwip/netif.h"
-#include "lwip/udp.h"
-#include "lwip/snmp.h"
-
-#include "netif/ppp/ppp_impl.h"
-#include "netif/ppp/lcp.h"
-#include "netif/ppp/ipcp.h"
-#include "netif/ppp/pppol2tp.h"
-
-#include "netif/ppp/magic.h"
-
-#if PPPOL2TP_AUTH_SUPPORT
-#if LWIP_INCLUDED_POLARSSL_MD5
-#include "netif/ppp/polarssl/md5.h"
-#else
-#include "polarssl/md5.h"
-#endif
-#endif /* PPPOL2TP_AUTH_SUPPORT */
-
-/* callbacks called from PPP core */
-static err_t pppol2tp_write(ppp_pcb *ppp, void *ctx, struct pbuf *p);
-static err_t pppol2tp_netif_output(ppp_pcb *ppp, void *ctx, struct pbuf *p, u_short protocol);
-static err_t pppol2tp_destroy(ppp_pcb *ppp, void *ctx);    /* Destroy a L2TP control block */
-static err_t pppol2tp_connect(ppp_pcb *ppp, void *ctx);    /* Be a LAC, connect to a LNS. */
-static void pppol2tp_disconnect(ppp_pcb *ppp, void *ctx);  /* Disconnect */
-
- /* Prototypes for procedures local to this file. */
-static void pppol2tp_input(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port);
-static void pppol2tp_dispatch_control_packet(pppol2tp_pcb *l2tp, u16_t port, struct pbuf *p, u16_t ns, u16_t nr);
-static void pppol2tp_timeout(void *arg);
-static void pppol2tp_abort_connect(pppol2tp_pcb *l2tp);
-static void pppol2tp_clear(pppol2tp_pcb *l2tp);
-static err_t pppol2tp_send_sccrq(pppol2tp_pcb *l2tp);
-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_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);
-
-/* Callbacks structure for PPP core */
-static const struct link_callbacks pppol2tp_callbacks = {
-  pppol2tp_connect,
-#if PPP_SERVER
-  NULL,
-#endif /* PPP_SERVER */
-  pppol2tp_disconnect,
-  pppol2tp_destroy,
-  pppol2tp_write,
-  pppol2tp_netif_output,
-  NULL,
-  NULL
-};
-
-
-/* Create a new L2TP session. */
-ppp_pcb *pppol2tp_create(struct netif *pppif,
-       struct netif *netif, ip_addr_t *ipaddr, u16_t port,
-       const u8_t *secret, u8_t secret_len,
-       ppp_link_status_cb_fn link_status_cb, void *ctx_cb) {
-  ppp_pcb *ppp;
-  pppol2tp_pcb *l2tp;
-  struct udp_pcb *udp;
-
-  if (ipaddr == NULL) {
-    goto ipaddr_check_failed;
-  }
-
-  l2tp = (pppol2tp_pcb *)memp_malloc(MEMP_PPPOL2TP_PCB);
-  if (l2tp == NULL) {
-    goto memp_malloc_l2tp_failed;
-  }
-
-  udp = udp_new_ip_type(IP_GET_TYPE(ipaddr));
-  if (udp == NULL) {
-    goto udp_new_failed;
-  }
-  udp_recv(udp, pppol2tp_input, l2tp);
-
-  ppp = ppp_new(pppif, &pppol2tp_callbacks, l2tp, link_status_cb, ctx_cb);
-  if (ppp == NULL) {
-    goto ppp_new_failed;
-  }
-
-  memset(l2tp, 0, sizeof(pppol2tp_pcb));
-  l2tp->phase = PPPOL2TP_STATE_INITIAL;
-  l2tp->ppp = ppp;
-  l2tp->udp = udp;
-  l2tp->netif = netif;
-  ip_addr_copy(l2tp->remote_ip, *ipaddr);
-  l2tp->remote_port = port;
-#if PPPOL2TP_AUTH_SUPPORT
-  l2tp->secret = secret;
-  l2tp->secret_len = secret_len;
-#endif /* PPPOL2TP_AUTH_SUPPORT */
-
-  return ppp;
-
-ppp_new_failed:
-  udp_remove(udp);
-udp_new_failed:
-  memp_free(MEMP_PPPOL2TP_PCB, l2tp);
-memp_malloc_l2tp_failed:
-ipaddr_check_failed:
-  return NULL;
-}
-
-/* Called by PPP core */
-static err_t pppol2tp_write(ppp_pcb *ppp, void *ctx, struct pbuf *p) {
-  pppol2tp_pcb *l2tp = (pppol2tp_pcb *)ctx;
-  struct pbuf *ph; /* UDP + L2TP header */
-  err_t ret;
-#if MIB2_STATS
-  u16_t tot_len;
-#else /* MIB2_STATS */
-  LWIP_UNUSED_ARG(ppp);
-#endif /* MIB2_STATS */
-
-  ph = pbuf_alloc(PBUF_TRANSPORT, (u16_t)(PPPOL2TP_OUTPUT_DATA_HEADER_LEN), PBUF_RAM);
-  if(!ph) {
-    LINK_STATS_INC(link.memerr);
-    LINK_STATS_INC(link.proterr);
-    MIB2_STATS_NETIF_INC(ppp->netif, ifoutdiscards);
-    pbuf_free(p);
-    return ERR_MEM;
-  }
-
-  pbuf_header(ph, -(s16_t)PPPOL2TP_OUTPUT_DATA_HEADER_LEN); /* hide L2TP header */
-  pbuf_cat(ph, p);
-#if MIB2_STATS
-  tot_len = ph->tot_len;
-#endif /* MIB2_STATS */
-
-  ret = pppol2tp_xmit(l2tp, ph);
-  if (ret != ERR_OK) {
-    LINK_STATS_INC(link.err);
-    MIB2_STATS_NETIF_INC(ppp->netif, ifoutdiscards);
-    return ret;
-  }
-
-  MIB2_STATS_NETIF_ADD(ppp->netif, ifoutoctets, (u16_t)tot_len);
-  MIB2_STATS_NETIF_INC(ppp->netif, ifoutucastpkts);
-  LINK_STATS_INC(link.xmit);
-  return ERR_OK;
-}
-
-/* Called by PPP core */
-static err_t pppol2tp_netif_output(ppp_pcb *ppp, void *ctx, struct pbuf *p, u_short protocol) {
-  pppol2tp_pcb *l2tp = (pppol2tp_pcb *)ctx;
-  struct pbuf *pb;
-  u8_t *pl;
-  err_t err;
-#if MIB2_STATS
-  u16_t tot_len;
-#else /* MIB2_STATS */
-  LWIP_UNUSED_ARG(ppp);
-#endif /* MIB2_STATS */
-
-  /* @todo: try to use pbuf_header() here! */
-  pb = pbuf_alloc(PBUF_TRANSPORT, PPPOL2TP_OUTPUT_DATA_HEADER_LEN + sizeof(protocol), PBUF_RAM);
-  if(!pb) {
-    LINK_STATS_INC(link.memerr);
-    LINK_STATS_INC(link.proterr);
-    MIB2_STATS_NETIF_INC(ppp->netif, ifoutdiscards);
-    return ERR_MEM;
-  }
-
-  pbuf_header(pb, -(s16_t)PPPOL2TP_OUTPUT_DATA_HEADER_LEN);
-
-  pl = (u8_t*)pb->payload;
-  PUTSHORT(protocol, pl);
-
-  pbuf_chain(pb, p);
-#if MIB2_STATS
-  tot_len = pb->tot_len;
-#endif /* MIB2_STATS */
-
-  if( (err = pppol2tp_xmit(l2tp, pb)) != ERR_OK) {
-    LINK_STATS_INC(link.err);
-    MIB2_STATS_NETIF_INC(ppp->netif, ifoutdiscards);
-    return err;
-  }
-
-  MIB2_STATS_NETIF_ADD(ppp->netif, ifoutoctets, tot_len);
-  MIB2_STATS_NETIF_INC(ppp->netif, ifoutucastpkts);
-  LINK_STATS_INC(link.xmit);
-  return ERR_OK;
-}
-
-/* Destroy a L2TP control block */
-static err_t pppol2tp_destroy(ppp_pcb *ppp, void *ctx) {
-  pppol2tp_pcb *l2tp = (pppol2tp_pcb *)ctx;
-  LWIP_UNUSED_ARG(ppp);
-
-  sys_untimeout(pppol2tp_timeout, l2tp);
-  if (l2tp->udp != NULL) {
-    udp_remove(l2tp->udp);
-  }
-  memp_free(MEMP_PPPOL2TP_PCB, l2tp);
-  return ERR_OK;
-}
-
-/* Be a LAC, connect to a LNS. */
-static err_t pppol2tp_connect(ppp_pcb *ppp, void *ctx) {
-  err_t err;
-  pppol2tp_pcb *l2tp = (pppol2tp_pcb *)ctx;
-  lcp_options *lcp_wo;
-  lcp_options *lcp_ao;
-#if PPP_IPV4_SUPPORT && VJ_SUPPORT
-  ipcp_options *ipcp_wo;
-  ipcp_options *ipcp_ao;
-#endif /* PPP_IPV4_SUPPORT && VJ_SUPPORT */
-
-  if (l2tp->phase != PPPOL2TP_STATE_INITIAL) {
-    return ERR_VAL;
-  }
-
-  pppol2tp_clear(l2tp);
-
-  ppp_clear(ppp);
-
-  lcp_wo = &ppp->lcp_wantoptions;
-  lcp_wo->mru = PPPOL2TP_DEFMRU;
-  lcp_wo->neg_asyncmap = 0;
-  lcp_wo->neg_pcompression = 0;
-  lcp_wo->neg_accompression = 0;
-
-  lcp_ao = &ppp->lcp_allowoptions;
-  lcp_ao->mru = PPPOL2TP_DEFMRU;
-  lcp_ao->neg_asyncmap = 0;
-  lcp_ao->neg_pcompression = 0;
-  lcp_ao->neg_accompression = 0;
-
-#if PPP_IPV4_SUPPORT && VJ_SUPPORT
-  ipcp_wo = &ppp->ipcp_wantoptions;
-  ipcp_wo->neg_vj = 0;
-  ipcp_wo->old_vj = 0;
-
-  ipcp_ao = &ppp->ipcp_allowoptions;
-  ipcp_ao->neg_vj = 0;
-  ipcp_ao->old_vj = 0;
-#endif /* PPP_IPV4_SUPPORT && VJ_SUPPORT */
-
-  /* Listen to a random source port, we need to do that instead of using udp_connect()
-   * because the L2TP LNS might answer with its own random source port (!= 1701)
-   */
-#if LWIP_IPV6
-  if (IP_IS_V6_VAL(l2tp->udp->local_ip)) {
-    udp_bind(l2tp->udp, IP6_ADDR_ANY, 0);
-  } else
-#endif /* LWIP_IPV6 */
-  udp_bind(l2tp->udp, IP_ADDR_ANY, 0);
-
-#if PPPOL2TP_AUTH_SUPPORT
-  /* Generate random vector */
-  if (l2tp->secret != NULL) {
-    magic_random_bytes(l2tp->secret_rv, sizeof(l2tp->secret_rv));
-  }
-#endif /* PPPOL2TP_AUTH_SUPPORT */
-
-  do {
-    l2tp->remote_tunnel_id = magic();
-  } while(l2tp->remote_tunnel_id == 0);
-  /* save state, in case we fail to send SCCRQ */
-  l2tp->sccrq_retried = 0;
-  l2tp->phase = PPPOL2TP_STATE_SCCRQ_SENT;
-  if ((err = pppol2tp_send_sccrq(l2tp)) != 0) {
-    PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send SCCRQ, error=%d\n", err));
-  }
-  sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
-  return err;
-}
-
-/* Disconnect */
-static void pppol2tp_disconnect(ppp_pcb *ppp, void *ctx) {
-  pppol2tp_pcb *l2tp = (pppol2tp_pcb *)ctx;
-
-  if (l2tp->phase < PPPOL2TP_STATE_DATA) {
-    return;
-  }
-
-  l2tp->our_ns++;
-  pppol2tp_send_stopccn(l2tp, l2tp->our_ns);
-
-  pppol2tp_clear(l2tp);
-  ppp_link_end(ppp); /* notify upper layers */
-}
-
-/* UDP Callback for incoming IPv4 L2TP frames */
-static void pppol2tp_input(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port) {
-  pppol2tp_pcb *l2tp = (pppol2tp_pcb*)arg;
-  u16_t hflags, hlen, len=0, tunnel_id=0, session_id=0, ns=0, nr=0, offset=0;
-  u8_t *inp;
-  LWIP_UNUSED_ARG(pcb);
-
-  if (l2tp->phase < PPPOL2TP_STATE_SCCRQ_SENT) {
-    goto free_and_return;
-  }
-
-  if (!ip_addr_cmp(&l2tp->remote_ip, addr)) {
-    goto free_and_return;
-  }
-
-  /* discard packet if port mismatch, but only if we received a SCCRP */
-  if (l2tp->phase > PPPOL2TP_STATE_SCCRQ_SENT && l2tp->tunnel_port != port) {
-    goto free_and_return;
-  }
-
-  /* printf("-----------\nL2TP INPUT, %d\n", p->len); */
-
-  /* L2TP header */
-  if (p->len < sizeof(hflags) + sizeof(tunnel_id) + sizeof(session_id) ) {
-    goto packet_too_short;
-  }
-
-  inp = (u8_t*)p->payload;
-  GETSHORT(hflags, inp);
-
-  if (hflags & PPPOL2TP_HEADERFLAG_CONTROL) {
-    /* check mandatory flags for a control packet */
-    if ( (hflags & PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY) != PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY ) {
-      PPPDEBUG(LOG_DEBUG, ("pppol2tp: mandatory header flags for control packet not set\n"));
-      goto free_and_return;
-    }
-    /* check forbidden flags for a control packet */
-    if (hflags & PPPOL2TP_HEADERFLAG_CONTROL_FORBIDDEN) {
-      PPPDEBUG(LOG_DEBUG, ("pppol2tp: forbidden header flags for control packet found\n"));
-      goto free_and_return;
-    }
-  } else {
-    /* check mandatory flags for a data packet */
-    if ( (hflags & PPPOL2TP_HEADERFLAG_DATA_MANDATORY) != PPPOL2TP_HEADERFLAG_DATA_MANDATORY) {
-      PPPDEBUG(LOG_DEBUG, ("pppol2tp: mandatory header flags for data packet not set\n"));
-      goto free_and_return;
-    }
-  }
-
-  /* Expected header size  */
-  hlen = sizeof(hflags) + sizeof(tunnel_id) + sizeof(session_id);
-  if (hflags & PPPOL2TP_HEADERFLAG_LENGTH) {
-    hlen += sizeof(len);
-  }
-  if (hflags & PPPOL2TP_HEADERFLAG_SEQUENCE) {
-    hlen += sizeof(ns) + sizeof(nr);
-  }
-  if (hflags & PPPOL2TP_HEADERFLAG_OFFSET) {
-    hlen += sizeof(offset);
-  }
-  if (p->len < hlen) {
-    goto packet_too_short;
-  }
-
-  if (hflags & PPPOL2TP_HEADERFLAG_LENGTH) {
-    GETSHORT(len, inp);
-    if (p->len < len || len < hlen) {
-      goto packet_too_short;
-    }
-  }
-  GETSHORT(tunnel_id, inp);
-  GETSHORT(session_id, inp);
-  if (hflags & PPPOL2TP_HEADERFLAG_SEQUENCE) {
-    GETSHORT(ns, inp);
-    GETSHORT(nr, inp);
-  }
-  if (hflags & PPPOL2TP_HEADERFLAG_OFFSET) {
-    GETSHORT(offset, inp)
-    if (offset > 4096) { /* don't be fooled with large offset which might overflow hlen */
-      PPPDEBUG(LOG_DEBUG, ("pppol2tp: strange packet received, offset=%d\n", offset));
-      goto free_and_return;
-    }
-    hlen += offset;
-    if (p->len < hlen) {
-      goto packet_too_short;
-    }
-    INCPTR(offset, inp);
-  }
-
-  /* printf("HLEN = %d\n", hlen); */
-
-  /* skip L2TP header */
-  if (pbuf_header(p, -(s16_t)hlen) != 0) {
-    goto free_and_return;
-  }
-
-  /* printf("LEN=%d, TUNNEL_ID=%d, SESSION_ID=%d, NS=%d, NR=%d, OFFSET=%d\n", len, tunnel_id, session_id, ns, nr, offset); */
-  PPPDEBUG(LOG_DEBUG, ("pppol2tp: input packet, len=%"U16_F", tunnel=%"U16_F", session=%"U16_F", ns=%"U16_F", nr=%"U16_F"\n",
-    len, tunnel_id, session_id, ns, nr));
-
-  /* Control packet */
-  if (hflags & PPPOL2TP_HEADERFLAG_CONTROL) {
-    pppol2tp_dispatch_control_packet(l2tp, port, p, ns, nr);
-    goto free_and_return;
-  }
-
-  /* Data packet */
-  if(l2tp->phase != PPPOL2TP_STATE_DATA) {
-    goto free_and_return;
-  }
-  if(tunnel_id != l2tp->remote_tunnel_id) {
-     PPPDEBUG(LOG_DEBUG, ("pppol2tp: tunnel ID mismatch, assigned=%d, received=%d\n", l2tp->remote_tunnel_id, tunnel_id));
-     goto free_and_return;
-  }
-  if(session_id != l2tp->remote_session_id) {
-     PPPDEBUG(LOG_DEBUG, ("pppol2tp: session ID mismatch, assigned=%d, received=%d\n", l2tp->remote_session_id, session_id));
-     goto free_and_return;
-  }
-  /*
-   * skip address & flags if necessary
-   *
-   * RFC 2661 does not specify whether the PPP frame in the L2TP payload should
-   * have a HDLC header or not. We handle both cases for compatibility.
-   */
-  if (p->len >= 2) {
-    GETSHORT(hflags, inp);
-    if (hflags == 0xff03) {
-      pbuf_header(p, -(s16_t)2);
-    }
-  }
-  /* Dispatch the packet thereby consuming it. */
-  ppp_input(l2tp->ppp, p);
-  return;
-
-packet_too_short:
-  PPPDEBUG(LOG_DEBUG, ("pppol2tp: packet too short: %d\n", p->len));
-free_and_return:
-  pbuf_free(p);
-}
-
-/* L2TP Control packet entry point */
-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;
-  err_t err;
-#if PPPOL2TP_AUTH_SUPPORT
-  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); */
-
-  /* Handle the special case of the ICCN acknowledge */
-  if (l2tp->phase == PPPOL2TP_STATE_ICCN_SENT && l2tp->peer_nr > l2tp->our_ns) {
-    l2tp->phase = PPPOL2TP_STATE_DATA;
-  }
-
-  /* ZLB packets */
-  if (p->tot_len == 0) {
-    return;
-  }
-
-  p = ppp_singlebuf(p);
-  inp = (u8_t*)p->payload;
-  /* Decode AVPs */
-  while (p->len > 0) {
-    if (p->len < sizeof(avpflags) + sizeof(vendorid) + sizeof(attributetype) ) {
-      goto packet_too_short;
-    }
-    GETSHORT(avpflags, inp);
-    avplen = avpflags & PPPOL2TP_AVPHEADERFLAG_LENGTHMASK;
-    /* printf("AVPLEN = %d\n", avplen); */
-    if (p->len < avplen || avplen < sizeof(avpflags) + sizeof(vendorid) + sizeof(attributetype)) {
-      goto packet_too_short;
-    }
-    GETSHORT(vendorid, inp);
-    GETSHORT(attributetype, inp);
-    avplen -= sizeof(avpflags) + sizeof(vendorid) + sizeof(attributetype);
-
-    /* Message type must be the first AVP */
-    if (messagetype == 0) {
-      if (attributetype != 0 || vendorid != 0 || avplen != sizeof(messagetype) ) {
-        PPPDEBUG(LOG_DEBUG, ("pppol2tp: message type must be the first AVP\n"));
-        return;
-      }
-      GETSHORT(messagetype, inp);
-      /* printf("Message type = %d\n", messagetype); */
-      switch(messagetype) {
-        /* Start Control Connection Reply */
-        case PPPOL2TP_MESSAGETYPE_SCCRP:
-          /* Only accept SCCRP packet if we sent a SCCRQ */
-          if (l2tp->phase != PPPOL2TP_STATE_SCCRQ_SENT) {
-            goto send_zlb;
-          }
-          break;
-        /* Incoming Call Reply */
-        case PPPOL2TP_MESSAGETYPE_ICRP:
-          /* Only accept ICRP packet if we sent a IRCQ */
-          if (l2tp->phase != PPPOL2TP_STATE_ICRQ_SENT) {
-            goto send_zlb;
-          }
-          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 */
-          if (l2tp->phase < PPPOL2TP_STATE_DATA) {
-            pppol2tp_abort_connect(l2tp);
-          } else if (l2tp->phase == PPPOL2TP_STATE_DATA) {
-            /* Don't disconnect here, we let the LCP Echo/Reply find the fact
-             * that PPP session is down. Asking the PPP stack to end the session
-             * require strict checking about the PPP phase to prevent endless
-             * disconnection loops.
-             */
-          }
-          return;
-        default:
-          break;
-      }
-      goto nextavp;
-    }
-
-    /* Skip proprietary L2TP extensions */
-    if (vendorid != 0) {
-      goto skipavp;
-    }
-
-    switch (messagetype) {
-      /* Start Control Connection Reply */
-      case PPPOL2TP_MESSAGETYPE_SCCRP:
-       switch (attributetype) {
-          case PPPOL2TP_AVPTYPE_TUNNELID:
-            if (avplen != sizeof(l2tp->source_tunnel_id) ) {
-               PPPDEBUG(LOG_DEBUG, ("pppol2tp: AVP Assign tunnel ID length check failed\n"));
-               return;
-            }
-            GETSHORT(l2tp->source_tunnel_id, inp);
-            PPPDEBUG(LOG_DEBUG, ("pppol2tp: Assigned tunnel ID %"U16_F"\n", l2tp->source_tunnel_id));
-            goto nextavp;
-#if PPPOL2TP_AUTH_SUPPORT
-          case PPPOL2TP_AVPTYPE_CHALLENGE:
-            if (avplen == 0) {
-               PPPDEBUG(LOG_DEBUG, ("pppol2tp: Challenge length check failed\n"));
-               return;
-            }
-            if (l2tp->secret == NULL) {
-              PPPDEBUG(LOG_DEBUG, ("pppol2tp: Received challenge from peer and no secret key available\n"));
-              pppol2tp_abort_connect(l2tp);
-              return;
-            }
-            /* Generate hash of ID, secret, challenge */
-            md5_starts(&md5_ctx);
-            challenge_id = PPPOL2TP_MESSAGETYPE_SCCCN;
-            md5_update(&md5_ctx, &challenge_id, 1);
-            md5_update(&md5_ctx, l2tp->secret, l2tp->secret_len);
-            md5_update(&md5_ctx, inp, avplen);
-            md5_finish(&md5_ctx, l2tp->challenge_hash);
-            l2tp->send_challenge = 1;
-            goto skipavp;
-          case PPPOL2TP_AVPTYPE_CHALLENGERESPONSE:
-            if (avplen != PPPOL2TP_AVPTYPE_CHALLENGERESPONSE_SIZE) {
-               PPPDEBUG(LOG_DEBUG, ("pppol2tp: AVP Challenge Response length check failed\n"));
-               return;
-            }
-            /* Generate hash of ID, secret, challenge */
-            md5_starts(&md5_ctx);
-            challenge_id = PPPOL2TP_MESSAGETYPE_SCCRP;
-            md5_update(&md5_ctx, &challenge_id, 1);
-            md5_update(&md5_ctx, l2tp->secret, l2tp->secret_len);
-            md5_update(&md5_ctx, l2tp->secret_rv, sizeof(l2tp->secret_rv));
-            md5_finish(&md5_ctx, md5_hash);
-            if ( memcmp(inp, md5_hash, sizeof(md5_hash)) ) {
-              PPPDEBUG(LOG_DEBUG, ("pppol2tp: Received challenge response from peer and secret key do not match\n"));
-              pppol2tp_abort_connect(l2tp);
-              return;
-            }
-            goto skipavp;
-#endif /* PPPOL2TP_AUTH_SUPPORT */
-          default:
-            break;
-        }
-        break;
-      /* Incoming Call Reply */
-      case PPPOL2TP_MESSAGETYPE_ICRP:
-        switch (attributetype) {
-         case PPPOL2TP_AVPTYPE_SESSIONID:
-            if (avplen != sizeof(l2tp->source_session_id) ) {
-               PPPDEBUG(LOG_DEBUG, ("pppol2tp: AVP Assign session ID length check failed\n"));
-               return;
-            }
-            GETSHORT(l2tp->source_session_id, inp);
-            PPPDEBUG(LOG_DEBUG, ("pppol2tp: Assigned session ID %"U16_F"\n", l2tp->source_session_id));
-            goto nextavp;
-          default:
-            break;
-        }
-        break;
-      default:
-        break;
-    }
-
-skipavp:
-    INCPTR(avplen, inp);
-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) {
-      return;
-    }
-  }
-
-  switch(messagetype) {
-    /* Start Control Connection Reply */
-    case PPPOL2TP_MESSAGETYPE_SCCRP:
-      do {
-        l2tp->remote_session_id = magic();
-      } while(l2tp->remote_session_id == 0);
-      l2tp->tunnel_port = port; /* LNS server might have chosen its own local port */
-      l2tp->icrq_retried = 0;
-      l2tp->phase = PPPOL2TP_STATE_ICRQ_SENT;
-      l2tp->our_ns++;
-      if ((err = pppol2tp_send_scccn(l2tp, l2tp->our_ns)) != 0) {
-        PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send SCCCN, error=%d\n", err));
-      }
-      l2tp->our_ns++;
-      if ((err = pppol2tp_send_icrq(l2tp, l2tp->our_ns)) != 0) {
-        PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send ICRQ, error=%d\n", err));
-      }
-      sys_untimeout(pppol2tp_timeout, l2tp);
-      sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
-      break;
-    /* Incoming Call Reply */
-    case PPPOL2TP_MESSAGETYPE_ICRP:
-      l2tp->iccn_retried = 0;
-      l2tp->phase = PPPOL2TP_STATE_ICCN_SENT;
-      l2tp->our_ns++;
-      ppp_start(l2tp->ppp); /* notify upper layers */
-      if ((err = pppol2tp_send_iccn(l2tp, l2tp->our_ns)) != 0) {
-        PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send ICCN, error=%d\n", err));
-      }
-      sys_untimeout(pppol2tp_timeout, l2tp);
-      sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
-      break;
-    /* Unhandled packet, send ZLB ACK */
-    default:
-      goto send_zlb;
-  }
-  return;
-
-send_zlb:
-  pppol2tp_send_zlb(l2tp, l2tp->our_ns);
-  return;
-packet_too_short:
-  PPPDEBUG(LOG_DEBUG, ("pppol2tp: packet too short: %d\n", p->len));
-}
-
-/* L2TP Timeout handler */
-static void pppol2tp_timeout(void *arg) {
-  pppol2tp_pcb *l2tp = (pppol2tp_pcb*)arg;
-  err_t err;
-  u32_t retry_wait;
-
-  PPPDEBUG(LOG_DEBUG, ("pppol2tp: timeout\n"));
-
-  switch (l2tp->phase) {
-    case PPPOL2TP_STATE_SCCRQ_SENT:
-      /* backoff wait */
-      if (l2tp->sccrq_retried < 0xff) {
-        l2tp->sccrq_retried++;
-      }
-      if (!l2tp->ppp->settings.persist && l2tp->sccrq_retried >= PPPOL2TP_MAXSCCRQ) {
-        pppol2tp_abort_connect(l2tp);
-        return;
-      }
-      retry_wait = LWIP_MIN(PPPOL2TP_CONTROL_TIMEOUT * l2tp->sccrq_retried, PPPOL2TP_SLOW_RETRY);
-      PPPDEBUG(LOG_DEBUG, ("pppol2tp: sccrq_retried=%d\n", l2tp->sccrq_retried));
-      if ((err = pppol2tp_send_sccrq(l2tp)) != 0) {
-        l2tp->sccrq_retried--;
-        PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send SCCRQ, error=%d\n", err));
-      }
-      sys_timeout(retry_wait, pppol2tp_timeout, l2tp);
-      break;
-
-    case PPPOL2TP_STATE_ICRQ_SENT:
-      l2tp->icrq_retried++;
-      if (l2tp->icrq_retried >= PPPOL2TP_MAXICRQ) {
-        pppol2tp_abort_connect(l2tp);
-        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 ((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;
-       }
-      }
-      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));
-      }
-      sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
-      break;
-
-    case PPPOL2TP_STATE_ICCN_SENT:
-      l2tp->iccn_retried++;
-      if (l2tp->iccn_retried >= PPPOL2TP_MAXICCN) {
-        pppol2tp_abort_connect(l2tp);
-        return;
-      }
-      PPPDEBUG(LOG_DEBUG, ("pppol2tp: iccn_retried=%d\n", l2tp->iccn_retried));
-      if ((err = pppol2tp_send_iccn(l2tp, l2tp->our_ns)) != 0) {
-       l2tp->iccn_retried--;
-       PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send ICCN, error=%d\n", err));
-      }
-      sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
-      break;
-
-    default:
-      return;  /* all done, work in peace */
-  }
-}
-
-/* Connection attempt aborted */
-static void pppol2tp_abort_connect(pppol2tp_pcb *l2tp) {
-  PPPDEBUG(LOG_DEBUG, ("pppol2tp: could not establish connection\n"));
-  pppol2tp_clear(l2tp);
-  ppp_link_failed(l2tp->ppp); /* notify upper layers */
-}
-
-/* Reset L2TP control block to its initial state */
-static void pppol2tp_clear(pppol2tp_pcb *l2tp) {
-  /* stop any timer */
-  sys_untimeout(pppol2tp_timeout, l2tp);
-  l2tp->phase = PPPOL2TP_STATE_INITIAL;
-  l2tp->tunnel_port = l2tp->remote_port;
-  l2tp->our_ns = 0;
-  l2tp->peer_nr = 0;
-  l2tp->peer_ns = 0;
-  l2tp->source_tunnel_id = 0;
-  l2tp->remote_tunnel_id = 0;
-  l2tp->source_session_id = 0;
-  l2tp->remote_session_id = 0;
-  /* l2tp->*_retried are cleared when used */
-}
-
-/* Initiate a new tunnel */
-static err_t pppol2tp_send_sccrq(pppol2tp_pcb *l2tp) {
-  struct pbuf *pb;
-  u8_t *p;
-  u16_t len;
-
-  /* calculate UDP packet length */
-  len = 12 +8 +8 +10 +10 +6+sizeof(PPPOL2TP_HOSTNAME)-1 +6+sizeof(PPPOL2TP_VENDORNAME)-1 +8 +8;
-#if PPPOL2TP_AUTH_SUPPORT
-  if (l2tp->secret != NULL) {
-    len += 6 + sizeof(l2tp->secret_rv);
-  }
-#endif /* PPPOL2TP_AUTH_SUPPORT */
-
-  /* allocate a buffer */
-  pb = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM);
-  if (pb == NULL) {
-    return ERR_MEM;
-  }
-  LWIP_ASSERT("pb->tot_len == pb->len", pb->tot_len == pb->len);
-
-  p = (u8_t*)pb->payload;
-  /* fill in pkt */
-  /* L2TP control header */
-  PUTSHORT(PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY, p);
-  PUTSHORT(len, p); /* Length */
-  PUTSHORT(0, p); /* Tunnel Id */
-  PUTSHORT(0, p); /* Session Id */
-  PUTSHORT(0, p); /* NS Sequence number - to peer */
-  PUTSHORT(0, p); /* NR Sequence number - expected for peer */
-
-  /* AVP - Message type */
-  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p); /* Mandatory flag + len field */
-  PUTSHORT(0, p); /* Vendor ID */
-  PUTSHORT(PPPOL2TP_AVPTYPE_MESSAGE, p); /* Attribute type: Message Type */
-  PUTSHORT(PPPOL2TP_MESSAGETYPE_SCCRQ, p); /* Attribute value: Message type: SCCRQ */
-
-  /* AVP - L2TP Version */
-  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p); /* Mandatory flag + len field */
-  PUTSHORT(0, p); /* Vendor ID */
-  PUTSHORT(PPPOL2TP_AVPTYPE_VERSION, p); /* Attribute type: Version */
-  PUTSHORT(PPPOL2TP_VERSION, p); /* Attribute value: L2TP Version */
-
-  /* AVP - Framing capabilities */
-  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 10, p); /* Mandatory flag + len field */
-  PUTSHORT(0, p); /* Vendor ID */
-  PUTSHORT(PPPOL2TP_AVPTYPE_FRAMINGCAPABILITIES, p); /* Attribute type: Framing capabilities */
-  PUTLONG(PPPOL2TP_FRAMINGCAPABILITIES, p); /* Attribute value: Framing capabilities */
-
-  /* AVP - Bearer capabilities */
-  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 10, p); /* Mandatory flag + len field */
-  PUTSHORT(0, p); /* Vendor ID */
-  PUTSHORT(PPPOL2TP_AVPTYPE_BEARERCAPABILITIES, p); /* Attribute type: Bearer capabilities */
-  PUTLONG(PPPOL2TP_BEARERCAPABILITIES, p); /* Attribute value: Bearer capabilities */
-
-  /* AVP - Host name */
-  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 6+sizeof(PPPOL2TP_HOSTNAME)-1, p); /* Mandatory flag + len field */
-  PUTSHORT(0, p); /* Vendor ID */
-  PUTSHORT(PPPOL2TP_AVPTYPE_HOSTNAME, p); /* Attribute type: Hostname */
-  MEMCPY(p, PPPOL2TP_HOSTNAME, sizeof(PPPOL2TP_HOSTNAME)-1); /* Attribute value: Hostname */
-  INCPTR(sizeof(PPPOL2TP_HOSTNAME)-1, p);
-
-  /* AVP - Vendor name */
-  PUTSHORT(6+sizeof(PPPOL2TP_VENDORNAME)-1, p); /* len field */
-  PUTSHORT(0, p); /* Vendor ID */
-  PUTSHORT(PPPOL2TP_AVPTYPE_VENDORNAME, p); /* Attribute type: Vendor name */
-  MEMCPY(p, PPPOL2TP_VENDORNAME, sizeof(PPPOL2TP_VENDORNAME)-1); /* Attribute value: Vendor name */
-  INCPTR(sizeof(PPPOL2TP_VENDORNAME)-1, p);
-
-  /* AVP - Assign tunnel ID */
-  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p); /* Mandatory flag + len field */
-  PUTSHORT(0, p); /* Vendor ID */
-  PUTSHORT(PPPOL2TP_AVPTYPE_TUNNELID, p); /* Attribute type: Tunnel ID */
-  PUTSHORT(l2tp->remote_tunnel_id, p); /* Attribute value: Tunnel ID */
-
-  /* AVP - Receive window size */
-  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p); /* Mandatory flag + len field */
-  PUTSHORT(0, p); /* Vendor ID */
-  PUTSHORT(PPPOL2TP_AVPTYPE_RECEIVEWINDOWSIZE, p); /* Attribute type: Receive window size */
-  PUTSHORT(PPPOL2TP_RECEIVEWINDOWSIZE, p); /* Attribute value: Receive window size */
-
-#if PPPOL2TP_AUTH_SUPPORT
-  /* AVP - Challenge */
-  if (l2tp->secret != NULL) {
-    PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 6 + sizeof(l2tp->secret_rv), p); /* Mandatory flag + len field */
-    PUTSHORT(0, p); /* Vendor ID */
-    PUTSHORT(PPPOL2TP_AVPTYPE_CHALLENGE, p); /* Attribute type: Challenge */
-    MEMCPY(p, l2tp->secret_rv, sizeof(l2tp->secret_rv)); /* Attribute value: Random vector */
-    INCPTR(sizeof(l2tp->secret_rv), p);
-  }
-#endif /* PPPOL2TP_AUTH_SUPPORT */
-
-  return pppol2tp_udp_send(l2tp, pb);
-}
-
-/* Complete tunnel establishment */
-static err_t pppol2tp_send_scccn(pppol2tp_pcb *l2tp, u16_t ns) {
-  struct pbuf *pb;
-  u8_t *p;
-  u16_t len;
-
-  /* calculate UDP packet length */
-  len = 12 +8;
-#if PPPOL2TP_AUTH_SUPPORT
-  if (l2tp->send_challenge) {
-    len += 6 + sizeof(l2tp->challenge_hash);
-  }
-#endif /* PPPOL2TP_AUTH_SUPPORT */
-
-  /* allocate a buffer */
-  pb = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM);
-  if (pb == NULL) {
-    return ERR_MEM;
-  }
-  LWIP_ASSERT("pb->tot_len == pb->len", pb->tot_len == pb->len);
-
-  p = (u8_t*)pb->payload;
-  /* fill in pkt */
-  /* L2TP control header */
-  PUTSHORT(PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY, p);
-  PUTSHORT(len, p); /* Length */
-  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 */
-
-  /* AVP - Message type */
-  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p); /* Mandatory flag + len field */
-  PUTSHORT(0, p); /* Vendor ID */
-  PUTSHORT(PPPOL2TP_AVPTYPE_MESSAGE, p); /* Attribute type: Message Type */
-  PUTSHORT(PPPOL2TP_MESSAGETYPE_SCCCN, p); /* Attribute value: Message type: SCCCN */
-
-#if PPPOL2TP_AUTH_SUPPORT
-  /* AVP - Challenge response */
-  if (l2tp->send_challenge) {
-    PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 6 + sizeof(l2tp->challenge_hash), p); /* Mandatory flag + len field */
-    PUTSHORT(0, p); /* Vendor ID */
-    PUTSHORT(PPPOL2TP_AVPTYPE_CHALLENGERESPONSE, p); /* Attribute type: Challenge response */
-    MEMCPY(p, l2tp->challenge_hash, sizeof(l2tp->challenge_hash)); /* Attribute value: Computed challenge */
-    INCPTR(sizeof(l2tp->challenge_hash), p);
-  }
-#endif /* PPPOL2TP_AUTH_SUPPORT */
-
-  return pppol2tp_udp_send(l2tp, pb);
-}
-
-/* Initiate a new session */
-static err_t pppol2tp_send_icrq(pppol2tp_pcb *l2tp, u16_t ns) {
-  struct pbuf *pb;
-  u8_t *p;
-  u16_t len;
-  u32_t serialnumber;
-
-  /* calculate UDP packet length */
-  len = 12 +8 +8 +10;
-
-  /* allocate a buffer */
-  pb = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM);
-  if (pb == NULL) {
-    return ERR_MEM;
-  }
-  LWIP_ASSERT("pb->tot_len == pb->len", pb->tot_len == pb->len);
-
-  p = (u8_t*)pb->payload;
-  /* fill in pkt */
-  /* L2TP control header */
-  PUTSHORT(PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY, p);
-  PUTSHORT(len, p); /* Length */
-  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 */
-
-  /* AVP - Message type */
-  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p); /* Mandatory flag + len field */
-  PUTSHORT(0, p); /* Vendor ID */
-  PUTSHORT(PPPOL2TP_AVPTYPE_MESSAGE, p); /* Attribute type: Message Type */
-  PUTSHORT(PPPOL2TP_MESSAGETYPE_ICRQ, p); /* Attribute value: Message type: ICRQ */
-
-  /* AVP - Assign session ID */
-  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p); /* Mandatory flag + len field */
-  PUTSHORT(0, p); /* Vendor ID */
-  PUTSHORT(PPPOL2TP_AVPTYPE_SESSIONID, p); /* Attribute type: Session ID */
-  PUTSHORT(l2tp->remote_session_id, p); /* Attribute value: Session ID */
-
-  /* AVP - Call Serial Number */
-  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 10, p); /* Mandatory flag + len field */
-  PUTSHORT(0, p); /* Vendor ID */
-  PUTSHORT(PPPOL2TP_AVPTYPE_CALLSERIALNUMBER, p); /* Attribute type: Serial number */
-  serialnumber = magic();
-  PUTLONG(serialnumber, p); /* Attribute value: Serial number */
-
-  return pppol2tp_udp_send(l2tp, pb);
-}
-
-/* Complete tunnel establishment */
-static err_t pppol2tp_send_iccn(pppol2tp_pcb *l2tp, u16_t ns) {
-  struct pbuf *pb;
-  u8_t *p;
-  u16_t len;
-
-  /* calculate UDP packet length */
-  len = 12 +8 +10 +10;
-
-  /* allocate a buffer */
-  pb = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM);
-  if (pb == NULL) {
-    return ERR_MEM;
-  }
-  LWIP_ASSERT("pb->tot_len == pb->len", pb->tot_len == pb->len);
-
-  p = (u8_t*)pb->payload;
-  /* fill in pkt */
-  /* L2TP control header */
-  PUTSHORT(PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY, p);
-  PUTSHORT(len, p); /* Length */
-  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 */
-
-  /* AVP - Message type */
-  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p); /* Mandatory flag + len field */
-  PUTSHORT(0, p); /* Vendor ID */
-  PUTSHORT(PPPOL2TP_AVPTYPE_MESSAGE, p); /* Attribute type: Message Type */
-  PUTSHORT(PPPOL2TP_MESSAGETYPE_ICCN, p); /* Attribute value: Message type: ICCN */
-
-  /* AVP - Framing type */
-  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 10, p); /* Mandatory flag + len field */
-  PUTSHORT(0, p); /* Vendor ID */
-  PUTSHORT(PPPOL2TP_AVPTYPE_FRAMINGTYPE, p); /* Attribute type: Framing type */
-  PUTLONG(PPPOL2TP_FRAMINGTYPE, p); /* Attribute value: Framing type */
-
-  /* AVP - TX Connect speed */
-  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 10, p); /* Mandatory flag + len field */
-  PUTSHORT(0, p); /* Vendor ID */
-  PUTSHORT(PPPOL2TP_AVPTYPE_TXCONNECTSPEED, p); /* Attribute type: TX Connect speed */
-  PUTLONG(PPPOL2TP_TXCONNECTSPEED, p); /* Attribute value: TX Connect speed */
-
-  return pppol2tp_udp_send(l2tp, pb);
-}
-
-/* Send a ZLB ACK packet */
-static err_t pppol2tp_send_zlb(pppol2tp_pcb *l2tp, u16_t ns) {
-  struct pbuf *pb;
-  u8_t *p;
-  u16_t len;
-
-  /* calculate UDP packet length */
-  len = 12;
-
-  /* allocate a buffer */
-  pb = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM);
-  if (pb == NULL) {
-    return ERR_MEM;
-  }
-  LWIP_ASSERT("pb->tot_len == pb->len", pb->tot_len == pb->len);
-
-  p = (u8_t*)pb->payload;
-  /* fill in pkt */
-  /* L2TP control header */
-  PUTSHORT(PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY, p);
-  PUTSHORT(len, p); /* Length */
-  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 */
-
-  return pppol2tp_udp_send(l2tp, pb);
-}
-
-/* Send a StopCCN packet */
-static err_t pppol2tp_send_stopccn(pppol2tp_pcb *l2tp, u16_t ns) {
-  struct pbuf *pb;
-  u8_t *p;
-  u16_t len;
-
-  /* calculate UDP packet length */
-  len = 12 +8 +8 +8;
-
-  /* allocate a buffer */
-  pb = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM);
-  if (pb == NULL) {
-    return ERR_MEM;
-  }
-  LWIP_ASSERT("pb->tot_len == pb->len", pb->tot_len == pb->len);
-
-  p = (u8_t*)pb->payload;
-  /* fill in pkt */
-  /* L2TP control header */
-  PUTSHORT(PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY, p);
-  PUTSHORT(len, p); /* Length */
-  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 */
-
-  /* AVP - Message type */
-  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p); /* Mandatory flag + len field */
-  PUTSHORT(0, p); /* Vendor ID */
-  PUTSHORT(PPPOL2TP_AVPTYPE_MESSAGE, p); /* Attribute type: Message Type */
-  PUTSHORT(PPPOL2TP_MESSAGETYPE_STOPCCN, p); /* Attribute value: Message type: StopCCN */
-
-  /* AVP - Assign tunnel ID */
-  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p); /* Mandatory flag + len field */
-  PUTSHORT(0, p); /* Vendor ID */
-  PUTSHORT(PPPOL2TP_AVPTYPE_TUNNELID, p); /* Attribute type: Tunnel ID */
-  PUTSHORT(l2tp->remote_tunnel_id, p); /* Attribute value: Tunnel ID */
-
-  /* AVP - Result code */
-  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p); /* Mandatory flag + len field */
-  PUTSHORT(0, p); /* Vendor ID */
-  PUTSHORT(PPPOL2TP_AVPTYPE_RESULTCODE, p); /* Attribute type: Result code */
-  PUTSHORT(PPPOL2TP_RESULTCODE, p); /* Attribute value: Result code */
-
-  return pppol2tp_udp_send(l2tp, pb);
-}
-
-static err_t pppol2tp_xmit(pppol2tp_pcb *l2tp, struct pbuf *pb) {
-  u8_t *p;
-
-  /* are we ready to process data yet? */
-  if (l2tp->phase < PPPOL2TP_STATE_DATA) {
-    pbuf_free(pb);
-    return ERR_CONN;
-  }
-
-  /* make room for L2TP header - should not fail */
-  if (pbuf_header(pb, (s16_t)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);
-    pbuf_free(pb);
-    return ERR_BUF;
-  }
-
-  p = (u8_t*)pb->payload;
-  PUTSHORT(PPPOL2TP_HEADERFLAG_DATA_MANDATORY, p);
-  PUTSHORT(l2tp->source_tunnel_id, p); /* Tunnel Id */
-  PUTSHORT(l2tp->source_session_id, p); /* Session Id */
-
-  return pppol2tp_udp_send(l2tp, pb);
-}
-
-static err_t pppol2tp_udp_send(pppol2tp_pcb *l2tp, struct pbuf *pb) {
-  err_t err;
-  if (l2tp->netif) {
-    err = udp_sendto_if(l2tp->udp, pb, &l2tp->remote_ip, l2tp->tunnel_port, l2tp->netif);
-  } else {
-    err = udp_sendto(l2tp->udp, pb, &l2tp->remote_ip, l2tp->tunnel_port);
-  }
-  pbuf_free(pb);
-  return err;
-}
-
-#endif /* PPP_SUPPORT && PPPOL2TP_SUPPORT */
diff --git a/components/lwip/netif/ppp/pppos.c b/components/lwip/netif/ppp/pppos.c
deleted file mode 100644 (file)
index b24e7fa..0000000
+++ /dev/null
@@ -1,899 +0,0 @@
-/**
- * @file
- * Network Point to Point Protocol over Serial file.
- *
- */
-
-/*
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && PPPOS_SUPPORT /* don't build if not configured for use in lwipopts.h */
-
-#include <string.h>
-
-#include "lwip/err.h"
-#include "lwip/pbuf.h"
-#include "lwip/sys.h"
-#include "lwip/memp.h"
-#include "lwip/netif.h"
-#include "lwip/snmp.h"
-#include "lwip/priv/tcpip_priv.h"
-#include "lwip/api.h"
-#include "lwip/ip4.h" /* for ip4_input() */
-
-#include "netif/ppp/ppp_impl.h"
-#include "netif/ppp/pppos.h"
-#include "netif/ppp/vj.h"
-
-/* callbacks called from PPP core */
-static err_t pppos_write(ppp_pcb *ppp, void *ctx, struct pbuf *p);
-static err_t pppos_netif_output(ppp_pcb *ppp, void *ctx, struct pbuf *pb, u16_t protocol);
-static err_t pppos_connect(ppp_pcb *ppp, void *ctx);
-#if PPP_SERVER
-static err_t pppos_listen(ppp_pcb *ppp, void *ctx, struct ppp_addrs *addrs);
-#endif /* PPP_SERVER */
-static void pppos_disconnect(ppp_pcb *ppp, void *ctx);
-static err_t pppos_destroy(ppp_pcb *ppp, void *ctx);
-static void pppos_send_config(ppp_pcb *ppp, void *ctx, u32_t accm, int pcomp, int accomp);
-static void pppos_recv_config(ppp_pcb *ppp, void *ctx, u32_t accm, int pcomp, int accomp);
-
-/* Prototypes for procedures local to this file. */
-#if PPP_INPROC_IRQ_SAFE
-static void pppos_input_callback(void *arg);
-#endif /* PPP_INPROC_IRQ_SAFE */
-static void pppos_input_free_current_packet(pppos_pcb *pppos);
-static void pppos_input_drop(pppos_pcb *pppos);
-static err_t pppos_output_append(pppos_pcb *pppos, err_t err, struct pbuf *nb, u8_t c, u8_t accm, u16_t *fcs);
-static err_t pppos_output_last(pppos_pcb *pppos, err_t err, struct pbuf *nb, u16_t *fcs);
-
-/* Callbacks structure for PPP core */
-static const struct link_callbacks pppos_callbacks = {
-  pppos_connect,
-#if PPP_SERVER
-  pppos_listen,
-#endif /* PPP_SERVER */
-  pppos_disconnect,
-  pppos_destroy,
-  pppos_write,
-  pppos_netif_output,
-  pppos_send_config,
-  pppos_recv_config
-};
-
-/* PPP's Asynchronous-Control-Character-Map.  The mask array is used
- * to select the specific bit for a character. */
-#define ESCAPE_P(accm, c) ((accm)[(c) >> 3] & 1 << (c & 0x07))
-
-#if PPP_FCS_TABLE
-/*
- * FCS lookup table as calculated by genfcstab.
- */
-static const u16_t fcstab[256] = {
-  0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
-  0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
-  0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
-  0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
-  0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
-  0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
-  0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
-  0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
-  0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
-  0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
-  0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
-  0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
-  0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
-  0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
-  0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
-  0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
-  0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
-  0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
-  0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
-  0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
-  0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
-  0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
-  0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
-  0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
-  0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
-  0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
-  0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
-  0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
-  0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
-  0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
-  0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
-  0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
-};
-#define PPP_FCS(fcs, c) (((fcs) >> 8) ^ fcstab[((fcs) ^ (c)) & 0xff])
-#else /* PPP_FCS_TABLE */
-/* The HDLC polynomial: X**0 + X**5 + X**12 + X**16 (0x8408) */
-#define PPP_FCS_POLYNOMIAL 0x8408
-static u16_t
-ppp_get_fcs(u8_t byte)
-{
-  unsigned int octet;
-  int bit;
-  octet = byte;
-  for (bit = 8; bit-- > 0; ) {
-    octet = (octet & 0x01) ? ((octet >> 1) ^ PPP_FCS_POLYNOMIAL) : (octet >> 1);
-  }
-  return octet & 0xffff;
-}
-#define PPP_FCS(fcs, c) (((fcs) >> 8) ^ ppp_get_fcs(((fcs) ^ (c)) & 0xff))
-#endif /* PPP_FCS_TABLE */
-
-/*
- * Values for FCS calculations.
- */
-#define PPP_INITFCS     0xffff  /* Initial FCS value */
-#define PPP_GOODFCS     0xf0b8  /* Good final FCS value */
-
-#if PPP_INPROC_IRQ_SAFE
-#define PPPOS_DECL_PROTECT(lev) SYS_ARCH_DECL_PROTECT(lev)
-#define PPPOS_PROTECT(lev) SYS_ARCH_PROTECT(lev)
-#define PPPOS_UNPROTECT(lev) SYS_ARCH_UNPROTECT(lev)
-#else
-#define PPPOS_DECL_PROTECT(lev)
-#define PPPOS_PROTECT(lev)
-#define PPPOS_UNPROTECT(lev)
-#endif /* PPP_INPROC_IRQ_SAFE */
-
-
-/*
- * Create a new PPP connection using the given serial I/O device.
- *
- * Return 0 on success, an error code on failure.
- */
-ppp_pcb *pppos_create(struct netif *pppif, pppos_output_cb_fn output_cb,
-       ppp_link_status_cb_fn link_status_cb, void *ctx_cb)
-{
-  pppos_pcb *pppos;
-  ppp_pcb *ppp;
-
-  pppos = (pppos_pcb *)memp_malloc(MEMP_PPPOS_PCB);
-  if (pppos == NULL) {
-    return NULL;
-  }
-
-  ppp = ppp_new(pppif, &pppos_callbacks, pppos, link_status_cb, ctx_cb);
-  if (ppp == NULL) {
-    memp_free(MEMP_PPPOS_PCB, pppos);
-    return NULL;
-  }
-
-  memset(pppos, 0, sizeof(pppos_pcb));
-  pppos->ppp = ppp;
-  pppos->output_cb = output_cb;
-  return ppp;
-}
-
-/* Called by PPP core */
-static err_t
-pppos_write(ppp_pcb *ppp, void *ctx, struct pbuf *p)
-{
-  pppos_pcb *pppos = (pppos_pcb *)ctx;
-  u8_t *s;
-  struct pbuf *nb;
-  u16_t n;
-  u16_t fcs_out;
-  err_t err;
-  LWIP_UNUSED_ARG(ppp);
-
-  /* Grab an output buffer. */
-  nb = pbuf_alloc(PBUF_RAW, 0, PBUF_POOL);
-  if (nb == NULL) {
-    PPPDEBUG(LOG_WARNING, ("pppos_write[%d]: alloc fail\n", ppp->netif->num));
-    LINK_STATS_INC(link.memerr);
-    LINK_STATS_INC(link.drop);
-    MIB2_STATS_NETIF_INC(ppp->netif, ifoutdiscards);
-    pbuf_free(p);
-    return ERR_MEM;
-  }
-
-  /* If the link has been idle, we'll send a fresh flag character to
-   * flush any noise. */
-  err = ERR_OK;
-  if ((sys_now() - pppos->last_xmit) >= PPP_MAXIDLEFLAG) {
-    err = pppos_output_append(pppos, err,  nb, PPP_FLAG, 0, NULL);
-  }
-
-  /* Load output buffer. */
-  fcs_out = PPP_INITFCS;
-  s = (u8_t*)p->payload;
-  n = p->len;
-  while (n-- > 0) {
-    err = pppos_output_append(pppos, err,  nb, *s++, 1, &fcs_out);
-  }
-
-  err = pppos_output_last(pppos, err, nb, &fcs_out);
-  if (err == ERR_OK) {
-    PPPDEBUG(LOG_INFO, ("pppos_write[%d]: len=%d\n", ppp->netif->num, p->len));
-  } else {
-    PPPDEBUG(LOG_WARNING, ("pppos_write[%d]: output failed len=%d\n", ppp->netif->num, p->len));
-  }
-  pbuf_free(p);
-  return err;
-}
-
-/* Called by PPP core */
-static err_t
-pppos_netif_output(ppp_pcb *ppp, void *ctx, struct pbuf *pb, u16_t protocol)
-{
-  pppos_pcb *pppos = (pppos_pcb *)ctx;
-  struct pbuf *nb, *p;
-  u16_t fcs_out;
-  err_t err;
-  LWIP_UNUSED_ARG(ppp);
-
-  /* Grab an output buffer. */
-  nb = pbuf_alloc(PBUF_RAW, 0, PBUF_POOL);
-  if (nb == NULL) {
-    PPPDEBUG(LOG_WARNING, ("pppos_netif_output[%d]: alloc fail\n", ppp->netif->num));
-    LINK_STATS_INC(link.memerr);
-    LINK_STATS_INC(link.drop);
-    MIB2_STATS_NETIF_INC(ppp->netif, ifoutdiscards);
-    return ERR_MEM;
-  }
-
-  /* If the link has been idle, we'll send a fresh flag character to
-   * flush any noise. */
-  err = ERR_OK;
-  if ((sys_now() - pppos->last_xmit) >= PPP_MAXIDLEFLAG) {
-    err = pppos_output_append(pppos, err,  nb, PPP_FLAG, 0, NULL);
-  }
-
-  fcs_out = PPP_INITFCS;
-  if (!pppos->accomp) {
-    err = pppos_output_append(pppos, err,  nb, PPP_ALLSTATIONS, 1, &fcs_out);
-    err = pppos_output_append(pppos, err,  nb, PPP_UI, 1, &fcs_out);
-  }
-  if (!pppos->pcomp || protocol > 0xFF) {
-    err = pppos_output_append(pppos, err,  nb, (protocol >> 8) & 0xFF, 1, &fcs_out);
-  }
-  err = pppos_output_append(pppos, err,  nb, protocol & 0xFF, 1, &fcs_out);
-
-  /* Load packet. */
-  for(p = pb; p; p = p->next) {
-    u16_t n = p->len;
-    u8_t *s = (u8_t*)p->payload;
-
-    while (n-- > 0) {
-      err = pppos_output_append(pppos, err,  nb, *s++, 1, &fcs_out);
-    }
-  }
-
-  err = pppos_output_last(pppos, err, nb, &fcs_out);
-  if (err == ERR_OK) {
-    PPPDEBUG(LOG_INFO, ("pppos_netif_output[%d]: proto=0x%"X16_F", len = %d\n", ppp->netif->num, protocol, pb->tot_len));
-  } else {
-    PPPDEBUG(LOG_WARNING, ("pppos_netif_output[%d]: output failed proto=0x%"X16_F", len = %d\n", ppp->netif->num, protocol, pb->tot_len));
-  }
-  return err;
-}
-
-static err_t
-pppos_connect(ppp_pcb *ppp, void *ctx)
-{
-  pppos_pcb *pppos = (pppos_pcb *)ctx;
-  PPPOS_DECL_PROTECT(lev);
-
-#if PPP_INPROC_IRQ_SAFE
-  /* input pbuf left over from last session? */
-  pppos_input_free_current_packet(pppos);
-#endif /* PPP_INPROC_IRQ_SAFE */
-
-  ppp_clear(ppp);
-  /* reset PPPoS control block to its initial state */
-  memset(&pppos->last_xmit, 0, sizeof(pppos_pcb) - ( (char*)&((pppos_pcb*)0)->last_xmit - (char*)0 ) );
-
-  /*
-   * Default the in and out accm so that escape and flag characters
-   * are always escaped.
-   */
-  pppos->in_accm[15] = 0x60; /* no need to protect since RX is not running */
-  pppos->out_accm[15] = 0x60;
-  PPPOS_PROTECT(lev);
-  pppos->open = 1;
-  PPPOS_UNPROTECT(lev);
-
-  /*
-   * Start the connection and handle incoming events (packet or timeout).
-   */
-  PPPDEBUG(LOG_INFO, ("pppos_connect: unit %d: connecting\n", ppp->netif->num));
-  ppp_start(ppp); /* notify upper layers */
-  return ERR_OK;
-}
-
-#if PPP_SERVER
-static err_t
-pppos_listen(ppp_pcb *ppp, void *ctx, struct ppp_addrs *addrs)
-{
-  pppos_pcb *pppos = (pppos_pcb *)ctx;
-#if PPP_IPV4_SUPPORT
-  ipcp_options *ipcp_wo;
-#endif /* PPP_IPV4_SUPPORT */
-  lcp_options *lcp_wo;
-  PPPOS_DECL_PROTECT(lev);
-
-#if PPP_INPROC_IRQ_SAFE
-  /* input pbuf left over from last session? */
-  pppos_input_free_current_packet(pppos);
-#endif /* PPP_INPROC_IRQ_SAFE */
-
-  ppp_clear(ppp);
-  /* reset PPPoS control block to its initial state */
-  memset(&pppos->last_xmit, 0, sizeof(pppos_pcb) - ( (char*)&((pppos_pcb*)0)->last_xmit - (char*)0 ) );
-
-  /* Wait passively */
-  lcp_wo = &ppp->lcp_wantoptions;
-  lcp_wo->silent = 1;
-
-#if PPP_AUTH_SUPPORT
-  if (ppp->settings.user && ppp->settings.passwd) {
-    ppp->settings.auth_required = 1;
-  }
-#endif /* PPP_AUTH_SUPPORT */
-
-#if PPP_IPV4_SUPPORT
-  ipcp_wo = &ppp->ipcp_wantoptions;
-  ipcp_wo->ouraddr = ip4_addr_get_u32(&addrs->our_ipaddr);
-  ipcp_wo->hisaddr = ip4_addr_get_u32(&addrs->his_ipaddr);
-#if LWIP_DNS
-  ipcp_wo->dnsaddr[0] = ip4_addr_get_u32(&addrs->dns1);
-  ipcp_wo->dnsaddr[1] = ip4_addr_get_u32(&addrs->dns2);
-#endif /* LWIP_DNS */
-#else /* PPP_IPV4_SUPPORT */
-  LWIP_UNUSED_ARG(addrs);
-#endif /* PPP_IPV4_SUPPORT */
-
-  /*
-   * Default the in and out accm so that escape and flag characters
-   * are always escaped.
-   */
-  pppos->in_accm[15] = 0x60; /* no need to protect since RX is not running */
-  pppos->out_accm[15] = 0x60;
-  PPPOS_PROTECT(lev);
-  pppos->open = 1;
-  PPPOS_UNPROTECT(lev);
-
-  /*
-   * Wait for something to happen.
-   */
-  PPPDEBUG(LOG_INFO, ("pppos_listen: unit %d: listening\n", ppp->netif->num));
-  ppp_start(ppp); /* notify upper layers */
-  return ERR_OK;
-}
-#endif /* PPP_SERVER */
-
-static void
-pppos_disconnect(ppp_pcb *ppp, void *ctx)
-{
-  pppos_pcb *pppos = (pppos_pcb *)ctx;
-  PPPOS_DECL_PROTECT(lev);
-
-  PPPOS_PROTECT(lev);
-  pppos->open = 0;
-  PPPOS_UNPROTECT(lev);
-
-  /* If PPP_INPROC_IRQ_SAFE is used we cannot call
-   * pppos_input_free_current_packet() here because
-   * rx IRQ might still call pppos_input().
-   */
-#if !PPP_INPROC_IRQ_SAFE
-  /* input pbuf left ? */
-  pppos_input_free_current_packet(pppos);
-#endif /* !PPP_INPROC_IRQ_SAFE */
-
-  ppp_link_end(ppp); /* notify upper layers */
-}
-
-static err_t
-pppos_destroy(ppp_pcb *ppp, void *ctx)
-{
-  pppos_pcb *pppos = (pppos_pcb *)ctx;
-  LWIP_UNUSED_ARG(ppp);
-
-#if PPP_INPROC_IRQ_SAFE
-  /* input pbuf left ? */
-  pppos_input_free_current_packet(pppos);
-#endif /* PPP_INPROC_IRQ_SAFE */
-
-  memp_free(MEMP_PPPOS_PCB, pppos);
-  return ERR_OK;
-}
-
-#if !NO_SYS && !PPP_INPROC_IRQ_SAFE
-/** Pass received raw characters to PPPoS to be decoded through lwIP TCPIP thread.
- *
- * @param pcb PPP descriptor index, returned by pppos_create()
- * @param data received data
- * @param len length of received data
- */
-err_t
-pppos_input_tcpip(ppp_pcb *ppp, u8_t *s, int l)
-{
-  struct pbuf *p;
-  err_t err;
-
-  p = pbuf_alloc(PBUF_RAW, l, PBUF_POOL);
-  if (!p) {
-    return ERR_MEM;
-  }
-  pbuf_take(p, s, l);
-
-  err = tcpip_inpkt(p, ppp_netif(ppp), pppos_input_sys);
-  if (err != ERR_OK) {
-     pbuf_free(p);
-  }
-  return err;
-}
-
-/* called from TCPIP thread */
-err_t pppos_input_sys(struct pbuf *p, struct netif *inp) {
-  ppp_pcb *ppp = (ppp_pcb*)inp->state;
-  struct pbuf *n;
-
-  for (n = p; n; n = n->next) {
-    pppos_input(ppp, (u8_t*)n->payload, n->len);
-  }
-  pbuf_free(p);
-  return ERR_OK;
-}
-#endif /* !NO_SYS && !PPP_INPROC_IRQ_SAFE */
-
-/** PPPoS input helper struct, must be packed since it is stored
- * to pbuf->payload, which might be unaligned. */
-#if PPP_INPROC_IRQ_SAFE
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct pppos_input_header {
-  PACK_STRUCT_FIELD(ppp_pcb *ppp);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
-#endif /* PPP_INPROC_IRQ_SAFE */
-
-/** Pass received raw characters to PPPoS to be decoded.
- *
- * @param pcb PPP descriptor index, returned by pppos_create()
- * @param data received data
- * @param len length of received data
- */
-void
-pppos_input(ppp_pcb *ppp, u8_t *s, int l)
-{
-  pppos_pcb *pppos = (pppos_pcb *)ppp->link_ctx_cb;
-  struct pbuf *next_pbuf;
-  u8_t cur_char;
-  u8_t escaped;
-  PPPOS_DECL_PROTECT(lev);
-
-  PPPOS_PROTECT(lev);
-  if (!pppos->open) {
-    PPPOS_UNPROTECT(lev);
-    return;
-  }
-  PPPOS_UNPROTECT(lev);
-
-  PPPDEBUG(LOG_DEBUG, ("pppos_input[%d]: got %d bytes\n", ppp->netif->num, l));
-  while (l-- > 0) {
-    cur_char = *s++;
-
-    PPPOS_PROTECT(lev);
-    escaped = ESCAPE_P(pppos->in_accm, cur_char);
-    PPPOS_UNPROTECT(lev);
-    /* Handle special characters. */
-    if (escaped) {
-      /* Check for escape sequences. */
-      /* XXX Note that this does not handle an escaped 0x5d character which
-       * would appear as an escape character.  Since this is an ASCII ']'
-       * and there is no reason that I know of to escape it, I won't complicate
-       * the code to handle this case. GLL */
-      if (cur_char == PPP_ESCAPE) {
-        pppos->in_escaped = 1;
-      /* Check for the flag character. */
-      } else if (cur_char == PPP_FLAG) {
-        /* If this is just an extra flag character, ignore it. */
-        if (pppos->in_state <= PDADDRESS) {
-          /* ignore it */;
-        /* If we haven't received the packet header, drop what has come in. */
-        } else if (pppos->in_state < PDDATA) {
-          PPPDEBUG(LOG_WARNING,
-                   ("pppos_input[%d]: Dropping incomplete packet %d\n",
-                    ppp->netif->num, pppos->in_state));
-          LINK_STATS_INC(link.lenerr);
-          pppos_input_drop(pppos);
-        /* If the fcs is invalid, drop the packet. */
-        } else if (pppos->in_fcs != PPP_GOODFCS) {
-          PPPDEBUG(LOG_INFO,
-                   ("pppos_input[%d]: Dropping bad fcs 0x%"X16_F" proto=0x%"X16_F"\n",
-                    ppp->netif->num, pppos->in_fcs, pppos->in_protocol));
-          /* Note: If you get lots of these, check for UART frame errors or try different baud rate */
-          LINK_STATS_INC(link.chkerr);
-          pppos_input_drop(pppos);
-        /* Otherwise it's a good packet so pass it on. */
-        } else {
-          struct pbuf *inp;
-          /* Trim off the checksum. */
-          if(pppos->in_tail->len > 2) {
-            pppos->in_tail->len -= 2;
-
-            pppos->in_tail->tot_len = pppos->in_tail->len;
-            if (pppos->in_tail != pppos->in_head) {
-              pbuf_cat(pppos->in_head, pppos->in_tail);
-            }
-          } else {
-            pppos->in_tail->tot_len = pppos->in_tail->len;
-            if (pppos->in_tail != pppos->in_head) {
-              pbuf_cat(pppos->in_head, pppos->in_tail);
-            }
-
-            pbuf_realloc(pppos->in_head, pppos->in_head->tot_len - 2);
-          }
-
-          /* Dispatch the packet thereby consuming it. */
-          inp = pppos->in_head;
-          /* Packet consumed, release our references. */
-          pppos->in_head = NULL;
-          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));
-#endif /* IP_FORWARD || LWIP_IPV6_FORWARD */
-#if PPP_INPROC_IRQ_SAFE
-          if(tcpip_callback_with_block(pppos_input_callback, inp, 0) != 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);
-            MIB2_STATS_NETIF_INC(ppp->netif, ifindiscards);
-          }
-#else /* PPP_INPROC_IRQ_SAFE */
-          ppp_input(ppp, inp);
-#endif /* PPP_INPROC_IRQ_SAFE */
-        }
-
-        /* Prepare for a new packet. */
-        pppos->in_fcs = PPP_INITFCS;
-        pppos->in_state = PDADDRESS;
-        pppos->in_escaped = 0;
-      /* Other characters are usually control characters that may have
-       * been inserted by the physical layer so here we just drop them. */
-      } else {
-        PPPDEBUG(LOG_WARNING,
-                 ("pppos_input[%d]: Dropping ACCM char <%d>\n", ppp->netif->num, cur_char));
-      }
-    /* Process other characters. */
-    } else {
-      /* Unencode escaped characters. */
-      if (pppos->in_escaped) {
-        pppos->in_escaped = 0;
-        cur_char ^= PPP_TRANS;
-      }
-
-      /* Process character relative to current state. */
-      switch(pppos->in_state) {
-        case PDIDLE:                    /* Idle state - waiting. */
-          /* Drop the character if it's not 0xff
-           * we would have processed a flag character above. */
-          if (cur_char != PPP_ALLSTATIONS) {
-            break;
-          }
-          /* no break */
-          /* Fall through */
-
-        case PDSTART:                   /* Process start flag. */
-          /* Prepare for a new packet. */
-          pppos->in_fcs = PPP_INITFCS;
-          /* no break */
-          /* Fall through */
-
-        case PDADDRESS:                 /* Process address field. */
-          if (cur_char == PPP_ALLSTATIONS) {
-            pppos->in_state = PDCONTROL;
-            break;
-          }
-          /* no break */
-
-          /* Else assume compressed address and control fields so
-           * fall through to get the protocol... */
-        case PDCONTROL:                 /* Process control field. */
-          /* If we don't get a valid control code, restart. */
-          if (cur_char == PPP_UI) {
-            pppos->in_state = PDPROTOCOL1;
-            break;
-          }
-          /* no break */
-
-#if 0
-          else {
-            PPPDEBUG(LOG_WARNING,
-                     ("pppos_input[%d]: Invalid control <%d>\n", ppp->netif->num, cur_char));
-            pppos->in_state = PDSTART;
-          }
-#endif
-        case PDPROTOCOL1:               /* Process protocol field 1. */
-          /* If the lower bit is set, this is the end of the protocol
-           * field. */
-          if (cur_char & 1) {
-            pppos->in_protocol = cur_char;
-            pppos->in_state = PDDATA;
-          } else {
-            pppos->in_protocol = (u16_t)cur_char << 8;
-            pppos->in_state = PDPROTOCOL2;
-          }
-          break;
-        case PDPROTOCOL2:               /* Process protocol field 2. */
-          pppos->in_protocol |= cur_char;
-          pppos->in_state = PDDATA;
-          break;
-        case PDDATA:                    /* Process data byte. */
-          /* Make space to receive processed data. */
-          if (pppos->in_tail == NULL || pppos->in_tail->len == PBUF_POOL_BUFSIZE) {
-            u16_t pbuf_alloc_len;
-            if (pppos->in_tail != NULL) {
-              pppos->in_tail->tot_len = pppos->in_tail->len;
-              if (pppos->in_tail != pppos->in_head) {
-                pbuf_cat(pppos->in_head, pppos->in_tail);
-                /* give up the in_tail reference now */
-                pppos->in_tail = NULL;
-              }
-            }
-            /* If we haven't started a packet, we need a packet header. */
-            pbuf_alloc_len = 0;
-#if IP_FORWARD || LWIP_IPV6_FORWARD
-            /* If IP forwarding is enabled we are reserving PBUF_LINK_ENCAPSULATION_HLEN
-             * + PBUF_LINK_HLEN bytes so the packet is being allocated with enough header
-             * space to be forwarded (to Ethernet for example).
-             */
-            if (pppos->in_head == NULL) {
-              pbuf_alloc_len = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN;
-            }
-#endif /* IP_FORWARD || LWIP_IPV6_FORWARD */
-            next_pbuf = pbuf_alloc(PBUF_RAW, pbuf_alloc_len, PBUF_POOL);
-            if (next_pbuf == NULL) {
-              /* No free buffers.  Drop the input packet and let the
-               * higher layers deal with it.  Continue processing
-               * the received pbuf chain in case a new packet starts. */
-              PPPDEBUG(LOG_ERR, ("pppos_input[%d]: NO FREE PBUFS!\n", ppp->netif->num));
-              LINK_STATS_INC(link.memerr);
-              pppos_input_drop(pppos);
-              pppos->in_state = PDSTART;  /* Wait for flag sequence. */
-              break;
-            }
-            if (pppos->in_head == NULL) {
-              u8_t *payload = ((u8_t*)next_pbuf->payload) + pbuf_alloc_len;
-#if PPP_INPROC_IRQ_SAFE
-              ((struct pppos_input_header*)payload)->ppp = ppp;
-              payload += sizeof(struct pppos_input_header);
-              next_pbuf->len += sizeof(struct pppos_input_header);
-#endif /* PPP_INPROC_IRQ_SAFE */
-              next_pbuf->len += sizeof(pppos->in_protocol);
-              *(payload++) = pppos->in_protocol >> 8;
-              *(payload) = pppos->in_protocol & 0xFF;
-              pppos->in_head = next_pbuf;
-            }
-            pppos->in_tail = next_pbuf;
-          }
-          /* Load character into buffer. */
-          ((u8_t*)pppos->in_tail->payload)[pppos->in_tail->len++] = cur_char;
-          break;
-        default:
-          break;
-      }
-
-      /* update the frame check sequence number. */
-      pppos->in_fcs = PPP_FCS(pppos->in_fcs, cur_char);
-    }
-  } /* while (l-- > 0), all bytes processed */
-}
-
-#if PPP_INPROC_IRQ_SAFE
-/* PPPoS input callback using one input pointer
- */
-static void pppos_input_callback(void *arg) {
-  struct pbuf *pb = (struct pbuf*)arg;
-  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);
-    goto drop;
-  }
-
-  /* Dispatch the packet thereby consuming it. */
-  ppp_input(ppp, pb);
-  return;
-
-drop:
-  LINK_STATS_INC(link.drop);
-  MIB2_STATS_NETIF_INC(ppp->netif, ifindiscards);
-  pbuf_free(pb);
-}
-#endif /* PPP_INPROC_IRQ_SAFE */
-
-static void
-pppos_send_config(ppp_pcb *ppp, void *ctx, u32_t accm, int pcomp, int accomp)
-{
-  int i;
-  pppos_pcb *pppos = (pppos_pcb *)ctx;
-  LWIP_UNUSED_ARG(ppp);
-
-  pppos->pcomp = pcomp;
-  pppos->accomp = accomp;
-
-  /* Load the ACCM bits for the 32 control codes. */
-  for (i = 0; i < 32/8; i++) {
-    pppos->out_accm[i] = (u8_t)((accm >> (8 * i)) & 0xFF);
-  }
-
-  PPPDEBUG(LOG_INFO, ("pppos_send_config[%d]: out_accm=%X %X %X %X\n",
-            pppos->ppp->netif->num,
-            pppos->out_accm[0], pppos->out_accm[1], pppos->out_accm[2], pppos->out_accm[3]));
-}
-
-static void
-pppos_recv_config(ppp_pcb *ppp, void *ctx, u32_t accm, int pcomp, int accomp)
-{
-  int i;
-  pppos_pcb *pppos = (pppos_pcb *)ctx;
-  PPPOS_DECL_PROTECT(lev);
-  LWIP_UNUSED_ARG(ppp);
-  LWIP_UNUSED_ARG(pcomp);
-  LWIP_UNUSED_ARG(accomp);
-
-  /* Load the ACCM bits for the 32 control codes. */
-  PPPOS_PROTECT(lev);
-  for (i = 0; i < 32 / 8; i++) {
-    pppos->in_accm[i] = (u8_t)(accm >> (i * 8));
-  }
-  PPPOS_UNPROTECT(lev);
-
-  PPPDEBUG(LOG_INFO, ("pppos_recv_config[%d]: in_accm=%X %X %X %X\n",
-            pppos->ppp->netif->num,
-            pppos->in_accm[0], pppos->in_accm[1], pppos->in_accm[2], pppos->in_accm[3]));
-}
-
-/*
- * Drop the input packet.
- */
-static void
-pppos_input_free_current_packet(pppos_pcb *pppos)
-{
-  if (pppos->in_head != NULL) {
-    if (pppos->in_tail && (pppos->in_tail != pppos->in_head)) {
-      pbuf_free(pppos->in_tail);
-    }
-    pbuf_free(pppos->in_head);
-    pppos->in_head = NULL;
-  }
-  pppos->in_tail = NULL;
-}
-
-/*
- * Drop the input packet and increase error counters.
- */
-static void
-pppos_input_drop(pppos_pcb *pppos)
-{
-  if (pppos->in_head != NULL) {
-#if 0
-    PPPDEBUG(LOG_INFO, ("pppos_input_drop: %d:%.*H\n", pppos->in_head->len, min(60, pppos->in_head->len * 2), pppos->in_head->payload));
-#endif
-    PPPDEBUG(LOG_INFO, ("pppos_input_drop: pbuf len=%d, addr %p\n", pppos->in_head->len, (void*)pppos->in_head));
-  }
-  pppos_input_free_current_packet(pppos);
-#if VJ_SUPPORT && LWIP_TCP
-  vj_uncompress_err(&pppos->ppp->vj_comp);
-#endif /* VJ_SUPPORT && LWIP_TCP */
-
-  LINK_STATS_INC(link.drop);
-  MIB2_STATS_NETIF_INC(pppos->ppp->netif, ifindiscards);
-}
-
-/*
- * pppos_output_append - append given character to end of given pbuf.
- * If out_accm is not 0 and the character needs to be escaped, do so.
- * If pbuf is full, send the pbuf and reuse it.
- * Return the current pbuf.
- */
-static err_t
-pppos_output_append(pppos_pcb *pppos, err_t err, struct pbuf *nb, u8_t c, u8_t accm, u16_t *fcs)
-{
-  if (err != ERR_OK) {
-    return err;
-  }
-
-  /* Make sure there is room for the character and an escape code.
-   * Sure we don't quite fill the buffer if the character doesn't
-   * get escaped but is one character worth complicating this? */
-  if ((PBUF_POOL_BUFSIZE - nb->len) < 2) {
-    u32_t l = pppos->output_cb(pppos->ppp, (u8_t*)nb->payload, nb->len, pppos->ppp->ctx_cb);
-    if (l != nb->len) {
-      return ERR_IF;
-    }
-    nb->len = 0;
-  }
-
-  /* Update FCS before checking for special characters. */
-  if (fcs) {
-    *fcs = PPP_FCS(*fcs, c);
-  }
-
-  /* Copy to output buffer escaping special characters. */
-  if (accm && ESCAPE_P(pppos->out_accm, c)) {
-    *((u8_t*)nb->payload + nb->len++) = PPP_ESCAPE;
-    *((u8_t*)nb->payload + nb->len++) = c ^ PPP_TRANS;
-  } else {
-    *((u8_t*)nb->payload + nb->len++) = c;
-  }
-
-  return ERR_OK;
-}
-
-static err_t
-pppos_output_last(pppos_pcb *pppos, err_t err, struct pbuf *nb, u16_t *fcs)
-{
-  ppp_pcb *ppp = pppos->ppp;
-
-  /* Add FCS and trailing flag. */
-  err = pppos_output_append(pppos, err,  nb, ~(*fcs) & 0xFF, 1, NULL);
-  err = pppos_output_append(pppos, err,  nb, (~(*fcs) >> 8) & 0xFF, 1, NULL);
-  err = pppos_output_append(pppos, err,  nb, PPP_FLAG, 0, NULL);
-
-  if (err != ERR_OK) {
-    goto failed;
-  }
-
-  /* Send remaining buffer if not empty */
-  if (nb->len > 0) {
-    u32_t l = pppos->output_cb(ppp, (u8_t*)nb->payload, nb->len, ppp->ctx_cb);
-    if (l != nb->len) {
-      err = ERR_IF;
-      goto failed;
-    }
-  }
-
-  pppos->last_xmit = sys_now();
-  MIB2_STATS_NETIF_ADD(ppp->netif, ifoutoctets, nb->tot_len);
-  MIB2_STATS_NETIF_INC(ppp->netif, ifoutucastpkts);
-  LINK_STATS_INC(link.xmit);
-  pbuf_free(nb);
-  return ERR_OK;
-
-failed:
-  pppos->last_xmit = 0; /* prepend PPP_FLAG to next packet */
-  LINK_STATS_INC(link.err);
-  LINK_STATS_INC(link.drop);
-  MIB2_STATS_NETIF_INC(ppp->netif, ifoutdiscards);
-  pbuf_free(nb);
-  return err;
-}
-
-#endif /* PPP_SUPPORT && PPPOS_SUPPORT */
diff --git a/components/lwip/netif/ppp/upap.c b/components/lwip/netif/ppp/upap.c
deleted file mode 100644 (file)
index 470303a..0000000
+++ /dev/null
@@ -1,677 +0,0 @@
-/*
- * upap.c - User/Password Authentication Protocol.
- *
- * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The name "Carnegie Mellon University" must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission. For permission or any legal
- *    details, please contact
- *      Office of Technology Transfer
- *      Carnegie Mellon University
- *      5000 Forbes Avenue
- *      Pittsburgh, PA  15213-3890
- *      (412) 268-4387, fax: (412) 268-7395
- *      tech-transfer@andrew.cmu.edu
- *
- * 4. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by Computing Services
- *     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
- *
- * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
- * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && PAP_SUPPORT  /* don't build if not configured for use in lwipopts.h */
-
-/*
- * TODO:
- */
-
-#if 0 /* UNUSED */
-#include <stdio.h>
-#include <string.h>
-#endif /* UNUSED */
-
-#include "netif/ppp/ppp_impl.h"
-
-#include "netif/ppp/upap.h"
-
-#if PPP_OPTIONS
-/*
- * Command-line options.
- */
-static option_t pap_option_list[] = {
-    { "hide-password", o_bool, &hide_password,
-      "Don't output passwords to log", OPT_PRIO | 1 },
-    { "show-password", o_bool, &hide_password,
-      "Show password string in debug log messages", OPT_PRIOSUB | 0 },
-
-    { "pap-restart", o_int, &upap[0].us_timeouttime,
-      "Set retransmit timeout for PAP", OPT_PRIO },
-    { "pap-max-authreq", o_int, &upap[0].us_maxtransmits,
-      "Set max number of transmissions for auth-reqs", OPT_PRIO },
-    { "pap-timeout", o_int, &upap[0].us_reqtimeout,
-      "Set time limit for peer PAP authentication", OPT_PRIO },
-
-    { NULL }
-};
-#endif /* PPP_OPTIONS */
-
-/*
- * Protocol entry points.
- */
-static void upap_init(ppp_pcb *pcb);
-static void upap_lowerup(ppp_pcb *pcb);
-static void upap_lowerdown(ppp_pcb *pcb);
-static void upap_input(ppp_pcb *pcb, u_char *inpacket, int l);
-static void upap_protrej(ppp_pcb *pcb);
-#if PRINTPKT_SUPPORT
-static int upap_printpkt(const u_char *p, int plen, void (*printer) (void *, const char *, ...), void *arg);
-#endif /* PRINTPKT_SUPPORT */
-
-const struct protent pap_protent = {
-    PPP_PAP,
-    upap_init,
-    upap_input,
-    upap_protrej,
-    upap_lowerup,
-    upap_lowerdown,
-    NULL,
-    NULL,
-#if PRINTPKT_SUPPORT
-    upap_printpkt,
-#endif /* PRINTPKT_SUPPORT */
-#if PPP_DATAINPUT
-    NULL,
-#endif /* PPP_DATAINPUT */
-#if PRINTPKT_SUPPORT
-    "PAP",
-    NULL,
-#endif /* PRINTPKT_SUPPORT */
-#if PPP_OPTIONS
-    pap_option_list,
-    NULL,
-#endif /* PPP_OPTIONS */
-#if DEMAND_SUPPORT
-    NULL,
-    NULL
-#endif /* DEMAND_SUPPORT */
-};
-
-static void upap_timeout(void *arg);
-#if PPP_SERVER
-static void upap_reqtimeout(void *arg);
-static void upap_rauthreq(ppp_pcb *pcb, u_char *inp, int id, int len);
-#endif /* PPP_SERVER */
-static void upap_rauthack(ppp_pcb *pcb, u_char *inp, int id, int len);
-static void upap_rauthnak(ppp_pcb *pcb, u_char *inp, int id, int len);
-static void upap_sauthreq(ppp_pcb *pcb);
-#if PPP_SERVER
-static void upap_sresp(ppp_pcb *pcb, u_char code, u_char id, const char *msg, int msglen);
-#endif /* PPP_SERVER */
-
-
-/*
- * upap_init - Initialize a UPAP unit.
- */
-static void upap_init(ppp_pcb *pcb) {
-    pcb->upap.us_user = NULL;
-    pcb->upap.us_userlen = 0;
-    pcb->upap.us_passwd = NULL;
-    pcb->upap.us_passwdlen = 0;
-    pcb->upap.us_clientstate = UPAPCS_INITIAL;
-#if PPP_SERVER
-    pcb->upap.us_serverstate = UPAPSS_INITIAL;
-#endif /* PPP_SERVER */
-    pcb->upap.us_id = 0;
-}
-
-
-/*
- * upap_authwithpeer - Authenticate us with our peer (start client).
- *
- * Set new state and send authenticate's.
- */
-void upap_authwithpeer(ppp_pcb *pcb, const char *user, const char *password) {
-
-    if(!user || !password)
-        return;
-
-    /* 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_passwd = password;
-    pcb->upap.us_passwdlen = LWIP_MIN(strlen(password), 0xff);
-    pcb->upap.us_transmits = 0;
-
-    /* Lower layer up yet? */
-    if (pcb->upap.us_clientstate == UPAPCS_INITIAL ||
-       pcb->upap.us_clientstate == UPAPCS_PENDING) {
-       pcb->upap.us_clientstate = UPAPCS_PENDING;
-       return;
-    }
-
-    upap_sauthreq(pcb);                /* Start protocol */
-}
-
-#if PPP_SERVER
-/*
- * upap_authpeer - Authenticate our peer (start server).
- *
- * Set new state.
- */
-void upap_authpeer(ppp_pcb *pcb) {
-
-    /* Lower layer up yet? */
-    if (pcb->upap.us_serverstate == UPAPSS_INITIAL ||
-       pcb->upap.us_serverstate == UPAPSS_PENDING) {
-       pcb->upap.us_serverstate = UPAPSS_PENDING;
-       return;
-    }
-
-    pcb->upap.us_serverstate = UPAPSS_LISTEN;
-    if (pcb->settings.pap_req_timeout > 0)
-       TIMEOUT(upap_reqtimeout, pcb, pcb->settings.pap_req_timeout);
-}
-#endif /* PPP_SERVER */
-
-/*
- * upap_timeout - Retransmission timer for sending auth-reqs expired.
- */
-static void upap_timeout(void *arg) {
-    ppp_pcb *pcb = (ppp_pcb*)arg;
-
-    if (pcb->upap.us_clientstate != UPAPCS_AUTHREQ)
-       return;
-
-    if (pcb->upap.us_transmits >= pcb->settings.pap_max_transmits) {
-       /* give up in disgust */
-       ppp_error("No response to PAP authenticate-requests");
-       pcb->upap.us_clientstate = UPAPCS_BADAUTH;
-       auth_withpeer_fail(pcb, PPP_PAP);
-       return;
-    }
-
-    upap_sauthreq(pcb);                /* Send Authenticate-Request */
-}
-
-
-#if PPP_SERVER
-/*
- * upap_reqtimeout - Give up waiting for the peer to send an auth-req.
- */
-static void upap_reqtimeout(void *arg) {
-    ppp_pcb *pcb = (ppp_pcb*)arg;
-
-    if (pcb->upap.us_serverstate != UPAPSS_LISTEN)
-       return;                 /* huh?? */
-
-    auth_peer_fail(pcb, PPP_PAP);
-    pcb->upap.us_serverstate = UPAPSS_BADAUTH;
-}
-#endif /* PPP_SERVER */
-
-
-/*
- * upap_lowerup - The lower layer is up.
- *
- * Start authenticating if pending.
- */
-static void upap_lowerup(ppp_pcb *pcb) {
-
-    if (pcb->upap.us_clientstate == UPAPCS_INITIAL)
-       pcb->upap.us_clientstate = UPAPCS_CLOSED;
-    else if (pcb->upap.us_clientstate == UPAPCS_PENDING) {
-       upap_sauthreq(pcb);     /* send an auth-request */
-    }
-
-#if PPP_SERVER
-    if (pcb->upap.us_serverstate == UPAPSS_INITIAL)
-       pcb->upap.us_serverstate = UPAPSS_CLOSED;
-    else if (pcb->upap.us_serverstate == UPAPSS_PENDING) {
-       pcb->upap.us_serverstate = UPAPSS_LISTEN;
-       if (pcb->settings.pap_req_timeout > 0)
-           TIMEOUT(upap_reqtimeout, pcb, pcb->settings.pap_req_timeout);
-    }
-#endif /* PPP_SERVER */
-}
-
-
-/*
- * upap_lowerdown - The lower layer is down.
- *
- * Cancel all timeouts.
- */
-static void upap_lowerdown(ppp_pcb *pcb) {
-
-    if (pcb->upap.us_clientstate == UPAPCS_AUTHREQ)    /* Timeout pending? */
-       UNTIMEOUT(upap_timeout, pcb);           /* Cancel timeout */
-#if PPP_SERVER
-    if (pcb->upap.us_serverstate == UPAPSS_LISTEN && pcb->settings.pap_req_timeout > 0)
-       UNTIMEOUT(upap_reqtimeout, pcb);
-#endif /* PPP_SERVER */
-
-    pcb->upap.us_clientstate = UPAPCS_INITIAL;
-#if PPP_SERVER
-    pcb->upap.us_serverstate = UPAPSS_INITIAL;
-#endif /* PPP_SERVER */
-}
-
-
-/*
- * upap_protrej - Peer doesn't speak this protocol.
- *
- * This shouldn't happen.  In any case, pretend lower layer went down.
- */
-static void upap_protrej(ppp_pcb *pcb) {
-
-    if (pcb->upap.us_clientstate == UPAPCS_AUTHREQ) {
-       ppp_error("PAP authentication failed due to protocol-reject");
-       auth_withpeer_fail(pcb, PPP_PAP);
-    }
-#if PPP_SERVER
-    if (pcb->upap.us_serverstate == UPAPSS_LISTEN) {
-       ppp_error("PAP authentication of peer failed (protocol-reject)");
-       auth_peer_fail(pcb, PPP_PAP);
-    }
-#endif /* PPP_SERVER */
-    upap_lowerdown(pcb);
-}
-
-
-/*
- * upap_input - Input UPAP packet.
- */
-static void upap_input(ppp_pcb *pcb, u_char *inpacket, int l) {
-    u_char *inp;
-    u_char code, id;
-    int len;
-
-    /*
-     * Parse header (code, id and length).
-     * If packet too short, drop it.
-     */
-    inp = inpacket;
-    if (l < UPAP_HEADERLEN) {
-       UPAPDEBUG(("pap_input: rcvd short header."));
-       return;
-    }
-    GETCHAR(code, inp);
-    GETCHAR(id, inp);
-    GETSHORT(len, inp);
-    if (len < UPAP_HEADERLEN) {
-       UPAPDEBUG(("pap_input: rcvd illegal length."));
-       return;
-    }
-    if (len > l) {
-       UPAPDEBUG(("pap_input: rcvd short packet."));
-       return;
-    }
-    len -= UPAP_HEADERLEN;
-
-    /*
-     * Action depends on code.
-     */
-    switch (code) {
-    case UPAP_AUTHREQ:
-#if PPP_SERVER
-       upap_rauthreq(pcb, inp, id, len);
-#endif /* PPP_SERVER */
-       break;
-
-    case UPAP_AUTHACK:
-       upap_rauthack(pcb, inp, id, len);
-       break;
-
-    case UPAP_AUTHNAK:
-       upap_rauthnak(pcb, inp, id, len);
-       break;
-
-    default:                           /* XXX Need code reject */
-       break;
-    }
-}
-
-#if PPP_SERVER
-/*
- * upap_rauth - Receive Authenticate.
- */
-static void upap_rauthreq(ppp_pcb *pcb, u_char *inp, int id, int len) {
-    u_char ruserlen, rpasswdlen;
-    char *ruser;
-    char *rpasswd;
-    char rhostname[256];
-    int retcode;
-    const char *msg;
-    int msglen;
-
-    if (pcb->upap.us_serverstate < UPAPSS_LISTEN)
-       return;
-
-    /*
-     * If we receive a duplicate authenticate-request, we are
-     * supposed to return the same status as for the first request.
-     */
-    if (pcb->upap.us_serverstate == UPAPSS_OPEN) {
-       upap_sresp(pcb, UPAP_AUTHACK, id, "", 0);       /* return auth-ack */
-       return;
-    }
-    if (pcb->upap.us_serverstate == UPAPSS_BADAUTH) {
-       upap_sresp(pcb, UPAP_AUTHNAK, id, "", 0);       /* return auth-nak */
-       return;
-    }
-
-    /*
-     * Parse user/passwd.
-     */
-    if (len < 1) {
-       UPAPDEBUG(("pap_rauth: rcvd short packet."));
-       return;
-    }
-    GETCHAR(ruserlen, inp);
-    len -= sizeof (u_char) + ruserlen + sizeof (u_char);
-    if (len < 0) {
-       UPAPDEBUG(("pap_rauth: rcvd short packet."));
-       return;
-    }
-    ruser = (char *) inp;
-    INCPTR(ruserlen, inp);
-    GETCHAR(rpasswdlen, inp);
-    if (len < rpasswdlen) {
-       UPAPDEBUG(("pap_rauth: rcvd short packet."));
-       return;
-    }
-
-    rpasswd = (char *) inp;
-
-    /*
-     * Check the username and password given.
-     */
-    retcode = UPAP_AUTHNAK;
-    if (auth_check_passwd(pcb, ruser, ruserlen, rpasswd, rpasswdlen, &msg, &msglen)) {
-      retcode = UPAP_AUTHACK;
-    }
-    BZERO(rpasswd, rpasswdlen);
-
-#if 0 /* UNUSED */
-    /*
-     * Check remote number authorization.  A plugin may have filled in
-     * the remote number or added an allowed number, and rather than
-     * return an authenticate failure, is leaving it for us to verify.
-     */
-    if (retcode == UPAP_AUTHACK) {
-       if (!auth_number()) {
-           /* We do not want to leak info about the pap result. */
-           retcode = UPAP_AUTHNAK; /* XXX exit value will be "wrong" */
-           warn("calling number %q is not authorized", remote_number);
-       }
-    }
-
-    msglen = strlen(msg);
-    if (msglen > 255)
-       msglen = 255;
-#endif /* UNUSED */
-
-    upap_sresp(pcb, retcode, id, msg, msglen);
-
-    /* Null terminate and clean remote name. */
-    ppp_slprintf(rhostname, sizeof(rhostname), "%.*v", ruserlen, ruser);
-
-    if (retcode == UPAP_AUTHACK) {
-       pcb->upap.us_serverstate = UPAPSS_OPEN;
-       ppp_notice("PAP peer authentication succeeded for %q", rhostname);
-       auth_peer_success(pcb, PPP_PAP, 0, ruser, ruserlen);
-    } else {
-       pcb->upap.us_serverstate = UPAPSS_BADAUTH;
-       ppp_warn("PAP peer authentication failed for %q", rhostname);
-       auth_peer_fail(pcb, PPP_PAP);
-    }
-
-    if (pcb->settings.pap_req_timeout > 0)
-       UNTIMEOUT(upap_reqtimeout, pcb);
-}
-#endif /* PPP_SERVER */
-
-/*
- * upap_rauthack - Receive Authenticate-Ack.
- */
-static void upap_rauthack(ppp_pcb *pcb, u_char *inp, int id, int len) {
-    u_char msglen;
-    char *msg;
-    LWIP_UNUSED_ARG(id);
-
-    if (pcb->upap.us_clientstate != UPAPCS_AUTHREQ) /* XXX */
-       return;
-
-    /*
-     * Parse message.
-     */
-    if (len < 1) {
-       UPAPDEBUG(("pap_rauthack: ignoring missing msg-length."));
-    } else {
-       GETCHAR(msglen, inp);
-       if (msglen > 0) {
-           len -= sizeof (u_char);
-           if (len < msglen) {
-               UPAPDEBUG(("pap_rauthack: rcvd short packet."));
-               return;
-           }
-           msg = (char *) inp;
-           PRINTMSG(msg, msglen);
-       }
-    }
-
-    pcb->upap.us_clientstate = UPAPCS_OPEN;
-
-    auth_withpeer_success(pcb, PPP_PAP, 0);
-}
-
-
-/*
- * upap_rauthnak - Receive Authenticate-Nak.
- */
-static void upap_rauthnak(ppp_pcb *pcb, u_char *inp, int id, int len) {
-    u_char msglen;
-    char *msg;
-    LWIP_UNUSED_ARG(id);
-
-    if (pcb->upap.us_clientstate != UPAPCS_AUTHREQ) /* XXX */
-       return;
-
-    /*
-     * Parse message.
-     */
-    if (len < 1) {
-       UPAPDEBUG(("pap_rauthnak: ignoring missing msg-length."));
-    } else {
-       GETCHAR(msglen, inp);
-       if (msglen > 0) {
-           len -= sizeof (u_char);
-           if (len < msglen) {
-               UPAPDEBUG(("pap_rauthnak: rcvd short packet."));
-               return;
-           }
-           msg = (char *) inp;
-           PRINTMSG(msg, msglen);
-       }
-    }
-
-    pcb->upap.us_clientstate = UPAPCS_BADAUTH;
-
-    ppp_error("PAP authentication failed");
-    auth_withpeer_fail(pcb, PPP_PAP);
-}
-
-
-/*
- * upap_sauthreq - Send an Authenticate-Request.
- */
-static void upap_sauthreq(ppp_pcb *pcb) {
-    struct pbuf *p;
-    u_char *outp;
-    int outlen;
-
-    outlen = UPAP_HEADERLEN + 2 * sizeof (u_char) +
-       pcb->upap.us_userlen + pcb->upap.us_passwdlen;
-    p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN +outlen), PPP_CTRL_PBUF_TYPE);
-    if(NULL == p)
-        return;
-    if(p->tot_len != p->len) {
-        pbuf_free(p);
-        return;
-    }
-
-    outp = (u_char*)p->payload;
-    MAKEHEADER(outp, PPP_PAP);
-
-    PUTCHAR(UPAP_AUTHREQ, outp);
-    PUTCHAR(++pcb->upap.us_id, outp);
-    PUTSHORT(outlen, outp);
-    PUTCHAR(pcb->upap.us_userlen, outp);
-    MEMCPY(outp, pcb->upap.us_user, pcb->upap.us_userlen);
-    INCPTR(pcb->upap.us_userlen, outp);
-    PUTCHAR(pcb->upap.us_passwdlen, outp);
-    MEMCPY(outp, pcb->upap.us_passwd, pcb->upap.us_passwdlen);
-
-    ppp_write(pcb, p);
-
-    TIMEOUT(upap_timeout, pcb, pcb->settings.pap_timeout_time);
-    ++pcb->upap.us_transmits;
-    pcb->upap.us_clientstate = UPAPCS_AUTHREQ;
-}
-
-#if PPP_SERVER
-/*
- * upap_sresp - Send a response (ack or nak).
- */
-static void upap_sresp(ppp_pcb *pcb, u_char code, u_char id, const char *msg, int msglen) {
-    struct pbuf *p;
-    u_char *outp;
-    int outlen;
-
-    outlen = UPAP_HEADERLEN + sizeof (u_char) + msglen;
-    p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN +outlen), PPP_CTRL_PBUF_TYPE);
-    if(NULL == p)
-        return;
-    if(p->tot_len != p->len) {
-        pbuf_free(p);
-        return;
-    }
-
-    outp = (u_char*)p->payload;
-    MAKEHEADER(outp, PPP_PAP);
-
-    PUTCHAR(code, outp);
-    PUTCHAR(id, outp);
-    PUTSHORT(outlen, outp);
-    PUTCHAR(msglen, outp);
-    MEMCPY(outp, msg, msglen);
-
-    ppp_write(pcb, p);
-}
-#endif /* PPP_SERVER */
-
-#if PRINTPKT_SUPPORT
-/*
- * upap_printpkt - print the contents of a PAP packet.
- */
-static const char* const upap_codenames[] = {
-    "AuthReq", "AuthAck", "AuthNak"
-};
-
-static int upap_printpkt(const u_char *p, int plen, void (*printer) (void *, const char *, ...), void *arg) {
-    int code, id, len;
-    int mlen, ulen, wlen;
-    const u_char *user, *pwd, *msg;
-    const u_char *pstart;
-
-    if (plen < UPAP_HEADERLEN)
-       return 0;
-    pstart = p;
-    GETCHAR(code, p);
-    GETCHAR(id, p);
-    GETSHORT(len, p);
-    if (len < UPAP_HEADERLEN || len > plen)
-       return 0;
-
-    if (code >= 1 && code <= (int)sizeof(upap_codenames) / (int)sizeof(char *))
-       printer(arg, " %s", upap_codenames[code-1]);
-    else
-       printer(arg, " code=0x%x", code);
-    printer(arg, " id=0x%x", id);
-    len -= UPAP_HEADERLEN;
-    switch (code) {
-    case UPAP_AUTHREQ:
-       if (len < 1)
-           break;
-       ulen = p[0];
-       if (len < ulen + 2)
-           break;
-       wlen = p[ulen + 1];
-       if (len < ulen + wlen + 2)
-           break;
-       user = (const u_char *) (p + 1);
-       pwd = (const u_char *) (p + ulen + 2);
-       p += ulen + wlen + 2;
-       len -= ulen + wlen + 2;
-       printer(arg, " user=");
-       ppp_print_string(user, ulen, printer, arg);
-       printer(arg, " password=");
-/* FIXME: require ppp_pcb struct as printpkt() argument */
-#if 0
-       if (!pcb->settings.hide_password)
-#endif
-           ppp_print_string(pwd, wlen, printer, arg);
-#if 0
-       else
-           printer(arg, "<hidden>");
-#endif
-       break;
-    case UPAP_AUTHACK:
-    case UPAP_AUTHNAK:
-       if (len < 1)
-           break;
-       mlen = p[0];
-       if (len < mlen + 1)
-           break;
-       msg = (const u_char *) (p + 1);
-       p += mlen + 1;
-       len -= mlen + 1;
-       printer(arg, " ");
-       ppp_print_string(msg, mlen, printer, arg);
-       break;
-    default:
-       break;
-    }
-
-    /* print the rest of the bytes in the packet */
-    for (; len > 0; --len) {
-       GETCHAR(code, p);
-       printer(arg, " %.2x", code);
-    }
-
-    return p - pstart;
-}
-#endif /* PRINTPKT_SUPPORT */
-
-#endif /* PPP_SUPPORT && PAP_SUPPORT */
diff --git a/components/lwip/netif/ppp/utils.c b/components/lwip/netif/ppp/utils.c
deleted file mode 100644 (file)
index c1d797a..0000000
+++ /dev/null
@@ -1,961 +0,0 @@
-/*
- * utils.c - various utility functions used in pppd.
- *
- * Copyright (c) 1999-2002 Paul Mackerras. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. The name(s) of the authors of this software must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission.
- *
- * 3. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by Paul Mackerras
- *     <paulus@samba.org>".
- *
- * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */
-
-#if 0 /* UNUSED */
-#include <stdio.h>
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <signal.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <syslog.h>
-#include <netdb.h>
-#include <time.h>
-#include <utmp.h>
-#include <pwd.h>
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-#include <sys/stat.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#ifdef SVR4
-#include <sys/mkdev.h>
-#endif
-#endif /* UNUSED */
-
-#include <ctype.h>  /* isdigit() */
-
-#include "netif/ppp/ppp_impl.h"
-
-#include "netif/ppp/fsm.h"
-#include "netif/ppp/lcp.h"
-
-#if defined(SUNOS4)
-extern char *strerror();
-#endif
-
-static void ppp_logit(int level, const char *fmt, va_list args);
-static void ppp_log_write(int level, char *buf);
-#if PRINTPKT_SUPPORT
-static void ppp_vslp_printer(void *arg, const char *fmt, ...);
-static void ppp_format_packet(const u_char *p, int len,
-               void (*printer) (void *, const char *, ...), void *arg);
-
-struct buffer_info {
-    char *ptr;
-    int len;
-};
-#endif /* PRINTPKT_SUPPORT */
-
-/*
- * ppp_strlcpy - like strcpy/strncpy, doesn't overflow destination buffer,
- * always leaves destination null-terminated (for len > 0).
- */
-size_t ppp_strlcpy(char *dest, const char *src, size_t len) {
-    size_t ret = strlen(src);
-
-    if (len != 0) {
-       if (ret < len)
-           strcpy(dest, src);
-       else {
-           strncpy(dest, src, len - 1);
-           dest[len-1] = 0;
-       }
-    }
-    return ret;
-}
-
-/*
- * ppp_strlcat - like strcat/strncat, doesn't overflow destination buffer,
- * always leaves destination null-terminated (for len > 0).
- */
-size_t ppp_strlcat(char *dest, const char *src, size_t len) {
-    size_t dlen = strlen(dest);
-
-    return dlen + ppp_strlcpy(dest + dlen, src, (len > dlen? len - dlen: 0));
-}
-
-
-/*
- * ppp_slprintf - format a message into a buffer.  Like sprintf except we
- * also specify the length of the output buffer, and we handle
- * %m (error message), %v (visible string),
- * %q (quoted string), %t (current time) and %I (IP address) formats.
- * Doesn't do floating-point formats.
- * Returns the number of chars put into buf.
- */
-int ppp_slprintf(char *buf, int buflen, const char *fmt, ...) {
-    va_list args;
-    int n;
-
-    va_start(args, fmt);
-    n = ppp_vslprintf(buf, buflen, fmt, args);
-    va_end(args);
-    return n;
-}
-
-/*
- * ppp_vslprintf - like ppp_slprintf, takes a va_list instead of a list of args.
- */
-#define OUTCHAR(c)     (buflen > 0? (--buflen, *buf++ = (c)): 0)
-
-int ppp_vslprintf(char *buf, int buflen, const char *fmt, va_list args) {
-    int c, i, n;
-    int width, prec, fillch;
-    int base, len, neg, quoted;
-    unsigned long val = 0;
-    const char *f;
-    char *str, *buf0;
-    const unsigned char *p;
-    char num[32];
-#if 0 /* need port */
-    time_t t;
-#endif /* need port */
-    u32_t ip;
-    static char hexchars[] = "0123456789abcdef";
-#if PRINTPKT_SUPPORT
-    struct buffer_info bufinfo;
-#endif /* PRINTPKT_SUPPORT */
-
-    buf0 = buf;
-    --buflen;
-    while (buflen > 0) {
-       for (f = fmt; *f != '%' && *f != 0; ++f)
-           ;
-       if (f > fmt) {
-           len = f - fmt;
-           if (len > buflen)
-               len = buflen;
-           memcpy(buf, fmt, len);
-           buf += len;
-           buflen -= len;
-           fmt = f;
-       }
-       if (*fmt == 0)
-           break;
-       c = *++fmt;
-       width = 0;
-       prec = -1;
-       fillch = ' ';
-       if (c == '0') {
-           fillch = '0';
-           c = *++fmt;
-       }
-       if (c == '*') {
-           width = va_arg(args, int);
-           c = *++fmt;
-       } else {
-           while (isdigit(c)) {
-               width = width * 10 + c - '0';
-               c = *++fmt;
-           }
-       }
-       if (c == '.') {
-           c = *++fmt;
-           if (c == '*') {
-               prec = va_arg(args, int);
-               c = *++fmt;
-           } else {
-               prec = 0;
-               while (isdigit(c)) {
-                   prec = prec * 10 + c - '0';
-                   c = *++fmt;
-               }
-           }
-       }
-       str = 0;
-       base = 0;
-       neg = 0;
-       ++fmt;
-       switch (c) {
-       case 'l':
-           c = *fmt++;
-           switch (c) {
-           case 'd':
-               val = va_arg(args, long);
-               if ((long)val < 0) {
-                   neg = 1;
-                   val = (unsigned long)-(long)val;
-               }
-               base = 10;
-               break;
-           case 'u':
-               val = va_arg(args, unsigned long);
-               base = 10;
-               break;
-           default:
-               OUTCHAR('%');
-               OUTCHAR('l');
-               --fmt;          /* so %lz outputs %lz etc. */
-               continue;
-           }
-           break;
-       case 'd':
-           i = va_arg(args, int);
-           if (i < 0) {
-               neg = 1;
-               val = -i;
-           } else
-               val = i;
-           base = 10;
-           break;
-       case 'u':
-           val = va_arg(args, unsigned int);
-           base = 10;
-           break;
-       case 'o':
-           val = va_arg(args, unsigned int);
-           base = 8;
-           break;
-       case 'x':
-       case 'X':
-           val = va_arg(args, unsigned int);
-           base = 16;
-           break;
-       case 'p':
-           val = (unsigned long) va_arg(args, void *);
-           base = 16;
-           neg = 2;
-           break;
-       case 's':
-           str = va_arg(args, char *);
-           break;
-       case 'c':
-           num[0] = va_arg(args, int);
-           num[1] = 0;
-           str = num;
-           break;
-#if 0 /* do we always have strerror() in embedded ? */
-       case 'm':
-           str = strerror(errno);
-           break;
-#endif /* do we always have strerror() in embedded ? */
-       case 'I':
-           ip = va_arg(args, u32_t);
-           ip = ntohl(ip);
-           ppp_slprintf(num, sizeof(num), "%d.%d.%d.%d", (ip >> 24) & 0xff,
-                    (ip >> 16) & 0xff, (ip >> 8) & 0xff, ip & 0xff);
-           str = num;
-           break;
-#if 0 /* need port */
-       case 't':
-           time(&t);
-           str = ctime(&t);
-           str += 4;           /* chop off the day name */
-           str[15] = 0;        /* chop off year and newline */
-           break;
-#endif /* need port */
-       case 'v':               /* "visible" string */
-       case 'q':               /* quoted string */
-           quoted = c == 'q';
-           p = va_arg(args, unsigned char *);
-           if (p == NULL)
-               p = (const unsigned char *)"<NULL>";
-           if (fillch == '0' && prec >= 0) {
-               n = prec;
-           } else {
-               n = strlen((const char *)p);
-               if (prec >= 0 && n > prec)
-                   n = prec;
-           }
-           while (n > 0 && buflen > 0) {
-               c = *p++;
-               --n;
-               if (!quoted && c >= 0x80) {
-                   OUTCHAR('M');
-                   OUTCHAR('-');
-                   c -= 0x80;
-               }
-               if (quoted && (c == '"' || c == '\\'))
-                   OUTCHAR('\\');
-               if (c < 0x20 || (0x7f <= c && c < 0xa0)) {
-                   if (quoted) {
-                       OUTCHAR('\\');
-                       switch (c) {
-                       case '\t':      OUTCHAR('t');   break;
-                       case '\n':      OUTCHAR('n');   break;
-                       case '\b':      OUTCHAR('b');   break;
-                       case '\f':      OUTCHAR('f');   break;
-                       default:
-                           OUTCHAR('x');
-                           OUTCHAR(hexchars[c >> 4]);
-                           OUTCHAR(hexchars[c & 0xf]);
-                       }
-                   } else {
-                       if (c == '\t')
-                           OUTCHAR(c);
-                       else {
-                           OUTCHAR('^');
-                           OUTCHAR(c ^ 0x40);
-                       }
-                   }
-               } else
-                   OUTCHAR(c);
-           }
-           continue;
-#if PRINTPKT_SUPPORT
-       case 'P':               /* print PPP packet */
-           bufinfo.ptr = buf;
-           bufinfo.len = buflen + 1;
-           p = va_arg(args, unsigned char *);
-           n = va_arg(args, int);
-           ppp_format_packet(p, n, ppp_vslp_printer, &bufinfo);
-           buf = bufinfo.ptr;
-           buflen = bufinfo.len - 1;
-           continue;
-#endif /* PRINTPKT_SUPPORT */
-       case 'B':
-           p = va_arg(args, unsigned char *);
-           for (n = prec; n > 0; --n) {
-               c = *p++;
-               if (fillch == ' ')
-                   OUTCHAR(' ');
-               OUTCHAR(hexchars[(c >> 4) & 0xf]);
-               OUTCHAR(hexchars[c & 0xf]);
-           }
-           continue;
-       default:
-           *buf++ = '%';
-           if (c != '%')
-               --fmt;          /* so %z outputs %z etc. */
-           --buflen;
-           continue;
-       }
-       if (base != 0) {
-           str = num + sizeof(num);
-           *--str = 0;
-           while (str > num + neg) {
-               *--str = hexchars[val % base];
-               val = val / base;
-               if (--prec <= 0 && val == 0)
-                   break;
-           }
-           switch (neg) {
-           case 1:
-               *--str = '-';
-               break;
-           case 2:
-               *--str = 'x';
-               *--str = '0';
-               break;
-           default:
-               break;
-           }
-           len = num + sizeof(num) - 1 - str;
-       } else {
-           len = strlen(str);
-           if (prec >= 0 && len > prec)
-               len = prec;
-       }
-       if (width > 0) {
-           if (width > buflen)
-               width = buflen;
-           if ((n = width - len) > 0) {
-               buflen -= n;
-               for (; n > 0; --n)
-                   *buf++ = fillch;
-           }
-       }
-       if (len > buflen)
-           len = buflen;
-       memcpy(buf, str, len);
-       buf += len;
-       buflen -= len;
-    }
-    *buf = 0;
-    return buf - buf0;
-}
-
-#if PRINTPKT_SUPPORT
-/*
- * vslp_printer - used in processing a %P format
- */
-static void ppp_vslp_printer(void *arg, const char *fmt, ...) {
-    int n;
-    va_list pvar;
-    struct buffer_info *bi;
-
-    va_start(pvar, fmt);
-    bi = (struct buffer_info *) arg;
-    n = ppp_vslprintf(bi->ptr, bi->len, fmt, pvar);
-    va_end(pvar);
-
-    bi->ptr += n;
-    bi->len -= n;
-}
-#endif /* PRINTPKT_SUPPORT */
-
-#if 0 /* UNUSED */
-/*
- * log_packet - format a packet and log it.
- */
-
-void
-log_packet(p, len, prefix, level)
-    u_char *p;
-    int len;
-    char *prefix;
-    int level;
-{
-       init_pr_log(prefix, level);
-       ppp_format_packet(p, len, pr_log, &level);
-       end_pr_log();
-}
-#endif /* UNUSED */
-
-#if PRINTPKT_SUPPORT
-/*
- * ppp_format_packet - make a readable representation of a packet,
- * calling `printer(arg, format, ...)' to output it.
- */
-static void ppp_format_packet(const u_char *p, int len,
-               void (*printer) (void *, const char *, ...), void *arg) {
-    int i, n;
-    u_short proto;
-    const struct protent *protp;
-
-    if (len >= 2) {
-       GETSHORT(proto, p);
-       len -= 2;
-       for (i = 0; (protp = protocols[i]) != NULL; ++i)
-           if (proto == protp->protocol)
-               break;
-       if (protp != NULL) {
-           printer(arg, "[%s", protp->name);
-           n = (*protp->printpkt)(p, len, printer, arg);
-           printer(arg, "]");
-           p += n;
-           len -= n;
-       } else {
-           for (i = 0; (protp = protocols[i]) != NULL; ++i)
-               if (proto == (protp->protocol & ~0x8000))
-                   break;
-           if (protp != 0 && protp->data_name != 0) {
-               printer(arg, "[%s data]", protp->data_name);
-               if (len > 8)
-                   printer(arg, "%.8B ...", p);
-               else
-                   printer(arg, "%.*B", len, p);
-               len = 0;
-           } else
-               printer(arg, "[proto=0x%x]", proto);
-       }
-    }
-
-    if (len > 32)
-       printer(arg, "%.32B ...", p);
-    else
-       printer(arg, "%.*B", len, p);
-}
-#endif /* PRINTPKT_SUPPORT */
-
-#if 0 /* UNUSED */
-/*
- * init_pr_log, end_pr_log - initialize and finish use of pr_log.
- */
-
-static char line[256];         /* line to be logged accumulated here */
-static char *linep;            /* current pointer within line */
-static int llevel;             /* level for logging */
-
-void
-init_pr_log(prefix, level)
-     const char *prefix;
-     int level;
-{
-       linep = line;
-       if (prefix != NULL) {
-               ppp_strlcpy(line, prefix, sizeof(line));
-               linep = line + strlen(line);
-       }
-       llevel = level;
-}
-
-void
-end_pr_log()
-{
-       if (linep != line) {
-               *linep = 0;
-               ppp_log_write(llevel, line);
-       }
-}
-
-/*
- * pr_log - printer routine for outputting to log
- */
-void
-pr_log (void *arg, const char *fmt, ...)
-{
-       int l, n;
-       va_list pvar;
-       char *p, *eol;
-       char buf[256];
-
-       va_start(pvar, fmt);
-       n = ppp_vslprintf(buf, sizeof(buf), fmt, pvar);
-       va_end(pvar);
-
-       p = buf;
-       eol = strchr(buf, '\n');
-       if (linep != line) {
-               l = (eol == NULL)? n: eol - buf;
-               if (linep + l < line + sizeof(line)) {
-                       if (l > 0) {
-                               memcpy(linep, buf, l);
-                               linep += l;
-                       }
-                       if (eol == NULL)
-                               return;
-                       p = eol + 1;
-                       eol = strchr(p, '\n');
-               }
-               *linep = 0;
-               ppp_log_write(llevel, line);
-               linep = line;
-       }
-
-       while (eol != NULL) {
-               *eol = 0;
-               ppp_log_write(llevel, p);
-               p = eol + 1;
-               eol = strchr(p, '\n');
-       }
-
-       /* assumes sizeof(buf) <= sizeof(line) */
-       l = buf + n - p;
-       if (l > 0) {
-               memcpy(line, p, n);
-               linep = line + l;
-       }
-}
-#endif /* UNUSED */
-
-/*
- * ppp_print_string - print a readable representation of a string using
- * printer.
- */
-void ppp_print_string(const u_char *p, int len, void (*printer) (void *, const char *, ...), void *arg) {
-    int c;
-
-    printer(arg, "\"");
-    for (; len > 0; --len) {
-       c = *p++;
-       if (' ' <= c && c <= '~') {
-           if (c == '\\' || c == '"')
-               printer(arg, "\\");
-           printer(arg, "%c", c);
-       } else {
-           switch (c) {
-           case '\n':
-               printer(arg, "\\n");
-               break;
-           case '\r':
-               printer(arg, "\\r");
-               break;
-           case '\t':
-               printer(arg, "\\t");
-               break;
-           default:
-               printer(arg, "\\%.3o", c);
-               /* no break */
-           }
-       }
-    }
-    printer(arg, "\"");
-}
-
-/*
- * ppp_logit - does the hard work for fatal et al.
- */
-static void ppp_logit(int level, const char *fmt, va_list args) {
-    char buf[1024];
-
-    ppp_vslprintf(buf, sizeof(buf), fmt, args);
-    ppp_log_write(level, buf);
-}
-
-static void ppp_log_write(int level, char *buf) {
-    LWIP_UNUSED_ARG(level); /* necessary if PPPDEBUG is defined to an empty function */
-    LWIP_UNUSED_ARG(buf);
-    PPPDEBUG(level, ("%s\n", buf) );
-#if 0
-    if (log_to_fd >= 0 && (level != LOG_DEBUG || debug)) {
-       int n = strlen(buf);
-
-       if (n > 0 && buf[n-1] == '\n')
-           --n;
-       if (write(log_to_fd, buf, n) != n
-           || write(log_to_fd, "\n", 1) != 1)
-           log_to_fd = -1;
-    }
-#endif
-}
-
-/*
- * ppp_fatal - log an error message and die horribly.
- */
-void ppp_fatal(const char *fmt, ...) {
-    va_list pvar;
-
-    va_start(pvar, fmt);
-    ppp_logit(LOG_ERR, fmt, pvar);
-    va_end(pvar);
-
-    LWIP_ASSERT("ppp_fatal", 0);   /* as promised */
-}
-
-/*
- * ppp_error - log an error message.
- */
-void ppp_error(const char *fmt, ...) {
-    va_list pvar;
-
-    va_start(pvar, fmt);
-    ppp_logit(LOG_ERR, fmt, pvar);
-    va_end(pvar);
-#if 0 /* UNUSED */
-    ++error_count;
-#endif /* UNUSED */
-}
-
-/*
- * ppp_warn - log a warning message.
- */
-void ppp_warn(const char *fmt, ...) {
-    va_list pvar;
-
-    va_start(pvar, fmt);
-    ppp_logit(LOG_WARNING, fmt, pvar);
-    va_end(pvar);
-}
-
-/*
- * ppp_notice - log a notice-level message.
- */
-void ppp_notice(const char *fmt, ...) {
-    va_list pvar;
-
-    va_start(pvar, fmt);
-    ppp_logit(LOG_NOTICE, fmt, pvar);
-    va_end(pvar);
-}
-
-/*
- * ppp_info - log an informational message.
- */
-void ppp_info(const char *fmt, ...) {
-    va_list pvar;
-
-    va_start(pvar, fmt);
-    ppp_logit(LOG_INFO, fmt, pvar);
-    va_end(pvar);
-}
-
-/*
- * ppp_dbglog - log a debug message.
- */
-void ppp_dbglog(const char *fmt, ...) {
-    va_list pvar;
-
-    va_start(pvar, fmt);
-    ppp_logit(LOG_DEBUG, fmt, pvar);
-    va_end(pvar);
-}
-
-#if PRINTPKT_SUPPORT
-/*
- * ppp_dump_packet - print out a packet in readable form if it is interesting.
- * Assumes len >= PPP_HDRLEN.
- */
-void ppp_dump_packet(const char *tag, unsigned char *p, int len) {
-    int proto;
-
-    /*
-     * don't print IPv4 and IPv6 packets.
-     */
-    proto = (p[0] << 8) + p[1];
-    if (proto == PPP_IP)
-       return;
-#if PPP_IPV6_SUPPORT
-    if (proto == PPP_IPV6)
-       return;
-#endif
-
-    /*
-     * don't print LCP echo request/reply packets if the link is up.
-     */
-    if (proto == PPP_LCP && len >= 2 + HEADERLEN) {
-       unsigned char *lcp = p + 2;
-       int l = (lcp[2] << 8) + lcp[3];
-
-       if ((lcp[0] == ECHOREQ || lcp[0] == ECHOREP)
-           && l >= HEADERLEN && l <= len - 2)
-           return;
-    }
-
-    ppp_dbglog("%s %P", tag, p, len);
-}
-#endif /* PRINTPKT_SUPPORT */
-
-#if 0 /* Unused */
-
-/*
- * complete_read - read a full `count' bytes from fd,
- * unless end-of-file or an error other than EINTR is encountered.
- */
-ssize_t
-complete_read(int fd, void *buf, size_t count)
-{
-       size_t done;
-       ssize_t nb;
-       char *ptr = buf;
-
-       for (done = 0; done < count; ) {
-               nb = read(fd, ptr, count - done);
-               if (nb < 0) {
-                       if (errno == EINTR)
-                               continue;
-                       return -1;
-               }
-               if (nb == 0)
-                       break;
-               done += nb;
-               ptr += nb;
-       }
-       return done;
-}
-
-/* Procedures for locking the serial device using a lock file. */
-#ifndef LOCK_DIR
-#ifdef __linux__
-#define LOCK_DIR       "/var/lock"
-#else
-#ifdef SVR4
-#define LOCK_DIR       "/var/spool/locks"
-#else
-#define LOCK_DIR       "/var/spool/lock"
-#endif
-#endif
-#endif /* LOCK_DIR */
-
-static char lock_file[MAXPATHLEN];
-
-/*
- * lock - create a lock file for the named device
- */
-int
-lock(dev)
-    char *dev;
-{
-#ifdef LOCKLIB
-    int result;
-
-    result = mklock (dev, (void *) 0);
-    if (result == 0) {
-       ppp_strlcpy(lock_file, dev, sizeof(lock_file));
-       return 0;
-    }
-
-    if (result > 0)
-        ppp_notice("Device %s is locked by pid %d", dev, result);
-    else
-       ppp_error("Can't create lock file %s", lock_file);
-    return -1;
-
-#else /* LOCKLIB */
-
-    char lock_buffer[12];
-    int fd, pid, n;
-
-#ifdef SVR4
-    struct stat sbuf;
-
-    if (stat(dev, &sbuf) < 0) {
-       ppp_error("Can't get device number for %s: %m", dev);
-       return -1;
-    }
-    if ((sbuf.st_mode & S_IFMT) != S_IFCHR) {
-       ppp_error("Can't lock %s: not a character device", dev);
-       return -1;
-    }
-    ppp_slprintf(lock_file, sizeof(lock_file), "%s/LK.%03d.%03d.%03d",
-            LOCK_DIR, major(sbuf.st_dev),
-            major(sbuf.st_rdev), minor(sbuf.st_rdev));
-#else
-    char *p;
-    char lockdev[MAXPATHLEN];
-
-    if ((p = strstr(dev, "dev/")) != NULL) {
-       dev = p + 4;
-       strncpy(lockdev, dev, MAXPATHLEN-1);
-       lockdev[MAXPATHLEN-1] = 0;
-       while ((p = strrchr(lockdev, '/')) != NULL) {
-           *p = '_';
-       }
-       dev = lockdev;
-    } else
-       if ((p = strrchr(dev, '/')) != NULL)
-           dev = p + 1;
-
-    ppp_slprintf(lock_file, sizeof(lock_file), "%s/LCK..%s", LOCK_DIR, dev);
-#endif
-
-    while ((fd = open(lock_file, O_EXCL | O_CREAT | O_RDWR, 0644)) < 0) {
-       if (errno != EEXIST) {
-           ppp_error("Can't create lock file %s: %m", lock_file);
-           break;
-       }
-
-       /* Read the lock file to find out who has the device locked. */
-       fd = open(lock_file, O_RDONLY, 0);
-       if (fd < 0) {
-           if (errno == ENOENT) /* This is just a timing problem. */
-               continue;
-           ppp_error("Can't open existing lock file %s: %m", lock_file);
-           break;
-       }
-#ifndef LOCK_BINARY
-       n = read(fd, lock_buffer, 11);
-#else
-       n = read(fd, &pid, sizeof(pid));
-#endif /* LOCK_BINARY */
-       close(fd);
-       fd = -1;
-       if (n <= 0) {
-           ppp_error("Can't read pid from lock file %s", lock_file);
-           break;
-       }
-
-       /* See if the process still exists. */
-#ifndef LOCK_BINARY
-       lock_buffer[n] = 0;
-       pid = atoi(lock_buffer);
-#endif /* LOCK_BINARY */
-       if (pid == getpid())
-           return 1;           /* somebody else locked it for us */
-       if (pid == 0
-           || (kill(pid, 0) == -1 && errno == ESRCH)) {
-           if (unlink (lock_file) == 0) {
-               ppp_notice("Removed stale lock on %s (pid %d)", dev, pid);
-               continue;
-           }
-           ppp_warn("Couldn't remove stale lock on %s", dev);
-       } else
-           ppp_notice("Device %s is locked by pid %d", dev, pid);
-       break;
-    }
-
-    if (fd < 0) {
-       lock_file[0] = 0;
-       return -1;
-    }
-
-    pid = getpid();
-#ifndef LOCK_BINARY
-    ppp_slprintf(lock_buffer, sizeof(lock_buffer), "%10d\n", pid);
-    write (fd, lock_buffer, 11);
-#else
-    write(fd, &pid, sizeof (pid));
-#endif
-    close(fd);
-    return 0;
-
-#endif
-}
-
-/*
- * relock - called to update our lockfile when we are about to detach,
- * thus changing our pid (we fork, the child carries on, and the parent dies).
- * Note that this is called by the parent, with pid equal to the pid
- * of the child.  This avoids a potential race which would exist if
- * we had the child rewrite the lockfile (the parent might die first,
- * and another process could think the lock was stale if it checked
- * between when the parent died and the child rewrote the lockfile).
- */
-int
-relock(pid)
-    int pid;
-{
-#ifdef LOCKLIB
-    /* XXX is there a way to do this? */
-    return -1;
-#else /* LOCKLIB */
-
-    int fd;
-    char lock_buffer[12];
-
-    if (lock_file[0] == 0)
-       return -1;
-    fd = open(lock_file, O_WRONLY, 0);
-    if (fd < 0) {
-       ppp_error("Couldn't reopen lock file %s: %m", lock_file);
-       lock_file[0] = 0;
-       return -1;
-    }
-
-#ifndef LOCK_BINARY
-    ppp_slprintf(lock_buffer, sizeof(lock_buffer), "%10d\n", pid);
-    write (fd, lock_buffer, 11);
-#else
-    write(fd, &pid, sizeof(pid));
-#endif /* LOCK_BINARY */
-    close(fd);
-    return 0;
-
-#endif /* LOCKLIB */
-}
-
-/*
- * unlock - remove our lockfile
- */
-void
-unlock()
-{
-    if (lock_file[0]) {
-#ifdef LOCKLIB
-       (void) rmlock(lock_file, (void *) 0);
-#else
-       unlink(lock_file);
-#endif
-       lock_file[0] = 0;
-    }
-}
-
-#endif /* Unused */
-
-#endif /* PPP_SUPPORT */
diff --git a/components/lwip/netif/ppp/vj.c b/components/lwip/netif/ppp/vj.c
deleted file mode 100644 (file)
index 19d8a2f..0000000
+++ /dev/null
@@ -1,670 +0,0 @@
-/*
- * Routines to compress and uncompess tcp packets (for transmission
- * over low speed serial lines.
- *
- * Copyright (c) 1989 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley.  The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Van Jacobson (van@helios.ee.lbl.gov), Dec 31, 1989:
- *   Initial distribution.
- *
- * Modified June 1993 by Paul Mackerras, paulus@cs.anu.edu.au,
- * so that the entire packet being decompressed doesn't have
- * to be in contiguous memory (just the compressed header).
- *
- * Modified March 1998 by Guy Lancaster, glanca@gesn.com,
- * for a 16 bit processor.
- */
-
-#include "lwip/opt.h"
-#if PPP_SUPPORT && VJ_SUPPORT && LWIP_TCP /* don't build if not configured for use in lwipopts.h */
-
-#include "netif/ppp/ppp_impl.h"
-#include "netif/ppp/pppdebug.h"
-
-#include "netif/ppp/vj.h"
-
-#include <string.h>
-
-#if LINK_STATS
-#define INCR(counter) ++comp->stats.counter
-#else
-#define INCR(counter)
-#endif
-
-void
-vj_compress_init(struct vjcompress *comp)
-{
-  u8_t i;
-  struct cstate *tstate = comp->tstate;
-
-#if MAX_SLOTS == 0
-  memset((char *)comp, 0, sizeof(*comp));
-#endif
-  comp->maxSlotIndex = MAX_SLOTS - 1;
-  comp->compressSlot = 0;    /* Disable slot ID compression by default. */
-  for (i = MAX_SLOTS - 1; i > 0; --i) {
-    tstate[i].cs_id = i;
-    tstate[i].cs_next = &tstate[i - 1];
-  }
-  tstate[0].cs_next = &tstate[MAX_SLOTS - 1];
-  tstate[0].cs_id = 0;
-  comp->last_cs = &tstate[0];
-  comp->last_recv = 255;
-  comp->last_xmit = 255;
-  comp->flags = VJF_TOSS;
-}
-
-
-/* ENCODE encodes a number that is known to be non-zero.  ENCODEZ
- * checks for zero (since zero has to be encoded in the long, 3 byte
- * form).
- */
-#define ENCODE(n) { \
-  if ((u16_t)(n) >= 256) { \
-    *cp++ = 0; \
-    cp[1] = (u8_t)(n); \
-    cp[0] = (u8_t)((n) >> 8); \
-    cp += 2; \
-  } else { \
-    *cp++ = (u8_t)(n); \
-  } \
-}
-#define ENCODEZ(n) { \
-  if ((u16_t)(n) >= 256 || (u16_t)(n) == 0) { \
-    *cp++ = 0; \
-    cp[1] = (u8_t)(n); \
-    cp[0] = (u8_t)((n) >> 8); \
-    cp += 2; \
-  } else { \
-    *cp++ = (u8_t)(n); \
-  } \
-}
-
-#define DECODEL(f) { \
-  if (*cp == 0) {\
-    u32_t tmp_ = ntohl(f) + ((cp[1] << 8) | cp[2]); \
-    (f) = htonl(tmp_); \
-    cp += 3; \
-  } else { \
-    u32_t tmp_ = ntohl(f) + (u32_t)*cp++; \
-    (f) = htonl(tmp_); \
-  } \
-}
-
-#define DECODES(f) { \
-  if (*cp == 0) {\
-    u16_t tmp_ = ntohs(f) + (((u16_t)cp[1] << 8) | cp[2]); \
-    (f) = htons(tmp_); \
-    cp += 3; \
-  } else { \
-    u16_t tmp_ = ntohs(f) + (u16_t)*cp++; \
-    (f) = htons(tmp_); \
-  } \
-}
-
-#define DECODEU(f) { \
-  if (*cp == 0) {\
-    (f) = htons(((u16_t)cp[1] << 8) | cp[2]); \
-    cp += 3; \
-  } else { \
-    (f) = htons((u16_t)*cp++); \
-  } \
-}
-
-/*
- * vj_compress_tcp - Attempt to do Van Jacobson header compression on a
- * packet.  This assumes that nb and comp are not null and that the first
- * buffer of the chain contains a valid IP header.
- * Return the VJ type code indicating whether or not the packet was
- * compressed.
- */
-u8_t
-vj_compress_tcp(struct vjcompress *comp, struct pbuf **pb)
-{
-  struct pbuf *np = *pb;
-  struct ip_hdr *ip = (struct ip_hdr *)np->payload;
-  struct cstate *cs = comp->last_cs->cs_next;
-  u16_t ilen = IPH_HL(ip);
-  u16_t hlen;
-  struct tcp_hdr *oth;
-  struct tcp_hdr *th;
-  u16_t deltaS, deltaA = 0;
-  u32_t deltaL;
-  u32_t changes = 0;
-  u8_t new_seq[16];
-  u8_t *cp = new_seq;
-
-  /*
-   * Check that the packet is IP proto TCP.
-   */
-  if (IPH_PROTO(ip) != IP_PROTO_TCP) {
-    return (TYPE_IP);
-  }
-
-  /*
-   * Bail if this is an IP fragment or if the TCP packet isn't
-   * `compressible' (i.e., ACK isn't set or some other control bit is
-   * set).
-   */
-  if ((IPH_OFFSET(ip) & PP_HTONS(0x3fff)) || np->tot_len < 40) {
-    return (TYPE_IP);
-  }
-  th = (struct tcp_hdr *)&((u32_t*)ip)[ilen];
-  if ((TCPH_FLAGS(th) & (TCP_SYN|TCP_FIN|TCP_RST|TCP_ACK)) != TCP_ACK) {
-    return (TYPE_IP);
-  }
-
-  /* Check that the TCP/IP headers are contained in the first buffer. */
-  hlen = ilen + TCPH_HDRLEN(th);
-  hlen <<= 2;
-  if (np->len < hlen) {
-    PPPDEBUG(LOG_INFO, ("vj_compress_tcp: header len %d spans buffers\n", hlen));
-    return (TYPE_IP);
-  }
-
-  /* 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);
-  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;
-
-  /*
-   * Packet is compressible -- we're going to send either a
-   * COMPRESSED_TCP or UNCOMPRESSED_TCP packet.  Either way we need
-   * to locate (or create) the connection state.  Special case the
-   * most recently used connection since it's most likely to be used
-   * again & we don't have to do any reordering if it's used.
-   */
-  INCR(vjs_packets);
-  if (!ip4_addr_cmp(&ip->src, &cs->cs_ip.src)
-      || !ip4_addr_cmp(&ip->dest, &cs->cs_ip.dest)
-      || *(u32_t*)th != ((u32_t*)&cs->cs_ip)[IPH_HL(&cs->cs_ip)]) {
-    /*
-     * Wasn't the first -- search for it.
-     *
-     * States are kept in a circularly linked list with
-     * last_cs pointing to the end of the list.  The
-     * list is kept in lru order by moving a state to the
-     * head of the list whenever it is referenced.  Since
-     * the list is short and, empirically, the connection
-     * we want is almost always near the front, we locate
-     * states via linear search.  If we don't find a state
-     * for the datagram, the oldest state is (re-)used.
-     */
-    struct cstate *lcs;
-    struct cstate *lastcs = comp->last_cs;
-
-    do {
-      lcs = cs; cs = cs->cs_next;
-      INCR(vjs_searches);
-      if (ip4_addr_cmp(&ip->src, &cs->cs_ip.src)
-          && ip4_addr_cmp(&ip->dest, &cs->cs_ip.dest)
-          && *(u32_t*)th == ((u32_t*)&cs->cs_ip)[IPH_HL(&cs->cs_ip)]) {
-        goto found;
-      }
-    } while (cs != lastcs);
-
-    /*
-     * Didn't find it -- re-use oldest cstate.  Send an
-     * uncompressed packet that tells the other side what
-     * connection number we're using for this conversation.
-     * Note that since the state list is circular, the oldest
-     * state points to the newest and we only need to set
-     * last_cs to update the lru linkage.
-     */
-    INCR(vjs_misses);
-    comp->last_cs = lcs;
-    goto uncompressed;
-
-    found:
-    /*
-     * Found it -- move to the front on the connection list.
-     */
-    if (cs == lastcs) {
-      comp->last_cs = lcs;
-    } else {
-      lcs->cs_next = cs->cs_next;
-      cs->cs_next = lastcs->cs_next;
-      lastcs->cs_next = cs;
-    }
-  }
-
-  oth = (struct tcp_hdr *)&((u32_t*)&cs->cs_ip)[ilen];
-  deltaS = ilen;
-
-  /*
-   * Make sure that only what we expect to change changed. The first
-   * line of the `if' checks the IP protocol version, header length &
-   * type of service.  The 2nd line checks the "Don't fragment" bit.
-   * The 3rd line checks the time-to-live and protocol (the protocol
-   * check is unnecessary but costless).  The 4th line checks the TCP
-   * header length.  The 5th line checks IP options, if any.  The 6th
-   * line checks TCP options, if any.  If any of these things are
-   * different between the previous & current datagram, we send the
-   * current datagram `uncompressed'.
-   */
-  if (((u16_t*)ip)[0] != ((u16_t*)&cs->cs_ip)[0]
-      || ((u16_t*)ip)[3] != ((u16_t*)&cs->cs_ip)[3]
-      || ((u16_t*)ip)[4] != ((u16_t*)&cs->cs_ip)[4]
-      || TCPH_HDRLEN(th) != TCPH_HDRLEN(oth)
-      || (deltaS > 5 && BCMP(ip + 1, &cs->cs_ip + 1, (deltaS - 5) << 2))
-      || (TCPH_HDRLEN(th) > 5 && BCMP(th + 1, oth + 1, (TCPH_HDRLEN(th) - 5) << 2))) {
-    goto uncompressed;
-  }
-
-  /*
-   * Figure out which of the changing fields changed.  The
-   * receiver expects changes in the order: urgent, window,
-   * ack, seq (the order minimizes the number of temporaries
-   * needed in this section of code).
-   */
-  if (TCPH_FLAGS(th) & TCP_URG) {
-    deltaS = ntohs(th->urgp);
-    ENCODEZ(deltaS);
-    changes |= NEW_U;
-  } else if (th->urgp != oth->urgp) {
-    /* argh! URG not set but urp changed -- a sensible
-     * implementation should never do this but RFC793
-     * doesn't prohibit the change so we have to deal
-     * with it. */
-    goto uncompressed;
-  }
-
-  if ((deltaS = (u16_t)(ntohs(th->wnd) - ntohs(oth->wnd))) != 0) {
-    ENCODE(deltaS);
-    changes |= NEW_W;
-  }
-
-  if ((deltaL = ntohl(th->ackno) - ntohl(oth->ackno)) != 0) {
-    if (deltaL > 0xffff) {
-      goto uncompressed;
-    }
-    deltaA = (u16_t)deltaL;
-    ENCODE(deltaA);
-    changes |= NEW_A;
-  }
-
-  if ((deltaL = ntohl(th->seqno) - ntohl(oth->seqno)) != 0) {
-    if (deltaL > 0xffff) {
-      goto uncompressed;
-    }
-    deltaS = (u16_t)deltaL;
-    ENCODE(deltaS);
-    changes |= NEW_S;
-  }
-
-  switch(changes) {
-  case 0:
-    /*
-     * Nothing changed. If this packet contains data and the
-     * last one didn't, this is probably a data packet following
-     * an ack (normal on an interactive connection) and we send
-     * it compressed.  Otherwise it's probably a retransmit,
-     * retransmitted ack or window probe.  Send it uncompressed
-     * in case the other side missed the compressed version.
-     */
-    if (IPH_LEN(ip) != IPH_LEN(&cs->cs_ip) &&
-      ntohs(IPH_LEN(&cs->cs_ip)) == hlen) {
-      break;
-    }
-    /* no break */
-    /* fall through */
-
-  case SPECIAL_I:
-  case SPECIAL_D:
-    /*
-     * actual changes match one of our special case encodings --
-     * send packet uncompressed.
-     */
-    goto uncompressed;
-
-  case NEW_S|NEW_A:
-    if (deltaS == deltaA && deltaS == ntohs(IPH_LEN(&cs->cs_ip)) - hlen) {
-      /* special case for echoed terminal traffic */
-      changes = SPECIAL_I;
-      cp = new_seq;
-    }
-    break;
-
-  case NEW_S:
-    if (deltaS == ntohs(IPH_LEN(&cs->cs_ip)) - hlen) {
-      /* special case for data xfer */
-      changes = SPECIAL_D;
-      cp = new_seq;
-    }
-    break;
-  default:
-     break;
-  }
-
-  deltaS = (u16_t)(ntohs(IPH_ID(ip)) - ntohs(IPH_ID(&cs->cs_ip)));
-  if (deltaS != 1) {
-    ENCODEZ(deltaS);
-    changes |= NEW_I;
-  }
-  if (TCPH_FLAGS(th) & TCP_PSH) {
-    changes |= TCP_PUSH_BIT;
-  }
-  /*
-   * Grab the cksum before we overwrite it below.  Then update our
-   * state with this packet's header.
-   */
-  deltaA = ntohs(th->chksum);
-  MEMCPY(&cs->cs_ip, ip, hlen);
-
-  /*
-   * We want to use the original packet as our compressed packet.
-   * (cp - new_seq) is the number of bytes we need for compressed
-   * sequence numbers.  In addition we need one byte for the change
-   * mask, one for the connection id and two for the tcp checksum.
-   * So, (cp - new_seq) + 4 bytes of header are needed.  hlen is how
-   * many bytes of the original packet to toss so subtract the two to
-   * get the new packet size.
-   */
-  deltaS = (u16_t)(cp - new_seq);
-  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)){
-      /* Can we cope with this failing?  Just assert for now */
-      LWIP_ASSERT("pbuf_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)) {
-      /* Can we cope with this failing?  Just assert for now */
-      LWIP_ASSERT("pbuf_header failed\n", 0);
-    }
-    cp = (u8_t*)np->payload;
-    *cp++ = (u8_t)changes;
-  }
-  *cp++ = (u8_t)(deltaA >> 8);
-  *cp++ = (u8_t)deltaA;
-  MEMCPY(cp, new_seq, deltaS);
-  INCR(vjs_compressed);
-  return (TYPE_COMPRESSED_TCP);
-
-  /*
-   * Update connection state cs & send uncompressed packet (that is,
-   * a regular ip/tcp packet but with the 'conversation id' we hope
-   * to use on future compressed packets in the protocol field).
-   */
-uncompressed:
-  MEMCPY(&cs->cs_ip, ip, hlen);
-  IPH_PROTO_SET(ip, cs->cs_id);
-  comp->last_xmit = cs->cs_id;
-  return (TYPE_UNCOMPRESSED_TCP);
-}
-
-/*
- * Called when we may have missed a packet.
- */
-void
-vj_uncompress_err(struct vjcompress *comp)
-{
-  comp->flags |= VJF_TOSS;
-  INCR(vjs_errorin);
-}
-
-/*
- * "Uncompress" a packet of type TYPE_UNCOMPRESSED_TCP.
- * Return 0 on success, -1 on failure.
- */
-int
-vj_uncompress_uncomp(struct pbuf *nb, struct vjcompress *comp)
-{
-  u32_t hlen;
-  struct cstate *cs;
-  struct ip_hdr *ip;
-
-  ip = (struct ip_hdr *)nb->payload;
-  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)
-          > 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);
-    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);
-  cs->cs_hlen = (u16_t)hlen;
-  INCR(vjs_uncompressedin);
-  return 0;
-}
-
-/*
- * Uncompress a packet of type TYPE_COMPRESSED_TCP.
- * The packet is composed of a buffer chain and the first buffer
- * must contain an accurate chain length.
- * The first buffer must include the entire compressed TCP/IP header.
- * This procedure replaces the compressed header with the uncompressed
- * header and returns the length of the VJ header.
- */
-int
-vj_uncompress_tcp(struct pbuf **nb, struct vjcompress *comp)
-{
-  u8_t *cp;
-  struct tcp_hdr *th;
-  struct cstate *cs;
-  u16_t *bp;
-  struct pbuf *n0 = *nb;
-  u32_t tmp;
-  u32_t vjlen, hlen, changes;
-
-  INCR(vjs_compressedin);
-  cp = (u8_t*)n0->payload;
-  changes = *cp++;
-  if (changes & NEW_C) {
-    /*
-     * Make sure the state index is in range, then grab the state.
-     * If we have a good state index, clear the 'discard' flag.
-     */
-    if (*cp >= MAX_SLOTS) {
-      PPPDEBUG(LOG_INFO, ("vj_uncompress_tcp: bad cid=%d\n", *cp));
-      goto bad;
-    }
-
-    comp->flags &=~ VJF_TOSS;
-    comp->last_recv = *cp++;
-  } else {
-    /*
-     * this packet has an implicit state index.  If we've
-     * had a line error since the last time we got an
-     * explicit state index, we have to toss the packet.
-     */
-    if (comp->flags & VJF_TOSS) {
-      PPPDEBUG(LOG_INFO, ("vj_uncompress_tcp: tossing\n"));
-      INCR(vjs_tossed);
-      return (-1);
-    }
-  }
-  cs = &comp->rstate[comp->last_recv];
-  hlen = IPH_HL(&cs->cs_ip) << 2;
-  th = (struct tcp_hdr *)&((u8_t*)&cs->cs_ip)[hlen];
-  th->chksum = htons((*cp << 8) | cp[1]);
-  cp += 2;
-  if (changes & TCP_PUSH_BIT) {
-    TCPH_SET_FLAG(th, TCP_PSH);
-  } else {
-    TCPH_UNSET_FLAG(th, TCP_PSH);
-  }
-
-  switch (changes & SPECIALS_MASK) {
-  case SPECIAL_I:
-    {
-      u32_t i = ntohs(IPH_LEN(&cs->cs_ip)) - cs->cs_hlen;
-      /* some compilers can't nest inline assembler.. */
-      tmp = ntohl(th->ackno) + i;
-      th->ackno = htonl(tmp);
-      tmp = ntohl(th->seqno) + i;
-      th->seqno = htonl(tmp);
-    }
-    break;
-
-  case SPECIAL_D:
-    /* some compilers can't nest inline assembler.. */
-    tmp = ntohl(th->seqno) + ntohs(IPH_LEN(&cs->cs_ip)) - cs->cs_hlen;
-    th->seqno = htonl(tmp);
-    break;
-
-  default:
-    if (changes & NEW_U) {
-      TCPH_SET_FLAG(th, TCP_URG);
-      DECODEU(th->urgp);
-    } else {
-      TCPH_UNSET_FLAG(th, TCP_URG);
-    }
-    if (changes & NEW_W) {
-      DECODES(th->wnd);
-    }
-    if (changes & NEW_A) {
-      DECODEL(th->ackno);
-    }
-    if (changes & NEW_S) {
-      DECODEL(th->seqno);
-    }
-    break;
-  }
-  if (changes & NEW_I) {
-    DECODES(cs->cs_ip._id);
-  } else {
-    IPH_ID_SET(&cs->cs_ip, ntohs(IPH_ID(&cs->cs_ip)) + 1);
-    IPH_ID_SET(&cs->cs_ip, htons(IPH_ID(&cs->cs_ip)));
-  }
-
-  /*
-   * At this point, cp points to the first byte of data in the
-   * packet.  Fill in the IP total length and update the IP
-   * header checksum.
-   */
-  vjlen = (u16_t)(cp - (u8_t*)n0->payload);
-  if (n0->len < vjlen) {
-    /*
-     * We must have dropped some characters (crc should detect
-     * this but the old slip framing won't)
-     */
-    PPPDEBUG(LOG_INFO, ("vj_uncompress_tcp: head buffer %d too short %d\n",
-          n0->len, vjlen));
-    goto bad;
-  }
-
-#if BYTE_ORDER == LITTLE_ENDIAN
-  tmp = n0->tot_len - vjlen + cs->cs_hlen;
-  IPH_LEN_SET(&cs->cs_ip, htons((u16_t)tmp));
-#else
-  IPH_LEN_SET(&cs->cs_ip, htons(n0->tot_len - vjlen + cs->cs_hlen));
-#endif
-
-  /* recompute the ip header checksum */
-  bp = (u16_t*) &cs->cs_ip;
-  IPH_CHKSUM_SET(&cs->cs_ip, 0);
-  for (tmp = 0; hlen > 0; hlen -= 2) {
-    tmp += *bp++;
-  }
-  tmp = (tmp & 0xffff) + (tmp >> 16);
-  tmp = (tmp & 0xffff) + (tmp >> 16);
-  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)) {
-    /* Can we cope with this failing?  Just assert for now */
-    LWIP_ASSERT("pbuf_header failed\n", 0);
-    goto bad;
-  }
-
-  if(LWIP_MEM_ALIGN(n0->payload) != n0->payload) {
-    struct pbuf *np, *q;
-    u8_t *bufptr;
-
-#if IP_FORWARD
-    /* If IP forwarding is enabled we are using a PBUF_LINK packet type so
-     * the packet is being allocated with enough header space to be
-     * forwarded (to Ethernet for example).
-     */
-    np = pbuf_alloc(PBUF_LINK, n0->len + cs->cs_hlen, PBUF_POOL);
-#else /* IP_FORWARD */
-    np = pbuf_alloc(PBUF_RAW, n0->len + cs->cs_hlen, PBUF_POOL);
-#endif /* IP_FORWARD */
-    if(!np) {
-      PPPDEBUG(LOG_WARNING, ("vj_uncompress_tcp: realign failed\n"));
-      goto bad;
-    }
-
-    if (pbuf_header(np, -(s16_t)cs->cs_hlen)) {
-      /* Can we cope with this failing?  Just assert for now */
-      LWIP_ASSERT("pbuf_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;
-    }
-
-    if(n0->next) {
-      pbuf_chain(np, n0->next);
-      pbuf_dechain(n0);
-    }
-    pbuf_free(n0);
-    n0 = np;
-  }
-
-  if (pbuf_header(n0, (s16_t)cs->cs_hlen)) {
-    struct pbuf *np;
-
-    LWIP_ASSERT("vj_uncompress_tcp: cs->cs_hlen <= PBUF_POOL_BUFSIZE", cs->cs_hlen <= PBUF_POOL_BUFSIZE);
-    np = pbuf_alloc(PBUF_RAW, cs->cs_hlen, PBUF_POOL);
-    if(!np) {
-      PPPDEBUG(LOG_WARNING, ("vj_uncompress_tcp: prepend failed\n"));
-      goto bad;
-    }
-    pbuf_cat(np, n0);
-    n0 = np;
-  }
-  LWIP_ASSERT("n0->len >= cs->cs_hlen", n0->len >= cs->cs_hlen);
-  MEMCPY(n0->payload, &cs->cs_ip, cs->cs_hlen);
-
-  *nb = n0;
-
-  return vjlen;
-
-bad:
-  comp->flags |= VJF_TOSS;
-  INCR(vjs_errorin);
-  return (-1);
-}
-
-#endif /* PPP_SUPPORT && VJ_SUPPORT && LWIP_TCP */
diff --git a/components/lwip/netif/slipif.c b/components/lwip/netif/slipif.c
deleted file mode 100644 (file)
index bf02475..0000000
+++ /dev/null
@@ -1,555 +0,0 @@
-/**
- * @file
- * SLIP Interface
- *
- */
-
-/*
- * 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. Neither the name of the Institute nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This file is built upon the file: src/arch/rtxc/netif/sioslip.c
- *
- * Author: Magnus Ivarsson <magnus.ivarsson(at)volvo.com>
- *         Simon Goldschmidt
- *
- * Usage: This netif can be used in three ways:
- *        1) For NO_SYS==0, an RX thread can be used which blocks on sio_read()
- *           until data is received.
- *        2) In your main loop, call slipif_poll() to check for new RX bytes,
- *           completed packets are fed into netif->input().
- *        3) Call slipif_received_byte[s]() from your serial RX ISR and
- *           slipif_process_rxqueue() from your main loop. ISR level decodes
- *           packets and puts completed packets on a queue which is fed into
- *           the stack from the main loop (needs SYS_LIGHTWEIGHT_PROT for
- *           pbuf_alloc to work on ISR level!).
- *
- */
-
-/*
- * 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
- */
-
-#include "netif/slipif.h"
-#include "lwip/opt.h"
-
-#if LWIP_HAVE_SLIPIF
-
-#include "lwip/def.h"
-#include "lwip/pbuf.h"
-#include "lwip/stats.h"
-#include "lwip/snmp.h"
-#include "lwip/sys.h"
-#include "lwip/sio.h"
-
-#define SLIP_END     0xC0 /* 0300: start and end of every packet */
-#define SLIP_ESC     0xDB /* 0333: escape start (one byte escaped data follows) */
-#define SLIP_ESC_END 0xDC /* 0334: following escape: original byte is 0xC0 (END) */
-#define SLIP_ESC_ESC 0xDD /* 0335: following escape: original byte is 0xDB (ESC) */
-
-/** Maximum packet size that is received by this netif */
-#ifndef SLIP_MAX_SIZE
-#define SLIP_MAX_SIZE 1500
-#endif
-
-/** 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'.
- */
-#ifndef SLIP_SIO_SPEED
-#define SLIP_SIO_SPEED(sio_fd) 0
-#endif
-
-enum slipif_recv_state {
-    SLIP_RECV_NORMAL,
-    SLIP_RECV_ESCAPE
-};
-
-struct slipif_priv {
-  sio_fd_t sd;
-  /* q is the whole pbuf chain for a packet, p is the current pbuf in the chain */
-  struct pbuf *p, *q;
-  u8_t state;
-  u16_t i, recved;
-#if SLIP_RX_FROM_ISR
-  struct pbuf *rxpackets;
-#endif
-};
-
-/**
- * Send a pbuf doing the necessary SLIP encapsulation
- *
- * Uses the serial layer's sio_send()
- *
- * @param netif the lwip network interface structure for this slipif
- * @param p the pbuf chain packet to send
- * @return always returns ERR_OK since the serial layer does not provide return values
- */
-static err_t
-slipif_output(struct netif *netif, struct pbuf *p)
-{
-  struct slipif_priv *priv;
-  struct pbuf *q;
-  u16_t i;
-  u8_t c;
-
-  LWIP_ASSERT("netif != NULL", (netif != NULL));
-  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));
-  priv = (struct slipif_priv *)netif->state;
-
-  /* Send pbuf out on the serial I/O device. */
-  /* Start with packet delimiter. */
-  sio_send(SLIP_END, priv->sd);
-
-  for (q = p; q != NULL; q = q->next) {
-    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;
-      }
-    }
-  }
-  /* End with packet delimiter. */
-  sio_send(SLIP_END, priv->sd);
-  return ERR_OK;
-}
-
-#if LWIP_IPV4
-/**
- * Send a pbuf doing the necessary SLIP encapsulation
- *
- * Uses the serial layer's sio_send()
- *
- * @param netif the lwip network interface structure for this slipif
- * @param p the pbuf chain packet to send
- * @param ipaddr the ip address to send the packet to (not used for slipif)
- * @return always returns ERR_OK since the serial layer does not provide return values
- */
-static err_t
-slipif_output_v4(struct netif *netif, struct pbuf *p, const ip4_addr_t *ipaddr)
-{
-  LWIP_UNUSED_ARG(ipaddr);
-  return slipif_output(netif, p);
-}
-#endif /* LWIP_IPV4 */
-
-#if LWIP_IPV6
-/**
- * Send a pbuf doing the necessary SLIP encapsulation
- *
- * Uses the serial layer's sio_send()
- *
- * @param netif the lwip network interface structure for this slipif
- * @param p the pbuf chain packet to send
- * @param ipaddr the ip address to send the packet to (not used for slipif)
- * @return always returns ERR_OK since the serial layer does not provide return values
- */
-static err_t
-slipif_output_v6(struct netif *netif, struct pbuf *p, const ip6_addr_t *ipaddr)
-{
-  LWIP_UNUSED_ARG(ipaddr);
-  return slipif_output(netif, p);
-}
-#endif /* LWIP_IPV6 */
-
-/**
- * Handle the incoming SLIP stream character by character
- *
- * @param netif the lwip network interface structure for this slipif
- * @param c received character (multiple calls to this function will
- *        return a complete packet, NULL is returned before - used for polling)
- * @return The IP packet when SLIP_END is received
- */
-static struct pbuf*
-slipif_rxbyte(struct netif *netif, u8_t c)
-{
-  struct slipif_priv *priv;
-  struct pbuf *t;
-
-  LWIP_ASSERT("netif != NULL", (netif != NULL));
-  LWIP_ASSERT("netif->state != NULL", (netif->state != NULL));
-
-  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);
-
-        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;
-      }
-      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;
-    }
-    priv->state = SLIP_RECV_NORMAL;
-    break;
-  default:
-    break;
-  } /* end switch (priv->state) */
-
-  /* byte received, packet not yet completely received */
-  if (priv->p == NULL) {
-    /* allocate a new pbuf */
-    LWIP_DEBUGF(SLIP_DEBUG, ("slipif_input: alloc\n"));
-    priv->p = pbuf_alloc(PBUF_LINK, (PBUF_POOL_BUFSIZE - PBUF_LINK_HLEN - PBUF_LINK_ENCAPSULATION_HLEN), PBUF_POOL);
-
-    if (priv->p == NULL) {
-      LINK_STATS_INC(link.drop);
-      LWIP_DEBUGF(SLIP_DEBUG, ("slipif_input: no new pbuf! (DROP)\n"));
-      /* don't process any further since we got no pbuf to receive to */
-      return NULL;
-    }
-
-    if (priv->q != NULL) {
-      /* 'chain' the pbuf to the existing chain */
-      pbuf_cat(priv->q, priv->p);
-    } else {
-      /* p is the first pbuf in the chain */
-      priv->q = priv->p;
-    }
-  }
-
-  /* this automatically drops bytes if > SLIP_MAX_SIZE */
-  if ((priv->p != NULL) && (priv->recved <= SLIP_MAX_SIZE)) {
-    ((u8_t *)priv->p->payload)[priv->i] = c;
-    priv->recved++;
-    priv->i++;
-    if (priv->i >= priv->p->len) {
-      /* on to the next pbuf */
-      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;
-      } else {
-        /* p is a single pbuf, set it to NULL so next time a new
-         * pbuf is allocated */
-          priv->p = NULL;
-      }
-    }
-  }
-  return NULL;
-}
-
-/** Like slipif_rxbyte, but passes completed packets to netif->input
- *
- * @param netif The lwip network interface structure for this slipif
- * @param data received character
- */
-static void
-slipif_rxbyte_input(struct netif *netif, u8_t c)
-{
-  struct pbuf *p;
-  p = slipif_rxbyte(netif, c);
-  if (p != NULL) {
-    if (netif->input(p, netif) != ERR_OK) {
-      pbuf_free(p);
-    }
-  }
-}
-
-#if SLIP_USE_RX_THREAD
-/**
- * The SLIP input thread.
- *
- * Feed the IP layer with incoming packets
- *
- * @param nf the lwip network interface structure for this slipif
- */
-static void
-slipif_loop_thread(void *nf)
-{
-  u8_t c;
-  struct netif *netif = (struct netif *)nf;
-  struct slipif_priv *priv = (struct slipif_priv *)netif->state;
-
-  while (1) {
-    if (sio_read(priv->sd, &c, 1) > 0) {
-      slipif_rxbyte_input(netif, c);
-    }
-  }
-}
-#endif /* SLIP_USE_RX_THREAD */
-
-/**
- * SLIP netif initialization
- *
- * Call the arch specific sio_open and remember
- * the opened device in the state field of the netif.
- *
- * @param netif the lwip network interface structure for this slipif
- * @return 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
- *
- * @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.
- *
- */
-err_t
-slipif_init(struct netif *netif)
-{
-  struct slipif_priv *priv;
-  u8_t sio_num;
-
-  LWIP_DEBUGF(SLIP_DEBUG, ("slipif_init: netif->num=%"U16_F"\n", (u16_t)netif->num));
-
-  /* Allocate private data */
-  priv = (struct slipif_priv *)mem_malloc(sizeof(struct slipif_priv));
-  if (!priv) {
-    return ERR_MEM;
-  }
-
-  netif->name[0] = 's';
-  netif->name[1] = 'l';
-#if LWIP_IPV4
-  netif->output = slipif_output_v4;
-#endif /* LWIP_IPV4 */
-#if LWIP_IPV6
-  netif->output_ip6 = slipif_output_v6;
-#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) {
-    /* Opening the serial port failed. */
-    mem_free(priv);
-    return ERR_IF;
-  }
-
-  /* Initialize private data */
-  priv->p = NULL;
-  priv->q = NULL;
-  priv->state = SLIP_RECV_NORMAL;
-  priv->i = 0;
-  priv->recved = 0;
-#if SLIP_RX_FROM_ISR
-  priv->rxpackets = NULL;
-#endif
-
-  netif->state = priv;
-
-  /* initialize the snmp variables and counters inside the struct netif */
-  MIB2_INIT_NETIF(netif, snmp_ifType_slip, SLIP_SIO_SPEED(priv->sd));
-
-#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);
-#endif /* SLIP_USE_RX_THREAD */
-  return ERR_OK;
-}
-
-/**
- * Polls the serial device and feeds the IP layer with incoming packets.
- *
- * @param netif The lwip network interface structure for this slipif
- */
-void
-slipif_poll(struct netif *netif)
-{
-  u8_t c;
-  struct slipif_priv *priv;
-
-  LWIP_ASSERT("netif != NULL", (netif != NULL));
-  LWIP_ASSERT("netif->state != NULL", (netif->state != NULL));
-
-  priv = (struct slipif_priv *)netif->state;
-
-  while (sio_tryread(priv->sd, &c, 1) > 0) {
-    slipif_rxbyte_input(netif, c);
-  }
-}
-
-#if SLIP_RX_FROM_ISR
-/**
- * Feeds the IP layer with incoming packets that were receive
- *
- * @param netif The lwip network interface structure for this slipif
- */
-void
-slipif_process_rxqueue(struct netif *netif)
-{
-  struct slipif_priv *priv;
-  SYS_ARCH_DECL_PROTECT(old_level);
-
-  LWIP_ASSERT("netif != NULL", (netif != NULL));
-  LWIP_ASSERT("netif->state != NULL", (netif->state != NULL));
-
-  priv = (struct slipif_priv *)netif->state;
-
-  SYS_ARCH_PROTECT(old_level);
-  while (priv->rxpackets != NULL) {
-    struct pbuf *p = priv->rxpackets;
-#if SLIP_RX_QUEUE
-    /* dequeue packet */
-    struct pbuf *q = p;
-    while ((q->len != q->tot_len) && (q->next != NULL)) {
-      q = q->next;
-    }
-    priv->rxpackets = q->next;
-    q->next = NULL;
-#else /* SLIP_RX_QUEUE */
-    priv->rxpackets = NULL;
-#endif /* SLIP_RX_QUEUE */
-    SYS_ARCH_UNPROTECT(old_level);
-    if (netif->input(p, netif) != ERR_OK) {
-      pbuf_free(p);
-    }
-    SYS_ARCH_PROTECT(old_level);
-  }
-}
-
-/** Like slipif_rxbyte, but queues completed packets.
- *
- * @param netif The lwip network interface structure for this slipif
- * @param data Received serial byte
- */
-static void
-slipif_rxbyte_enqueue(struct netif *netif, u8_t data)
-{
-  struct pbuf *p;
-  struct slipif_priv *priv = (struct slipif_priv *)netif->state;
-  SYS_ARCH_DECL_PROTECT(old_level);
-
-  p = slipif_rxbyte(netif, data);
-  if (p != NULL) {
-    SYS_ARCH_PROTECT(old_level);
-    if (priv->rxpackets != NULL) {
-#if SLIP_RX_QUEUE
-      /* queue multiple pbufs */
-      struct pbuf *q = p;
-      while (q->next != NULL) {
-        q = q->next;
-      }
-      q->next = p;
-    } else {
-#else /* SLIP_RX_QUEUE */
-      pbuf_free(priv->rxpackets);
-    }
-    {
-#endif /* SLIP_RX_QUEUE */
-      priv->rxpackets = p;
-    }
-    SYS_ARCH_UNPROTECT(old_level);
-  }
-}
-
-/**
- * Process a received byte, completed packets are put on a queue that is
- * fed into IP through slipif_process_rxqueue().
- *
- * This function can be called from ISR if SYS_LIGHTWEIGHT_PROT is enabled.
- *
- * @param netif The lwip network interface structure for this slipif
- * @param data received character
- */
-void
-slipif_received_byte(struct netif *netif, u8_t data)
-{
-  LWIP_ASSERT("netif != NULL", (netif != NULL));
-  LWIP_ASSERT("netif->state != NULL", (netif->state != NULL));
-  slipif_rxbyte_enqueue(netif, data);
-}
-
-/**
- * Process multiple received byte, completed packets are put on a queue that is
- * fed into IP through slipif_process_rxqueue().
- *
- * This function can be called from ISR if SYS_LIGHTWEIGHT_PROT is enabled.
- *
- * @param netif The lwip network interface structure for this slipif
- * @param data received character
- * @param len Number of received characters
- */
-void
-slipif_received_bytes(struct netif *netif, u8_t *data, u8_t len)
-{
-  u8_t i;
-  u8_t *rxdata = data;
-  LWIP_ASSERT("netif != NULL", (netif != NULL));
-  LWIP_ASSERT("netif->state != NULL", (netif->state != NULL));
-
-  for (i = 0; i < len; i++, rxdata++) {
-    slipif_rxbyte_enqueue(netif, *rxdata);
-  }
-}
-#endif /* SLIP_RX_FROM_ISR */
-
-#endif /* LWIP_HAVE_SLIPIF */
similarity index 98%
rename from components/lwip/port/debug/lwip_debug.c
rename to components/lwip/port/esp32/debug/lwip_debug.c
index c2bd89f3ebe846570b1d28be55e41d3d43447e93..8e1574548c0b3f44a2181a563fe59cdbf467fc81 100644 (file)
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "lwip/lwip_debug.h"
+#include "debug/lwip_debug.h"
 #include "lwip/api.h"
 #include "lwip/netbuf.h"
 #include "lwip/tcp.h"
@@ -95,7 +95,7 @@ static void dbg_lwip_tcp_pcb_one_show(struct tcp_pcb* pcb)
     ESP_LWIP_LOGI("cwnd=%d ssthreash=%d", pcb->cwnd, pcb->ssthresh);
     ESP_LWIP_LOGI("snd_next=%d snd_wl1=%d snd_wl2=%d", pcb->snd_nxt, pcb->snd_wl1, pcb->snd_wl2);
     ESP_LWIP_LOGI("snd_lbb=%d snd_wnd=%d snd_wnd_max=%d", pcb->snd_lbb, pcb->snd_wnd, pcb->snd_wnd_max);
-    ESP_LWIP_LOGI("acked=%d", pcb->acked);
+    //ESP_LWIP_LOGI("acked=%d", pcb->acked);
     ESP_LWIP_LOGI("snd_buf=%d snd_queuelen=%d", pcb->snd_buf, pcb->snd_queuelen);
     ESP_LWIP_LOGI("unsent_oversize=%d", pcb->unsent_oversize);
     ESP_LWIP_LOGI("keep_idle=%d keep_intvl=%d keep_cnt=%d", pcb->keep_idle, pcb->keep_intvl, pcb->keep_cnt);
similarity index 93%
rename from components/lwip/include/lwip/port/arpa/inet.h
rename to components/lwip/port/esp32/include/arpa/inet.h
index 94c6c17ed5a23928abc570a0c89750f437c8d8d9..90428f687d7ea0965774b55811b662841e0d11d1 100644 (file)
@@ -15,6 +15,6 @@
 #ifndef INET_H_
 #define INET_H_
 
-#include "lwip/inet.h"
+#include "../../../lwip/src/include/lwip/inet.h"
 
 #endif /* INET_H_ */
similarity index 97%
rename from components/lwip/include/lwip/port/lwipopts.h
rename to components/lwip/port/esp32/include/lwipopts.h
index 8f1dd44ff5ee123414f626b69877db70a4a6becd..64920030758ad05a007d797569bb78f3b6fd085e 100644 (file)
    ---------------------------------------
 */
 #define LWIP_HOOK_IP4_ROUTE_SRC         ip4_route_src_hook
-
 /*
    ---------------------------------------
    ---------- Debugging options ----------
 
 #define ESP_LWIP                        1
 #define ESP_LWIP_ARP                    1
-#define ESP_PER_SOC_TCP_WND             1
+#define ESP_PER_SOC_TCP_WND             0
 #define ESP_THREAD_SAFE                 1
 #define ESP_THREAD_SAFE_DEBUG           LWIP_DBG_OFF
 #define ESP_DHCP                        1
 #define ESP_STATS_DROP                  CONFIG_LWIP_STATS
 #define ESP_STATS_TCP                   0
 #define ESP_DHCP_TIMER                  1
+#define ESP_DHCPS_TIMER                 1
 #define ESP_LWIP_LOGI(...)              ESP_LOGI("lwip", __VA_ARGS__)
 #define ESP_PING                        1
 #define ESP_HAS_SELECT                  1
+#define ESP_AUTO_RECV                   1
 
 #if CONFIG_LWIP_IRAM_OPTIMIZATION
 #define ESP_IRAM_ATTR                   IRAM_ATTR
 #define ESP_IRAM_ATTR                   
 #endif
 
-#define TCP_WND_DEFAULT                 CONFIG_TCP_WND_DEFAULT
-#define TCP_SND_BUF_DEFAULT             CONFIG_TCP_SND_BUF_DEFAULT
-
 #if ESP_PERF
 #define DBG_PERF_PATH_SET(dir, point)
 #define DBG_PERF_FILTER_LEN             1000
@@ -772,9 +770,18 @@ enum {
 #define DBG_PERF_FILTER_LEN             1000
 #endif
 
+#define TCP_SND_BUF                     CONFIG_TCP_SND_BUF_DEFAULT
+#define TCP_WND                         CONFIG_TCP_WND_DEFAULT
+
 #if ESP_PER_SOC_TCP_WND
+#define TCP_WND_DEFAULT                 CONFIG_TCP_WND_DEFAULT
+#define TCP_SND_BUF_DEFAULT             CONFIG_TCP_SND_BUF_DEFAULT
 #define TCP_WND(pcb)                    (pcb->per_soc_tcp_wnd)
 #define TCP_SND_BUF(pcb)                (pcb->per_soc_tcp_snd_buf)
+#define TCP_SND_QUEUELEN(pcb)           ((4 * (TCP_SND_BUF((pcb))) + (TCP_MSS - 1))/(TCP_MSS))
+#define TCP_SNDLOWAT(pcb)               LWIP_MIN(LWIP_MAX(((TCP_SND_BUF((pcb)))/2), (2 * TCP_MSS) + 1), (TCP_SND_BUF((pcb))) - 1)
+#define TCP_SNDQUEUELOWAT(pcb)          LWIP_MAX(((TCP_SND_QUEUELEN((pcb)))/2), 5)
+#define TCP_WND_UPDATE_THRESHOLD(pcb)   LWIP_MIN((TCP_WND((pcb)) / 4), (TCP_MSS * 4))
 #endif
 
 /**
index e4ab816decbed6a8b8cfc29f665a8c0a2ae0673f..1779bd527f0c070c3739d5c6bb94e8e5611d46d2 100644 (file)
@@ -207,7 +207,7 @@ static esp_err_t _udp_pcb_init(tcpip_adapter_if_t tcpip_if, mdns_ip_protocol_t i
 }
 
 typedef struct {
-    struct tcpip_api_call call;
+    struct tcpip_api_call_data call;
     tcpip_adapter_if_t tcpip_if;
     mdns_ip_protocol_t ip_protocol;
     esp_err_t err;
@@ -216,7 +216,7 @@ typedef struct {
 /**
  * @brief  Start PCB from LwIP thread
  */
-static err_t _mdns_pcb_init_api(struct tcpip_api_call *api_call_msg)
+static err_t _mdns_pcb_init_api(struct tcpip_api_call_data *api_call_msg)
 {
     mdns_api_call_t * msg = (mdns_api_call_t *)api_call_msg;
     msg->err = _udp_pcb_init(msg->tcpip_if, msg->ip_protocol);
@@ -226,7 +226,7 @@ static err_t _mdns_pcb_init_api(struct tcpip_api_call *api_call_msg)
 /**
  * @brief  Stop PCB from LwIP thread
  */
-static err_t _mdns_pcb_deinit_api(struct tcpip_api_call *api_call_msg)
+static err_t _mdns_pcb_deinit_api(struct tcpip_api_call_data *api_call_msg)
 {
     mdns_api_call_t * msg = (mdns_api_call_t *)api_call_msg;
     _udp_pcb_deinit(msg->tcpip_if, msg->ip_protocol);
@@ -245,7 +245,7 @@ esp_err_t _mdns_pcb_init(tcpip_adapter_if_t tcpip_if, mdns_ip_protocol_t ip_prot
         .tcpip_if = tcpip_if,
         .ip_protocol = ip_protocol
     };
-    tcpip_api_call(_mdns_pcb_init_api, (struct tcpip_api_call*)&msg);
+    tcpip_api_call(_mdns_pcb_init_api, (struct tcpip_api_call_data*)&msg);
     return msg.err;
 }
 
@@ -255,7 +255,7 @@ esp_err_t _mdns_pcb_deinit(tcpip_adapter_if_t tcpip_if, mdns_ip_protocol_t ip_pr
         .tcpip_if = tcpip_if,
         .ip_protocol = ip_protocol
     };
-    tcpip_api_call(_mdns_pcb_deinit_api, (struct tcpip_api_call*)&msg);
+    tcpip_api_call(_mdns_pcb_deinit_api, (struct tcpip_api_call_data*)&msg);
     return msg.err;
 }
 
index 4644bd81ed09afd7f0dec2d98ed64c61ba189e31..205c05fab6b364d958896c3c57f73b30d4e682b2 100644 (file)
@@ -43,7 +43,7 @@
 
 #if CONFIG_TCPIP_LWIP
 #include "lwip/ip_addr.h"
-#include "apps/dhcpserver.h"
+#include "dhcpserver/dhcpserver.h"
 
 #ifdef __cplusplus
 extern "C" {
index 31b9db24e895288c994d7a04422a52e64b2cadde..a92cfd7c313d1e32ab31ddda9abe9d8076b7e486 100644 (file)
@@ -32,8 +32,8 @@
 #include "netif/wlanif.h"
 #include "netif/ethernetif.h"
 
-#include "apps/dhcpserver.h"
-#include "apps/dhcpserver_options.h"
+#include "dhcpserver/dhcpserver.h"
+#include "dhcpserver/dhcpserver_options.h"
 
 #include "esp_event.h"
 #include "esp_log.h"
@@ -139,7 +139,7 @@ static int tcpip_adapter_ipc_check(tcpip_adapter_api_msg_t *msg)
     }
 
     sys_arch_sem_wait(&api_lock_sem, 0);
-    tcpip_send_api_msg((tcpip_callback_fn)tcpip_adapter_api_cb, msg, &api_sync_sem);
+    tcpip_send_msg_wait_sem((tcpip_callback_fn)tcpip_adapter_api_cb, msg, &api_sync_sem);
     sys_sem_signal(&api_lock_sem);
 
     return TCPIP_ADAPTER_IPC_REMOTE;
@@ -316,7 +316,7 @@ esp_err_t tcpip_adapter_down(tcpip_adapter_if_t tcpip_if)
             tcpip_adapter_reset_ip_info(tcpip_if);
         }
 
-        netif_set_addr(esp_netif[tcpip_if], IP4_ADDR_ANY, IP4_ADDR_ANY, IP4_ADDR_ANY);
+        netif_set_addr(esp_netif[tcpip_if], IP4_ADDR_ANY4, IP4_ADDR_ANY4, IP4_ADDR_ANY4);
         netif_set_down(esp_netif[tcpip_if]);
         tcpip_adapter_start_ip_lost_timer(tcpip_if);
     }
@@ -882,12 +882,12 @@ static void tcpip_adapter_dhcpc_cb(struct netif *netif)
     ip_info = &esp_ip[tcpip_if];
     ip_info_old = &esp_ip_old[tcpip_if];
 
-    if ( !ip4_addr_cmp(ip_2_ip4(&netif->ip_addr), IP4_ADDR_ANY) ) {
+    if ( !ip4_addr_cmp(ip_2_ip4(&netif->ip_addr), IP4_ADDR_ANY4) ) {
         
         //check whether IP is changed
-        if ( !ip4_addr_cmp(ip_2_ip4(&netif->ip_addr), &ip_info->ip) ||
-                !ip4_addr_cmp(ip_2_ip4(&netif->netmask), &ip_info->netmask) ||
-                !ip4_addr_cmp(ip_2_ip4(&netif->gw), &ip_info->gw) ) {
+        if ( !ip4_addr_cmp(ip_2_ip4(&netif->ip_addr), (&ip_info->ip)) ||
+                !ip4_addr_cmp(ip_2_ip4(&netif->netmask), (&ip_info->netmask)) ||
+                !ip4_addr_cmp(ip_2_ip4(&netif->gw), (&ip_info->gw)) ) {
             system_event_t evt;
 
             ip4_addr_set(&ip_info->ip, ip_2_ip4(&netif->ip_addr));
@@ -915,7 +915,7 @@ static void tcpip_adapter_dhcpc_cb(struct netif *netif)
             ESP_LOGD(TAG, "if%d ip unchanged", tcpip_if);
         }
     } else {
-        if (!ip4_addr_cmp(&ip_info->ip, IP4_ADDR_ANY)) {
+        if (!ip4_addr_cmp(&ip_info->ip, IP4_ADDR_ANY4)) {
             tcpip_adapter_start_ip_lost_timer(tcpip_if);
         }
     }
@@ -962,7 +962,7 @@ static void tcpip_adapter_ip_lost_timer(void *arg)
     if (tcpip_if == TCPIP_ADAPTER_IF_STA) {
         struct netif *netif = esp_netif[tcpip_if];
 
-        if ( (!netif) || (netif && ip4_addr_cmp(ip_2_ip4(&netif->ip_addr), IP4_ADDR_ANY))){
+        if ( (!netif) || (netif && ip4_addr_cmp(ip_2_ip4(&netif->ip_addr), IP4_ADDR_ANY4))){
             system_event_t evt;
 
             ESP_LOGD(TAG, "if%d ip lost tmr: raise ip lost event", tcpip_if);
index cdcc6ec977f2717b9f1e7d14d5230ed4517ddc59..8083fcf720948e47db014ec38509916f277e9105 100644 (file)
@@ -18,7 +18,7 @@
 #include "freertos/event_groups.h"
 #include "esp_wifi.h"
 #include "esp_event_loop.h"
-#include "apps/sntp/sntp.h"
+#include "lwip/apps/sntp.h"
 #include "esp_log.h"
 #include "esp_system.h"
 #include "nvs_flash.h"
index a1dcaf588c5d6d371d2c762ea7ac5808a794cb26..0c3c0858c8b4e2de5765307b280a1a5b8678e45d 100644 (file)
 #include "driver/uart.h"
 
 #include "netif/ppp/pppos.h"
+#include "netif/ppp/pppapi.h"
 #include "lwip/err.h"
 #include "lwip/sockets.h"
 #include "lwip/sys.h"
 #include "lwip/netdb.h"
 #include "lwip/dns.h"
-#include "lwip/pppapi.h"
 
 /* The examples use simple GSM configuration that you can set via
    'make menuconfig'.
index e77ccbdcbf2696bfaf2e0459617a477c6ab11816..0cfdeb7a5814bc97590e7767d4a930d1b2f9e13d 100644 (file)
@@ -21,7 +21,7 @@
 #include "nvs_flash.h"
 
 #include "lwip/err.h"
-#include "apps/sntp/sntp.h"
+#include "lwip/apps/sntp.h"
 
 /* The examples use simple WiFi configuration that you can set via
    'make menuconfig'.
index af5bcb702dccb95ec92a74f2a1071aab6ed3fbff..a21c24a609781a4773ea68730ae4a8108e62bd05 100644 (file)
@@ -125,7 +125,7 @@ static int socket_add_ipv4_multicast_group(int sock, bool assign_source_if)
         ESP_LOGE(V4TAG, "Failed to get IP address info. Error 0x%x", err);
         goto err;
     }
-    inet_addr_from_ipaddr(&iaddr, &ip_info.ip);
+    inet_addr_from_ip4addr(&iaddr, &ip_info.ip);
 #endif
     // Configure multicast address to listen to
     err = inet_aton(MULTICAST_IPV4_ADDR, &imreq.imr_multiaddr.s_addr);
index 613b73f3f8e62d551f614457afda4a5064e4206e..94b0ad2d9ead81d34da6400c3a41b09923f1883d 100644 (file)
@@ -18,8 +18,8 @@ CONFIG_FREERTOS_HZ=1000
 CONFIG_INT_WDT=
 CONFIG_TASK_WDT=
 
-CONFIG_TCP_SND_BUF_DEFAULT=65535
-CONFIG_TCP_WND_DEFAULT=65535
+CONFIG_TCP_SND_BUF_DEFAULT=65534
+CONFIG_TCP_WND_DEFAULT=65534
 CONFIG_TCP_RECVMBOX_SIZE=64
 CONFIG_UDP_RECVMBOX_SIZE=64
 CONFIG_TCPIP_RECVMBOX_SIZE=64
index 0c6fc87abf2cbf9116123f58fdf9d0ea8adcdd99..b0bed372c7b6ba073ac31ac52c558bb8c9704e7e 100644 (file)
@@ -16,8 +16,8 @@ CONFIG_ESP32_WIFI_TX_BA_WIN=32
 CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y
 CONFIG_ESP32_WIFI_RX_BA_WIN=32
 
-CONFIG_TCP_SND_BUF_DEFAULT=65535
-CONFIG_TCP_WND_DEFAULT=65535
+CONFIG_TCP_SND_BUF_DEFAULT=65534
+CONFIG_TCP_WND_DEFAULT=65534
 CONFIG_TCP_RECVMBOX_SIZE=64
 CONFIG_UDP_RECVMBOX_SIZE=64
 CONFIG_TCPIP_RECVMBOX_SIZE=64
index 3d016f9544398cffa3d88e4e76ab532a88038dc9..90b23887f7fa2da6d99cd59d265d35a7e63356d2 100644 (file)
@@ -14,8 +14,8 @@ CONFIG_FREERTOS_HZ=1000
 CONFIG_INT_WDT=
 CONFIG_TASK_WDT=
 
-CONFIG_TCP_SND_BUF_DEFAULT=65535
-CONFIG_TCP_WND_DEFAULT=65535
+CONFIG_TCP_SND_BUF_DEFAULT=65534
+CONFIG_TCP_WND_DEFAULT=65534
 CONFIG_TCP_RECVMBOX_SIZE=64
 CONFIG_UDP_RECVMBOX_SIZE=64
 CONFIG_TCPIP_RECVMBOX_SIZE=64
index 12460b84be07823b16b6418a850750adde22c925..cdd5257d317f0467ed4e2fc6b3a514fd8b1894cf 100644 (file)
@@ -18,8 +18,8 @@ CONFIG_FREERTOS_HZ=1000
 CONFIG_INT_WDT=
 CONFIG_TASK_WDT=
 
-CONFIG_TCP_SND_BUF_DEFAULT=65535
-CONFIG_TCP_WND_DEFAULT=65535
+CONFIG_TCP_SND_BUF_DEFAULT=65534
+CONFIG_TCP_WND_DEFAULT=65534
 CONFIG_TCP_RECVMBOX_SIZE=64
 CONFIG_UDP_RECVMBOX_SIZE=64
 CONFIG_TCPIP_RECVMBOX_SIZE=64
index dd516ba1765d77e1ece1b24395b22eca800aa8c9..65d51174a9c8504dc1e1ee7696471e6459d73f7c 100644 (file)
@@ -18,8 +18,8 @@ CONFIG_FREERTOS_HZ=1000
 CONFIG_INT_WDT=
 CONFIG_TASK_WDT=
 
-CONFIG_TCP_SND_BUF_DEFAULT=65535
-CONFIG_TCP_WND_DEFAULT=65535
+CONFIG_TCP_SND_BUF_DEFAULT=65534
+CONFIG_TCP_WND_DEFAULT=65534
 CONFIG_TCP_RECVMBOX_SIZE=64
 CONFIG_UDP_RECVMBOX_SIZE=64
 CONFIG_TCPIP_RECVMBOX_SIZE=64
index c67a7ddeaeaa519e90976d32e85603c3eab4f210..f45d0f76ecbc66d21946adf1bd910e6ff5c3ef24 100644 (file)
@@ -11,5 +11,6 @@ components/micro-ecc/micro-ecc                      @GENERAL_MIRROR_SERVER@/idf/
 components/nghttp/nghttp2                           @GENERAL_MIRROR_SERVER@/idf/nghttp2.git                         ALLOW_TO_SYNC_FROM_PUBLIC
 components/spiffs/spiffs                            @GENERAL_MIRROR_SERVER@/idf/spiffs.git                          ALLOW_TO_SYNC_FROM_PUBLIC
 components/asio/asio                                @GENERAL_MIRROR_SERVER@/idf/asio.git
+components/lwip/lwip                                @GENERAL_MIRROR_SERVER@/idf/esp-lwip.git
 third-party/mruby                                   @GENERAL_MIRROR_SERVER@/idf/mruby.git                           ALLOW_TO_SYNC_FROM_PUBLIC
 third-party/neverbleed                              @GENERAL_MIRROR_SERVER@/idf/neverbleed.git                      ALLOW_TO_SYNC_FROM_PUBLIC