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