00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #include "lwip/opt.h"
00040
00041 #include "lwip/init.h"
00042 #include "lwip/stats.h"
00043 #include "lwip/sys.h"
00044 #include "lwip/mem.h"
00045 #include "lwip/memp.h"
00046 #include "lwip/pbuf.h"
00047 #include "lwip/netif.h"
00048 #include "lwip/sockets.h"
00049 #include "lwip/ip.h"
00050 #include "lwip/raw.h"
00051 #include "lwip/udp.h"
00052 #include "lwip/tcp_impl.h"
00053 #include "lwip/snmp_msg.h"
00054 #include "lwip/autoip.h"
00055 #include "lwip/igmp.h"
00056 #include "lwip/dns.h"
00057 #include "lwip/timers.h"
00058 #include "netif/etharp.h"
00059 #include "lwip/api.h"
00060
00061
00062
00063
00064 #ifndef BYTE_ORDER
00065 #error "BYTE_ORDER is not defined, you have to define it in your cc.h"
00066 #endif
00067 #if (!IP_SOF_BROADCAST && IP_SOF_BROADCAST_RECV)
00068 #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"
00069 #endif
00070 #if (!LWIP_UDP && LWIP_UDPLITE)
00071 #error "If you want to use UDP Lite, you have to define LWIP_UDP=1 in your lwipopts.h"
00072 #endif
00073 #if (!LWIP_UDP && LWIP_SNMP)
00074 #error "If you want to use SNMP, you have to define LWIP_UDP=1 in your lwipopts.h"
00075 #endif
00076 #if (!LWIP_UDP && LWIP_DHCP)
00077 #error "If you want to use DHCP, you have to define LWIP_UDP=1 in your lwipopts.h"
00078 #endif
00079 #if (!LWIP_UDP && LWIP_IGMP)
00080 #error "If you want to use IGMP, you have to define LWIP_UDP=1 in your lwipopts.h"
00081 #endif
00082 #if (!LWIP_UDP && LWIP_SNMP)
00083 #error "If you want to use SNMP, you have to define LWIP_UDP=1 in your lwipopts.h"
00084 #endif
00085 #if (!LWIP_UDP && LWIP_DNS)
00086 #error "If you want to use DNS, you have to define LWIP_UDP=1 in your lwipopts.h"
00087 #endif
00088 #if !MEMP_MEM_MALLOC
00089 #if (LWIP_ARP && ARP_QUEUEING && (MEMP_NUM_ARP_QUEUE<=0))
00090 #error "If you want to use ARP Queueing, you have to define MEMP_NUM_ARP_QUEUE>=1 in your lwipopts.h"
00091 #endif
00092 #if (LWIP_RAW && (MEMP_NUM_RAW_PCB<=0))
00093 #error "If you want to use RAW, you have to define MEMP_NUM_RAW_PCB>=1 in your lwipopts.h"
00094 #endif
00095 #if (LWIP_UDP && (MEMP_NUM_UDP_PCB<=0))
00096 #error "If you want to use UDP, you have to define MEMP_NUM_UDP_PCB>=1 in your lwipopts.h"
00097 #endif
00098 #if (LWIP_TCP && (MEMP_NUM_TCP_PCB<=0))
00099 #error "If you want to use TCP, you have to define MEMP_NUM_TCP_PCB>=1 in your lwipopts.h"
00100 #endif
00101 #if (LWIP_IGMP && (MEMP_NUM_IGMP_GROUP<=1))
00102 #error "If you want to use IGMP, you have to define MEMP_NUM_IGMP_GROUP>1 in your lwipopts.h"
00103 #endif
00104 #if ((LWIP_NETCONN || LWIP_SOCKET) && (MEMP_NUM_TCPIP_MSG_API<=0))
00105 #error "If you want to use Sequential API, you have to define MEMP_NUM_TCPIP_MSG_API>=1 in your lwipopts.h"
00106 #endif
00107
00108 #if LWIP_TIMERS && (MEMP_NUM_SYS_TIMEOUT < (LWIP_TCP + IP_REASSEMBLY + LWIP_ARP + (2*LWIP_DHCP) + LWIP_AUTOIP + LWIP_IGMP + LWIP_DNS + PPP_SUPPORT))
00109 #error "MEMP_NUM_SYS_TIMEOUT is too low to accomodate all required timeouts"
00110 #endif
00111 #if (IP_REASSEMBLY && (MEMP_NUM_REASSDATA > IP_REASS_MAX_PBUFS))
00112 #error "MEMP_NUM_REASSDATA > IP_REASS_MAX_PBUFS doesn't make sense since each struct ip_reassdata must hold 2 pbufs at least!"
00113 #endif
00114 #endif
00115 #if (LWIP_TCP && (TCP_WND > 0xffff))
00116 #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"
00117 #endif
00118 #if (LWIP_TCP && (TCP_SND_QUEUELEN > 0xffff))
00119 #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"
00120 #endif
00121 #if (LWIP_TCP && (TCP_SND_QUEUELEN < 2))
00122 #error "TCP_SND_QUEUELEN must be at least 2 for no-copy TCP writes to work"
00123 #endif
00124 #if (LWIP_TCP && ((TCP_MAXRTX > 12) || (TCP_SYNMAXRTX > 12)))
00125 #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"
00126 #endif
00127 #if (LWIP_TCP && TCP_LISTEN_BACKLOG && (TCP_DEFAULT_LISTEN_BACKLOG < 0) || (TCP_DEFAULT_LISTEN_BACKLOG > 0xff))
00128 #error "If you want to use TCP backlog, TCP_DEFAULT_LISTEN_BACKLOG must fit into an u8_t"
00129 #endif
00130 #if (LWIP_NETIF_API && (NO_SYS==1))
00131 #error "If you want to use NETIF API, you have to define NO_SYS=0 in your lwipopts.h"
00132 #endif
00133 #if ((LWIP_SOCKET || LWIP_NETCONN) && (NO_SYS==1))
00134 #error "If you want to use Sequential API, you have to define NO_SYS=0 in your lwipopts.h"
00135 #endif
00136 #if (!LWIP_NETCONN && LWIP_SOCKET)
00137 #error "If you want to use Socket API, you have to define LWIP_NETCONN=1 in your lwipopts.h"
00138 #endif
00139 #if (((!LWIP_DHCP) || (!LWIP_AUTOIP)) && LWIP_DHCP_AUTOIP_COOP)
00140 #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"
00141 #endif
00142 #if (((!LWIP_DHCP) || (!LWIP_ARP)) && DHCP_DOES_ARP_CHECK)
00143 #error "If you want to use DHCP ARP checking, you have to define LWIP_DHCP=1 and LWIP_ARP=1 in your lwipopts.h"
00144 #endif
00145 #if (!LWIP_ARP && LWIP_AUTOIP)
00146 #error "If you want to use AUTOIP, you have to define LWIP_ARP=1 in your lwipopts.h"
00147 #endif
00148 #if (LWIP_SNMP && (SNMP_CONCURRENT_REQUESTS<=0))
00149 #error "If you want to use SNMP, you have to define SNMP_CONCURRENT_REQUESTS>=1 in your lwipopts.h"
00150 #endif
00151 #if (LWIP_SNMP && (SNMP_TRAP_DESTINATIONS<=0))
00152 #error "If you want to use SNMP, you have to define SNMP_TRAP_DESTINATIONS>=1 in your lwipopts.h"
00153 #endif
00154 #if (LWIP_TCP && ((LWIP_EVENT_API && LWIP_CALLBACK_API) || (!LWIP_EVENT_API && !LWIP_CALLBACK_API)))
00155 #error "One and exactly one of LWIP_EVENT_API and LWIP_CALLBACK_API has to be enabled in your lwipopts.h"
00156 #endif
00157 #if (MEM_LIBC_MALLOC && MEM_USE_POOLS)
00158 #error "MEM_LIBC_MALLOC and MEM_USE_POOLS may not both be simultaneously enabled in your lwipopts.h"
00159 #endif
00160 #if (MEM_USE_POOLS && !MEMP_USE_CUSTOM_POOLS)
00161 #error "MEM_USE_POOLS requires custom pools (MEMP_USE_CUSTOM_POOLS) to be enabled in your lwipopts.h"
00162 #endif
00163 #if (PBUF_POOL_BUFSIZE <= MEM_ALIGNMENT)
00164 #error "PBUF_POOL_BUFSIZE must be greater than MEM_ALIGNMENT or the offset may take the full first pbuf"
00165 #endif
00166 #if (DNS_LOCAL_HOSTLIST && !DNS_LOCAL_HOSTLIST_IS_DYNAMIC && !(defined(DNS_LOCAL_HOSTLIST_INIT)))
00167 #error "you have to define define DNS_LOCAL_HOSTLIST_INIT {{'host1', 0x123}, {'host2', 0x234}} to initialize DNS_LOCAL_HOSTLIST"
00168 #endif
00169 #if PPP_SUPPORT && !PPPOS_SUPPORT & !PPPOE_SUPPORT
00170 #error "PPP_SUPPORT needs either PPPOS_SUPPORT or PPPOE_SUPPORT turned on"
00171 #endif
00172 #if !LWIP_ETHERNET && (LWIP_ARP || PPPOE_SUPPORT)
00173 #error "LWIP_ETHERNET needs to be turned on for LWIP_ARP or PPPOE_SUPPORT"
00174 #endif
00175 #if LWIP_IGMP && !defined(LWIP_RAND)
00176 #error "When using IGMP, LWIP_RAND() needs to be defined to a random-function returning an u32_t random value"
00177 #endif
00178 #if LWIP_TCPIP_CORE_LOCKING_INPUT && !LWIP_TCPIP_CORE_LOCKING
00179 #error "When using LWIP_TCPIP_CORE_LOCKING_INPUT, LWIP_TCPIP_CORE_LOCKING must be enabled, too"
00180 #endif
00181 #if LWIP_TCP && LWIP_NETIF_TX_SINGLE_PBUF && !TCP_OVERSIZE
00182 #error "LWIP_NETIF_TX_SINGLE_PBUF needs TCP_OVERSIZE enabled to create single-pbuf TCP packets"
00183 #endif
00184 #if IP_FRAG && IP_FRAG_USES_STATIC_BUF && LWIP_NETIF_TX_SINGLE_PBUF
00185 #error "LWIP_NETIF_TX_SINGLE_PBUF does not work with IP_FRAG_USES_STATIC_BUF==1 as that creates pbuf queues"
00186 #endif
00187 #if LWIP_NETCONN && LWIP_TCP
00188 #if NETCONN_COPY != TCP_WRITE_FLAG_COPY
00189 #error "NETCONN_COPY != TCP_WRITE_FLAG_COPY"
00190 #endif
00191 #if NETCONN_MORE != TCP_WRITE_FLAG_MORE
00192 #error "NETCONN_MORE != TCP_WRITE_FLAG_MORE"
00193 #endif
00194 #endif
00195 #if LWIP_SOCKET
00196
00197 #if SO_ACCEPTCONN != SOF_ACCEPTCONN
00198 #error "SO_ACCEPTCONN != SOF_ACCEPTCONN"
00199 #endif
00200 #if SO_REUSEADDR != SOF_REUSEADDR
00201 #error "WARNING: SO_REUSEADDR != SOF_REUSEADDR"
00202 #endif
00203 #if SO_KEEPALIVE != SOF_KEEPALIVE
00204 #error "WARNING: SO_KEEPALIVE != SOF_KEEPALIVE"
00205 #endif
00206 #if SO_BROADCAST != SOF_BROADCAST
00207 #error "WARNING: SO_BROADCAST != SOF_BROADCAST"
00208 #endif
00209 #if SO_LINGER != SOF_LINGER
00210 #error "WARNING: SO_LINGER != SOF_LINGER"
00211 #endif
00212 #endif
00213
00214
00215
00216
00217 #ifdef MEMP_NUM_TCPIP_MSG
00218 #error "MEMP_NUM_TCPIP_MSG option is deprecated. Remove it from your lwipopts.h."
00219 #endif
00220 #ifdef MEMP_NUM_API_MSG
00221 #error "MEMP_NUM_API_MSG option is deprecated. Remove it from your lwipopts.h."
00222 #endif
00223 #ifdef TCP_REXMIT_DEBUG
00224 #error "TCP_REXMIT_DEBUG option is deprecated. Remove it from your lwipopts.h."
00225 #endif
00226 #ifdef RAW_STATS
00227 #error "RAW_STATS option is deprecated. Remove it from your lwipopts.h."
00228 #endif
00229 #ifdef ETHARP_QUEUE_FIRST
00230 #error "ETHARP_QUEUE_FIRST option is deprecated. Remove it from your lwipopts.h."
00231 #endif
00232 #ifdef ETHARP_ALWAYS_INSERT
00233 #error "ETHARP_ALWAYS_INSERT option is deprecated. Remove it from your lwipopts.h."
00234 #endif
00235
00236 #ifndef LWIP_DISABLE_TCP_SANITY_CHECKS
00237 #define LWIP_DISABLE_TCP_SANITY_CHECKS 1
00238 #endif
00239 #ifndef LWIP_DISABLE_MEMP_SANITY_CHECKS
00240 #define LWIP_DISABLE_MEMP_SANITY_CHECKS 0
00241 #endif
00242
00243
00244 #if !LWIP_DISABLE_MEMP_SANITY_CHECKS
00245 #if LWIP_NETCONN
00246 #if MEMP_MEM_MALLOC
00247 #if !MEMP_NUM_NETCONN && LWIP_SOCKET
00248 #error "lwip_sanity_check: WARNING: MEMP_NUM_NETCONN cannot be 0 when using sockets!"
00249 #endif
00250 #else
00251 #if MEMP_NUM_NETCONN > (MEMP_NUM_TCP_PCB+MEMP_NUM_TCP_PCB_LISTEN+MEMP_NUM_UDP_PCB+MEMP_NUM_RAW_PCB)
00252 #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."
00253 #endif
00254 #endif
00255 #endif
00256 #endif
00257
00258
00259 #if !LWIP_DISABLE_TCP_SANITY_CHECKS
00260 #if LWIP_TCP
00261 #if !MEMP_MEM_MALLOC && (MEMP_NUM_TCP_SEG < TCP_SND_QUEUELEN)
00262 #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."
00263 #endif
00264 #if TCP_SND_BUF < (2 * TCP_MSS)
00265 #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."
00266 #endif
00267 #if TCP_SND_QUEUELEN < (2 * (TCP_SND_BUF / TCP_MSS))
00268 #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."
00269 #endif
00270 #if TCP_SNDLOWAT >= TCP_SND_BUF
00271 #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."
00272 #endif
00273 #if TCP_SNDQUEUELOWAT >= TCP_SND_QUEUELEN
00274 #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."
00275 #endif
00276 #if !MEMP_MEM_MALLOC && (TCP_WND > (PBUF_POOL_SIZE * (PBUF_POOL_BUFSIZE - (PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN))))
00277 #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."
00278 #endif
00279 #if TCP_WND < TCP_MSS
00280 #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."
00281 #endif
00282 #endif
00283 #endif
00284
00285
00286
00287
00288 void
00289 lwip_init(void)
00290 {
00291
00292 stats_init();
00293 #if !NO_SYS
00294 sys_init();
00295 #endif
00296 mem_init();
00297 memp_init();
00298 pbuf_init();
00299 netif_init();
00300 #if LWIP_SOCKET
00301 lwip_socket_init();
00302 #endif
00303 ip_init();
00304 #if LWIP_ARP
00305 etharp_init();
00306 #endif
00307 #if LWIP_RAW
00308 raw_init();
00309 #endif
00310 #if LWIP_UDP
00311 udp_init();
00312 #endif
00313 #if LWIP_TCP
00314 tcp_init();
00315 #endif
00316 #if LWIP_SNMP
00317 snmp_init();
00318 #endif
00319 #if LWIP_AUTOIP
00320 autoip_init();
00321 #endif
00322 #if LWIP_IGMP
00323 igmp_init();
00324 #endif
00325 #if LWIP_DNS
00326 dns_init();
00327 #endif
00328
00329 #if LWIP_TIMERS
00330 sys_timeouts_init();
00331 #endif
00332 }