32 #ifndef LWIP_HDR_IP_ADDR_H__ 33 #define LWIP_HDR_IP_ADDR_H__ 45 #if LWIP_IPV4 && LWIP_IPV6 49 typedef struct _ip_addr {
58 #define IPADDR_TYPE_V4 0U 59 #define IPADDR_TYPE_V6 6U 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 } 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) 69 #define IP_ADDR_PCB_VERSION_MATCH(pcb, ipaddr) (PCB_ISIPV6(pcb) == IP_IS_V6(ipaddr)) 72 #define ip_2_ip6(ipaddr) (&((ipaddr)->u_addr.ip6)) 73 #define ip_2_ip4(ipaddr) (&((ipaddr)->u_addr.ip4)) 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) 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)) ? \ 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)) ? \ 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))) 153 #define IP_ADDR_PCB_VERSION_MATCH(addr, pcb) 1 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) 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) 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) 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) 232 extern const ip_addr_t ip_addr_any;
233 extern const ip_addr_t ip_addr_broadcast;
238 #define IP_ADDR_ANY (&ip_addr_any) 239 #define IP_ADDR_BROADCAST (&ip_addr_broadcast) 243 #define IP4_ADDR_ANY (ip_2_ip4(&ip_addr_any)) 244 #define IP4_ADDR_BROADCAST (ip_2_ip4(&ip_addr_broadcast)) 250 extern const ip_addr_t ip6_addr_any;
255 #define IP6_ADDR_ANY (&ip6_addr_any) 259 #define IP6_ADDR_ANY6 (ip_2_ip6(&ip6_addr_any)) 263 #define IP_ADDR_ANY IP6_ADDR_ANY
#define ipaddr_aton(cp, addr)