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
hostapd_ip_txt(const struct hostapd_ip_addr * addr,char * buf,size_t buflen)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
hostapd_parse_ip_addr(const char * txt,struct hostapd_ip_addr * addr)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
hostapd_ip_equal(const struct hostapd_ip_addr * a,const struct hostapd_ip_addr * b)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