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

This site uses cookies to store information on your computer. By continuing to use our site, you consent to our cookies. If you are not happy with the use of these cookies, please review our Cookie Policy to learn how they can be disabled. By disabling cookies, some features of the site will not work.