]>
Commit | Line | Data |
---|---|---|
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 | ||
39 | #include "lwip/opt.h" | |
40 | ||
41 | #include "lwip/init.h" | |
42 | #include "lwip/stats.h" | |
43 | #include "lwip/sys.h" | |
44 | #include "lwip/mem.h" | |
45 | #include "lwip/memp.h" | |
46 | #include "lwip/pbuf.h" | |
47 | #include "lwip/netif.h" | |
48 | #include "lwip/sockets.h" | |
49 | #include "lwip/ip.h" | |
50 | #include "lwip/raw.h" | |
51 | #include "lwip/udp.h" | |
52 | #include "lwip/tcp.h" | |
53 | #include "lwip/autoip.h" | |
54 | #include "lwip/igmp.h" | |
55 | #include "lwip/dns.h" | |
56 | #include "netif/etharp.h" | |
57 | ||
58 | /* Compile-time sanity checks for configuration errors. | |
59 | * These can be done independently of LWIP_DEBUG, without penalty. | |
60 | */ | |
61 | #ifndef BYTE_ORDER | |
62 | #error "BYTE_ORDER is not defined, you have to define it in your cc.h" | |
63 | #endif | |
64 | #if (!LWIP_ARP && ARP_QUEUEING) | |
65 | #error "If you want to use ARP Queueing, you have to define LWIP_ARP=1 in your lwipopts.h" | |
66 | #endif | |
67 | #if (!LWIP_UDP && LWIP_UDPLITE) | |
68 | #error "If you want to use UDP Lite, you have to define LWIP_UDP=1 in your lwipopts.h" | |
69 | #endif | |
70 | #if (!LWIP_UDP && LWIP_SNMP) | |
71 | #error "If you want to use SNMP, you have to define LWIP_UDP=1 in your lwipopts.h" | |
72 | #endif | |
73 | #if (!LWIP_UDP && LWIP_DHCP) | |
74 | #error "If you want to use DHCP, you have to define LWIP_UDP=1 in your lwipopts.h" | |
75 | #endif | |
76 | #if (!LWIP_UDP && LWIP_IGMP) | |
77 | #error "If you want to use IGMP, you have to define LWIP_UDP=1 in your lwipopts.h" | |
78 | #endif | |
79 | #if (!LWIP_UDP && LWIP_DNS) | |
80 | #error "If you want to use DNS, you have to define LWIP_UDP=1 in your lwipopts.h" | |
81 | #endif | |
82 | #if (LWIP_ARP && (ARP_TABLE_SIZE > 0x7f)) | |
83 | #error "If you want to use ARP, ARP_TABLE_SIZE must fit in an s8_t, so, you have to reduce it in your lwipopts.h" | |
84 | #endif | |
85 | #if (LWIP_ARP && ARP_QUEUEING && (MEMP_NUM_ARP_QUEUE<=0)) | |
86 | #error "If you want to use ARP Queueing, you have to define MEMP_NUM_ARP_QUEUE>=1 in your lwipopts.h" | |
87 | #endif | |
88 | #if (LWIP_RAW && (MEMP_NUM_RAW_PCB<=0)) | |
89 | #error "If you want to use RAW, you have to define MEMP_NUM_RAW_PCB>=1 in your lwipopts.h" | |
90 | #endif | |
91 | #if (LWIP_UDP && (MEMP_NUM_UDP_PCB<=0)) | |
92 | #error "If you want to use UDP, you have to define MEMP_NUM_UDP_PCB>=1 in your lwipopts.h" | |
93 | #endif | |
94 | #if (LWIP_TCP && (MEMP_NUM_TCP_PCB<=0)) | |
95 | #error "If you want to use TCP, you have to define MEMP_NUM_TCP_PCB>=1 in your lwipopts.h" | |
96 | #endif | |
97 | #if (LWIP_TCP && (TCP_WND > 0xffff)) | |
98 | #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" | |
99 | #endif | |
100 | #if (LWIP_TCP && (TCP_SND_QUEUELEN > 0xffff)) | |
101 | #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" | |
102 | #endif | |
103 | #if (LWIP_TCP && ((TCP_MAXRTX > 12) || (TCP_SYNMAXRTX > 12))) | |
104 | #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" | |
105 | #endif | |
106 | #if (LWIP_TCP && TCP_LISTEN_BACKLOG && (TCP_DEFAULT_LISTEN_BACKLOG < 0) || (TCP_DEFAULT_LISTEN_BACKLOG > 0xff)) | |
107 | #error "If you want to use TCP backlog, TCP_DEFAULT_LISTEN_BACKLOG must fit into an u8_t" | |
108 | #endif | |
109 | #if (LWIP_IGMP && (MEMP_NUM_IGMP_GROUP<=1)) | |
110 | #error "If you want to use IGMP, you have to define MEMP_NUM_IGMP_GROUP>1 in your lwipopts.h" | |
111 | #endif | |
112 | #if (PPP_SUPPORT && (NO_SYS==1)) | |
113 | #error "If you want to use PPP, you have to define NO_SYS=0 in your lwipopts.h" | |
114 | #endif | |
115 | #if (LWIP_NETIF_API && (NO_SYS==1)) | |
116 | #error "If you want to use NETIF API, you have to define NO_SYS=0 in your lwipopts.h" | |
117 | #endif | |
118 | #if ((LWIP_SOCKET || LWIP_NETCONN) && (NO_SYS==1)) | |
119 | #error "If you want to use Sequential API, you have to define NO_SYS=0 in your lwipopts.h" | |
120 | #endif | |
121 | #if ((LWIP_NETCONN || LWIP_SOCKET) && (MEMP_NUM_TCPIP_MSG_API<=0)) | |
122 | #error "If you want to use Sequential API, you have to define MEMP_NUM_TCPIP_MSG_API>=1 in your lwipopts.h" | |
123 | #endif | |
124 | #if (!LWIP_NETCONN && LWIP_SOCKET) | |
125 | #error "If you want to use Socket API, you have to define LWIP_NETCONN=1 in your lwipopts.h" | |
126 | #endif | |
127 | #if (((!LWIP_DHCP) || (!LWIP_AUTOIP)) && LWIP_DHCP_AUTOIP_COOP) | |
128 | #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" | |
129 | #endif | |
130 | #if (((!LWIP_DHCP) || (!LWIP_ARP)) && DHCP_DOES_ARP_CHECK) | |
131 | #error "If you want to use DHCP ARP checking, you have to define LWIP_DHCP=1 and LWIP_ARP=1 in your lwipopts.h" | |
132 | #endif | |
133 | #if (!LWIP_ARP && LWIP_AUTOIP) | |
134 | #error "If you want to use AUTOIP, you have to define LWIP_ARP=1 in your lwipopts.h" | |
135 | #endif | |
136 | #if (LWIP_SNMP && (SNMP_CONCURRENT_REQUESTS<=0)) | |
137 | #error "If you want to use SNMP, you have to define SNMP_CONCURRENT_REQUESTS>=1 in your lwipopts.h" | |
138 | #endif | |
139 | #if (LWIP_SNMP && (SNMP_TRAP_DESTINATIONS<=0)) | |
140 | #error "If you want to use SNMP, you have to define SNMP_TRAP_DESTINATIONS>=1 in your lwipopts.h" | |
141 | #endif | |
142 | #if (LWIP_TCP && ((LWIP_EVENT_API && LWIP_CALLBACK_API) || (!LWIP_EVENT_API && !LWIP_CALLBACK_API))) | |
143 | #error "One and exactly one of LWIP_EVENT_API and LWIP_CALLBACK_API has to be enabled in your lwipopts.h" | |
144 | #endif | |
145 | /* There must be sufficient timeouts, taking into account requirements of the subsystems. */ | |
146 | #if ((NO_SYS==0) && (MEMP_NUM_SYS_TIMEOUT < (LWIP_TCP + IP_REASSEMBLY + LWIP_ARP + (2*LWIP_DHCP) + LWIP_AUTOIP + LWIP_IGMP + LWIP_DNS + PPP_SUPPORT))) | |
147 | #error "MEMP_NUM_SYS_TIMEOUT is too low to accomodate all required timeouts" | |
148 | #endif | |
149 | #if (IP_REASSEMBLY && (MEMP_NUM_REASSDATA > IP_REASS_MAX_PBUFS)) | |
150 | #error "MEMP_NUM_REASSDATA > IP_REASS_MAX_PBUFS doesn't make sense since each struct ip_reassdata must hold 2 pbufs at least!" | |
151 | #endif | |
152 | #if (MEM_LIBC_MALLOC && MEM_USE_POOLS) | |
153 | #error "MEM_LIBC_MALLOC and MEM_USE_POOLS may not both be simultaneously enabled in your lwipopts.h" | |
154 | #endif | |
155 | #if (MEM_USE_POOLS && !MEMP_USE_CUSTOM_POOLS) | |
156 | #error "MEM_USE_POOLS requires custom pools (MEMP_USE_CUSTOM_POOLS) to be enabled in your lwipopts.h" | |
157 | #endif | |
158 | ||
159 | ||
160 | /* Compile-time checks for deprecated options. | |
161 | */ | |
162 | #ifdef MEMP_NUM_TCPIP_MSG | |
163 | #error "MEMP_NUM_TCPIP_MSG option is deprecated. Remove it from your lwipopts.h." | |
164 | #endif | |
165 | #ifdef MEMP_NUM_API_MSG | |
166 | #error "MEMP_NUM_API_MSG option is deprecated. Remove it from your lwipopts.h." | |
167 | #endif | |
168 | #ifdef TCP_REXMIT_DEBUG | |
169 | #error "TCP_REXMIT_DEBUG option is deprecated. Remove it from your lwipopts.h." | |
170 | #endif | |
171 | #ifdef RAW_STATS | |
172 | #error "RAW_STATS option is deprecated. Remove it from your lwipopts.h." | |
173 | #endif | |
174 | #ifdef ETHARP_QUEUE_FIRST | |
175 | #error "ETHARP_QUEUE_FIRST option is deprecated. Remove it from your lwipopts.h." | |
176 | #endif | |
177 | #ifdef ETHARP_ALWAYS_INSERT | |
178 | #error "ETHARP_ALWAYS_INSERT option is deprecated. Remove it from your lwipopts.h." | |
179 | #endif | |
180 | #if SO_REUSE | |
181 | /* I removed the lot since this was an ugly hack. It broke the raw-API. | |
182 | It also came with many ugly goto's, Christiaan Simons. */ | |
183 | #error "SO_REUSE currently unavailable, this was a hack" | |
184 | #endif | |
185 | ||
186 | #ifdef LWIP_DEBUG | |
187 | static void | |
188 | lwip_sanity_check(void) | |
189 | { | |
190 | /* Warnings */ | |
191 | #if LWIP_NETCONN | |
192 | if (MEMP_NUM_NETCONN > (MEMP_NUM_TCP_PCB+MEMP_NUM_TCP_PCB_LISTEN+MEMP_NUM_UDP_PCB+MEMP_NUM_RAW_PCB)) | |
193 | LWIP_PLATFORM_DIAG(("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\n")); | |
194 | #endif /* LWIP_NETCONN */ | |
195 | #if LWIP_TCP | |
196 | if (MEMP_NUM_TCP_SEG < TCP_SND_QUEUELEN) | |
197 | LWIP_PLATFORM_DIAG(("lwip_sanity_check: WARNING: MEMP_NUM_TCP_SEG should be at least as big as TCP_SND_QUEUELEN\n")); | |
198 | if (TCP_SND_QUEUELEN < (2 * (TCP_SND_BUF/TCP_MSS))) | |
199 | LWIP_PLATFORM_DIAG(("lwip_sanity_check: WARNING: TCP_SND_QUEUELEN must be at least as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work\n")); | |
200 | if (TCP_SNDLOWAT > TCP_SND_BUF) | |
201 | LWIP_PLATFORM_DIAG(("lwip_sanity_check: WARNING: TCP_SNDLOWAT must be less than or equal to TCP_SND_BUF.\n")); | |
202 | if (TCP_WND > (PBUF_POOL_SIZE*PBUF_POOL_BUFSIZE)) | |
203 | LWIP_PLATFORM_DIAG(("lwip_sanity_check: WARNING: TCP_WND is larger than space provided by PBUF_POOL_SIZE*PBUF_POOL_BUFSIZE\n")); | |
204 | if (TCP_WND < TCP_MSS) | |
205 | LWIP_PLATFORM_DIAG(("lwip_sanity_check: WARNING: TCP_WND is smaller than MSS\n")); | |
206 | #endif /* LWIP_TCP */ | |
207 | } | |
208 | #else /* LWIP_DEBUG */ | |
209 | #define lwip_sanity_check() | |
210 | #endif /* LWIP_DEBUG */ | |
211 | ||
212 | /** | |
213 | * Perform Sanity check of user-configurable values, and initialize all modules. | |
214 | */ | |
215 | void | |
216 | lwip_init(void) | |
217 | { | |
218 | /* Sanity check user-configurable values */ | |
219 | lwip_sanity_check(); | |
220 | ||
221 | /* Modules initialization */ | |
222 | stats_init(); | |
223 | sys_init(); | |
224 | mem_init(); | |
225 | memp_init(); | |
226 | pbuf_init(); | |
227 | netif_init(); | |
228 | #if LWIP_SOCKET | |
229 | lwip_socket_init(); | |
230 | #endif /* LWIP_SOCKET */ | |
231 | ip_init(); | |
232 | #if LWIP_ARP | |
233 | etharp_init(); | |
234 | #endif /* LWIP_ARP */ | |
235 | #if LWIP_RAW | |
236 | raw_init(); | |
237 | #endif /* LWIP_RAW */ | |
238 | #if LWIP_UDP | |
239 | udp_init(); | |
240 | #endif /* LWIP_UDP */ | |
241 | #if LWIP_TCP | |
242 | tcp_init(); | |
243 | #endif /* LWIP_TCP */ | |
244 | #if LWIP_AUTOIP | |
245 | autoip_init(); | |
246 | #endif /* LWIP_AUTOIP */ | |
247 | #if LWIP_IGMP | |
248 | igmp_init(); | |
249 | #endif /* LWIP_IGMP */ | |
250 | #if LWIP_DNS | |
251 | dns_init(); | |
252 | #endif /* LWIP_DNS */ | |
253 | } |