18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * IP address processing 38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2003-2006, Jouni Malinen <j@w1.fi> 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license. 6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details. 78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "includes.h" 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common.h" 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "ip_addr.h" 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtconst char * hostapd_ip_txt(const struct hostapd_ip_addr *addr, char *buf, 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t buflen) 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buflen == 0 || addr == NULL) 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (addr->af == AF_INET) { 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strlcpy(buf, inet_ntoa(addr->u.v4), buflen); 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf[0] = '\0'; 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IPV6 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (addr->af == AF_INET6) { 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (inet_ntop(AF_INET6, &addr->u.v6, buf, buflen) == NULL) 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf[0] = '\0'; 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IPV6 */ 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return buf; 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint hostapd_ip_diff(struct hostapd_ip_addr *a, struct hostapd_ip_addr *b) 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (a == NULL && b == NULL) 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (a == NULL || b == NULL) 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 1; 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (a->af) { 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case AF_INET: 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (a->u.v4.s_addr != b->u.v4.s_addr) 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 1; 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IPV6 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case AF_INET6: 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_memcmp(&a->u.v6, &b->u.v6, sizeof(a->u.v6)) != 0) 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 1; 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IPV6 */ 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint hostapd_parse_ip_addr(const char *txt, struct hostapd_ip_addr *addr) 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NATIVE_WINDOWS 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (inet_aton(txt, &addr->u.v4)) { 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt addr->af = AF_INET; 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IPV6 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (inet_pton(AF_INET6, txt, &addr->u.v6) > 0) { 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt addr->af = AF_INET6; 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IPV6 */ 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NATIVE_WINDOWS */ 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 78