xref: /nrf52832-nimble/rt-thread/components/net/lwip-2.0.2/src/include/lwip/ip_addr.h (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /**
2*10465441SEvalZero  * @file
3*10465441SEvalZero  * IP address API (common IPv4 and IPv6)
4*10465441SEvalZero  */
5*10465441SEvalZero 
6*10465441SEvalZero /*
7*10465441SEvalZero  * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
8*10465441SEvalZero  * All rights reserved.
9*10465441SEvalZero  *
10*10465441SEvalZero  * Redistribution and use in source and binary forms, with or without modification,
11*10465441SEvalZero  * are permitted provided that the following conditions are met:
12*10465441SEvalZero  *
13*10465441SEvalZero  * 1. Redistributions of source code must retain the above copyright notice,
14*10465441SEvalZero  *    this list of conditions and the following disclaimer.
15*10465441SEvalZero  * 2. Redistributions in binary form must reproduce the above copyright notice,
16*10465441SEvalZero  *    this list of conditions and the following disclaimer in the documentation
17*10465441SEvalZero  *    and/or other materials provided with the distribution.
18*10465441SEvalZero  * 3. The name of the author may not be used to endorse or promote products
19*10465441SEvalZero  *    derived from this software without specific prior written permission.
20*10465441SEvalZero  *
21*10465441SEvalZero  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
22*10465441SEvalZero  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
23*10465441SEvalZero  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
24*10465441SEvalZero  * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25*10465441SEvalZero  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
26*10465441SEvalZero  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27*10465441SEvalZero  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28*10465441SEvalZero  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
29*10465441SEvalZero  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
30*10465441SEvalZero  * OF SUCH DAMAGE.
31*10465441SEvalZero  *
32*10465441SEvalZero  * This file is part of the lwIP TCP/IP stack.
33*10465441SEvalZero  *
34*10465441SEvalZero  * Author: Adam Dunkels <[email protected]>
35*10465441SEvalZero  *
36*10465441SEvalZero  */
37*10465441SEvalZero #ifndef LWIP_HDR_IP_ADDR_H
38*10465441SEvalZero #define LWIP_HDR_IP_ADDR_H
39*10465441SEvalZero 
40*10465441SEvalZero #include "lwip/opt.h"
41*10465441SEvalZero #include "lwip/def.h"
42*10465441SEvalZero 
43*10465441SEvalZero #include "lwip/ip4_addr.h"
44*10465441SEvalZero #include "lwip/ip6_addr.h"
45*10465441SEvalZero 
46*10465441SEvalZero #ifdef __cplusplus
47*10465441SEvalZero extern "C" {
48*10465441SEvalZero #endif
49*10465441SEvalZero 
50*10465441SEvalZero /** @ingroup ipaddr
51*10465441SEvalZero  * IP address types for use in ip_addr_t.type member.
52*10465441SEvalZero  * @see tcp_new_ip_type(), udp_new_ip_type(), raw_new_ip_type().
53*10465441SEvalZero  */
54*10465441SEvalZero enum lwip_ip_addr_type {
55*10465441SEvalZero   /** IPv4 */
56*10465441SEvalZero   IPADDR_TYPE_V4 =   0U,
57*10465441SEvalZero   /** IPv6 */
58*10465441SEvalZero   IPADDR_TYPE_V6 =   6U,
59*10465441SEvalZero   /** IPv4+IPv6 ("dual-stack") */
60*10465441SEvalZero   IPADDR_TYPE_ANY = 46U
61*10465441SEvalZero };
62*10465441SEvalZero 
63*10465441SEvalZero #if LWIP_IPV4 && LWIP_IPV6
64*10465441SEvalZero /**
65*10465441SEvalZero  * @ingroup ipaddr
66*10465441SEvalZero  * A union struct for both IP version's addresses.
67*10465441SEvalZero  * ATTENTION: watch out for its size when adding IPv6 address scope!
68*10465441SEvalZero  */
69*10465441SEvalZero typedef struct ip_addr {
70*10465441SEvalZero   union {
71*10465441SEvalZero     ip6_addr_t ip6;
72*10465441SEvalZero     ip4_addr_t ip4;
73*10465441SEvalZero   } u_addr;
74*10465441SEvalZero   /** @ref lwip_ip_addr_type */
75*10465441SEvalZero   u8_t type;
76*10465441SEvalZero } ip_addr_t;
77*10465441SEvalZero 
78*10465441SEvalZero extern const ip_addr_t ip_addr_any_type;
79*10465441SEvalZero 
80*10465441SEvalZero /** @ingroup ip4addr */
81*10465441SEvalZero #define IPADDR4_INIT(u32val)          { { { { u32val, 0ul, 0ul, 0ul } } }, IPADDR_TYPE_V4 }
82*10465441SEvalZero /** @ingroup ip4addr */
83*10465441SEvalZero #define IPADDR4_INIT_BYTES(a,b,c,d)   IPADDR4_INIT(PP_HTONL(LWIP_MAKEU32(a,b,c,d)))
84*10465441SEvalZero /** @ingroup ip6addr */
85*10465441SEvalZero #define IPADDR6_INIT(a, b, c, d)      { { { { a, b, c, d } } }, IPADDR_TYPE_V6 }
86*10465441SEvalZero /** @ingroup ip6addr */
87*10465441SEvalZero #define IPADDR6_INIT_HOST(a, b, c, d) { { { { PP_HTONL(a), PP_HTONL(b), PP_HTONL(c), PP_HTONL(d) } } }, IPADDR_TYPE_V6 }
88*10465441SEvalZero 
89*10465441SEvalZero /** @ingroup ipaddr */
90*10465441SEvalZero #define IP_IS_ANY_TYPE_VAL(ipaddr)    (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_ANY)
91*10465441SEvalZero /** @ingroup ipaddr */
92*10465441SEvalZero #define IPADDR_ANY_TYPE_INIT          { { { { 0ul, 0ul, 0ul, 0ul } } }, IPADDR_TYPE_ANY }
93*10465441SEvalZero 
94*10465441SEvalZero /** @ingroup ip4addr */
95*10465441SEvalZero #define IP_IS_V4_VAL(ipaddr)          (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_V4)
96*10465441SEvalZero /** @ingroup ip6addr */
97*10465441SEvalZero #define IP_IS_V6_VAL(ipaddr)          (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_V6)
98*10465441SEvalZero /** @ingroup ip4addr */
99*10465441SEvalZero #define IP_IS_V4(ipaddr)              (((ipaddr) == NULL) || IP_IS_V4_VAL(*(ipaddr)))
100*10465441SEvalZero /** @ingroup ip6addr */
101*10465441SEvalZero #define IP_IS_V6(ipaddr)              (((ipaddr) != NULL) && IP_IS_V6_VAL(*(ipaddr)))
102*10465441SEvalZero 
103*10465441SEvalZero #define IP_SET_TYPE_VAL(ipaddr, iptype) do { (ipaddr).type = (iptype); }while(0)
104*10465441SEvalZero #define IP_SET_TYPE(ipaddr, iptype)     do { if((ipaddr) != NULL) { IP_SET_TYPE_VAL(*(ipaddr), iptype); }}while(0)
105*10465441SEvalZero #define IP_GET_TYPE(ipaddr)           ((ipaddr)->type)
106*10465441SEvalZero 
107*10465441SEvalZero #define IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr) (IP_GET_TYPE(&pcb->local_ip) == IP_GET_TYPE(ipaddr))
108*10465441SEvalZero #define IP_ADDR_PCB_VERSION_MATCH(pcb, ipaddr) (IP_IS_ANY_TYPE_VAL(pcb->local_ip) || IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr))
109*10465441SEvalZero 
110*10465441SEvalZero /** @ingroup ip6addr
111*10465441SEvalZero  * Convert generic ip address to specific protocol version
112*10465441SEvalZero  */
113*10465441SEvalZero #define ip_2_ip6(ipaddr)   (&((ipaddr)->u_addr.ip6))
114*10465441SEvalZero /** @ingroup ip4addr
115*10465441SEvalZero  * Convert generic ip address to specific protocol version
116*10465441SEvalZero  */
117*10465441SEvalZero #define ip_2_ip4(ipaddr)   (&((ipaddr)->u_addr.ip4))
118*10465441SEvalZero 
119*10465441SEvalZero /** @ingroup ip4addr */
120*10465441SEvalZero #define IP_ADDR4(ipaddr,a,b,c,d)      do { IP4_ADDR(ip_2_ip4(ipaddr),a,b,c,d); \
121*10465441SEvalZero                                            IP_SET_TYPE_VAL(*(ipaddr), IPADDR_TYPE_V4); } while(0)
122*10465441SEvalZero /** @ingroup ip6addr */
123*10465441SEvalZero #define IP_ADDR6(ipaddr,i0,i1,i2,i3)  do { IP6_ADDR(ip_2_ip6(ipaddr),i0,i1,i2,i3); \
124*10465441SEvalZero                                            IP_SET_TYPE_VAL(*(ipaddr), IPADDR_TYPE_V6); } while(0)
125*10465441SEvalZero /** @ingroup ip6addr */
126*10465441SEvalZero #define IP_ADDR6_HOST(ipaddr,i0,i1,i2,i3)  IP_ADDR6(ipaddr,PP_HTONL(i0),PP_HTONL(i1),PP_HTONL(i2),PP_HTONL(i3))
127*10465441SEvalZero 
128*10465441SEvalZero /** @ingroup ipaddr */
129*10465441SEvalZero #define ip_addr_copy(dest, src)      do{ IP_SET_TYPE_VAL(dest, IP_GET_TYPE(&src)); if(IP_IS_V6_VAL(src)){ \
130*10465441SEvalZero   ip6_addr_copy(*ip_2_ip6(&(dest)), *ip_2_ip6(&(src))); }else{ \
131*10465441SEvalZero   ip4_addr_copy(*ip_2_ip4(&(dest)), *ip_2_ip4(&(src))); }}while(0)
132*10465441SEvalZero /** @ingroup ip6addr */
133*10465441SEvalZero #define ip_addr_copy_from_ip6(dest, src)      do{ \
134*10465441SEvalZero   ip6_addr_copy(*ip_2_ip6(&(dest)), src); IP_SET_TYPE_VAL(dest, IPADDR_TYPE_V6); }while(0)
135*10465441SEvalZero /** @ingroup ip4addr */
136*10465441SEvalZero #define ip_addr_copy_from_ip4(dest, src)      do{ \
137*10465441SEvalZero   ip4_addr_copy(*ip_2_ip4(&(dest)), src); IP_SET_TYPE_VAL(dest, IPADDR_TYPE_V4); }while(0)
138*10465441SEvalZero /** @ingroup ip4addr */
139*10465441SEvalZero #define ip_addr_set_ip4_u32(ipaddr, val)  do{if(ipaddr){ip4_addr_set_u32(ip_2_ip4(ipaddr), val); \
140*10465441SEvalZero   IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); }}while(0)
141*10465441SEvalZero /** @ingroup ip4addr */
142*10465441SEvalZero #define ip_addr_get_ip4_u32(ipaddr)  (((ipaddr) && IP_IS_V4(ipaddr)) ? \
143*10465441SEvalZero   ip4_addr_get_u32(ip_2_ip4(ipaddr)) : 0)
144*10465441SEvalZero /** @ingroup ipaddr */
145*10465441SEvalZero #define ip_addr_set(dest, src) do{ IP_SET_TYPE(dest, IP_GET_TYPE(src)); if(IP_IS_V6(src)){ \
146*10465441SEvalZero   ip6_addr_set(ip_2_ip6(dest), ip_2_ip6(src)); }else{ \
147*10465441SEvalZero   ip4_addr_set(ip_2_ip4(dest), ip_2_ip4(src)); }}while(0)
148*10465441SEvalZero /** @ingroup ipaddr */
149*10465441SEvalZero #define ip_addr_set_ipaddr(dest, src) ip_addr_set(dest, src)
150*10465441SEvalZero /** @ingroup ipaddr */
151*10465441SEvalZero #define ip_addr_set_zero(ipaddr)     do{ \
152*10465441SEvalZero   ip6_addr_set_zero(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, 0); }while(0)
153*10465441SEvalZero /** @ingroup ip5addr */
154*10465441SEvalZero #define ip_addr_set_zero_ip4(ipaddr)     do{ \
155*10465441SEvalZero   ip6_addr_set_zero(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); }while(0)
156*10465441SEvalZero /** @ingroup ip6addr */
157*10465441SEvalZero #define ip_addr_set_zero_ip6(ipaddr)     do{ \
158*10465441SEvalZero   ip6_addr_set_zero(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); }while(0)
159*10465441SEvalZero /** @ingroup ipaddr */
160*10465441SEvalZero #define ip_addr_set_any(is_ipv6, ipaddr)      do{if(is_ipv6){ \
161*10465441SEvalZero   ip6_addr_set_any(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); }else{ \
162*10465441SEvalZero   ip4_addr_set_any(ip_2_ip4(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); }}while(0)
163*10465441SEvalZero /** @ingroup ipaddr */
164*10465441SEvalZero #define ip_addr_set_loopback(is_ipv6, ipaddr) do{if(is_ipv6){ \
165*10465441SEvalZero   ip6_addr_set_loopback(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); }else{ \
166*10465441SEvalZero   ip4_addr_set_loopback(ip_2_ip4(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); }}while(0)
167*10465441SEvalZero /** @ingroup ipaddr */
168*10465441SEvalZero #define ip_addr_set_hton(dest, src)  do{if(IP_IS_V6(src)){ \
169*10465441SEvalZero   ip6_addr_set_hton(ip_2_ip6(ipaddr), (src)); IP_SET_TYPE(dest, IPADDR_TYPE_V6); }else{ \
170*10465441SEvalZero   ip4_addr_set_hton(ip_2_ip4(ipaddr), (src)); IP_SET_TYPE(dest, IPADDR_TYPE_V4); }}while(0)
171*10465441SEvalZero /** @ingroup ipaddr */
172*10465441SEvalZero #define ip_addr_get_network(target, host, netmask) do{if(IP_IS_V6(host)){ \
173*10465441SEvalZero   ip4_addr_set_zero(ip_2_ip4(target)); IP_SET_TYPE(target, IPADDR_TYPE_V6); } else { \
174*10465441SEvalZero   ip4_addr_get_network(ip_2_ip4(target), ip_2_ip4(host), ip_2_ip4(netmask)); IP_SET_TYPE(target, IPADDR_TYPE_V4); }}while(0)
175*10465441SEvalZero /** @ingroup ipaddr */
176*10465441SEvalZero #define ip_addr_netcmp(addr1, addr2, mask) ((IP_IS_V6(addr1) && IP_IS_V6(addr2)) ? \
177*10465441SEvalZero   0 : \
178*10465441SEvalZero   ip4_addr_netcmp(ip_2_ip4(addr1), ip_2_ip4(addr2), mask))
179*10465441SEvalZero /** @ingroup ipaddr */
180*10465441SEvalZero #define ip_addr_cmp(addr1, addr2)    ((IP_GET_TYPE(addr1) != IP_GET_TYPE(addr2)) ? 0 : (IP_IS_V6_VAL(*(addr1)) ? \
181*10465441SEvalZero   ip6_addr_cmp(ip_2_ip6(addr1), ip_2_ip6(addr2)) : \
182*10465441SEvalZero   ip4_addr_cmp(ip_2_ip4(addr1), ip_2_ip4(addr2))))
183*10465441SEvalZero /** @ingroup ipaddr */
184*10465441SEvalZero #define ip_addr_isany(ipaddr)        ((IP_IS_V6(ipaddr)) ? \
185*10465441SEvalZero   ip6_addr_isany(ip_2_ip6(ipaddr)) : \
186*10465441SEvalZero   ip4_addr_isany(ip_2_ip4(ipaddr)))
187*10465441SEvalZero /** @ingroup ipaddr */
188*10465441SEvalZero #define ip_addr_isany_val(ipaddr)        ((IP_IS_V6_VAL(ipaddr)) ? \
189*10465441SEvalZero   ip6_addr_isany_val(*ip_2_ip6(&(ipaddr))) : \
190*10465441SEvalZero   ip4_addr_isany_val(*ip_2_ip4(&(ipaddr))))
191*10465441SEvalZero /** @ingroup ipaddr */
192*10465441SEvalZero #define ip_addr_isbroadcast(ipaddr, netif) ((IP_IS_V6(ipaddr)) ? \
193*10465441SEvalZero   0 : \
194*10465441SEvalZero   ip4_addr_isbroadcast(ip_2_ip4(ipaddr), netif))
195*10465441SEvalZero /** @ingroup ipaddr */
196*10465441SEvalZero #define ip_addr_ismulticast(ipaddr)  ((IP_IS_V6(ipaddr)) ? \
197*10465441SEvalZero   ip6_addr_ismulticast(ip_2_ip6(ipaddr)) : \
198*10465441SEvalZero   ip4_addr_ismulticast(ip_2_ip4(ipaddr)))
199*10465441SEvalZero /** @ingroup ipaddr */
200*10465441SEvalZero #define ip_addr_isloopback(ipaddr)  ((IP_IS_V6(ipaddr)) ? \
201*10465441SEvalZero   ip6_addr_isloopback(ip_2_ip6(ipaddr)) : \
202*10465441SEvalZero   ip4_addr_isloopback(ip_2_ip4(ipaddr)))
203*10465441SEvalZero /** @ingroup ipaddr */
204*10465441SEvalZero #define ip_addr_islinklocal(ipaddr)  ((IP_IS_V6(ipaddr)) ? \
205*10465441SEvalZero   ip6_addr_islinklocal(ip_2_ip6(ipaddr)) : \
206*10465441SEvalZero   ip4_addr_islinklocal(ip_2_ip4(ipaddr)))
207*10465441SEvalZero #define ip_addr_debug_print(debug, ipaddr) do { if(IP_IS_V6(ipaddr)) { \
208*10465441SEvalZero   ip6_addr_debug_print(debug, ip_2_ip6(ipaddr)); } else { \
209*10465441SEvalZero   ip4_addr_debug_print(debug, ip_2_ip4(ipaddr)); }}while(0)
210*10465441SEvalZero #define ip_addr_debug_print_val(debug, ipaddr) do { if(IP_IS_V6_VAL(ipaddr)) { \
211*10465441SEvalZero   ip6_addr_debug_print_val(debug, *ip_2_ip6(&(ipaddr))); } else { \
212*10465441SEvalZero   ip4_addr_debug_print_val(debug, *ip_2_ip4(&(ipaddr))); }}while(0)
213*10465441SEvalZero /** @ingroup ipaddr */
214*10465441SEvalZero #define ipaddr_ntoa(addr)   (((addr) == NULL) ? "NULL" : \
215*10465441SEvalZero   ((IP_IS_V6(addr)) ? ip6addr_ntoa(ip_2_ip6(addr)) : ip4addr_ntoa(ip_2_ip4(addr))))
216*10465441SEvalZero /** @ingroup ipaddr */
217*10465441SEvalZero #define ipaddr_ntoa_r(addr, buf, buflen)   (((addr) == NULL) ? "NULL" : \
218*10465441SEvalZero   ((IP_IS_V6(addr)) ? ip6addr_ntoa_r(ip_2_ip6(addr), buf, buflen) : ip4addr_ntoa_r(ip_2_ip4(addr), buf, buflen)))
219*10465441SEvalZero int ipaddr_aton(const char *cp, ip_addr_t *addr);
220*10465441SEvalZero 
221*10465441SEvalZero /** @ingroup ipaddr */
222*10465441SEvalZero #define IPADDR_STRLEN_MAX   IP6ADDR_STRLEN_MAX
223*10465441SEvalZero 
224*10465441SEvalZero /** @ingroup ipaddr */
225*10465441SEvalZero #define ip4_2_ipv4_mapped_ipv6(ip6addr, ip4addr) do { \
226*10465441SEvalZero   (ip6addr)->addr[3] = (ip4addr)->addr; \
227*10465441SEvalZero   (ip6addr)->addr[2] = PP_HTONL(0x0000FFFFUL); \
228*10465441SEvalZero   (ip6addr)->addr[1] = 0; \
229*10465441SEvalZero   (ip6addr)->addr[0] = 0; } while(0);
230*10465441SEvalZero 
231*10465441SEvalZero /** @ingroup ipaddr */
232*10465441SEvalZero #define unmap_ipv4_mapped_ipv6(ip4addr, ip6addr) \
233*10465441SEvalZero   (ip4addr)->addr = (ip6addr)->addr[3];
234*10465441SEvalZero 
235*10465441SEvalZero #define IP46_ADDR_ANY(type) (((type) == IPADDR_TYPE_V6)? IP6_ADDR_ANY : IP4_ADDR_ANY)
236*10465441SEvalZero 
237*10465441SEvalZero #else /* LWIP_IPV4 && LWIP_IPV6 */
238*10465441SEvalZero 
239*10465441SEvalZero #define IP_ADDR_PCB_VERSION_MATCH(addr, pcb)         1
240*10465441SEvalZero #define IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr) 1
241*10465441SEvalZero 
242*10465441SEvalZero #if LWIP_IPV4
243*10465441SEvalZero 
244*10465441SEvalZero typedef ip4_addr_t ip_addr_t;
245*10465441SEvalZero #define IPADDR4_INIT(u32val)                    { u32val }
246*10465441SEvalZero #define IPADDR4_INIT_BYTES(a,b,c,d)             IPADDR4_INIT(PP_HTONL(LWIP_MAKEU32(a,b,c,d)))
247*10465441SEvalZero #define IP_IS_V4_VAL(ipaddr)                    1
248*10465441SEvalZero #define IP_IS_V6_VAL(ipaddr)                    0
249*10465441SEvalZero #define IP_IS_V4(ipaddr)                        1
250*10465441SEvalZero #define IP_IS_V6(ipaddr)                        0
251*10465441SEvalZero #define IP_IS_ANY_TYPE_VAL(ipaddr)              0
252*10465441SEvalZero #define IP_SET_TYPE_VAL(ipaddr, iptype)
253*10465441SEvalZero #define IP_SET_TYPE(ipaddr, iptype)
254*10465441SEvalZero #define IP_GET_TYPE(ipaddr)                     IPADDR_TYPE_V4
255*10465441SEvalZero #define ip_2_ip4(ipaddr)                        (ipaddr)
256*10465441SEvalZero #define IP_ADDR4(ipaddr,a,b,c,d)                IP4_ADDR(ipaddr,a,b,c,d)
257*10465441SEvalZero 
258*10465441SEvalZero #define ip_addr_copy(dest, src)                 ip4_addr_copy(dest, src)
259*10465441SEvalZero #define ip_addr_copy_from_ip4(dest, src)        ip4_addr_copy(dest, src)
260*10465441SEvalZero #define ip_addr_set_ip4_u32(ipaddr, val)        ip4_addr_set_u32(ip_2_ip4(ipaddr), val)
261*10465441SEvalZero #define ip_addr_get_ip4_u32(ipaddr)             ip4_addr_get_u32(ip_2_ip4(ipaddr))
262*10465441SEvalZero #define ip_addr_set(dest, src)                  ip4_addr_set(dest, src)
263*10465441SEvalZero #define ip_addr_set_ipaddr(dest, src)           ip4_addr_set(dest, src)
264*10465441SEvalZero #define ip_addr_set_zero(ipaddr)                ip4_addr_set_zero(ipaddr)
265*10465441SEvalZero #define ip_addr_set_zero_ip4(ipaddr)            ip4_addr_set_zero(ipaddr)
266*10465441SEvalZero #define ip_addr_set_any(is_ipv6, ipaddr)        ip4_addr_set_any(ipaddr)
267*10465441SEvalZero #define ip_addr_set_loopback(is_ipv6, ipaddr)   ip4_addr_set_loopback(ipaddr)
268*10465441SEvalZero #define ip_addr_set_hton(dest, src)             ip4_addr_set_hton(dest, src)
269*10465441SEvalZero #define ip_addr_get_network(target, host, mask) ip4_addr_get_network(target, host, mask)
270*10465441SEvalZero #define ip_addr_netcmp(addr1, addr2, mask)      ip4_addr_netcmp(addr1, addr2, mask)
271*10465441SEvalZero #define ip_addr_cmp(addr1, addr2)               ip4_addr_cmp(addr1, addr2)
272*10465441SEvalZero #define ip_addr_isany(ipaddr)                   ip4_addr_isany(ipaddr)
273*10465441SEvalZero #define ip_addr_isany_val(ipaddr)               ip4_addr_isany_val(ipaddr)
274*10465441SEvalZero #define ip_addr_isloopback(ipaddr)              ip4_addr_isloopback(ipaddr)
275*10465441SEvalZero #define ip_addr_islinklocal(ipaddr)             ip4_addr_islinklocal(ipaddr)
276*10465441SEvalZero #define ip_addr_isbroadcast(addr, netif)        ip4_addr_isbroadcast(addr, netif)
277*10465441SEvalZero #define ip_addr_ismulticast(ipaddr)             ip4_addr_ismulticast(ipaddr)
278*10465441SEvalZero #define ip_addr_debug_print(debug, ipaddr)      ip4_addr_debug_print(debug, ipaddr)
279*10465441SEvalZero #define ip_addr_debug_print_val(debug, ipaddr)  ip4_addr_debug_print_val(debug, ipaddr)
280*10465441SEvalZero #define ipaddr_ntoa(ipaddr)                     ip4addr_ntoa(ipaddr)
281*10465441SEvalZero #define ipaddr_ntoa_r(ipaddr, buf, buflen)      ip4addr_ntoa_r(ipaddr, buf, buflen)
282*10465441SEvalZero #define ipaddr_aton(cp, addr)                   ip4addr_aton(cp, addr)
283*10465441SEvalZero 
284*10465441SEvalZero #define IPADDR_STRLEN_MAX   IP4ADDR_STRLEN_MAX
285*10465441SEvalZero 
286*10465441SEvalZero #define IP46_ADDR_ANY(type) (IP4_ADDR_ANY)
287*10465441SEvalZero 
288*10465441SEvalZero #else /* LWIP_IPV4 */
289*10465441SEvalZero 
290*10465441SEvalZero typedef ip6_addr_t ip_addr_t;
291*10465441SEvalZero #define IPADDR6_INIT(a, b, c, d)                { { a, b, c, d } }
292*10465441SEvalZero #define IPADDR6_INIT_HOST(a, b, c, d)           { { PP_HTONL(a), PP_HTONL(b), PP_HTONL(c), PP_HTONL(d) } }
293*10465441SEvalZero #define IP_IS_V4_VAL(ipaddr)                    0
294*10465441SEvalZero #define IP_IS_V6_VAL(ipaddr)                    1
295*10465441SEvalZero #define IP_IS_V4(ipaddr)                        0
296*10465441SEvalZero #define IP_IS_V6(ipaddr)                        1
297*10465441SEvalZero #define IP_IS_ANY_TYPE_VAL(ipaddr)              0
298*10465441SEvalZero #define IP_SET_TYPE_VAL(ipaddr, iptype)
299*10465441SEvalZero #define IP_SET_TYPE(ipaddr, iptype)
300*10465441SEvalZero #define IP_GET_TYPE(ipaddr)                     IPADDR_TYPE_V6
301*10465441SEvalZero #define ip_2_ip6(ipaddr)                        (ipaddr)
302*10465441SEvalZero #define IP_ADDR6(ipaddr,i0,i1,i2,i3)            IP6_ADDR(ipaddr,i0,i1,i2,i3)
303*10465441SEvalZero #define IP_ADDR6_HOST(ipaddr,i0,i1,i2,i3)       IP_ADDR6(ipaddr,PP_HTONL(i0),PP_HTONL(i1),PP_HTONL(i2),PP_HTONL(i3))
304*10465441SEvalZero 
305*10465441SEvalZero #define ip_addr_copy(dest, src)                 ip6_addr_copy(dest, src)
306*10465441SEvalZero #define ip_addr_copy_from_ip6(dest, src)        ip6_addr_copy(dest, src)
307*10465441SEvalZero #define ip_addr_set(dest, src)                  ip6_addr_set(dest, src)
308*10465441SEvalZero #define ip_addr_set_ipaddr(dest, src)           ip6_addr_set(dest, src)
309*10465441SEvalZero #define ip_addr_set_zero(ipaddr)                ip6_addr_set_zero(ipaddr)
310*10465441SEvalZero #define ip_addr_set_zero_ip6(ipaddr)            ip6_addr_set_zero(ipaddr)
311*10465441SEvalZero #define ip_addr_set_any(is_ipv6, ipaddr)        ip6_addr_set_any(ipaddr)
312*10465441SEvalZero #define ip_addr_set_loopback(is_ipv6, ipaddr)   ip6_addr_set_loopback(ipaddr)
313*10465441SEvalZero #define ip_addr_set_hton(dest, src)             ip6_addr_set_hton(dest, src)
314*10465441SEvalZero #define ip_addr_get_network(target, host, mask) ip6_addr_set_zero(target)
315*10465441SEvalZero #define ip_addr_netcmp(addr1, addr2, mask)      0
316*10465441SEvalZero #define ip_addr_cmp(addr1, addr2)               ip6_addr_cmp(addr1, addr2)
317*10465441SEvalZero #define ip_addr_isany(ipaddr)                   ip6_addr_isany(ipaddr)
318*10465441SEvalZero #define ip_addr_isany_val(ipaddr)               ip6_addr_isany_val(ipaddr)
319*10465441SEvalZero #define ip_addr_isloopback(ipaddr)              ip6_addr_isloopback(ipaddr)
320*10465441SEvalZero #define ip_addr_islinklocal(ipaddr)             ip6_addr_islinklocal(ipaddr)
321*10465441SEvalZero #define ip_addr_isbroadcast(addr, netif)        0
322*10465441SEvalZero #define ip_addr_ismulticast(ipaddr)             ip6_addr_ismulticast(ipaddr)
323*10465441SEvalZero #define ip_addr_debug_print(debug, ipaddr)      ip6_addr_debug_print(debug, ipaddr)
324*10465441SEvalZero #define ip_addr_debug_print_val(debug, ipaddr)  ip6_addr_debug_print_val(debug, ipaddr)
325*10465441SEvalZero #define ipaddr_ntoa(ipaddr)                     ip6addr_ntoa(ipaddr)
326*10465441SEvalZero #define ipaddr_ntoa_r(ipaddr, buf, buflen)      ip6addr_ntoa_r(ipaddr, buf, buflen)
327*10465441SEvalZero #define ipaddr_aton(cp, addr)                   ip6addr_aton(cp, addr)
328*10465441SEvalZero 
329*10465441SEvalZero #define IPADDR_STRLEN_MAX   IP6ADDR_STRLEN_MAX
330*10465441SEvalZero 
331*10465441SEvalZero #define IP46_ADDR_ANY(type) (IP6_ADDR_ANY)
332*10465441SEvalZero 
333*10465441SEvalZero #endif /* LWIP_IPV4 */
334*10465441SEvalZero #endif /* LWIP_IPV4 && LWIP_IPV6 */
335*10465441SEvalZero 
336*10465441SEvalZero #if LWIP_IPV4
337*10465441SEvalZero 
338*10465441SEvalZero extern const ip_addr_t ip_addr_any;
339*10465441SEvalZero extern const ip_addr_t ip_addr_broadcast;
340*10465441SEvalZero 
341*10465441SEvalZero /**
342*10465441SEvalZero  * @ingroup ip4addr
343*10465441SEvalZero  * Can be used as a fixed/const ip_addr_t
344*10465441SEvalZero  * for the IP wildcard.
345*10465441SEvalZero  * Defined to @ref IP4_ADDR_ANY when IPv4 is enabled.
346*10465441SEvalZero  * Defined to @ref IP6_ADDR_ANY in IPv6 only systems.
347*10465441SEvalZero  * Use this if you can handle IPv4 _AND_ IPv6 addresses.
348*10465441SEvalZero  * Use @ref IP4_ADDR_ANY or @ref IP6_ADDR_ANY when the IP
349*10465441SEvalZero  * type matters.
350*10465441SEvalZero  */
351*10465441SEvalZero #define IP_ADDR_ANY         IP4_ADDR_ANY
352*10465441SEvalZero /**
353*10465441SEvalZero  * @ingroup ip4addr
354*10465441SEvalZero  * Can be used as a fixed/const ip_addr_t
355*10465441SEvalZero  * for the IPv4 wildcard and the broadcast address
356*10465441SEvalZero  */
357*10465441SEvalZero #define IP4_ADDR_ANY        (&ip_addr_any)
358*10465441SEvalZero /**
359*10465441SEvalZero  * @ingroup ip4addr
360*10465441SEvalZero  * Can be used as a fixed/const ip4_addr_t
361*10465441SEvalZero  * for the wildcard and the broadcast address
362*10465441SEvalZero  */
363*10465441SEvalZero #define IP4_ADDR_ANY4       (ip_2_ip4(&ip_addr_any))
364*10465441SEvalZero 
365*10465441SEvalZero /** @ingroup ip4addr */
366*10465441SEvalZero #define IP_ADDR_BROADCAST   (&ip_addr_broadcast)
367*10465441SEvalZero /** @ingroup ip4addr */
368*10465441SEvalZero #define IP4_ADDR_BROADCAST  (ip_2_ip4(&ip_addr_broadcast))
369*10465441SEvalZero 
370*10465441SEvalZero #endif /* LWIP_IPV4*/
371*10465441SEvalZero 
372*10465441SEvalZero #if LWIP_IPV6
373*10465441SEvalZero 
374*10465441SEvalZero extern const ip_addr_t ip6_addr_any;
375*10465441SEvalZero 
376*10465441SEvalZero /**
377*10465441SEvalZero  * @ingroup ip6addr
378*10465441SEvalZero  * IP6_ADDR_ANY can be used as a fixed ip_addr_t
379*10465441SEvalZero  * for the IPv6 wildcard address
380*10465441SEvalZero  */
381*10465441SEvalZero #define IP6_ADDR_ANY   (&ip6_addr_any)
382*10465441SEvalZero /**
383*10465441SEvalZero  * @ingroup ip6addr
384*10465441SEvalZero  * IP6_ADDR_ANY6 can be used as a fixed ip6_addr_t
385*10465441SEvalZero  * for the IPv6 wildcard address
386*10465441SEvalZero  */
387*10465441SEvalZero #define IP6_ADDR_ANY6  (ip_2_ip6(&ip6_addr_any))
388*10465441SEvalZero 
389*10465441SEvalZero #if !LWIP_IPV4
390*10465441SEvalZero /** IPv6-only configurations */
391*10465441SEvalZero #define IP_ADDR_ANY IP6_ADDR_ANY
392*10465441SEvalZero #endif /* !LWIP_IPV4 */
393*10465441SEvalZero 
394*10465441SEvalZero #endif
395*10465441SEvalZero 
396*10465441SEvalZero #if LWIP_IPV4 && LWIP_IPV6
397*10465441SEvalZero /** @ingroup ipaddr */
398*10465441SEvalZero #define IP_ANY_TYPE    (&ip_addr_any_type)
399*10465441SEvalZero #else
400*10465441SEvalZero #define IP_ANY_TYPE    IP_ADDR_ANY
401*10465441SEvalZero #endif
402*10465441SEvalZero 
403*10465441SEvalZero #ifdef __cplusplus
404*10465441SEvalZero }
405*10465441SEvalZero #endif
406*10465441SEvalZero 
407*10465441SEvalZero #endif /* LWIP_HDR_IP_ADDR_H */
408