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 | */
|
---|
54 | enum lwip_ip_addr_type {
|
---|
55 | /** IPv4 */
|
---|
56 | IPADDR_TYPE_V4 = 0U,
|
---|
57 | /** IPv6 */
|
---|
58 | IPADDR_TYPE_V6 = 6U,
|
---|
59 | /** IPv4+IPv6 ("dual-stack") */
|
---|
60 | IPADDR_TYPE_ANY = 46U
|
---|
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 */
|
---|