xref: /freebsd/contrib/wpa/src/utils/ip_addr.c (revision a90b9d0159070121c221b966469c3e36d912bf82)
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