STM32F769IDiscovery  1.00
uDANTE Audio Networking with STM32F7 DISCO board
ip_addr.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without modification,
6  * are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice,
9  * this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright notice,
11  * this list of conditions and the following disclaimer in the documentation
12  * and/or other materials provided with the distribution.
13  * 3. The name of the author may not be used to endorse or promote products
14  * derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
19  * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
21  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
24  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
25  * OF SUCH DAMAGE.
26  *
27  * This file is part of the lwIP TCP/IP stack.
28  *
29  * Author: Adam Dunkels <adam@sics.se>
30  *
31  */
32 #ifndef LWIP_HDR_IP_ADDR_H__
33 #define LWIP_HDR_IP_ADDR_H__
34 
35 #include "lwip/opt.h"
36 #include "lwip/def.h"
37 
38 #include "lwip/ip4_addr.h"
39 #include "lwip/ip6_addr.h"
40 
41 #ifdef __cplusplus
42 extern "C" {
43 #endif
44 
45 #if LWIP_IPV4 && LWIP_IPV6
46 
49 typedef struct _ip_addr {
50  union {
51  ip6_addr_t ip6;
52  ip4_addr_t ip4;
53  } u_addr;
54  u8_t type;
55 } ip_addr_t;
56 
58 #define IPADDR_TYPE_V4 0U
59 #define IPADDR_TYPE_V6 6U
60 
61 #define IPADDR4_INIT(u32val) { { { { u32val, 0ul, 0ul, 0ul } } }, IPADDR_TYPE_V4 }
62 #define IPADDR6_INIT(a, b, c, d) { { { { a, b, c, d } } }, IPADDR_TYPE_V6 }
63 
64 #define IP_IS_V6_VAL(ipaddr) ((ipaddr).type == IPADDR_TYPE_V6)
65 #define IP_IS_V6(ipaddr) (((ipaddr) != NULL) && IP_IS_V6_VAL(*(ipaddr)))
66 #define IP_SET_TYPE_VAL(ipaddr, iptype) do { (ipaddr).type = (iptype); }while(0)
67 #define IP_SET_TYPE(ipaddr, iptype) do { if((ipaddr) != NULL) { IP_SET_TYPE_VAL(*(ipaddr), iptype); }}while(0)
68 
69 #define IP_ADDR_PCB_VERSION_MATCH(pcb, ipaddr) (PCB_ISIPV6(pcb) == IP_IS_V6(ipaddr))
70 
71 /* Convert generic ip address to specific protocol version */
72 #define ip_2_ip6(ipaddr) (&((ipaddr)->u_addr.ip6))
73 #define ip_2_ip4(ipaddr) (&((ipaddr)->u_addr.ip4))
74 
75 #define IP_ADDR4(ipaddr,a,b,c,d) do { IP4_ADDR(ip_2_ip4(ipaddr),a,b,c,d); \
76  IP_SET_TYPE_VAL(*(ipaddr), IPADDR_TYPE_V4); } while(0)
77 #define IP_ADDR6(ipaddr,i0,i1,i2,i3) do { IP6_ADDR(ip_2_ip6(ipaddr),i0,i1,i2,i3); \
78  IP_SET_TYPE_VAL(*(ipaddr), IPADDR_TYPE_V6); } while(0)
79 
80 #define ip_addr_copy(dest, src) do{if(IP_IS_V6_VAL(src)){ \
81  ip6_addr_copy(*ip_2_ip6(&(dest)), *ip_2_ip6(&(src))); IP_SET_TYPE_VAL(dest, IPADDR_TYPE_V6); }else{ \
82  ip4_addr_copy(*ip_2_ip4(&(dest)), *ip_2_ip4(&(src))); IP_SET_TYPE_VAL(dest, IPADDR_TYPE_V4); }}while(0)
83 #define ip_addr_copy_from_ip6(dest, src) do{ \
84  ip6_addr_copy(*ip_2_ip6(&(dest)), src); IP_SET_TYPE_VAL(dest, IPADDR_TYPE_V6); }while(0)
85 #define ip_addr_copy_from_ip4(dest, src) do{ \
86  ip4_addr_copy(*ip_2_ip4(&(dest)), src); IP_SET_TYPE_VAL(dest, IPADDR_TYPE_V4); }while(0)
87 #define ip_addr_set_ip4_u32(ipaddr, val) do{if(ipaddr){ip4_addr_set_u32(ip_2_ip4(ipaddr), val); \
88  IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); }}while(0)
89 #define ip_addr_get_ip4_u32(ipaddr) (((ipaddr) && !IP_IS_V6(ipaddr)) ? \
90  ip4_addr_get_u32(ip_2_ip4(ipaddr)) : 0)
91 #define ip_addr_set(dest, src) do{if(IP_IS_V6(src)){ \
92  ip6_addr_set(ip_2_ip6(dest), ip_2_ip6(src)); IP_SET_TYPE(dest, IPADDR_TYPE_V6); }else{ \
93  ip4_addr_set(ip_2_ip4(dest), ip_2_ip4(src)); IP_SET_TYPE(dest, IPADDR_TYPE_V4); }}while(0)
94 #define ip_addr_set_ipaddr(dest, src) do{if(IP_IS_V6(src)){ \
95  ip6_addr_set(ip_2_ip6(dest), ip_2_ip6(src)); IP_SET_TYPE(dest, IPADDR_TYPE_V6); }else{ \
96  ip4_addr_set(ip_2_ip4(dest), ip_2_ip4(src)); IP_SET_TYPE(dest, IPADDR_TYPE_V4); }}while(0)
97 #define ip_addr_set_zero(ipaddr) do{ \
98  ip6_addr_set_zero(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, 0); }while(0)
99 #define ip_addr_set_zero_ip4(ipaddr) do{ \
100  ip6_addr_set_zero(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); }while(0)
101 #define ip_addr_set_zero_ip6(ipaddr) do{ \
102  ip6_addr_set_zero(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); }while(0)
103 #define ip_addr_set_any(is_ipv6, ipaddr) do{if(is_ipv6){ \
104  ip6_addr_set_any(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); }else{ \
105  ip4_addr_set_any(ip_2_ip4(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); }}while(0)
106 #define ip_addr_set_loopback(is_ipv6, ipaddr) do{if(is_ipv6){ \
107  ip6_addr_set_loopback(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); }else{ \
108  ip4_addr_set_loopback(ip_2_ip4(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); }}while(0)
109 #define ip_addr_set_hton(dest, src) do{if(IP_IS_V6(src)){ \
110  ip6_addr_set_hton(ip_2_ip6(ipaddr), (src)); IP_SET_TYPE(dest, IPADDR_TYPE_V6); }else{ \
111  ip4_addr_set_hton(ip_2_ip4(ipaddr), (src)); IP_SET_TYPE(dest, IPADDR_TYPE_V4); }}while(0)
112 #define ip_addr_get_network(target, host, netmask) do{if(IP_IS_V6(host)){ \
113  ip4_addr_set_zero(ip_2_ip4(target)); IP_SET_TYPE(target, IPADDR_TYPE_V6); } else { \
114  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)
115 #define ip_addr_netcmp(addr1, addr2, mask) ((IP_IS_V6(addr1) && IP_IS_V6(addr2)) ? \
116  0 : \
117  ip4_addr_netcmp(ip_2_ip4(addr1), ip_2_ip4(addr2), mask))
118 #define ip_addr_cmp(addr1, addr2) ((IP_IS_V6_VAL(*(addr1)) != IP_IS_V6_VAL(*(addr2))) ? 0 : (IP_IS_V6_VAL(*(addr1)) ? \
119  ip6_addr_cmp(ip_2_ip6(addr1), ip_2_ip6(addr2)) : \
120  ip4_addr_cmp(ip_2_ip4(addr1), ip_2_ip4(addr2))))
121 #define ip_addr_isany(ipaddr) ((IP_IS_V6(ipaddr)) ? \
122  ip6_addr_isany(ip_2_ip6(ipaddr)) : \
123  ip4_addr_isany(ip_2_ip4(ipaddr)))
124 #define ip_addr_isany_val(ipaddr) ((IP_IS_V6_VAL(ipaddr)) ? \
125  ip6_addr_isany_val(*ip_2_ip6(&(ipaddr))) : \
126  ip4_addr_isany_val(*ip_2_ip4(&(ipaddr))))
127 #define ip_addr_isbroadcast(ipaddr, netif) ((IP_IS_V6(ipaddr)) ? \
128  0 : \
129  ip4_addr_isbroadcast(ip_2_ip4(ipaddr), netif))
130 #define ip_addr_ismulticast(ipaddr) ((IP_IS_V6(ipaddr)) ? \
131  ip6_addr_ismulticast(ip_2_ip6(ipaddr)) : \
132  ip4_addr_ismulticast(ip_2_ip4(ipaddr)))
133 #define ip_addr_isloopback(ipaddr) ((IP_IS_V6(ipaddr)) ? \
134  ip6_addr_isloopback(ip_2_ip6(ipaddr)) : \
135  ip4_addr_isloopback(ip_2_ip4(ipaddr)))
136 #define ip_addr_islinklocal(ipaddr) ((IP_IS_V6(ipaddr)) ? \
137  ip6_addr_islinklocal(ip_2_ip6(ipaddr)) : \
138  ip4_addr_islinklocal(ip_2_ip4(ipaddr)))
139 #define ip_addr_debug_print(debug, ipaddr) do { if(IP_IS_V6(ipaddr)) { \
140  ip6_addr_debug_print(debug, ip_2_ip6(ipaddr)); } else { \
141  ip4_addr_debug_print(debug, ip_2_ip4(ipaddr)); }}while(0)
142 #define ip_addr_debug_print_val(debug, ipaddr) do { if(IP_IS_V6_VAL(ipaddr)) { \
143  ip6_addr_debug_print_val(debug, *ip_2_ip6(&(ipaddr))); } else { \
144  ip4_addr_debug_print_val(debug, *ip_2_ip4(&(ipaddr))); }}while(0)
145 #define ipaddr_ntoa(addr) (((addr) == NULL) ? "NULL" : \
146  ((IP_IS_V6(addr)) ? ip6addr_ntoa(ip_2_ip6(addr)) : ip4addr_ntoa(ip_2_ip4(addr))))
147 #define ipaddr_ntoa_r(addr, buf, buflen) (((addr) == NULL) ? "NULL" : \
148  ((IP_IS_V6(addr)) ? ip6addr_ntoa_r(ip_2_ip6(addr), buf, buflen) : ip4addr_ntoa_r(ip_2_ip4(addr), buf, buflen)))
149 int ipaddr_aton(const char *cp, ip_addr_t *addr);
150 
151 #else /* LWIP_IPV4 && LWIP_IPV6 */
152 
153 #define IP_ADDR_PCB_VERSION_MATCH(addr, pcb) 1
154 
155 #if LWIP_IPV4
156 
157 typedef ip4_addr_t ip_addr_t;
158 #define IPADDR4_INIT(u32val) { u32val }
159 #define IP_IS_V6_VAL(ipaddr) 0
160 #define IP_IS_V6(ipaddr) 0
161 #define IP_SET_TYPE_VAL(ipaddr, iptype)
162 #define IP_SET_TYPE(ipaddr, iptype)
163 #define ip_2_ip4(ipaddr) (ipaddr)
164 #define IP_ADDR4(ipaddr,a,b,c,d) IP4_ADDR(ipaddr,a,b,c,d)
165 
166 #define ip_addr_copy(dest, src) ip4_addr_copy(dest, src)
167 #define ip_addr_copy_from_ip4(dest, src) ip4_addr_copy(dest, src)
168 #define ip_addr_set_ip4_u32(ipaddr, val) ip4_addr_set_u32(ip_2_ip4(ipaddr), val)
169 #define ip_addr_get_ip4_u32(ipaddr) ip4_addr_get_u32(ip_2_ip4(ipaddr))
170 #define ip_addr_set(dest, src) ip4_addr_set(dest, src)
171 #define ip_addr_set_ipaddr(dest, src) ip4_addr_set(dest, src)
172 #define ip_addr_set_zero(ipaddr) ip4_addr_set_zero(ipaddr)
173 #define ip_addr_set_zero_ip4(ipaddr) ip4_addr_set_zero(ipaddr)
174 #define ip_addr_set_any(is_ipv6, ipaddr) ip4_addr_set_any(ipaddr)
175 #define ip_addr_set_loopback(is_ipv6, ipaddr) ip4_addr_set_loopback(ipaddr)
176 #define ip_addr_set_hton(dest, src) ip4_addr_set_hton(dest, src)
177 #define ip_addr_get_network(target, host, mask) ip4_addr_get_network(target, host, mask)
178 #define ip_addr_netcmp(addr1, addr2, mask) ip4_addr_netcmp(addr1, addr2, mask)
179 #define ip_addr_cmp(addr1, addr2) ip4_addr_cmp(addr1, addr2)
180 #define ip_addr_isany(ipaddr) ip4_addr_isany(ipaddr)
181 #define ip_addr_isany_val(ipaddr) ip4_addr_isany_val(ipaddr)
182 #define ip_addr_isloopback(ipaddr) ip4_addr_isloopback(ipaddr)
183 #define ip_addr_islinklocal(ipaddr) ip4_addr_islinklocal(ipaddr)
184 #define ip_addr_isbroadcast(addr, netif) ip4_addr_isbroadcast(addr, netif)
185 #define ip_addr_ismulticast(ipaddr) ip4_addr_ismulticast(ipaddr)
186 #define ip_addr_debug_print(debug, ipaddr) ip4_addr_debug_print(debug, ipaddr)
187 #define ip_addr_debug_print_val(debug, ipaddr) ip4_addr_debug_print_val(debug, ipaddr)
188 #define ipaddr_ntoa(ipaddr) ip4addr_ntoa(ipaddr)
189 #define ipaddr_ntoa_r(ipaddr, buf, buflen) ip4addr_ntoa_r(ipaddr, buf, buflen)
190 #define ipaddr_aton(cp, addr) ip4addr_aton(cp, addr)
191 
192 #else /* LWIP_IPV4 */
193 
194 typedef ip6_addr_t ip_addr_t;
195 #define IPADDR6_INIT(a, b, c, d) { { a, b, c, d } }
196 #define IP_IS_V6_VAL(ipaddr) 1
197 #define IP_IS_V6(ipaddr) 1
198 #define IP_SET_TYPE_VAL(ipaddr, iptype)
199 #define IP_SET_TYPE(ipaddr, iptype)
200 #define ip_2_ip6(ipaddr) (ipaddr)
201 #define IP_ADDR6(ipaddr,i0,i1,i2,i3) IP6_ADDR(ipaddr,i0,i1,i2,i3)
202 
203 #define ip_addr_copy(dest, src) ip6_addr_copy(dest, src)
204 #define ip_addr_copy_from_ip6(dest, src) ip6_addr_copy(dest, src)
205 #define ip_addr_set(dest, src) ip6_addr_set(dest, src)
206 #define ip_addr_set_ipaddr(dest, src) ip6_addr_set(dest, src)
207 #define ip_addr_set_zero(ipaddr) ip6_addr_set_zero(ipaddr)
208 #define ip_addr_set_zero_ip6(ipaddr) ip6_addr_set_zero(ipaddr)
209 #define ip_addr_set_any(is_ipv6, ipaddr) ip6_addr_set_any(ipaddr)
210 #define ip_addr_set_loopback(is_ipv6, ipaddr) ip6_addr_set_loopback(ipaddr)
211 #define ip_addr_set_hton(dest, src) ip6_addr_set_hton(dest, src)
212 #define ip_addr_get_network(target, host, mask) ip6_addr_set_zero(target)
213 #define ip_addr_netcmp(addr1, addr2, mask) 0
214 #define ip_addr_cmp(addr1, addr2) ip6_addr_cmp(addr1, addr2)
215 #define ip_addr_isany(ipaddr) ip6_addr_isany(ipaddr)
216 #define ip_addr_isany_val(ipaddr) ip6_addr_isany_val(ipaddr)
217 #define ip_addr_isloopback(ipaddr) ip6_addr_isloopback(ipaddr)
218 #define ip_addr_islinklocal(ipaddr) ip6_addr_islinklocal(ipaddr)
219 #define ip_addr_isbroadcast(addr, netif) 0
220 #define ip_addr_ismulticast(ipaddr) ip6_addr_ismulticast(ipaddr)
221 #define ip_addr_debug_print(debug, ipaddr) ip6_addr_debug_print(debug, ipaddr)
222 #define ip_addr_debug_print_val(debug, ipaddr) ip6_addr_debug_print_val(debug, ipaddr)
223 #define ipaddr_ntoa(ipaddr) ip6addr_ntoa(ipaddr)
224 #define ipaddr_ntoa_r(ipaddr, buf, buflen) ip6addr_ntoa_r(ipaddr, buf, buflen)
225 #define ipaddr_aton(cp, addr) ip6addr_aton(cp, addr)
226 
227 #endif /* LWIP_IPV4 */
228 #endif /* LWIP_IPV4 && LWIP_IPV6 */
229 
230 #if LWIP_IPV4
231 
232 extern const ip_addr_t ip_addr_any;
233 extern const ip_addr_t ip_addr_broadcast;
234 
238 #define IP_ADDR_ANY (&ip_addr_any)
239 #define IP_ADDR_BROADCAST (&ip_addr_broadcast)
240 
243 #define IP4_ADDR_ANY (ip_2_ip4(&ip_addr_any))
244 #define IP4_ADDR_BROADCAST (ip_2_ip4(&ip_addr_broadcast))
245 
246 #endif /* LWIP_IPV4*/
247 
248 #if LWIP_IPV6
249 
250 extern const ip_addr_t ip6_addr_any;
251 
255 #define IP6_ADDR_ANY (&ip6_addr_any)
256 
259 #define IP6_ADDR_ANY6 (ip_2_ip6(&ip6_addr_any))
260 
261 #if !LWIP_IPV4
262 
263 #define IP_ADDR_ANY IP6_ADDR_ANY
264 #endif /* !LWIP_IPV4 */
265 
266 #endif
267 
268 #ifdef __cplusplus
269 }
270 #endif
271 
272 #endif /* LWIP_HDR_IP_ADDR_H__ */
273 
274 
#define ipaddr_aton(cp, addr)
Definition: ip_addr.h:225
unsigned char u8_t
Definition: cc.h:38
ip6_addr_t ip_addr_t
Definition: ip_addr.h:194