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_parse_ip_addr(const char *txt, struct hostapd_ip_addr *addr)
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NATIVE_WINDOWS
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (inet_aton(txt, &addr->u.v4)) {
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		addr->af = AF_INET;
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IPV6
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (inet_pton(AF_INET6, txt, &addr->u.v6) > 0) {
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		addr->af = AF_INET6;
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IPV6 */
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NATIVE_WINDOWS */
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
54