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