Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Release 1.0
[palacios.git] / geekos / src / lwip / core / init.c
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: %d\n",  (PBUF_POOL_SIZE*PBUF_POOL_BUFSIZE)));
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 }