1/** 2 * @file 3 * Modules initialization 4 * 5 */ 6 7/* 8 * Copyright (c) 2001-2004 Swedish Institute of Computer Science. 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without modification, 12 * are permitted provided that the following conditions are met: 13 * 14 * 1. Redistributions of source code must retain the above copyright notice, 15 * this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright notice, 17 * this list of conditions and the following disclaimer in the documentation 18 * and/or other materials provided with the distribution. 19 * 3. The name of the author may not be used to endorse or promote products 20 * derived from this software without specific prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 23 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 24 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 25 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 26 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 27 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 30 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 31 * OF SUCH DAMAGE. 32 * 33 * This file is part of the lwIP TCP/IP stack. 34 * 35 * Author: Adam Dunkels <adam@sics.se> 36 */ 37 38#include "lwip/opt.h" 39 40#include "lwip/init.h" 41#include "lwip/stats.h" 42#include "lwip/sys.h" 43#include "lwip/mem.h" 44#include "lwip/memp.h" 45#include "lwip/pbuf.h" 46#include "lwip/netif.h" 47#include "lwip/sockets.h" 48#include "lwip/ip.h" 49#include "lwip/raw.h" 50#include "lwip/udp.h" 51#include "lwip/priv/tcp_priv.h" 52#include "lwip/igmp.h" 53#include "lwip/dns.h" 54#include "lwip/timeouts.h" 55#include "lwip/etharp.h" 56#include "lwip/ip6.h" 57#include "lwip/nd6.h" 58#include "lwip/mld6.h" 59#include "lwip/api.h" 60 61#include "netif/ppp/ppp_opts.h" 62#include "netif/ppp/ppp_impl.h" 63 64#ifndef LWIP_SKIP_PACKING_CHECK 65 66#ifdef PACK_STRUCT_USE_INCLUDES 67# include "arch/bpstruct.h" 68#endif 69PACK_STRUCT_BEGIN 70struct packed_struct_test { 71 PACK_STRUCT_FLD_8(u8_t dummy1); 72 PACK_STRUCT_FIELD(u32_t dummy2); 73} PACK_STRUCT_STRUCT; 74PACK_STRUCT_END 75#ifdef PACK_STRUCT_USE_INCLUDES 76# include "arch/epstruct.h" 77#endif 78#define PACKED_STRUCT_TEST_EXPECTED_SIZE 5 79 80#endif 81 82/* Compile-time sanity checks for configuration errors. 83 * These can be done independently of LWIP_DEBUG, without penalty. 84 */ 85#ifndef BYTE_ORDER 86#error "BYTE_ORDER is not defined, you have to define it in your cc.h" 87#endif 88#if (!IP_SOF_BROADCAST && IP_SOF_BROADCAST_RECV) 89#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" 90#endif 91#if (!LWIP_UDP && LWIP_UDPLITE) 92#error "If you want to use UDP Lite, you have to define LWIP_UDP=1 in your lwipopts.h" 93#endif 94#if (!LWIP_UDP && LWIP_DHCP) 95#error "If you want to use DHCP, you have to define LWIP_UDP=1 in your lwipopts.h" 96#endif 97#if (!LWIP_UDP && !LWIP_RAW && LWIP_MULTICAST_TX_OPTIONS) 98#error "If you want to use LWIP_MULTICAST_TX_OPTIONS, you have to define LWIP_UDP=1 and/or LWIP_RAW=1 in your lwipopts.h" 99#endif 100#if (!LWIP_UDP && LWIP_DNS) 101#error "If you want to use DNS, you have to define LWIP_UDP=1 in your lwipopts.h" 102#endif 103#if !MEMP_MEM_MALLOC /* MEMP_NUM_* checks are disabled when not using the pool allocator */ 104#if (LWIP_ARP && ARP_QUEUEING && (MEMP_NUM_ARP_QUEUE<=0)) 105#error "If you want to use ARP Queueing, you have to define MEMP_NUM_ARP_QUEUE>=1 in your lwipopts.h" 106#endif 107#if (LWIP_RAW && (MEMP_NUM_RAW_PCB<=0)) 108#error "If you want to use RAW, you have to define MEMP_NUM_RAW_PCB>=1 in your lwipopts.h" 109#endif 110#if (LWIP_UDP && (MEMP_NUM_UDP_PCB<=0)) 111#error "If you want to use UDP, you have to define MEMP_NUM_UDP_PCB>=1 in your lwipopts.h" 112#endif 113#if (LWIP_TCP && (MEMP_NUM_TCP_PCB<=0)) 114#error "If you want to use TCP, you have to define MEMP_NUM_TCP_PCB>=1 in your lwipopts.h" 115#endif 116#if (LWIP_IGMP && (MEMP_NUM_IGMP_GROUP<=1)) 117#error "If you want to use IGMP, you have to define MEMP_NUM_IGMP_GROUP>1 in your lwipopts.h" 118#endif 119#if (LWIP_IGMP && !LWIP_MULTICAST_TX_OPTIONS) 120#error "If you want to use IGMP, you have to define LWIP_MULTICAST_TX_OPTIONS==1 in your lwipopts.h" 121#endif 122#if (LWIP_IGMP && !LWIP_IPV4) 123#error "IGMP needs LWIP_IPV4 enabled in your lwipopts.h" 124#endif 125#if ((LWIP_NETCONN || LWIP_SOCKET) && (MEMP_NUM_TCPIP_MSG_API<=0)) 126#error "If you want to use Sequential API, you have to define MEMP_NUM_TCPIP_MSG_API>=1 in your lwipopts.h" 127#endif 128/* There must be sufficient timeouts, taking into account requirements of the subsystems. */ 129#if LWIP_TIMERS && (MEMP_NUM_SYS_TIMEOUT < LWIP_NUM_SYS_TIMEOUT_INTERNAL) 130#error "MEMP_NUM_SYS_TIMEOUT is too low to accomodate all required timeouts" 131#endif 132#if (IP_REASSEMBLY && (MEMP_NUM_REASSDATA > IP_REASS_MAX_PBUFS)) 133#error "MEMP_NUM_REASSDATA > IP_REASS_MAX_PBUFS doesn't make sense since each struct ip_reassdata must hold 2 pbufs at least!" 134#endif 135#endif /* !MEMP_MEM_MALLOC */ 136#if LWIP_WND_SCALE 137#if (LWIP_TCP && (TCP_WND > 0xffffffff)) 138#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" 139#endif 140#if (LWIP_TCP && (TCP_RCV_SCALE > 14)) 141#error "The maximum valid window scale value is 14!" 142#endif 143#if (LWIP_TCP && (TCP_WND > (0xFFFFU << TCP_RCV_SCALE))) 144#error "TCP_WND is bigger than the configured LWIP_WND_SCALE allows!" 145#endif 146#if (LWIP_TCP && ((TCP_WND >> TCP_RCV_SCALE) == 0)) 147#error "TCP_WND is too small for the configured LWIP_WND_SCALE (results in zero window)!" 148#endif 149#else /* LWIP_WND_SCALE */ 150#if (LWIP_TCP && (TCP_WND > 0xffff)) 151#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)" 152#endif 153#endif /* LWIP_WND_SCALE */ 154#if (LWIP_TCP && (TCP_SND_QUEUELEN > 0xffff)) 155#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" 156#endif 157#if (LWIP_TCP && (TCP_SND_QUEUELEN < 2)) 158#error "TCP_SND_QUEUELEN must be at least 2 for no-copy TCP writes to work" 159#endif 160#if (LWIP_TCP && ((TCP_MAXRTX > 12) || (TCP_SYNMAXRTX > 12))) 161#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" 162#endif 163#if (LWIP_TCP && TCP_LISTEN_BACKLOG && ((TCP_DEFAULT_LISTEN_BACKLOG < 0) || (TCP_DEFAULT_LISTEN_BACKLOG > 0xff))) 164#error "If you want to use TCP backlog, TCP_DEFAULT_LISTEN_BACKLOG must fit into an u8_t" 165#endif 166#if (LWIP_TCP && LWIP_TCP_SACK_OUT && !TCP_QUEUE_OOSEQ) 167#error "To use LWIP_TCP_SACK_OUT, TCP_QUEUE_OOSEQ needs to be enabled" 168#endif 169#if (LWIP_TCP && LWIP_TCP_SACK_OUT && (LWIP_TCP_MAX_SACK_NUM < 1)) 170#error "LWIP_TCP_MAX_SACK_NUM must be greater than 0" 171#endif 172#if (LWIP_NETIF_API && (NO_SYS==1)) 173#error "If you want to use NETIF API, you have to define NO_SYS=0 in your lwipopts.h" 174#endif 175#if ((LWIP_SOCKET || LWIP_NETCONN) && (NO_SYS==1)) 176#error "If you want to use Sequential API, you have to define NO_SYS=0 in your lwipopts.h" 177#endif 178#if (LWIP_PPP_API && (NO_SYS==1)) 179#error "If you want to use PPP API, you have to define NO_SYS=0 in your lwipopts.h" 180#endif 181#if (LWIP_PPP_API && (PPP_SUPPORT==0)) 182#error "If you want to use PPP API, you have to enable PPP_SUPPORT in your lwipopts.h" 183#endif 184#if (((!LWIP_DHCP) || (!LWIP_AUTOIP)) && LWIP_DHCP_AUTOIP_COOP) 185#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" 186#endif 187#if (((!LWIP_DHCP) || (!LWIP_ARP)) && DHCP_DOES_ARP_CHECK) 188#error "If you want to use DHCP ARP checking, you have to define LWIP_DHCP=1 and LWIP_ARP=1 in your lwipopts.h" 189#endif 190#if (!LWIP_ARP && LWIP_AUTOIP) 191#error "If you want to use AUTOIP, you have to define LWIP_ARP=1 in your lwipopts.h" 192#endif 193#if (LWIP_TCP && ((LWIP_EVENT_API && LWIP_CALLBACK_API) || (!LWIP_EVENT_API && !LWIP_CALLBACK_API))) 194#error "One and exactly one of LWIP_EVENT_API and LWIP_CALLBACK_API has to be enabled in your lwipopts.h" 195#endif 196#if (LWIP_ALTCP && LWIP_EVENT_API) 197#error "The application layered tcp API does not work with LWIP_EVENT_API" 198#endif 199#if (MEM_LIBC_MALLOC && MEM_USE_POOLS) 200#error "MEM_LIBC_MALLOC and MEM_USE_POOLS may not both be simultaneously enabled in your lwipopts.h" 201#endif 202#if (MEM_USE_POOLS && !MEMP_USE_CUSTOM_POOLS) 203#error "MEM_USE_POOLS requires custom pools (MEMP_USE_CUSTOM_POOLS) to be enabled in your lwipopts.h" 204#endif 205#if (PBUF_POOL_BUFSIZE <= MEM_ALIGNMENT) 206#error "PBUF_POOL_BUFSIZE must be greater than MEM_ALIGNMENT or the offset may take the full first pbuf" 207#endif 208#if (DNS_LOCAL_HOSTLIST && !DNS_LOCAL_HOSTLIST_IS_DYNAMIC && !(defined(DNS_LOCAL_HOSTLIST_INIT))) 209#error "you have to define define DNS_LOCAL_HOSTLIST_INIT {{'host1', 0x123}, {'host2', 0x234}} to initialize DNS_LOCAL_HOSTLIST" 210#endif 211#if PPP_SUPPORT && !PPPOS_SUPPORT && !PPPOE_SUPPORT && !PPPOL2TP_SUPPORT 212#error "PPP_SUPPORT needs at least one of PPPOS_SUPPORT, PPPOE_SUPPORT or PPPOL2TP_SUPPORT turned on" 213#endif 214#if PPP_SUPPORT && !PPP_IPV4_SUPPORT && !PPP_IPV6_SUPPORT 215#error "PPP_SUPPORT needs PPP_IPV4_SUPPORT and/or PPP_IPV6_SUPPORT turned on" 216#endif 217#if PPP_SUPPORT && PPP_IPV4_SUPPORT && !LWIP_IPV4 218#error "PPP_IPV4_SUPPORT needs LWIP_IPV4 turned on" 219#endif 220#if PPP_SUPPORT && PPP_IPV6_SUPPORT && !LWIP_IPV6 221#error "PPP_IPV6_SUPPORT needs LWIP_IPV6 turned on" 222#endif 223#if !LWIP_ETHERNET && (LWIP_ARP || PPPOE_SUPPORT) 224#error "LWIP_ETHERNET needs to be turned on for LWIP_ARP or PPPOE_SUPPORT" 225#endif 226#if LWIP_TCPIP_CORE_LOCKING_INPUT && !LWIP_TCPIP_CORE_LOCKING 227#error "When using LWIP_TCPIP_CORE_LOCKING_INPUT, LWIP_TCPIP_CORE_LOCKING must be enabled, too" 228#endif 229#if LWIP_TCP && LWIP_NETIF_TX_SINGLE_PBUF && !TCP_OVERSIZE 230#error "LWIP_NETIF_TX_SINGLE_PBUF needs TCP_OVERSIZE enabled to create single-pbuf TCP packets" 231#endif 232#if LWIP_NETCONN && LWIP_TCP 233#if NETCONN_COPY != TCP_WRITE_FLAG_COPY 234#error "NETCONN_COPY != TCP_WRITE_FLAG_COPY" 235#endif 236#if NETCONN_MORE != TCP_WRITE_FLAG_MORE 237#error "NETCONN_MORE != TCP_WRITE_FLAG_MORE" 238#endif 239#endif /* LWIP_NETCONN && LWIP_TCP */ 240#if LWIP_SOCKET 241#endif /* LWIP_SOCKET */ 242 243 244/* Compile-time checks for deprecated options. 245 */ 246#ifdef MEMP_NUM_TCPIP_MSG 247#error "MEMP_NUM_TCPIP_MSG option is deprecated. Remove it from your lwipopts.h." 248#endif 249#ifdef TCP_REXMIT_DEBUG 250#error "TCP_REXMIT_DEBUG option is deprecated. Remove it from your lwipopts.h." 251#endif 252#ifdef RAW_STATS 253#error "RAW_STATS option is deprecated. Remove it from your lwipopts.h." 254#endif 255#ifdef ETHARP_QUEUE_FIRST 256#error "ETHARP_QUEUE_FIRST option is deprecated. Remove it from your lwipopts.h." 257#endif 258#ifdef ETHARP_ALWAYS_INSERT 259#error "ETHARP_ALWAYS_INSERT option is deprecated. Remove it from your lwipopts.h." 260#endif 261#if !NO_SYS && LWIP_TCPIP_CORE_LOCKING && LWIP_COMPAT_MUTEX && !defined(LWIP_COMPAT_MUTEX_ALLOWED) 262#error "LWIP_COMPAT_MUTEX cannot prevent priority inversion. It is recommended to implement priority-aware mutexes. (Define LWIP_COMPAT_MUTEX_ALLOWED to disable this error.)" 263#endif 264 265#ifndef LWIP_DISABLE_TCP_SANITY_CHECKS 266#define LWIP_DISABLE_TCP_SANITY_CHECKS 0 267#endif 268#ifndef LWIP_DISABLE_MEMP_SANITY_CHECKS 269#define LWIP_DISABLE_MEMP_SANITY_CHECKS 0 270#endif 271 272/* MEMP sanity checks */ 273#if MEMP_MEM_MALLOC 274#if !LWIP_DISABLE_MEMP_SANITY_CHECKS 275#if LWIP_NETCONN || LWIP_SOCKET 276#if !MEMP_NUM_NETCONN && LWIP_SOCKET 277#error "lwip_sanity_check: WARNING: MEMP_NUM_NETCONN cannot be 0 when using sockets!" 278#endif 279#else /* MEMP_MEM_MALLOC */ 280#if MEMP_NUM_NETCONN > (MEMP_NUM_TCP_PCB+MEMP_NUM_TCP_PCB_LISTEN+MEMP_NUM_UDP_PCB+MEMP_NUM_RAW_PCB) 281#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." 282#endif 283#endif /* LWIP_NETCONN || LWIP_SOCKET */ 284#endif /* !LWIP_DISABLE_MEMP_SANITY_CHECKS */ 285#if MEM_USE_POOLS 286#error "MEMP_MEM_MALLOC and MEM_USE_POOLS cannot be enabled at the same time" 287#endif 288#ifdef LWIP_HOOK_MEMP_AVAILABLE 289#error "LWIP_HOOK_MEMP_AVAILABLE doesn't make sense with MEMP_MEM_MALLOC" 290#endif 291#endif /* MEMP_MEM_MALLOC */ 292 293/* TCP sanity checks */ 294#if !LWIP_DISABLE_TCP_SANITY_CHECKS 295#if LWIP_TCP 296#if !MEMP_MEM_MALLOC && (MEMP_NUM_TCP_SEG < TCP_SND_QUEUELEN) 297#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." 298#endif 299#if TCP_SND_BUF < (2 * TCP_MSS) 300#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." 301#endif 302#if TCP_SND_QUEUELEN < (2 * (TCP_SND_BUF / TCP_MSS)) 303#error "lwip_sanity_check: WARNING: TCP_SND_QUEUELEN must be at least as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." 304#endif 305#if TCP_SNDLOWAT >= TCP_SND_BUF 306#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." 307#endif 308#if TCP_SNDLOWAT >= (0xFFFF - (4 * TCP_MSS)) 309#error "lwip_sanity_check: WARNING: TCP_SNDLOWAT must at least be 4*MSS below u16_t overflow!" 310#endif 311#if TCP_SNDQUEUELOWAT >= TCP_SND_QUEUELEN 312#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." 313#endif 314#if !MEMP_MEM_MALLOC && PBUF_POOL_SIZE && (PBUF_POOL_BUFSIZE <= (PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN)) 315#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." 316#endif 317#if !MEMP_MEM_MALLOC && PBUF_POOL_SIZE && (TCP_WND > (PBUF_POOL_SIZE * (PBUF_POOL_BUFSIZE - (PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN)))) 318#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." 319#endif 320#if TCP_WND < TCP_MSS 321#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." 322#endif 323#endif /* LWIP_TCP */ 324#endif /* !LWIP_DISABLE_TCP_SANITY_CHECKS */ 325 326/** 327 * @ingroup lwip_nosys 328 * Initialize all modules. 329 * Use this in NO_SYS mode. Use tcpip_init() otherwise. 330 */ 331void 332lwip_init(void) 333{ 334#ifndef LWIP_SKIP_CONST_CHECK 335 int a = 0; 336 LWIP_UNUSED_ARG(a); 337 LWIP_ASSERT("LWIP_CONST_CAST not implemented correctly. Check your lwIP port.", LWIP_CONST_CAST(void *, &a) == &a); 338#endif 339#ifndef LWIP_SKIP_PACKING_CHECK 340 LWIP_ASSERT("Struct packing not implemented correctly. Check your lwIP port.", sizeof(struct packed_struct_test) == PACKED_STRUCT_TEST_EXPECTED_SIZE); 341#endif 342 343 /* Modules initialization */ 344 stats_init(); 345#if !NO_SYS 346 sys_init(); 347#endif /* !NO_SYS */ 348 mem_init(); 349 memp_init(); 350 pbuf_init(); 351 netif_init(); 352#if LWIP_IPV4 353 ip_init(); 354#if LWIP_ARP 355 etharp_init(); 356#endif /* LWIP_ARP */ 357#endif /* LWIP_IPV4 */ 358#if LWIP_RAW 359 raw_init(); 360#endif /* LWIP_RAW */ 361#if LWIP_UDP 362 udp_init(); 363#endif /* LWIP_UDP */ 364#if LWIP_TCP 365 tcp_init(); 366#endif /* LWIP_TCP */ 367#if LWIP_IGMP 368 igmp_init(); 369#endif /* LWIP_IGMP */ 370#if LWIP_DNS 371 dns_init(); 372#endif /* LWIP_DNS */ 373#if PPP_SUPPORT 374 ppp_init(); 375#endif 376 377#if LWIP_TIMERS 378 sys_timeouts_init(); 379#endif /* LWIP_TIMERS */ 380} 381