PS2SDK
PS2 Homebrew Libraries
tcpip.h
Go to the documentation of this file.
1 /*
2 # _____ ___ ____ ___ ____
3 # ____| | ____| | | |____|
4 # | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5 #-----------------------------------------------------------------------
6 # Copyright 2001-2004, ps2dev - http://www.ps2dev.org
7 # Licenced under Academic Free License version 2.0
8 # Review ps2sdk README & LICENSE files for further details.
9 */
10 
16 #ifndef __TCPIP_H__
17 #define __TCPIP_H__
18 
19 #include <tamtypes.h>
20 #ifdef _EE
21 /* Use the select related definitions fron newlib. */
22 #include <sys/select.h>
23 #endif
24 
25 /* Some portions of this header fall under the following copyright. The license
26  is compatible with that of ps2sdk.
27 
28  This port of LWIP has LWIP_DHCP defined by default. */
29 
30 #ifndef PS2IP_DNS
31 #define PS2IP_DNS
32 #endif
33 #ifndef PS2IP_DHCP
34 #define PS2IP_DHCP 1
35 #endif
36 #ifndef LWIP_IPV4
37 #define LWIP_IPV4 1
38 #endif
39 #ifndef LWIP_IPV6
40 #define LWIP_IPV6 0
41 #endif
42 #ifndef LWIP_IPV6_MLD
43 #define LWIP_IPV6_MLD 0
44 #endif
45 #ifndef LWIP_CHECKSUM_CTRL_PER_NETIF
46 #define LWIP_CHECKSUM_CTRL_PER_NETIF 0
47 #endif
48 #ifndef LWIP_NETIF_REMOVE_CALLBACK
49 #define LWIP_NETIF_REMOVE_CALLBACK 0
50 #endif
51 #ifndef LWIP_IPV6_AUTOCONFIG
52 #define LWIP_IPV6_AUTOCONFIG 0
53 #endif
54 #ifndef LWIP_MULTICAST_TX_OPTIONS
55 #define LWIP_MULTICAST_TX_OPTIONS 0
56 #endif
57 #ifndef LWIP_DHCP
58 #define LWIP_DHCP 1
59 #endif
60 #ifndef LWIP_TCP
61 #define LWIP_TCP 1
62 #endif
63 #ifndef LWIP_UDP
64 #define LWIP_UDP 1
65 #endif
66 #ifndef LWIP_UDPLITE
67 #define LWIP_UDPLITE 0
68 #endif
69 #ifndef MIB2_STATS
70 #define MIB2_STATS 0
71 #endif
72 #ifndef ENABLE_LOOPBACK
73 #define ENABLE_LOOPBACK 0
74 #endif
75 #ifndef DNS_LOCAL_HOSTLIST
76 #define DNS_LOCAL_HOSTLIST 0
77 #endif
78 
79 /*** Taken from src/include/lwip/opt.h. If changes were made to lwipopts.h, please update this section.
80  Some settings affect the fields present in structures like struct netif! ****/
81 #ifndef MEMP_NUM_UDP_PCB
82 #define MEMP_NUM_UDP_PCB 4
83 #endif
84 #ifndef MEMP_NUM_TCP_PCB
85 #define MEMP_NUM_TCP_PCB 5
86 #endif
87 #ifndef MEMP_NUM_NETCONN
88 #define MEMP_NUM_NETCONN (MEMP_NUM_TCP_PCB + MEMP_NUM_UDP_PCB)
89 #endif
90 #ifndef LWIP_NETIF_STATUS_CALLBACK
91 #define LWIP_NETIF_STATUS_CALLBACK 0
92 #endif
93 #ifndef LWIP_NETIF_LINK_CALLBACK
94 #define LWIP_NETIF_LINK_CALLBACK 0
95 #endif
96 #ifndef LWIP_AUTOIP
97 #define LWIP_AUTOIP 0
98 #endif
99 #ifndef LWIP_NETIF_HOSTNAME
100 #define LWIP_NETIF_HOSTNAME 0
101 #endif
102 #ifndef LWIP_SNMP
103 #define LWIP_SNMP 0
104 #endif
105 #ifndef LWIP_IGMP
106 #define LWIP_IGMP 0
107 #endif
108 #ifndef LWIP_NETIF_HWADDRHINT
109 #define LWIP_NETIF_HWADDRHINT 0
110 #endif
111 #ifndef LWIP_LOOPBACK_MAX_PBUFS
112 #define LWIP_LOOPBACK_MAX_PBUFS 0
113 #endif
114 #ifndef LWIP_NUM_NETIF_CLIENT_DATA
115 #define LWIP_NUM_NETIF_CLIENT_DATA 0
116 #endif
117 #ifndef LWIP_SOCKET_OFFSET
118 #define LWIP_SOCKET_OFFSET 0
119 #endif
120 #ifndef LWIP_IPV6_SEND_ROUTER_SOLICIT
121 #define LWIP_IPV6_SEND_ROUTER_SOLICIT 1
122 #endif
123 #ifndef DNS_MAX_SERVERS
124 #define DNS_MAX_SERVERS 2
125 #endif
126 
127 /*
128  * Copyright (c) 2001-2003 Swedish Institute of Computer Science.
129  * All rights reserved.
130  *
131  * Redistribution and use in source and binary forms, with or without modification,
132  * are permitted provided that the following conditions are met:
133  *
134  * 1. Redistributions of source code must retain the above copyright notice,
135  * this list of conditions and the following disclaimer.
136  * 2. Redistributions in binary form must reproduce the above copyright notice,
137  * this list of conditions and the following disclaimer in the documentation
138  * and/or other materials provided with the distribution.
139  * 3. The name of the author may not be used to endorse or promote products
140  * derived from this software without specific prior written permission.
141  *
142  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
143  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
144  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
145  * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
146  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
147  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
148  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
149  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
150  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
151  * OF SUCH DAMAGE.
152  *
153  * This file is part of the lwIP TCP/IP stack.
154  *
155  * Author: Adam Dunkels <adam@sics.se>
156  *
157  */
158 
159 typedef signed char err_t; /* lwIP error type. */
160 
161 /* From src/include/lwip/pbuf.h: */
162 
163 #define PBUF_TRANSPORT_HLEN 20
164 #if LWIP_IPV6
165 #define PBUF_IP_HLEN 40
166 #else
167 #define PBUF_IP_HLEN 20
168 #endif
169 
174 typedef enum {
197 } pbuf_layer;
198 
203 typedef enum {
226 } pbuf_type;
227 
229 struct pbuf
230 {
232  struct pbuf *next;
233 
235  void *payload;
236 
244  u16 tot_len;
245 
247  u16 len;
248 
250  u8 /*pbuf_type*/ type;
251 
253  u8 flags;
254 
260  u16 ref;
261 };
262 
263 /* From include/lwip/ip4_addr.h: */
266 struct ip4_addr
267 {
268  u32 addr;
269 };
270 
273 typedef struct ip4_addr ip4_addr_t;
274 typedef struct ip4_addr_packed ip4_addr_p_t;
275 
277 #define IPADDR_NONE ((u32)0xffffffffUL)
278 
279 #define IPADDR_LOOPBACK ((u32)0x7f000001UL)
280 
281 #define IPADDR_ANY ((u32)0x00000000UL)
282 
283 #define IPADDR_BROADCAST ((u32)0xffffffffUL)
284 
285 /* Definitions of the bits in an Internet address integer.
286 
287  On subnets, host and network parts are found according to
288  the subnet mask, not these masks. */
289 #define IP_CLASSA(a) ((((u32)(a)) & 0x80000000UL) == 0)
290 #define IP_CLASSA_NET 0xff000000
291 #define IP_CLASSA_NSHIFT 24
292 #define IP_CLASSA_HOST (0xffffffff & ~IP_CLASSA_NET)
293 #define IP_CLASSA_MAX 128
294 
295 #define IP_CLASSB(a) ((((u32)(a)) & 0xc0000000UL) == 0x80000000UL)
296 #define IP_CLASSB_NET 0xffff0000
297 #define IP_CLASSB_NSHIFT 16
298 #define IP_CLASSB_HOST (0xffffffff & ~IP_CLASSB_NET)
299 #define IP_CLASSB_MAX 65536
300 
301 #define IP_CLASSC(a) ((((u32)(a)) & 0xe0000000UL) == 0xc0000000UL)
302 #define IP_CLASSC_NET 0xffffff00
303 #define IP_CLASSC_NSHIFT 8
304 #define IP_CLASSC_HOST (0xffffffff & ~IP_CLASSC_NET)
305 
306 #define IP_CLASSD(a) (((u32)(a)&0xf0000000UL) == 0xe0000000UL)
307 #define IP_CLASSD_NET 0xf0000000 /* These ones aren't really */
308 #define IP_CLASSD_NSHIFT 28 /* net and host fields, but */
309 #define IP_CLASSD_HOST 0x0fffffff /* routing needn't know. */
310 #define IP_MULTICAST(a) IP_CLASSD(a)
311 
312 #define IP_EXPERIMENTAL(a) (((u32)(a)&0xf0000000UL) == 0xf0000000UL)
313 #define IP_BADCLASS(a) (((u32)(a)&0xf0000000UL) == 0xf0000000UL)
314 
315 #define IP_LOOPBACKNET 127 /* official! */
316 
317 
320 #define IP4_ADDR(ipaddr, a, b, c, d) \
321  (ipaddr)->addr = ((u32)((d)&0xff) << 24) | \
322  ((u32)((c)&0xff) << 16) | \
323  ((u32)((b)&0xff) << 8) | \
324  (u32)((a)&0xff)
325 
329 #ifndef IPADDR2_COPY
330 #define IPADDR2_COPY(dest, src) memcpy(dest, src, sizeof(ip4_addr_t))
331 #endif
332 
334 #define ip4_addr_copy(dest, src) ((dest).addr = (src).addr)
335 
336 #define ip4_addr_set(dest, src) ((dest)->addr = \
337  ((src) == NULL ? 0 : \
338  (src)->addr))
339 
340 #define ip4_addr_set_zero(ipaddr) ((ipaddr)->addr = 0)
341 
342 #define ip4_addr_set_any(ipaddr) ((ipaddr)->addr = IPADDR_ANY)
343 
344 #define ip4_addr_set_loopback(ipaddr) ((ipaddr)->addr = PP_HTONL(IPADDR_LOOPBACK))
345 
346 #define ip4_addr_isloopback(ipaddr) (((ipaddr)->addr & PP_HTONL(IP_CLASSA_NET)) == PP_HTONL(((u32)IP_LOOPBACKNET) << 24))
347 
349 #define ip4_addr_set_hton(dest, src) ((dest)->addr = \
350  ((src) == NULL ? 0 : \
351  lwip_htonl((src)->addr)))
352 
353 #define ip4_addr_set_u32(dest_ipaddr, src_u32) ((dest_ipaddr)->addr = (src_u32))
354 
355 #define ip4_addr_get_u32(src_ipaddr) ((src_ipaddr)->addr)
356 
358 #define ip4_addr_get_network(target, host, netmask) \
359  do { \
360  ((target)->addr = ((host)->addr) & ((netmask)->addr)); \
361  } while (0)
362 
371 #define ip4_addr_netcmp(addr1, addr2, mask) (((addr1)->addr & \
372  (mask)->addr) == \
373  ((addr2)->addr & \
374  (mask)->addr))
375 #define ip4_addr_cmp(addr1, addr2) ((addr1)->addr == (addr2)->addr)
376 
377 #define ip4_addr_isany_val(addr1) ((addr1).addr == IPADDR_ANY)
378 #define ip4_addr_isany(addr1) ((addr1) == NULL || ip4_addr_isany_val(*(addr1)))
379 
380 #define ip4_addr_isbroadcast(addr1, netif) ip4_addr_isbroadcast_u32((addr1)->addr, netif)
381 
382 #define ip_addr_netmask_valid(netmask) ip4_addr_netmask_valid((netmask)->addr)
383 
384 #define ip4_addr_ismulticast(addr1) (((addr1)->addr & PP_HTONL(0xf0000000UL)) == PP_HTONL(0xe0000000UL))
385 
386 #define ip4_addr_islinklocal(addr1) (((addr1)->addr & PP_HTONL(0xffff0000UL)) == PP_HTONL(0xa9fe0000UL))
387 
388 #define ip4_addr_debug_print_parts(debug, a, b, c, d) \
389  LWIP_DEBUGF(debug, ("%" U16_F ".%" U16_F ".%" U16_F ".%" U16_F, a, b, c, d))
390 #define ip4_addr_debug_print(debug, ipaddr) \
391  ip4_addr_debug_print_parts(debug, \
392  (u16)((ipaddr) != NULL ? ip4_addr1_16(ipaddr) : 0), \
393  (u16)((ipaddr) != NULL ? ip4_addr2_16(ipaddr) : 0), \
394  (u16)((ipaddr) != NULL ? ip4_addr3_16(ipaddr) : 0), \
395  (u16)((ipaddr) != NULL ? ip4_addr4_16(ipaddr) : 0))
396 #define ip4_addr_debug_print_val(debug, ipaddr) \
397  ip4_addr_debug_print_parts(debug, \
398  ip4_addr1_16(&(ipaddr)), \
399  ip4_addr2_16(&(ipaddr)), \
400  ip4_addr3_16(&(ipaddr)), \
401  ip4_addr4_16(&(ipaddr)))
402 
403 /* Get one byte from the 4-byte address */
404 #define ip4_addr1(ipaddr) (((const u8 *)(&(ipaddr)->addr))[0])
405 #define ip4_addr2(ipaddr) (((const u8 *)(&(ipaddr)->addr))[1])
406 #define ip4_addr3(ipaddr) (((const u8 *)(&(ipaddr)->addr))[2])
407 #define ip4_addr4(ipaddr) (((const u8 *)(&(ipaddr)->addr))[3])
408 /* These are cast to u16, with the intent that they are often arguments
409  * to printf using the U16_F format from cc.h. */
410 #define ip4_addr1_16(ipaddr) ((u16)ip4_addr1(ipaddr))
411 #define ip4_addr2_16(ipaddr) ((u16)ip4_addr2(ipaddr))
412 #define ip4_addr3_16(ipaddr) ((u16)ip4_addr3(ipaddr))
413 #define ip4_addr4_16(ipaddr) ((u16)ip4_addr4(ipaddr))
414 
415 #define IP4ADDR_STRLEN_MAX 16
416 
417 /* From include/lwip/ip6_addr.h: */
420 struct ip6_addr
421 {
422  u32 addr[4];
423 };
424 
426 typedef struct ip6_addr ip6_addr_t;
427 typedef struct ip6_addr_packed ip6_addr_p_t;
428 
431 #define IP6_ADDR_PART(ip6addr, index, a, b, c, d) \
432  (ip6addr)->addr[index] = ((u32)((d)&0xff) << 24) | \
433  ((u32)((c)&0xff) << 16) | \
434  ((u32)((b)&0xff) << 8) | \
435  (u32)((a)&0xff)
436 
439 #define IP6_ADDR(ip6addr, idx0, idx1, idx2, idx3) \
440  do { \
441  (ip6addr)->addr[0] = idx0; \
442  (ip6addr)->addr[1] = idx1; \
443  (ip6addr)->addr[2] = idx2; \
444  (ip6addr)->addr[3] = idx3; \
445  } while (0)
446 
448 #define IP6_ADDR_BLOCK1(ip6addr) ((u16)((lwip_htonl((ip6addr)->addr[0]) >> 16) & 0xffff))
449 
450 #define IP6_ADDR_BLOCK2(ip6addr) ((u16)((lwip_htonl((ip6addr)->addr[0])) & 0xffff))
451 
452 #define IP6_ADDR_BLOCK3(ip6addr) ((u16)((lwip_htonl((ip6addr)->addr[1]) >> 16) & 0xffff))
453 
454 #define IP6_ADDR_BLOCK4(ip6addr) ((u16)((lwip_htonl((ip6addr)->addr[1])) & 0xffff))
455 
456 #define IP6_ADDR_BLOCK5(ip6addr) ((u16)((lwip_htonl((ip6addr)->addr[2]) >> 16) & 0xffff))
457 
458 #define IP6_ADDR_BLOCK6(ip6addr) ((u16)((lwip_htonl((ip6addr)->addr[2])) & 0xffff))
459 
460 #define IP6_ADDR_BLOCK7(ip6addr) ((u16)((lwip_htonl((ip6addr)->addr[3]) >> 16) & 0xffff))
461 
462 #define IP6_ADDR_BLOCK8(ip6addr) ((u16)((lwip_htonl((ip6addr)->addr[3])) & 0xffff))
463 
465 #define ip6_addr_copy(dest, src) \
466  do { \
467  (dest).addr[0] = (src).addr[0]; \
468  (dest).addr[1] = (src).addr[1]; \
469  (dest).addr[2] = (src).addr[2]; \
470  (dest).addr[3] = (src).addr[3]; \
471  } while (0)
472 
473 #define ip6_addr_set(dest, src) \
474  do { \
475  (dest)->addr[0] = (src) == NULL ? 0 : (src)->addr[0]; \
476  (dest)->addr[1] = (src) == NULL ? 0 : (src)->addr[1]; \
477  (dest)->addr[2] = (src) == NULL ? 0 : (src)->addr[2]; \
478  (dest)->addr[3] = (src) == NULL ? 0 : (src)->addr[3]; \
479  } while (0)
480 
482 #define ip6_addr_set_zero(ip6addr) \
483  do { \
484  (ip6addr)->addr[0] = 0; \
485  (ip6addr)->addr[1] = 0; \
486  (ip6addr)->addr[2] = 0; \
487  (ip6addr)->addr[3] = 0; \
488  } while (0)
489 
491 #define ip6_addr_set_any(ip6addr) ip6_addr_set_zero(ip6addr)
492 
493 #define ip6_addr_set_loopback(ip6addr) \
494  do { \
495  (ip6addr)->addr[0] = 0; \
496  (ip6addr)->addr[1] = 0; \
497  (ip6addr)->addr[2] = 0; \
498  (ip6addr)->addr[3] = PP_HTONL(0x00000001UL); \
499  } while (0)
500 
502 #define ip6_addr_set_hton(dest, src) \
503  do { \
504  (dest)->addr[0] = (src) == NULL ? 0 : lwip_htonl((src)->addr[0]); \
505  (dest)->addr[1] = (src) == NULL ? 0 : lwip_htonl((src)->addr[1]); \
506  (dest)->addr[2] = (src) == NULL ? 0 : lwip_htonl((src)->addr[2]); \
507  (dest)->addr[3] = (src) == NULL ? 0 : lwip_htonl((src)->addr[3]); \
508  } while (0)
509 
510 
518 #define ip6_addr_netcmp(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \
519  ((addr1)->addr[1] == (addr2)->addr[1]))
520 
521 #define ip6_addr_cmp(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \
522  ((addr1)->addr[1] == (addr2)->addr[1]) && \
523  ((addr1)->addr[2] == (addr2)->addr[2]) && \
524  ((addr1)->addr[3] == (addr2)->addr[3]))
525 
526 #define ip6_get_subnet_id(ip6addr) (lwip_htonl((ip6addr)->addr[2]) & 0x0000ffffUL)
527 
528 #define ip6_addr_isany_val(ip6addr) (((ip6addr).addr[0] == 0) && \
529  ((ip6addr).addr[1] == 0) && \
530  ((ip6addr).addr[2] == 0) && \
531  ((ip6addr).addr[3] == 0))
532 #define ip6_addr_isany(ip6addr) (((ip6addr) == NULL) || ip6_addr_isany_val(*(ip6addr)))
533 
534 #define ip6_addr_isloopback(ip6addr) (((ip6addr)->addr[0] == 0UL) && \
535  ((ip6addr)->addr[1] == 0UL) && \
536  ((ip6addr)->addr[2] == 0UL) && \
537  ((ip6addr)->addr[3] == PP_HTONL(0x00000001UL)))
538 
539 #define ip6_addr_isglobal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xe0000000UL)) == PP_HTONL(0x20000000UL))
540 
541 #define ip6_addr_islinklocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xffc00000UL)) == PP_HTONL(0xfe800000UL))
542 
543 #define ip6_addr_issitelocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xffc00000UL)) == PP_HTONL(0xfec00000UL))
544 
545 #define ip6_addr_isuniquelocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xfe000000UL)) == PP_HTONL(0xfc000000UL))
546 
547 #define ip6_addr_isipv6mappedipv4(ip6addr) (((ip6addr)->addr[0] == 0) && ((ip6addr)->addr[1] == 0) && (((ip6addr)->addr[2]) == PP_HTONL(0x0000FFFFUL)))
548 
549 #define ip6_addr_ismulticast(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff000000UL)) == PP_HTONL(0xff000000UL))
550 #define ip6_addr_multicast_transient_flag(ip6addr) ((ip6addr)->addr[0] & PP_HTONL(0x00100000UL))
551 #define ip6_addr_multicast_prefix_flag(ip6addr) ((ip6addr)->addr[0] & PP_HTONL(0x00200000UL))
552 #define ip6_addr_multicast_rendezvous_flag(ip6addr) ((ip6addr)->addr[0] & PP_HTONL(0x00400000UL))
553 #define ip6_addr_multicast_scope(ip6addr) ((lwip_htonl((ip6addr)->addr[0]) >> 16) & 0xf)
554 #define IP6_MULTICAST_SCOPE_RESERVED 0x0
555 #define IP6_MULTICAST_SCOPE_RESERVED0 0x0
556 #define IP6_MULTICAST_SCOPE_INTERFACE_LOCAL 0x1
557 #define IP6_MULTICAST_SCOPE_LINK_LOCAL 0x2
558 #define IP6_MULTICAST_SCOPE_RESERVED3 0x3
559 #define IP6_MULTICAST_SCOPE_ADMIN_LOCAL 0x4
560 #define IP6_MULTICAST_SCOPE_SITE_LOCAL 0x5
561 #define IP6_MULTICAST_SCOPE_ORGANIZATION_LOCAL 0x8
562 #define IP6_MULTICAST_SCOPE_GLOBAL 0xe
563 #define IP6_MULTICAST_SCOPE_RESERVEDF 0xf
564 #define ip6_addr_ismulticast_iflocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff010000UL))
565 #define ip6_addr_ismulticast_linklocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff020000UL))
566 #define ip6_addr_ismulticast_adminlocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff040000UL))
567 #define ip6_addr_ismulticast_sitelocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff050000UL))
568 #define ip6_addr_ismulticast_orglocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff080000UL))
569 #define ip6_addr_ismulticast_global(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff0e0000UL))
570 
571 /* @todo define get/set for well-know multicast addresses, e.g. ff02::1 */
572 #define ip6_addr_isallnodes_iflocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff010000UL)) && \
573  ((ip6addr)->addr[1] == 0UL) && \
574  ((ip6addr)->addr[2] == 0UL) && \
575  ((ip6addr)->addr[3] == PP_HTONL(0x00000001UL)))
576 
577 #define ip6_addr_isallnodes_linklocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \
578  ((ip6addr)->addr[1] == 0UL) && \
579  ((ip6addr)->addr[2] == 0UL) && \
580  ((ip6addr)->addr[3] == PP_HTONL(0x00000001UL)))
581 #define ip6_addr_set_allnodes_linklocal(ip6addr) \
582  do { \
583  (ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \
584  (ip6addr)->addr[1] = 0; \
585  (ip6addr)->addr[2] = 0; \
586  (ip6addr)->addr[3] = PP_HTONL(0x00000001UL); \
587  } while (0)
588 
589 #define ip6_addr_isallrouters_linklocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \
590  ((ip6addr)->addr[1] == 0UL) && \
591  ((ip6addr)->addr[2] == 0UL) && \
592  ((ip6addr)->addr[3] == PP_HTONL(0x00000002UL)))
593 #define ip6_addr_set_allrouters_linklocal(ip6addr) \
594  do { \
595  (ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \
596  (ip6addr)->addr[1] = 0; \
597  (ip6addr)->addr[2] = 0; \
598  (ip6addr)->addr[3] = PP_HTONL(0x00000002UL); \
599  } while (0)
600 
601 #define ip6_addr_issolicitednode(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \
602  ((ip6addr)->addr[2] == PP_HTONL(0x00000001UL)) && \
603  (((ip6addr)->addr[3] & PP_HTONL(0xff000000UL)) == PP_HTONL(0xff000000UL)))
604 
605 #define ip6_addr_set_solicitednode(ip6addr, if_id) \
606  do { \
607  (ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \
608  (ip6addr)->addr[1] = 0; \
609  (ip6addr)->addr[2] = PP_HTONL(0x00000001UL); \
610  (ip6addr)->addr[3] = (PP_HTONL(0xff000000UL) | (if_id)); \
611  } while (0)
612 
613 #define ip6_addr_cmp_solicitednode(ip6addr, sn_addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \
614  ((ip6addr)->addr[1] == 0) && \
615  ((ip6addr)->addr[2] == PP_HTONL(0x00000001UL)) && \
616  ((ip6addr)->addr[3] == (PP_HTONL(0xff000000UL) | (sn_addr)->addr[3])))
617 
618 /* IPv6 address states. */
619 #define IP6_ADDR_INVALID 0x00
620 #define IP6_ADDR_TENTATIVE 0x08
621 #define IP6_ADDR_TENTATIVE_1 0x09 /* 1 probe sent */
622 #define IP6_ADDR_TENTATIVE_2 0x0a /* 2 probes sent */
623 #define IP6_ADDR_TENTATIVE_3 0x0b /* 3 probes sent */
624 #define IP6_ADDR_TENTATIVE_4 0x0c /* 4 probes sent */
625 #define IP6_ADDR_TENTATIVE_5 0x0d /* 5 probes sent */
626 #define IP6_ADDR_TENTATIVE_6 0x0e /* 6 probes sent */
627 #define IP6_ADDR_TENTATIVE_7 0x0f /* 7 probes sent */
628 #define IP6_ADDR_VALID 0x10 /* This bit marks an address as valid (preferred or deprecated) */
629 #define IP6_ADDR_PREFERRED 0x30
630 #define IP6_ADDR_DEPRECATED 0x10 /* Same as VALID (valid but not preferred) */
631 
632 #define IP6_ADDR_TENTATIVE_COUNT_MASK 0x07 /* 1-7 probes sent */
633 
634 #define ip6_addr_isinvalid(addr_state) (addr_state == IP6_ADDR_INVALID)
635 #define ip6_addr_istentative(addr_state) (addr_state & IP6_ADDR_TENTATIVE)
636 #define ip6_addr_isvalid(addr_state) (addr_state & IP6_ADDR_VALID) /* Include valid, preferred, and deprecated. */
637 #define ip6_addr_ispreferred(addr_state) (addr_state == IP6_ADDR_PREFERRED)
638 #define ip6_addr_isdeprecated(addr_state) (addr_state == IP6_ADDR_DEPRECATED)
639 
640 #define ip6_addr_debug_print_parts(debug, a, b, c, d, e, f, g, h) \
641  LWIP_DEBUGF(debug, ("%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F, \
642  a, b, c, d, e, f, g, h))
643 #define ip6_addr_debug_print(debug, ipaddr) \
644  ip6_addr_debug_print_parts(debug, \
645  (u16)((ipaddr) != NULL ? IP6_ADDR_BLOCK1(ipaddr) : 0), \
646  (u16)((ipaddr) != NULL ? IP6_ADDR_BLOCK2(ipaddr) : 0), \
647  (u16)((ipaddr) != NULL ? IP6_ADDR_BLOCK3(ipaddr) : 0), \
648  (u16)((ipaddr) != NULL ? IP6_ADDR_BLOCK4(ipaddr) : 0), \
649  (u16)((ipaddr) != NULL ? IP6_ADDR_BLOCK5(ipaddr) : 0), \
650  (u16)((ipaddr) != NULL ? IP6_ADDR_BLOCK6(ipaddr) : 0), \
651  (u16)((ipaddr) != NULL ? IP6_ADDR_BLOCK7(ipaddr) : 0), \
652  (u16)((ipaddr) != NULL ? IP6_ADDR_BLOCK8(ipaddr) : 0))
653 #define ip6_addr_debug_print_val(debug, ipaddr) \
654  ip6_addr_debug_print_parts(debug, \
655  IP6_ADDR_BLOCK1(&(ipaddr)), \
656  IP6_ADDR_BLOCK2(&(ipaddr)), \
657  IP6_ADDR_BLOCK3(&(ipaddr)), \
658  IP6_ADDR_BLOCK4(&(ipaddr)), \
659  IP6_ADDR_BLOCK5(&(ipaddr)), \
660  IP6_ADDR_BLOCK6(&(ipaddr)), \
661  IP6_ADDR_BLOCK7(&(ipaddr)), \
662  IP6_ADDR_BLOCK8(&(ipaddr)))
663 
664 #define IP6ADDR_STRLEN_MAX 46
665 
666 /* From include/lwip/ip_addr.h: */
667 
679 };
680 
681 #if LWIP_IPV4 && LWIP_IPV6
682 
687 typedef struct _ip_addr
688 {
689  union
690  {
691  ip6_addr_t ip6;
692  ip4_addr_t ip4;
693  } uaddr;
695  u8 type;
696 } ip_addr_t;
697 
698 extern const ip_addr_t ip_addr_any_type;
699 
701 #define IPADDR4_INIT(u32val) \
702  { \
703  {{{u32val, 0ul, 0ul, 0ul}}}, IPADDR_TYPE_V4 \
704  }
705 
706 #define IPADDR6_INIT(a, b, c, d) \
707  { \
708  {{{a, b, c, d}}}, IPADDR_TYPE_V6 \
709  }
710 
712 #define IP_IS_ANY_TYPE_VAL(ipaddr) (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_ANY)
713 
714 #define IPADDR_ANY_TYPE_INIT \
715  { \
716  {{{0ul, 0ul, 0ul, 0ul}}}, IPADDR_TYPE_ANY \
717  }
718 
720 #define IP_IS_V4_VAL(ipaddr) (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_V4)
721 
722 #define IP_IS_V6_VAL(ipaddr) (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_V6)
723 
724 #define IP_IS_V4(ipaddr) (((ipaddr) == NULL) || IP_IS_V4_VAL(*(ipaddr)))
725 
726 #define IP_IS_V6(ipaddr) (((ipaddr) != NULL) && IP_IS_V6_VAL(*(ipaddr)))
727 
728 #define IP_SET_TYPE_VAL(ipaddr, iptype) \
729  do { \
730  (ipaddr).type = (iptype); \
731  } while (0)
732 #define IP_SET_TYPE(ipaddr, iptype) \
733  do { \
734  if ((ipaddr) != NULL) { \
735  IP_SET_TYPE_VAL(*(ipaddr), iptype); \
736  } \
737  } while (0)
738 #define IP_GET_TYPE(ipaddr) ((ipaddr)->type)
739 
740 #define IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr) (IP_GET_TYPE(&pcb->local_ip) == IP_GET_TYPE(ipaddr))
741 #define IP_ADDR_PCB_VERSION_MATCH(pcb, ipaddr) (IP_IS_ANY_TYPE_VAL(pcb->local_ip) || IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr))
742 
746 #define ip_2_ip6(ipaddr) (&((ipaddr)->uaddr.ip6))
747 
750 #define ip_2_ip4(ipaddr) (&((ipaddr)->uaddr.ip4))
751 
753 #define IP_ADDR4(ipaddr, a, b, c, d) \
754  do { \
755  IP4_ADDR(ip_2_ip4(ipaddr), a, b, c, d); \
756  IP_SET_TYPE_VAL(*(ipaddr), IPADDR_TYPE_V4); \
757  } while (0)
758 
759 #define IP_ADDR6(ipaddr, i0, i1, i2, i3) \
760  do { \
761  IP6_ADDR(ip_2_ip6(ipaddr), i0, i1, i2, i3); \
762  IP_SET_TYPE_VAL(*(ipaddr), IPADDR_TYPE_V6); \
763  } while (0)
764 
766 #define ip_addr_copy(dest, src) \
767  do { \
768  IP_SET_TYPE_VAL(dest, IP_GET_TYPE(&src)); \
769  if (IP_IS_V6_VAL(src)) { \
770  ip6_addr_copy(*ip_2_ip6(&(dest)), *ip_2_ip6(&(src))); \
771  } else { \
772  ip4_addr_copy(*ip_2_ip4(&(dest)), *ip_2_ip4(&(src))); \
773  } \
774  } while (0)
775 
776 #define ip_addr_copy_from_ip6(dest, src) \
777  do { \
778  ip6_addr_copy(*ip_2_ip6(&(dest)), src); \
779  IP_SET_TYPE_VAL(dest, IPADDR_TYPE_V6); \
780  } while (0)
781 
782 #define ip_addr_copy_from_ip4(dest, src) \
783  do { \
784  ip4_addr_copy(*ip_2_ip4(&(dest)), src); \
785  IP_SET_TYPE_VAL(dest, IPADDR_TYPE_V4); \
786  } while (0)
787 
788 #define ip_addr_set_ip4_u32(ipaddr, val) \
789  do { \
790  if (ipaddr) { \
791  ip4_addr_set_u32(ip_2_ip4(ipaddr), val); \
792  IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); \
793  } \
794  } while (0)
795 
796 #define ip_addr_get_ip4_u32(ipaddr) (((ipaddr) && IP_IS_V4(ipaddr)) ? \
797  ip4_addr_get_u32(ip_2_ip4(ipaddr)) : \
798  0)
799 
800 #define ip_addr_set(dest, src) \
801  do { \
802  IP_SET_TYPE(dest, IP_GET_TYPE(src)); \
803  if (IP_IS_V6(src)) { \
804  ip6_addr_set(ip_2_ip6(dest), ip_2_ip6(src)); \
805  } else { \
806  ip4_addr_set(ip_2_ip4(dest), ip_2_ip4(src)); \
807  } \
808  } while (0)
809 
810 #define ip_addr_set_ipaddr(dest, src) ip_addr_set(dest, src)
811 
812 #define ip_addr_set_zero(ipaddr) \
813  do { \
814  ip6_addr_set_zero(ip_2_ip6(ipaddr)); \
815  IP_SET_TYPE(ipaddr, 0); \
816  } while (0)
817 
818 #define ip_addr_set_zero_ip4(ipaddr) \
819  do { \
820  ip6_addr_set_zero(ip_2_ip6(ipaddr)); \
821  IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); \
822  } while (0)
823 
824 #define ip_addr_set_zero_ip6(ipaddr) \
825  do { \
826  ip6_addr_set_zero(ip_2_ip6(ipaddr)); \
827  IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); \
828  } while (0)
829 
830 #define ip_addr_set_any(is_ipv6, ipaddr) \
831  do { \
832  if (is_ipv6) { \
833  ip6_addr_set_any(ip_2_ip6(ipaddr)); \
834  IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); \
835  } else { \
836  ip4_addr_set_any(ip_2_ip4(ipaddr)); \
837  IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); \
838  } \
839  } while (0)
840 
841 #define ip_addr_set_loopback(is_ipv6, ipaddr) \
842  do { \
843  if (is_ipv6) { \
844  ip6_addr_set_loopback(ip_2_ip6(ipaddr)); \
845  IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); \
846  } else { \
847  ip4_addr_set_loopback(ip_2_ip4(ipaddr)); \
848  IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); \
849  } \
850  } while (0)
851 
852 #define ip_addr_set_hton(dest, src) \
853  do { \
854  if (IP_IS_V6(src)) { \
855  ip6_addr_set_hton(ip_2_ip6(ipaddr), (src)); \
856  IP_SET_TYPE(dest, IPADDR_TYPE_V6); \
857  } else { \
858  ip4_addr_set_hton(ip_2_ip4(ipaddr), (src)); \
859  IP_SET_TYPE(dest, IPADDR_TYPE_V4); \
860  } \
861  } while (0)
862 
863 #define ip_addr_get_network(target, host, netmask) \
864  do { \
865  if (IP_IS_V6(host)) { \
866  ip4_addr_set_zero(ip_2_ip4(target)); \
867  IP_SET_TYPE(target, IPADDR_TYPE_V6); \
868  } else { \
869  ip4_addr_get_network(ip_2_ip4(target), ip_2_ip4(host), ip_2_ip4(netmask)); \
870  IP_SET_TYPE(target, IPADDR_TYPE_V4); \
871  } \
872  } while (0)
873 
874 #define ip_addr_netcmp(addr1, addr2, mask) ((IP_IS_V6(addr1) && IP_IS_V6(addr2)) ? \
875  0 : \
876  ip4_addr_netcmp(ip_2_ip4(addr1), ip_2_ip4(addr2), mask))
877 
878 #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))))
879 
880 #define ip_addr_isany(ipaddr) ((IP_IS_V6(ipaddr)) ? \
881  ip6_addr_isany(ip_2_ip6(ipaddr)) : \
882  ip4_addr_isany(ip_2_ip4(ipaddr)))
883 
884 #define ip_addr_isany_val(ipaddr) ((IP_IS_V6_VAL(ipaddr)) ? \
885  ip6_addr_isany_val(*ip_2_ip6(&(ipaddr))) : \
886  ip4_addr_isany_val(*ip_2_ip4(&(ipaddr))))
887 
888 #define ip_addr_isbroadcast(ipaddr, netif) ((IP_IS_V6(ipaddr)) ? \
889  0 : \
890  ip4_addr_isbroadcast(ip_2_ip4(ipaddr), netif))
891 
892 #define ip_addr_ismulticast(ipaddr) ((IP_IS_V6(ipaddr)) ? \
893  ip6_addr_ismulticast(ip_2_ip6(ipaddr)) : \
894  ip4_addr_ismulticast(ip_2_ip4(ipaddr)))
895 
896 #define ip_addr_isloopback(ipaddr) ((IP_IS_V6(ipaddr)) ? \
897  ip6_addr_isloopback(ip_2_ip6(ipaddr)) : \
898  ip4_addr_isloopback(ip_2_ip4(ipaddr)))
899 
900 #define ip_addr_islinklocal(ipaddr) ((IP_IS_V6(ipaddr)) ? \
901  ip6_addr_islinklocal(ip_2_ip6(ipaddr)) : \
902  ip4_addr_islinklocal(ip_2_ip4(ipaddr)))
903 #define ip_addr_debug_print(debug, ipaddr) \
904  do { \
905  if (IP_IS_V6(ipaddr)) { \
906  ip6_addr_debug_print(debug, ip_2_ip6(ipaddr)); \
907  } else { \
908  ip4_addr_debug_print(debug, ip_2_ip4(ipaddr)); \
909  } \
910  } while (0)
911 #define ip_addr_debug_print_val(debug, ipaddr) \
912  do { \
913  if (IP_IS_V6_VAL(ipaddr)) { \
914  ip6_addr_debug_print_val(debug, *ip_2_ip6(&(ipaddr))); \
915  } else { \
916  ip4_addr_debug_print_val(debug, *ip_2_ip4(&(ipaddr))); \
917  } \
918  } while (0)
919 
920 #define ipaddr_ntoa(addr) (((addr) == NULL) ? "NULL" : \
921  ((IP_IS_V6(addr)) ? ip6addr_ntoa(ip_2_ip6(addr)) : ip4addr_ntoa(ip_2_ip4(addr))))
922 
923 #define ipaddr_ntoa_r(addr, buf, buflen) (((addr) == NULL) ? "NULL" : \
924  ((IP_IS_V6(addr)) ? ip6addr_ntoa_r(ip_2_ip6(addr), buf, buflen) : ip4addr_ntoa_r(ip_2_ip4(addr), buf, buflen)))
925 int ipaddr_aton(const char *cp, ip_addr_t *addr);
926 
928 #define IPADDR_STRLEN_MAX IP6ADDR_STRLEN_MAX
929 
930 #else /* LWIP_IPV4 && LWIP_IPV6 */
931 
932 #define IP_ADDR_PCB_VERSION_MATCH(addr, pcb) 1
933 #define IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr) 1
934 
935 #if LWIP_IPV4
936 
937 typedef ip4_addr_t ip_addr_t;
938 #define IPADDR4_INIT(u32val) \
939  { \
940  u32val \
941  }
942 #define IP_IS_V4_VAL(ipaddr) 1
943 #define IP_IS_V6_VAL(ipaddr) 0
944 #define IP_IS_V4(ipaddr) 1
945 #define IP_IS_V6(ipaddr) 0
946 #define IP_IS_ANY_TYPE_VAL(ipaddr) 0
947 #define IP_SET_TYPE_VAL(ipaddr, iptype)
948 #define IP_SET_TYPE(ipaddr, iptype)
949 #define IP_GET_TYPE(ipaddr) IPADDR_TYPE_V4
950 #define ip_2_ip4(ipaddr) (ipaddr)
951 #define IP_ADDR4(ipaddr, a, b, c, d) IP4_ADDR(ipaddr, a, b, c, d)
952 
953 #define ip_addr_copy(dest, src) ip4_addr_copy(dest, src)
954 #define ip_addr_copy_from_ip4(dest, src) ip4_addr_copy(dest, src)
955 #define ip_addr_set_ip4_u32(ipaddr, val) ip4_addr_set_u32(ip_2_ip4(ipaddr), val)
956 #define ip_addr_get_ip4_u32(ipaddr) ip4_addr_get_u32(ip_2_ip4(ipaddr))
957 #define ip_addr_set(dest, src) ip4_addr_set(dest, src)
958 #define ip_addr_set_ipaddr(dest, src) ip4_addr_set(dest, src)
959 #define ip_addr_set_zero(ipaddr) ip4_addr_set_zero(ipaddr)
960 #define ip_addr_set_zero_ip4(ipaddr) ip4_addr_set_zero(ipaddr)
961 #define ip_addr_set_any(is_ipv6, ipaddr) ip4_addr_set_any(ipaddr)
962 #define ip_addr_set_loopback(is_ipv6, ipaddr) ip4_addr_set_loopback(ipaddr)
963 #define ip_addr_set_hton(dest, src) ip4_addr_set_hton(dest, src)
964 #define ip_addr_get_network(target, host, mask) ip4_addr_get_network(target, host, mask)
965 #define ip_addr_netcmp(addr1, addr2, mask) ip4_addr_netcmp(addr1, addr2, mask)
966 #define ip_addr_cmp(addr1, addr2) ip4_addr_cmp(addr1, addr2)
967 #define ip_addr_isany(ipaddr) ip4_addr_isany(ipaddr)
968 #define ip_addr_isany_val(ipaddr) ip4_addr_isany_val(ipaddr)
969 #define ip_addr_isloopback(ipaddr) ip4_addr_isloopback(ipaddr)
970 #define ip_addr_islinklocal(ipaddr) ip4_addr_islinklocal(ipaddr)
971 #define ip_addr_isbroadcast(addr, netif) ip4_addr_isbroadcast(addr, netif)
972 #define ip_addr_ismulticast(ipaddr) ip4_addr_ismulticast(ipaddr)
973 #define ip_addr_debug_print(debug, ipaddr) ip4_addr_debug_print(debug, ipaddr)
974 #define ip_addr_debug_print_val(debug, ipaddr) ip4_addr_debug_print_val(debug, ipaddr)
975 #define ipaddr_ntoa(ipaddr) ip4addr_ntoa(ipaddr)
976 #define ipaddr_ntoa_r(ipaddr, buf, buflen) ip4addr_ntoa_r(ipaddr, buf, buflen)
977 #define ipaddr_aton(cp, addr) ip4addr_aton(cp, addr)
978 
979 #define IPADDR_STRLEN_MAX IP4ADDR_STRLEN_MAX
980 
981 #else /* LWIP_IPV4 */
982 
983 typedef ip6_addr_t ip_addr_t;
984 #define IPADDR6_INIT(a, b, c, d) \
985  { \
986  { \
987  a, b, c, d \
988  } \
989  }
990 #define IP_IS_V4_VAL(ipaddr) 0
991 #define IP_IS_V6_VAL(ipaddr) 1
992 #define IP_IS_V4(ipaddr) 0
993 #define IP_IS_V6(ipaddr) 1
994 #define IP_IS_ANY_TYPE_VAL(ipaddr) 0
995 #define IP_SET_TYPE_VAL(ipaddr, iptype)
996 #define IP_SET_TYPE(ipaddr, iptype)
997 #define IP_GET_TYPE(ipaddr) IPADDR_TYPE_V6
998 #define ip_2_ip6(ipaddr) (ipaddr)
999 #define IP_ADDR6(ipaddr, i0, i1, i2, i3) IP6_ADDR(ipaddr, i0, i1, i2, i3)
1000 
1001 #define ip_addr_copy(dest, src) ip6_addr_copy(dest, src)
1002 #define ip_addr_copy_from_ip6(dest, src) ip6_addr_copy(dest, src)
1003 #define ip_addr_set(dest, src) ip6_addr_set(dest, src)
1004 #define ip_addr_set_ipaddr(dest, src) ip6_addr_set(dest, src)
1005 #define ip_addr_set_zero(ipaddr) ip6_addr_set_zero(ipaddr)
1006 #define ip_addr_set_zero_ip6(ipaddr) ip6_addr_set_zero(ipaddr)
1007 #define ip_addr_set_any(is_ipv6, ipaddr) ip6_addr_set_any(ipaddr)
1008 #define ip_addr_set_loopback(is_ipv6, ipaddr) ip6_addr_set_loopback(ipaddr)
1009 #define ip_addr_set_hton(dest, src) ip6_addr_set_hton(dest, src)
1010 #define ip_addr_get_network(target, host, mask) ip6_addr_set_zero(target)
1011 #define ip_addr_netcmp(addr1, addr2, mask) 0
1012 #define ip_addr_cmp(addr1, addr2) ip6_addr_cmp(addr1, addr2)
1013 #define ip_addr_isany(ipaddr) ip6_addr_isany(ipaddr)
1014 #define ip_addr_isany_val(ipaddr) ip6_addr_isany_val(ipaddr)
1015 #define ip_addr_isloopback(ipaddr) ip6_addr_isloopback(ipaddr)
1016 #define ip_addr_islinklocal(ipaddr) ip6_addr_islinklocal(ipaddr)
1017 #define ip_addr_isbroadcast(addr, netif) 0
1018 #define ip_addr_ismulticast(ipaddr) ip6_addr_ismulticast(ipaddr)
1019 #define ip_addr_debug_print(debug, ipaddr) ip6_addr_debug_print(debug, ipaddr)
1020 #define ip_addr_debug_print_val(debug, ipaddr) ip6_addr_debug_print_val(debug, ipaddr)
1021 #define ipaddr_ntoa(ipaddr) ip6addr_ntoa(ipaddr)
1022 #define ipaddr_ntoa_r(ipaddr, buf, buflen) ip6addr_ntoa_r(ipaddr, buf, buflen)
1023 #define ipaddr_aton(cp, addr) ip6addr_aton(cp, addr)
1024 
1025 #define IPADDR_STRLEN_MAX IP6ADDR_STRLEN_MAX
1026 
1027 #endif /* LWIP_IPV4 */
1028 #endif /* LWIP_IPV4 && LWIP_IPV6 */
1029 
1030 #if LWIP_IPV4
1031 
1032 extern const ip_addr_t ip_addr_any;
1033 extern const ip_addr_t ip_addr_broadcast;
1034 
1039 #define IP_ADDR_ANY IP4_ADDR_ANY
1040 
1045 #define IP4_ADDR_ANY (&ip_addr_any)
1046 
1051 #define IP4_ADDR_ANY4 (ip_2_ip4(&ip_addr_any))
1052 
1054 #define IP_ADDR_BROADCAST (&ip_addr_broadcast)
1055 
1056 #define IP4_ADDR_BROADCAST (ip_2_ip4(&ip_addr_broadcast))
1057 
1058 #endif /* LWIP_IPV4*/
1059 
1060 #if LWIP_IPV6
1061 
1062 extern const ip_addr_t ip6_addr_any;
1063 
1069 #define IP6_ADDR_ANY (&ip6_addr_any)
1070 
1075 #define IP6_ADDR_ANY6 (ip_2_ip6(&ip6_addr_any))
1076 
1077 #if !LWIP_IPV4
1078 
1079 #define IP_ADDR_ANY IP6_ADDR_ANY
1080 #endif /* !LWIP_IPV4 */
1081 
1082 #endif
1083 
1084 #if LWIP_IPV4 && LWIP_IPV6
1085 
1086 #define IP_ANY_TYPE (&ip_addr_any_type)
1087 #else
1088 #define IP_ANY_TYPE IP_ADDR_ANY
1089 #endif
1090 
1091 /* From src/include/lwip/netif.h: */
1092 
1093 
1094 /* Throughout this file, IP addresses are expected to be in
1095  * the same byte order as in IP_PCB. */
1096 
1100 #ifndef NETIF_MAX_HWADDR_LEN
1101 #define NETIF_MAX_HWADDR_LEN 6U
1102 #endif
1103 
1116 #define NETIF_FLAG_UP 0x01U
1117 
1119 #define NETIF_FLAG_BROADCAST 0x02U
1120 
1125 #define NETIF_FLAG_LINK_UP 0x04U
1126 
1129 #define NETIF_FLAG_ETHARP 0x08U
1130 
1133 #define NETIF_FLAG_ETHERNET 0x10U
1134 
1136 #define NETIF_FLAG_IGMP 0x20U
1137 
1139 #define NETIF_FLAG_MLD6 0x40U
1140 
1145 enum lwip_internal_netif_client_data_index {
1146 #if LWIP_DHCP
1147  LWIP_NETIF_CLIENT_DATA_INDEX_DHCP,
1148 #endif
1149 #if LWIP_AUTOIP
1150  LWIP_NETIF_CLIENT_DATA_INDEX_AUTOIP,
1151 #endif
1152 #if LWIP_IGMP
1153  LWIP_NETIF_CLIENT_DATA_INDEX_IGMP,
1154 #endif
1155 #if LWIP_IPV6_MLD
1156  LWIP_NETIF_CLIENT_DATA_INDEX_MLD6,
1157 #endif
1158  LWIP_NETIF_CLIENT_DATA_INDEX_MAX
1159 };
1160 
1161 #if LWIP_CHECKSUM_CTRL_PER_NETIF
1162 #define NETIF_CHECKSUM_GEN_IP 0x0001
1163 #define NETIF_CHECKSUM_GEN_UDP 0x0002
1164 #define NETIF_CHECKSUM_GEN_TCP 0x0004
1165 #define NETIF_CHECKSUM_GEN_ICMP 0x0008
1166 #define NETIF_CHECKSUM_GEN_ICMP6 0x0010
1167 #define NETIF_CHECKSUM_CHECK_IP 0x0100
1168 #define NETIF_CHECKSUM_CHECK_UDP 0x0200
1169 #define NETIF_CHECKSUM_CHECK_TCP 0x0400
1170 #define NETIF_CHECKSUM_CHECK_ICMP 0x0800
1171 #define NETIF_CHECKSUM_CHECK_ICMP6 0x1000
1172 #define NETIF_CHECKSUM_ENABLE_ALL 0xFFFF
1173 #define NETIF_CHECKSUM_DISABLE_ALL 0x0000
1174 #endif /* LWIP_CHECKSUM_CTRL_PER_NETIF */
1175 
1176 struct netif;
1177 
1185 };
1186 
1192 typedef err_t (*netif_init_fn)(struct netif *netif);
1199 typedef err_t (*netif_input_fn)(struct pbuf *p, struct netif *inp);
1200 
1201 #if LWIP_IPV4
1202 
1210 typedef err_t (*netif_output_fn)(struct netif *netif, struct pbuf *p,
1211  const ip4_addr_t *ipaddr);
1212 #endif /* LWIP_IPV4*/
1213 
1214 #if LWIP_IPV6
1215 
1223 typedef err_t (*netif_output_ip6_fn)(struct netif *netif, struct pbuf *p,
1224  const ip6_addr_t *ipaddr);
1225 #endif /* LWIP_IPV6 */
1226 
1233 typedef err_t (*netif_linkoutput_fn)(struct netif *netif, struct pbuf *p);
1235 typedef void (*netif_status_callback_fn)(struct netif *netif);
1236 #if LWIP_IPV4 && LWIP_IGMP
1237 
1238 typedef err_t (*netif_igmp_mac_filter_fn)(struct netif *netif,
1239  const ip4_addr_t *group, enum netif_mac_filter_action action);
1240 #endif /* LWIP_IPV4 && LWIP_IGMP */
1241 #if LWIP_IPV6 && LWIP_IPV6_MLD
1242 
1243 typedef err_t (*netif_mld_mac_filter_fn)(struct netif *netif,
1244  const ip6_addr_t *group, enum netif_mac_filter_action action);
1245 #endif /* LWIP_IPV6 && LWIP_IPV6_MLD */
1246 
1247 #if LWIP_DHCP || LWIP_AUTOIP || LWIP_IGMP || LWIP_IPV6_MLD || (LWIP_NUM_NETIF_CLIENT_DATA > 0)
1248 u8 netif_alloc_client_data_id(void);
1252 #define netif_set_client_data(netif, id, data) netif_get_client_data(netif, id) = (data)
1253 
1256 #define netif_get_client_data(netif, id) (netif)->client_data[(id)]
1257 #endif /* LWIP_DHCP || LWIP_AUTOIP || (LWIP_NUM_NETIF_CLIENT_DATA > 0) */
1258 
1262 struct netif
1263 {
1265  struct netif *next;
1266 
1267 #if LWIP_IPV4
1268 
1270  ip_addr_t netmask;
1271  ip_addr_t gw;
1272 #endif /* LWIP_IPV4 */
1273 #if LWIP_IPV6
1274 
1275  ip_addr_t ip6_addr[LWIP_IPV6_NUM_ADDRESSES];
1278  u8 ip6_addr_state[LWIP_IPV6_NUM_ADDRESSES];
1279 #endif /* LWIP_IPV6 */
1280 
1283 #if LWIP_IPV4
1284 
1289 #endif /* LWIP_IPV4 */
1290 
1294 #if LWIP_IPV6
1295 
1299  netif_output_ip6_fn output_ip6;
1300 #endif /* LWIP_IPV6 */
1301 #if LWIP_NETIF_STATUS_CALLBACK
1302 
1304  netif_status_callback_fn status_callback;
1305 #endif /* LWIP_NETIF_STATUS_CALLBACK */
1306 #if LWIP_NETIF_LINK_CALLBACK
1307 
1309  netif_status_callback_fn link_callback;
1310 #endif /* LWIP_NETIF_LINK_CALLBACK */
1311 #if LWIP_NETIF_REMOVE_CALLBACK
1312 
1313  netif_status_callback_fn remove_callback;
1314 #endif /* LWIP_NETIF_REMOVE_CALLBACK */
1315 
1317  void *state;
1318 #ifdef netif_get_client_data
1319  void *client_data[LWIP_NETIF_CLIENT_DATA_INDEX_MAX + LWIP_NUM_NETIF_CLIENT_DATA];
1320 #endif
1321 #if LWIP_IPV6_AUTOCONFIG
1322 
1323  u8 ip6_autoconfig_enabled;
1324 #endif /* LWIP_IPV6_AUTOCONFIG */
1325 #if LWIP_IPV6_SEND_ROUTER_SOLICIT
1326 
1328 #endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */
1329 #if LWIP_NETIF_HOSTNAME
1330  /* the hostname for this netif, NULL is a valid value */
1331  const char *hostname;
1332 #endif /* LWIP_NETIF_HOSTNAME */
1333 #if LWIP_CHECKSUM_CTRL_PER_NETIF
1334  u16 chksum_flags;
1335 #endif /* LWIP_CHECKSUM_CTRL_PER_NETIF*/
1336 
1337  u16 mtu;
1343  u8 flags;
1345  char name[2];
1347  u8 num;
1348 #if MIB2_STATS
1349 
1350  u8 link_type;
1352  u32 link_speed;
1354  u32 ts;
1356  struct stats_mib2_netif_ctrs mib2_counters;
1357 #endif /* MIB2_STATS */
1358 #if LWIP_IPV4 && LWIP_IGMP
1359 
1361  netif_igmp_mac_filter_fn igmp_mac_filter;
1362 #endif /* LWIP_IPV4 && LWIP_IGMP */
1363 #if LWIP_IPV6 && LWIP_IPV6_MLD
1364 
1366  netif_mld_mac_filter_fn mld_mac_filter;
1367 #endif /* LWIP_IPV6 && LWIP_IPV6_MLD */
1368 #if LWIP_NETIF_HWADDRHINT
1369  u8 *addr_hint;
1370 #endif /* LWIP_NETIF_HWADDRHINT */
1371 #if ENABLE_LOOPBACK
1372  /* List of packets to be queued for ourselves. */
1373  struct pbuf *loop_first;
1374  struct pbuf *loop_last;
1375 #if LWIP_LOOPBACK_MAX_PBUFS
1376  u16 loop_cnt_current;
1377 #endif /* LWIP_LOOPBACK_MAX_PBUFS */
1378 #endif /* ENABLE_LOOPBACK */
1379 };
1380 
1381 #if LWIP_CHECKSUM_CTRL_PER_NETIF
1382 #define NETIF_SET_CHECKSUM_CTRL(netif, chksumflags) \
1383  do { \
1384  (netif)->chksum_flags = chksumflags; \
1385  } while (0)
1386 #define IF__NETIF_CHECKSUM_ENABLED(netif, chksumflag) if (((netif) == NULL) || (((netif)->chksum_flags & (chksumflag)) != 0))
1387 #else /* LWIP_CHECKSUM_CTRL_PER_NETIF */
1388 #define NETIF_SET_CHECKSUM_CTRL(netif, chksumflags)
1389 #define IF__NETIF_CHECKSUM_ENABLED(netif, chksumflag)
1390 #endif /* LWIP_CHECKSUM_CTRL_PER_NETIF */
1391 
1393 extern struct netif *netif_list;
1395 extern struct netif *netif_default;
1396 
1397 #if LWIP_IPV4
1398 
1399 #define netif_ip4_addr(netif) ((const ip4_addr_t *)ip_2_ip4(&((netif)->ip_addr)))
1400 
1401 #define netif_ip4_netmask(netif) ((const ip4_addr_t *)ip_2_ip4(&((netif)->netmask)))
1402 
1403 #define netif_ip4_gw(netif) ((const ip4_addr_t *)ip_2_ip4(&((netif)->gw)))
1404 
1405 #define netif_ip_addr4(netif) ((const ip_addr_t *)&((netif)->ip_addr))
1406 
1407 #define netif_ip_netmask4(netif) ((const ip_addr_t *)&((netif)->netmask))
1408 
1409 #define netif_ip_gw4(netif) ((const ip_addr_t *)&((netif)->gw))
1410 #endif /* LWIP_IPV4 */
1411 
1415 #define netif_is_up(netif) (((netif)->flags & NETIF_FLAG_UP) ? (u8)1 : (u8)0)
1416 
1418 #define netif_is_link_up(netif) (((netif)->flags & NETIF_FLAG_LINK_UP) ? (u8)1 : (u8)0)
1419 
1420 #if LWIP_NETIF_HOSTNAME
1421 
1422 #define netif_set_hostname(netif, name) \
1423  do { \
1424  if ((netif) != NULL) { \
1425  (netif)->hostname = name; \
1426  } \
1427  } while (0)
1428 
1429 #define netif_get_hostname(netif) (((netif) != NULL) ? ((netif)->hostname) : NULL)
1430 #endif /* LWIP_NETIF_HOSTNAME */
1431 
1432 #if LWIP_IGMP
1433 
1434 #define netif_set_igmp_mac_filter(netif, function) \
1435  do { \
1436  if ((netif) != NULL) { \
1437  (netif)->igmp_mac_filter = function; \
1438  } \
1439  } while (0)
1440 #define netif_get_igmp_mac_filter(netif) (((netif) != NULL) ? ((netif)->igmp_mac_filter) : NULL)
1441 #endif /* LWIP_IGMP */
1442 
1443 #if LWIP_IPV6 && LWIP_IPV6_MLD
1444 
1445 #define netif_set_mld_mac_filter(netif, function) \
1446  do { \
1447  if ((netif) != NULL) { \
1448  (netif)->mld_mac_filter = function; \
1449  } \
1450  } while (0)
1451 #define netif_get_mld_mac_filter(netif) (((netif) != NULL) ? ((netif)->mld_mac_filter) : NULL)
1452 #define netif_mld_mac_filter(netif, addr, action) \
1453  do { \
1454  if ((netif) && (netif)->mld_mac_filter) { \
1455  (netif)->mld_mac_filter((netif), (addr), (action)); \
1456  } \
1457  } while (0)
1458 #endif /* LWIP_IPV6 && LWIP_IPV6_MLD */
1459 
1460 #if LWIP_IPV6
1461 
1462 #define netif_ip_addr6(netif, i) ((const ip_addr_t *)(&((netif)->ip6_addr[i])))
1463 
1464 #define netif_ip6_addr(netif, i) ((const ip6_addr_t *)ip_2_ip6(&((netif)->ip6_addr[i])))
1465 void netif_ip6_addr_set(struct netif *netif, s8_t addr_idx, const ip6_addr_t *addr6);
1466 void netif_ip6_addr_set_parts(struct netif *netif, s8_t addr_idx, u32 i0, u32 i1, u32 i2, u32 i3);
1467 #define netif_ip6_addr_state(netif, i) ((netif)->ip6_addr_state[i])
1468 #define netif_set_ip6_autoconfig_enabled(netif, action) \
1469  do { \
1470  if (netif) { \
1471  (netif)->ip6_autoconfig_enabled = (action); \
1472  } \
1473  } while (0)
1474 #endif /* LWIP_IPV6 */
1475 
1476 #if LWIP_NETIF_HWADDRHINT
1477 #define NETIF_SET_HWADDRHINT(netif, hint) ((netif)->addr_hint = (hint))
1478 #else /* LWIP_NETIF_HWADDRHINT */
1479 #define NETIF_SET_HWADDRHINT(netif, hint)
1480 #endif /* LWIP_NETIF_HWADDRHINT */
1481 
1482 /* From include/lwip/prot/dhcp.h: */
1483 /* DHCP client states */
1484 typedef enum {
1485  DHCP_STATE_OFF = 0,
1486  DHCP_STATE_REQUESTING = 1,
1487  DHCP_STATE_INIT = 2,
1488  DHCP_STATE_REBOOTING = 3,
1489  DHCP_STATE_REBINDING = 4,
1490  DHCP_STATE_RENEWING = 5,
1491  DHCP_STATE_SELECTING = 6,
1492  DHCP_STATE_INFORMING = 7,
1493  DHCP_STATE_CHECKING = 8,
1494  DHCP_STATE_PERMANENT = 9, /* not yet implemented */
1495  DHCP_STATE_BOUND = 10,
1496  DHCP_STATE_RELEASING = 11, /* not yet implemented */
1497  DHCP_STATE_BACKING_OFF = 12
1498 } dhcp_state_enum_t;
1499 
1500 /* From include/lwip/inet.h: */
1501 
1502 struct in_addr
1503 {
1504  u32 s_addr;
1505 };
1506 
1507 struct in6_addr
1508 {
1509  union
1510  {
1511  u32 u32_addr[4];
1512  u8 u8_addr[16];
1513  } un;
1514 #define s6_addr un.u8_addr
1515 };
1516 
1518 #define INADDR_NONE IPADDR_NONE
1519 
1520 #define INADDR_LOOPBACK IPADDR_LOOPBACK
1521 
1522 #define INADDR_ANY IPADDR_ANY
1523 
1524 #define INADDR_BROADCAST IPADDR_BROADCAST
1525 
1526 /* If your port already typedef's sa_family_t, define SA_FAMILY_T_DEFINED
1527  to prevent this code from redefining it. */
1528 #if !defined(sa_family_t) && !defined(SA_FAMILY_T_DEFINED)
1529 typedef u8 sa_family_t;
1530 #endif
1531 /* If your port already typedef's in_port_t, define IN_PORT_T_DEFINED
1532  to prevent this code from redefining it. */
1533 #if !defined(in_port_t) && !defined(IN_PORT_T_DEFINED)
1534 typedef u16 in_port_t;
1535 #endif
1536 
1537 #if LWIP_IPV4
1538 /* members are in network byte order */
1540 {
1541  u8 sin_len;
1542  sa_family_t sin_family;
1543  in_port_t sin_port;
1544  struct in_addr sin_addr;
1545 #define SIN_ZERO_LEN 8
1546  char sin_zero[SIN_ZERO_LEN];
1547 };
1548 #endif /* LWIP_IPV4 */
1549 
1550 #if LWIP_IPV6
1551 struct sockaddr_in6
1552 {
1553  u8 sin6_len; /* length of this structure */
1554  sa_family_t sin6_family; /* AF_INET6 */
1555  in_port_t sin6_port; /* Transport layer port # */
1556  u32 sin6_flowinfo; /* IPv6 flow information */
1557  struct in6_addr sin6_addr; /* IPv6 address */
1558  u32 sin6_scope_id; /* Set of interfaces for scope */
1559 };
1560 #endif /* LWIP_IPV6 */
1561 
1562 struct sockaddr
1563 {
1564  u8 sa_len;
1565  sa_family_t sa_family;
1566  char sa_data[14];
1567 };
1568 
1570 {
1571  u8 s2_len;
1572  sa_family_t ss_family;
1573  char s2_data1[2];
1574  u32 s2_data2[3];
1575 #if LWIP_IPV6
1576  u32 s2_data3[3];
1577 #endif /* LWIP_IPV6 */
1578 };
1579 
1580 /* Define SOCKLEN_T_DEFINED to prevent other code from redefining socklen_t. */
1581 #define SOCKLEN_T_DEFINED 1
1582 typedef int socklen_t;
1583 
1584 /* Socket protocol types (TCP/UDP/RAW) */
1585 #define SOCK_STREAM 1
1586 #define SOCK_DGRAM 2
1587 #define SOCK_RAW 3
1588 
1589 /*
1590  * Option flags per-socket. These must match the SOF_ flags in ip.h (checked in init.c)
1591  */
1592 #define SO_REUSEADDR 0x0004 /* Allow local address reuse */
1593 #define SO_KEEPALIVE 0x0008 /* keep connections alive */
1594 #define SO_BROADCAST 0x0020 /* permit to send and to receive broadcast messages (see IP_SOF_BROADCAST option) */
1595 
1596 
1597 /*
1598  * Additional options, not kept in so_options.
1599  */
1600 #define SO_DEBUG 0x0001 /* Unimplemented: turn on debugging info recording */
1601 #define SO_ACCEPTCONN 0x0002 /* socket has had listen() */
1602 #define SO_DONTROUTE 0x0010 /* Unimplemented: just use interface addresses */
1603 #define SO_USELOOPBACK 0x0040 /* Unimplemented: bypass hardware when possible */
1604 #define SO_LINGER 0x0080 /* linger on close if data present */
1605 #define SO_DONTLINGER ((int)(~SO_LINGER))
1606 #define SO_OOBINLINE 0x0100 /* Unimplemented: leave received OOB data in line */
1607 #define SO_REUSEPORT 0x0200 /* Unimplemented: allow local address & port reuse */
1608 #define SO_SNDBUF 0x1001 /* Unimplemented: send buffer size */
1609 #define SO_RCVBUF 0x1002 /* receive buffer size */
1610 #define SO_SNDLOWAT 0x1003 /* Unimplemented: send low-water mark */
1611 #define SO_RCVLOWAT 0x1004 /* Unimplemented: receive low-water mark */
1612 #define SO_SNDTIMEO 0x1005 /* send timeout */
1613 #define SO_RCVTIMEO 0x1006 /* receive timeout */
1614 #define SO_ERROR 0x1007 /* get error status and clear */
1615 #define SO_TYPE 0x1008 /* get socket type */
1616 #define SO_CONTIMEO 0x1009 /* Unimplemented: connect timeout */
1617 #define SO_NO_CHECK 0x100a /* don't create UDP checksum */
1618 
1619 /*
1620  * Level number for (get/set)sockopt() to apply to socket itself.
1621  */
1622 #define SOL_SOCKET 0xfff /* options for socket level */
1623 
1624 #define AF_UNSPEC 0
1625 #define AF_INET 2
1626 #if LWIP_IPV6
1627 #define AF_INET6 10
1628 #else /* LWIP_IPV6 */
1629 #define AF_INET6 AF_UNSPEC
1630 #endif /* LWIP_IPV6 */
1631 #define PF_INET AF_INET
1632 #define PF_INET6 AF_INET6
1633 #define PF_UNSPEC AF_UNSPEC
1634 
1635 #define IPPROTO_IP 0
1636 #define IPPROTO_ICMP 1
1637 #define IPPROTO_TCP 6
1638 #define IPPROTO_UDP 17
1639 #if LWIP_IPV6
1640 #define IPPROTO_IPV6 41
1641 #define IPPROTO_ICMPV6 58
1642 #endif /* LWIP_IPV6 */
1643 #define IPPROTO_UDPLITE 136
1644 #define IPPROTO_RAW 255
1645 
1646 /* Flags we can use with send and recv. */
1647 #define MSG_PEEK 0x01 /* Peeks at an incoming message */
1648 #define MSG_WAITALL 0x02 /* Unimplemented: Requests that the function block until the full amount of data requested can be returned */
1649 #define MSG_OOB 0x04 /* Unimplemented: Requests out-of-band data. The significance and semantics of out-of-band data are protocol-specific */
1650 #define MSG_DONTWAIT 0x08 /* Nonblocking i/o for this operation only */
1651 #define MSG_MORE 0x10 /* Sender will send more */
1652 
1653 /*
1654  * Options for level IPPROTO_IP
1655  */
1656 #define IP_TOS 1
1657 #define IP_TTL 2
1658 
1659 #if LWIP_TCP
1660 /*
1661  * Options for level IPPROTO_TCP
1662  */
1663 #define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */
1664 #define TCP_KEEPALIVE 0x02 /* send KEEPALIVE probes when idle for pcb->keep_idle milliseconds */
1665 #define TCP_KEEPIDLE 0x03 /* set pcb->keep_idle - Same as TCP_KEEPALIVE, but use seconds for get/setsockopt */
1666 #define TCP_KEEPINTVL 0x04 /* set pcb->keep_intvl - Use seconds for get/setsockopt */
1667 #define TCP_KEEPCNT 0x05 /* set pcb->keep_cnt - Use number of probes sent for get/setsockopt */
1668 #endif /* LWIP_TCP */
1669 
1670 #if LWIP_IPV6
1671 /*
1672  * Options for level IPPROTO_IPV6
1673  */
1674 #define IPV6_CHECKSUM 7 /* RFC3542: calculate and insert the ICMPv6 checksum for raw sockets. */
1675 #define IPV6_V6ONLY 27 /* RFC3493: boolean control to restrict AF_INET6 sockets to IPv6 communications only. */
1676 #endif /* LWIP_IPV6 */
1677 
1678 #if LWIP_UDP && LWIP_UDPLITE
1679 /*
1680  * Options for level IPPROTO_UDPLITE
1681  */
1682 #define UDPLITE_SEND_CSCOV 0x01 /* sender checksum coverage */
1683 #define UDPLITE_RECV_CSCOV 0x02 /* minimal receiver checksum coverage */
1684 #endif /* LWIP_UDP && LWIP_UDPLITE*/
1685 
1686 
1687 #if LWIP_MULTICAST_TX_OPTIONS
1688 /*
1689  * Options and types for UDP multicast traffic handling
1690  */
1691 #define IP_MULTICAST_TTL 5
1692 #define IP_MULTICAST_IF 6
1693 #define IP_MULTICAST_LOOP 7
1694 #endif /* LWIP_MULTICAST_TX_OPTIONS */
1695 
1696 #if LWIP_IGMP
1697 /*
1698  * Options and types related to multicast membership
1699  */
1700 #define IP_ADD_MEMBERSHIP 3
1701 #define IP_DROP_MEMBERSHIP 4
1702 
1703 typedef struct ip_mreq
1704 {
1705  struct in_addr imr_multiaddr; /* IP multicast address of group */
1706  struct in_addr imr_interface; /* local IP address of interface */
1707 } ip_mreq;
1708 #endif /* LWIP_IGMP */
1709 
1710 /*
1711  * The Type of Service provides an indication of the abstract
1712  * parameters of the quality of service desired. These parameters are
1713  * to be used to guide the selection of the actual service parameters
1714  * when transmitting a datagram through a particular network. Several
1715  * networks offer service precedence, which somehow treats high
1716  * precedence traffic as more important than other traffic (generally
1717  * by accepting only traffic above a certain precedence at time of high
1718  * load). The major choice is a three way tradeoff between low-delay,
1719  * high-reliability, and high-throughput.
1720  * The use of the Delay, Throughput, and Reliability indications may
1721  * increase the cost (in some sense) of the service. In many networks
1722  * better performance for one of these parameters is coupled with worse
1723  * performance on another. Except for very unusual cases at most two
1724  * of these three indications should be set.
1725  */
1726 #define IPTOS_TOS_MASK 0x1E
1727 #define IPTOS_TOS(tos) ((tos)&IPTOS_TOS_MASK)
1728 #define IPTOS_LOWDELAY 0x10
1729 #define IPTOS_THROUGHPUT 0x08
1730 #define IPTOS_RELIABILITY 0x04
1731 #define IPTOS_LOWCOST 0x02
1732 #define IPTOS_MINCOST IPTOS_LOWCOST
1733 
1734 /*
1735  * The Network Control precedence designation is intended to be used
1736  * within a network only. The actual use and control of that
1737  * designation is up to each network. The Internetwork Control
1738  * designation is intended for use by gateway control originators only.
1739  * If the actual use of these precedence designations is of concern to
1740  * a particular network, it is the responsibility of that network to
1741  * control the access to, and use of, those precedence designations.
1742  */
1743 #define IPTOS_PREC_MASK 0xe0
1744 #define IPTOS_PREC(tos) ((tos)&IPTOS_PREC_MASK)
1745 #define IPTOS_PREC_NETCONTROL 0xe0
1746 #define IPTOS_PREC_INTERNETCONTROL 0xc0
1747 #define IPTOS_PREC_CRITIC_ECP 0xa0
1748 #define IPTOS_PREC_FLASHOVERRIDE 0x80
1749 #define IPTOS_PREC_FLASH 0x60
1750 #define IPTOS_PREC_IMMEDIATE 0x40
1751 #define IPTOS_PREC_PRIORITY 0x20
1752 #define IPTOS_PREC_ROUTINE 0x00
1753 
1754 
1755 /*
1756  * Commands for ioctlsocket(), taken from the BSD file fcntl.h.
1757  * lwip_ioctl only supports FIONREAD and FIONBIO, for now
1758  *
1759  * Ioctl's have the command encoded in the lower word,
1760  * and the size of any in or out parameters in the upper
1761  * word. The high 2 bits of the upper word are used
1762  * to encode the in/out status of the parameter; for now
1763  * we restrict parameters to at most 128 bytes.
1764  */
1765 #if !defined(FIONREAD) || !defined(FIONBIO)
1766 #define IOCPARM_MASK 0x7fU /* parameters must be < 128 bytes */
1767 #define IOC_VOID 0x20000000UL /* no parameters */
1768 #define IOC_OUT 0x40000000UL /* copy out parameters */
1769 #define IOC_IN 0x80000000UL /* copy in parameters */
1770 #define IOC_INOUT (IOC_IN | IOC_OUT)
1771 /* 0x20000000 distinguishes new &
1772  old ioctl's */
1773 #define _IO(x, y) (IOC_VOID | ((x) << 8) | (y))
1774 
1775 #define _IOR(x, y, t) (IOC_OUT | (((long)sizeof(t) & IOCPARM_MASK) << 16) | ((x) << 8) | (y))
1776 
1777 #define _IOW(x, y, t) (IOC_IN | (((long)sizeof(t) & IOCPARM_MASK) << 16) | ((x) << 8) | (y))
1778 #endif /* !defined(FIONREAD) || !defined(FIONBIO) */
1779 
1780 #ifndef FIONREAD
1781 #define FIONREAD _IOR('f', 127, unsigned long) /* get # bytes to read */
1782 #endif
1783 #ifndef FIONBIO
1784 #define FIONBIO _IOW('f', 126, unsigned long) /* set/clear non-blocking i/o */
1785 #endif
1786 
1787 /* Socket I/O Controls: unimplemented */
1788 #ifndef SIOCSHIWAT
1789 #define SIOCSHIWAT _IOW('s', 0, unsigned long) /* set high watermark */
1790 #define SIOCGHIWAT _IOR('s', 1, unsigned long) /* get high watermark */
1791 #define SIOCSLOWAT _IOW('s', 2, unsigned long) /* set low watermark */
1792 #define SIOCGLOWAT _IOR('s', 3, unsigned long) /* get low watermark */
1793 #define SIOCATMARK _IOR('s', 7, unsigned long) /* at oob mark? */
1794 #endif
1795 
1796 /* commands for fnctl */
1797 #ifndef F_GETFL
1798 #define F_GETFL 3
1799 #endif
1800 #ifndef F_SETFL
1801 #define F_SETFL 4
1802 #endif
1803 
1804 /* File status flags and file access modes for fnctl,
1805  these are bits in an int. */
1806 #ifndef O_NONBLOCK
1807 #define O_NONBLOCK 1 /* nonblocking I/O */
1808 #endif
1809 #ifndef O_NDELAY
1810 #define O_NDELAY 1 /* same as O_NONBLOCK, for compatibility */
1811 #endif
1812 
1813 #ifndef SHUT_RD
1814 #define SHUT_RD 0
1815 #define SHUT_WR 1
1816 #define SHUT_RDWR 2
1817 #endif
1818 
1819 /* FD_SET used for lwip_select */
1820 #ifndef FD_SET
1821 #undef FD_SETSIZE
1822 /* Make FD_SETSIZE match NUM_SOCKETS in socket.c */
1823 #define FD_SETSIZE MEMP_NUM_NETCONN
1824 #define FDSETSAFESET(n, code) \
1825  do { \
1826  if (((n)-LWIP_SOCKET_OFFSET < MEMP_NUM_NETCONN) && (((int)(n)-LWIP_SOCKET_OFFSET) >= 0)) { \
1827  code; \
1828  } \
1829  } while (0)
1830 #define FDSETSAFEGET(n, code) (((n)-LWIP_SOCKET_OFFSET < MEMP_NUM_NETCONN) && (((int)(n)-LWIP_SOCKET_OFFSET) >= 0) ? \
1831  (code) : \
1832  0)
1833 #define FD_SET(n, p) FDSETSAFESET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET) / 8] |= (1 << (((n)-LWIP_SOCKET_OFFSET) & 7)))
1834 #define FD_CLR(n, p) FDSETSAFESET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET) / 8] &= ~(1 << (((n)-LWIP_SOCKET_OFFSET) & 7)))
1835 #define FD_ISSET(n, p) FDSETSAFEGET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET) / 8] & (1 << (((n)-LWIP_SOCKET_OFFSET) & 7)))
1836 #define FD_ZERO(p) memset((void *)(p), 0, sizeof(*(p)))
1837 
1838 typedef struct fd_set
1839 {
1840  unsigned char fd_bits[(FD_SETSIZE + 7) / 8];
1841 } fd_set;
1842 
1843 #elif LWIP_SOCKET_OFFSET
1844 #error LWIP_SOCKET_OFFSET does not work with external FD_SET!
1845 #elif FD_SETSIZE < MEMP_NUM_NETCONN
1846 #error "external FD_SETSIZE too small for number of sockets"
1847 #endif /* FD_SET */
1848 
1849 #ifdef PS2IP_DNS
1850 
1851 #define DNS_TMR_INTERVAL 1000
1852 
1853 /* DNS resolve types: */
1854 #define LWIP_DNS_ADDRTYPE_IPV4 0
1855 #define LWIP_DNS_ADDRTYPE_IPV6 1
1856 #define LWIP_DNS_ADDRTYPE_IPV4_IPV6 2 /* try to resolve IPv4 first, try IPv6 if IPv4 fails only */
1857 #define LWIP_DNS_ADDRTYPE_IPV6_IPV4 3 /* try to resolve IPv6 first, try IPv4 if IPv6 fails only */
1858 #if LWIP_IPV4 && LWIP_IPV6
1859 #ifndef LWIP_DNS_ADDRTYPE_DEFAULT
1860 #define LWIP_DNS_ADDRTYPE_DEFAULT LWIP_DNS_ADDRTYPE_IPV4_IPV6
1861 #endif
1862 #elif defined(LWIP_IPV4)
1863 #define LWIP_DNS_ADDRTYPE_DEFAULT LWIP_DNS_ADDRTYPE_IPV4
1864 #else
1865 #define LWIP_DNS_ADDRTYPE_DEFAULT LWIP_DNS_ADDRTYPE_IPV6
1866 #endif
1867 
1868 #if DNS_LOCAL_HOSTLIST
1869 
1870 struct local_hostlist_entry
1871 {
1873  const char *name;
1875  ip_addr_t addr;
1876  struct local_hostlist_entry *next;
1877 };
1878 #if DNS_LOCAL_HOSTLIST_IS_DYNAMIC
1879 #ifndef DNS_LOCAL_HOSTLIST_MAX_NAMELEN
1880 #define DNS_LOCAL_HOSTLIST_MAX_NAMELEN DNS_MAX_NAME_LENGTH
1881 #endif
1882 #define LOCALHOSTLIST_ELEM_SIZE ((sizeof(struct local_hostlist_entry) + DNS_LOCAL_HOSTLIST_MAX_NAMELEN + 1))
1883 #endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */
1884 #endif /* DNS_LOCAL_HOSTLIST */
1885 
1893 typedef void (*dns_found_callback)(const char *name, const ip_addr_t *ipaddr, void *callback_arg);
1894 #endif
1895 
1896 /* From src/include/lwip/netdb.h: */
1897 /* some rarely used options */
1898 #ifndef LWIP_DNS_API_DECLARE_H_ERRNO
1899 #define LWIP_DNS_API_DECLARE_H_ERRNO 1
1900 #endif
1901 
1902 #ifndef LWIP_DNS_API_DEFINE_ERRORS
1903 #define LWIP_DNS_API_DEFINE_ERRORS 1
1904 #endif
1905 
1906 #ifndef LWIP_DNS_API_DEFINE_FLAGS
1907 #define LWIP_DNS_API_DEFINE_FLAGS 1
1908 #endif
1909 
1910 #ifndef LWIP_DNS_API_DECLARE_STRUCTS
1911 #define LWIP_DNS_API_DECLARE_STRUCTS 1
1912 #endif
1913 
1914 #if LWIP_DNS_API_DEFINE_ERRORS
1915 
1916 #define EAI_NONAME 200
1917 #define EAI_SERVICE 201
1918 #define EAI_FAIL 202
1919 #define EAI_MEMORY 203
1920 #define EAI_FAMILY 204
1921 
1922 #define HOST_NOT_FOUND 210
1923 #define NO_DATA 211
1924 #define NO_RECOVERY 212
1925 #define TRY_AGAIN 213
1926 #endif /* LWIP_DNS_API_DEFINE_ERRORS */
1927 
1928 #if LWIP_DNS_API_DEFINE_FLAGS
1929 /* input flags for struct addrinfo */
1930 #define AI_PASSIVE 0x01
1931 #define AI_CANONNAME 0x02
1932 #define AI_NUMERICHOST 0x04
1933 #define AI_NUMERICSERV 0x08
1934 #define AI_V4MAPPED 0x10
1935 #define AI_ALL 0x20
1936 #define AI_ADDRCONFIG 0x40
1937 #endif /* LWIP_DNS_API_DEFINE_FLAGS */
1938 
1939 #if LWIP_DNS_API_DECLARE_STRUCTS
1940 struct hostent
1941 {
1942  char *h_name; /* Official name of the host. */
1943  char **h_aliases; /* A pointer to an array of pointers to alternative host names,
1944  terminated by a null pointer. */
1945  int h_addrtype; /* Address type. */
1946  int h_length; /* The length, in bytes, of the address. */
1947  char **h_addr_list; /* A pointer to an array of pointers to network addresses (in
1948  network byte order) for the host, terminated by a null pointer. */
1949 #define h_addr h_addr_list[0] /* for backward compatibility */
1950 };
1951 
1952 struct addrinfo
1953 {
1954  int ai_flags; /* Input flags. */
1955  int ai_family; /* Address family of socket. */
1956  int ai_socktype; /* Socket type. */
1957  int ai_protocol; /* Protocol of socket. */
1958  socklen_t ai_addrlen; /* Length of socket address. */
1959  struct sockaddr *ai_addr; /* Socket address of socket. */
1960  char *ai_canonname; /* Canonical name of service location. */
1961  struct addrinfo *ai_next; /* Pointer to next in list. */
1962 };
1963 #endif /* LWIP_DNS_API_DECLARE_STRUCTS */
1964 
1965 #define NETDB_ELEM_SIZE (sizeof(struct addrinfo) + sizeof(struct sockaddr_storage) + DNS_MAX_NAME_LENGTH + 1)
1966 
1967 /* From src/include/lwip/def.h: */
1968 #define htons(x) lwip_htons(x)
1969 #define ntohs(x) lwip_ntohs(x)
1970 #define htonl(x) lwip_htonl(x)
1971 #define ntohl(x) lwip_ntohl(x)
1972 
1973 #define lwip_htons(x) PP_HTONS(x)
1974 #define lwip_ntohs(x) PP_NTOHS(x)
1975 #define lwip_htonl(x) PP_HTONL(x)
1976 #define lwip_ntohl(x) PP_NTOHL(x)
1977 
1978 /* These macros should be calculated by the preprocessor and are used
1979  with compile-time constants only (so that there is no little-endian
1980  overhead at runtime). */
1981 #define PP_HTONS(x) ((((x)&0xff) << 8) | (((x)&0xff00) >> 8))
1982 #define PP_NTOHS(x) PP_HTONS(x)
1983 #define PP_HTONL(x) ((((x)&0xff) << 24) | \
1984  (((x)&0xff00) << 8) | \
1985  (((x)&0xff0000UL) >> 8) | \
1986  (((x)&0xff000000UL) >> 24))
1987 #define PP_NTOHL(x) PP_HTONL(x)
1988 
1990 typedef struct
1991 {
1992  char netif_name[4];
1993  struct in_addr ipaddr;
1994  struct in_addr netmask;
1995  struct in_addr gw;
1996  u32 dhcp_enabled;
1997  u32 dhcp_status;
1998  u8 hw_addr[8];
1999 } t_ip_info;
2000 
2001 struct timeval;
2002 
2003 #endif /* __TCPIP_H__ */
PBUF_POOL
@ PBUF_POOL
Definition: tcpip.h:225
dns_found_callback
void(* dns_found_callback)(const char *name, const ip_addr_t *ipaddr, void *callback_arg)
Definition: tcpip.h:1893
netif::output
netif_output_fn output
Definition: tcpip.h:1288
IPADDR_TYPE_V6
@ IPADDR_TYPE_V6
Definition: tcpip.h:676
netif_list
struct netif * netif_list
netif::hwaddr
u8 hwaddr[NETIF_MAX_HWADDR_LEN]
Definition: tcpip.h:1341
PBUF_RAW
@ PBUF_RAW
Definition: tcpip.h:196
ip6_addr
Definition: tcpip.h:420
netif::rs_count
u8 rs_count
Definition: tcpip.h:1327
NETIF_MAX_HWADDR_LEN
#define NETIF_MAX_HWADDR_LEN
Definition: tcpip.h:1101
netif::hwaddr_len
u8 hwaddr_len
Definition: tcpip.h:1339
sockaddr_storage
Definition: tcpip.h:1569
pbuf_layer
pbuf_layer
Definition: tcpip.h:174
netif_input_fn
err_t(* netif_input_fn)(struct pbuf *p, struct netif *inp)
Definition: tcpip.h:1199
t_ip_info
Definition: tcpip.h:1990
PBUF_IP
@ PBUF_IP
Definition: tcpip.h:182
netif_status_callback_fn
void(* netif_status_callback_fn)(struct netif *netif)
Definition: tcpip.h:1235
netif_init_fn
err_t(* netif_init_fn)(struct netif *netif)
Definition: tcpip.h:1192
netif_mac_filter_action
netif_mac_filter_action
Definition: tcpip.h:1180
netif_linkoutput_fn
err_t(* netif_linkoutput_fn)(struct netif *netif, struct pbuf *p)
Definition: tcpip.h:1233
netif::name
char name[2]
Definition: tcpip.h:1345
pbuf::flags
u8 flags
Definition: tcpip.h:253
PBUF_RAM
@ PBUF_RAM
Definition: tcpip.h:210
netif::input
netif_input_fn input
Definition: tcpip.h:1282
addrinfo
Definition: tcpip.h:1952
PBUF_ROM
@ PBUF_ROM
Definition: tcpip.h:214
lwip_ip_addr_type
lwip_ip_addr_type
Definition: tcpip.h:672
pbuf::tot_len
u16 tot_len
Definition: tcpip.h:244
ip4_addr
Definition: tcpip.h:266
tamtypes.h
netif_output_fn
err_t(* netif_output_fn)(struct netif *netif, struct pbuf *p, const ip4_addr_t *ipaddr)
Definition: tcpip.h:1210
PBUF_RAW_TX
@ PBUF_RAW_TX
Definition: tcpip.h:193
pbuf::type
u8 type
Definition: tcpip.h:250
in6_addr
Definition: tcpip.h:1507
PBUF_LINK
@ PBUF_LINK
Definition: tcpip.h:187
IPADDR_TYPE_ANY
@ IPADDR_TYPE_ANY
Definition: tcpip.h:678
netif::linkoutput
netif_linkoutput_fn linkoutput
Definition: tcpip.h:1293
PBUF_REF
@ PBUF_REF
Definition: tcpip.h:218
NETIF_ADD_MAC_FILTER
@ NETIF_ADD_MAC_FILTER
Definition: tcpip.h:1184
IPADDR_TYPE_V4
@ IPADDR_TYPE_V4
Definition: tcpip.h:674
pbuf::next
struct pbuf * next
Definition: tcpip.h:232
netif
Definition: tcpip.h:1262
hostent
Definition: tcpip.h:1940
timeval
Definition: time.h:29
sockaddr_in
Definition: tcpip.h:1539
netif::flags
u8 flags
Definition: tcpip.h:1343
netif::next
struct netif * next
Definition: tcpip.h:1265
netif::state
void * state
Definition: tcpip.h:1317
NETIF_DEL_MAC_FILTER
@ NETIF_DEL_MAC_FILTER
Definition: tcpip.h:1182
netif_default
struct netif * netif_default
pbuf
Definition: tcpip.h:229
pbuf::len
u16 len
Definition: tcpip.h:247
in_addr
Definition: tcpip.h:1502
pbuf_type
pbuf_type
Definition: tcpip.h:203
netif::ip_addr
ip_addr_t ip_addr
Definition: tcpip.h:1269
fd_set
Definition: tcpip.h:1838
pbuf::ref
u16 ref
Definition: tcpip.h:260
netif::mtu
u16 mtu
Definition: tcpip.h:1337
pbuf::payload
void * payload
Definition: tcpip.h:235
netif::num
u8 num
Definition: tcpip.h:1347
sockaddr
Definition: tcpip.h:1562
PBUF_TRANSPORT
@ PBUF_TRANSPORT
Definition: tcpip.h:178