139beb93cSSam Leffler /* 239beb93cSSam Leffler * IP address processing 339beb93cSSam Leffler * Copyright (c) 2003-2006, Jouni Malinen <j@w1.fi> 439beb93cSSam Leffler * 5f05cddf9SRui Paulo * This software may be distributed under the terms of the BSD license. 6f05cddf9SRui Paulo * See README for more details. 739beb93cSSam Leffler */ 839beb93cSSam Leffler 939beb93cSSam Leffler #include "includes.h" 1039beb93cSSam Leffler 1139beb93cSSam Leffler #include "common.h" 1239beb93cSSam Leffler #include "ip_addr.h" 1339beb93cSSam Leffler 1439beb93cSSam Leffler const char * hostapd_ip_txt(const struct hostapd_ip_addr *addr, char *buf, 1539beb93cSSam Leffler size_t buflen) 1639beb93cSSam Leffler { 1739beb93cSSam Leffler if (buflen == 0 || addr == NULL) 1839beb93cSSam Leffler return NULL; 1939beb93cSSam Leffler 2039beb93cSSam Leffler if (addr->af == AF_INET) { 2139beb93cSSam Leffler os_strlcpy(buf, inet_ntoa(addr->u.v4), buflen); 2239beb93cSSam Leffler } else { 2339beb93cSSam Leffler buf[0] = '\0'; 2439beb93cSSam Leffler } 2539beb93cSSam Leffler #ifdef CONFIG_IPV6 2639beb93cSSam Leffler if (addr->af == AF_INET6) { 2739beb93cSSam Leffler if (inet_ntop(AF_INET6, &addr->u.v6, buf, buflen) == NULL) 2839beb93cSSam Leffler buf[0] = '\0'; 2939beb93cSSam Leffler } 3039beb93cSSam Leffler #endif /* CONFIG_IPV6 */ 3139beb93cSSam Leffler 3239beb93cSSam Leffler return buf; 3339beb93cSSam Leffler } 3439beb93cSSam Leffler 3539beb93cSSam Leffler 3639beb93cSSam Leffler int hostapd_parse_ip_addr(const char *txt, struct hostapd_ip_addr *addr) 3739beb93cSSam Leffler { 3839beb93cSSam Leffler #ifndef CONFIG_NATIVE_WINDOWS 3939beb93cSSam Leffler if (inet_aton(txt, &addr->u.v4)) { 4039beb93cSSam Leffler addr->af = AF_INET; 4139beb93cSSam Leffler return 0; 4239beb93cSSam Leffler } 4339beb93cSSam Leffler 4439beb93cSSam Leffler #ifdef CONFIG_IPV6 4539beb93cSSam Leffler if (inet_pton(AF_INET6, txt, &addr->u.v6) > 0) { 4639beb93cSSam Leffler addr->af = AF_INET6; 4739beb93cSSam Leffler return 0; 4839beb93cSSam Leffler } 4939beb93cSSam Leffler #endif /* CONFIG_IPV6 */ 5039beb93cSSam Leffler #endif /* CONFIG_NATIVE_WINDOWS */ 5139beb93cSSam Leffler 5239beb93cSSam Leffler return -1; 5339beb93cSSam Leffler } 54*a90b9d01SCy Schubert 55*a90b9d01SCy Schubert 56*a90b9d01SCy Schubert bool hostapd_ip_equal(const struct hostapd_ip_addr *a, 57*a90b9d01SCy Schubert const struct hostapd_ip_addr *b) 58*a90b9d01SCy Schubert { 59*a90b9d01SCy Schubert if (a->af != b->af) 60*a90b9d01SCy Schubert return false; 61*a90b9d01SCy Schubert 62*a90b9d01SCy Schubert if (a->af == AF_INET && a->u.v4.s_addr == b->u.v4.s_addr) 63*a90b9d01SCy Schubert return true; 64*a90b9d01SCy Schubert 65*a90b9d01SCy Schubert #ifdef CONFIG_IPV6 66*a90b9d01SCy Schubert if (a->af == AF_INET6 && 67*a90b9d01SCy Schubert os_memcmp(&a->u.v6, &b->u.v6, sizeof(a->u.v6)) == 0) 68*a90b9d01SCy Schubert return true; 69*a90b9d01SCy Schubert #endif /* CONFIG_IPV6 */ 70*a90b9d01SCy Schubert 71*a90b9d01SCy Schubert return false; 72*a90b9d01SCy Schubert } 73