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