support of %any address string
This commit is contained in:
@@ -27,6 +27,9 @@
|
|||||||
|
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
|
#define IPV4_LEN 4
|
||||||
|
#define IPV6_LEN 16
|
||||||
|
|
||||||
typedef struct private_host_t private_host_t;
|
typedef struct private_host_t private_host_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -83,17 +86,17 @@ static bool is_anyaddr(private_host_t *this)
|
|||||||
{
|
{
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
{
|
{
|
||||||
u_int8_t default_route[4];
|
u_int8_t zeroes[IPV4_LEN];
|
||||||
memset(default_route, 0, sizeof(default_route));
|
|
||||||
return memeq(default_route, &(this->address4.sin_addr.s_addr),
|
memset(zeroes, 0, IPV4_LEN);
|
||||||
sizeof(default_route));
|
return memeq(zeroes, &(this->address4.sin_addr.s_addr), IPV4_LEN);
|
||||||
}
|
}
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
{
|
{
|
||||||
u_int8_t default_route[16];
|
u_int8_t zeroes[IPV6_LEN];
|
||||||
memset(default_route, 0, sizeof(default_route));
|
|
||||||
return memeq(default_route, &(this->address6.sin6_addr.s6_addr),
|
memset(zeroes, 0, IPV6_LEN);
|
||||||
sizeof(default_route));
|
return memeq(zeroes, &(this->address6.sin6_addr.s6_addr), IPV6_LEN);
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
@@ -196,13 +199,13 @@ static chunk_t get_address(private_host_t *this)
|
|||||||
case AF_INET:
|
case AF_INET:
|
||||||
{
|
{
|
||||||
address.ptr = (char*)&(this->address4.sin_addr.s_addr);
|
address.ptr = (char*)&(this->address4.sin_addr.s_addr);
|
||||||
address.len = 4;
|
address.len = IPV4_LEN;
|
||||||
return address;
|
return address;
|
||||||
}
|
}
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
{
|
{
|
||||||
address.ptr = (char*)&(this->address6.sin6_addr.s6_addr);
|
address.ptr = (char*)&(this->address6.sin6_addr.s6_addr);
|
||||||
address.len = 16;
|
address.len = IPV6_LEN;
|
||||||
return address;
|
return address;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@@ -285,33 +288,21 @@ static bool ip_equals(private_host_t *this, private_host_t *other)
|
|||||||
{
|
{
|
||||||
if (this->address.sa_family != other->address.sa_family)
|
if (this->address.sa_family != other->address.sa_family)
|
||||||
{
|
{
|
||||||
/* 0.0.0.0 and ::0 are equal */
|
/* 0.0.0.0 and 0::0 are equal */
|
||||||
if (is_anyaddr(this) && is_anyaddr(other))
|
return (is_anyaddr(this) && is_anyaddr(other));
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (this->address.sa_family)
|
switch (this->address.sa_family)
|
||||||
{
|
{
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
{
|
{
|
||||||
if (memeq(&this->address4.sin_addr, &other->address4.sin_addr,
|
return memeq(&this->address4.sin_addr, &other->address4.sin_addr,
|
||||||
sizeof(this->address4.sin_addr)))
|
sizeof(this->address4.sin_addr));
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
{
|
{
|
||||||
if (memeq(&this->address6.sin6_addr, &other->address6.sin6_addr,
|
return memeq(&this->address6.sin6_addr, &other->address6.sin6_addr,
|
||||||
sizeof(this->address6.sin6_addr)))
|
sizeof(this->address6.sin6_addr));
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -340,7 +331,7 @@ static host_diff_t get_differences(host_t *this, host_t *other)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Impelements host_t.equals
|
* Implements host_t.equals
|
||||||
*/
|
*/
|
||||||
static bool equals(private_host_t *this, private_host_t *other)
|
static bool equals(private_host_t *this, private_host_t *other)
|
||||||
{
|
{
|
||||||
@@ -353,19 +344,11 @@ static bool equals(private_host_t *this, private_host_t *other)
|
|||||||
{
|
{
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
{
|
{
|
||||||
if (this->address4.sin_port == other->address4.sin_port)
|
return (this->address4.sin_port == other->address4.sin_port);
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
{
|
{
|
||||||
if (this->address6.sin6_port == other->address6.sin6_port)
|
return (this->address6.sin6_port == other->address6.sin6_port);
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -411,7 +394,12 @@ host_t *host_create_from_string(char *string, u_int16_t port)
|
|||||||
{
|
{
|
||||||
private_host_t *this = host_create_empty();
|
private_host_t *this = host_create_empty();
|
||||||
|
|
||||||
if (strchr(string, '.'))
|
if (streq(string, "%any"))
|
||||||
|
{
|
||||||
|
string = "0.0.0.0";
|
||||||
|
this->address.sa_family = AF_INET;
|
||||||
|
}
|
||||||
|
else if (strchr(string, '.'))
|
||||||
{
|
{
|
||||||
this->address.sa_family = AF_INET;
|
this->address.sa_family = AF_INET;
|
||||||
}
|
}
|
||||||
@@ -460,9 +448,9 @@ host_t *host_create_from_dns(char *string, int af, u_int16_t port)
|
|||||||
struct hostent host, *ptr;
|
struct hostent host, *ptr;
|
||||||
char buf[512];
|
char buf[512];
|
||||||
int err, ret;
|
int err, ret;
|
||||||
|
|
||||||
if (af == AF_INET6 || strchr(string, ':'))
|
if (af == AF_INET6 || strchr(string, ':') || streq(string, "%any"))
|
||||||
{ /* gethostbyname does not like IPv6 addresses, fallback */
|
{/* gethostbyname does not like IPv6 addresses or wildcards - fallback */
|
||||||
return host_create_from_string(string, port);
|
return host_create_from_string(string, port);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -518,22 +506,22 @@ host_t *host_create_from_chunk(int family, chunk_t address, u_int16_t port)
|
|||||||
{
|
{
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
{
|
{
|
||||||
if (address.len != 4)
|
if (address.len != IPV4_LEN)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
memcpy(&(this->address4.sin_addr.s_addr), address.ptr,4);
|
memcpy(&(this->address4.sin_addr.s_addr), address.ptr, IPV4_LEN);
|
||||||
this->address4.sin_port = htons(port);
|
this->address4.sin_port = htons(port);
|
||||||
this->socklen = sizeof(struct sockaddr_in);
|
this->socklen = sizeof(struct sockaddr_in);
|
||||||
return &(this->public);
|
return &(this->public);
|
||||||
}
|
}
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
{
|
{
|
||||||
if (address.len != 16)
|
if (address.len != IPV6_LEN)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
memcpy(&(this->address6.sin6_addr.s6_addr), address.ptr, 16);
|
memcpy(&(this->address6.sin6_addr.s6_addr), address.ptr, IPV6_LEN);
|
||||||
this->address6.sin6_port = htons(port);
|
this->address6.sin6_port = htons(port);
|
||||||
this->socklen = sizeof(struct sockaddr_in6);
|
this->socklen = sizeof(struct sockaddr_in6);
|
||||||
return &this->public;
|
return &this->public;
|
||||||
|
|||||||
@@ -37,6 +37,9 @@
|
|||||||
#include "confread.h"
|
#include "confread.h"
|
||||||
#include "files.h"
|
#include "files.h"
|
||||||
|
|
||||||
|
#define IPV4_LEN 4
|
||||||
|
#define IPV6_LEN 16
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Authentication methods, must be the same as in charons authenticator.h
|
* Authentication methods, must be the same as in charons authenticator.h
|
||||||
*/
|
*/
|
||||||
@@ -126,7 +129,11 @@ static void ip_address2string(ip_address *addr, char *buffer, size_t len)
|
|||||||
case AF_INET:
|
case AF_INET:
|
||||||
{
|
{
|
||||||
struct sockaddr_in* sin = (struct sockaddr_in*)addr;
|
struct sockaddr_in* sin = (struct sockaddr_in*)addr;
|
||||||
if (inet_ntop(AF_INET, &sin->sin_addr, buffer, len))
|
u_int8_t zeroes[IPV4_LEN];
|
||||||
|
|
||||||
|
memset(zeroes, 0, IPV4_LEN);
|
||||||
|
if (memcmp(zeroes, &(sin->sin_addr.s_addr), IPV4_LEN) &&
|
||||||
|
inet_ntop(AF_INET, &sin->sin_addr, buffer, len))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -135,7 +142,11 @@ static void ip_address2string(ip_address *addr, char *buffer, size_t len)
|
|||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
{
|
{
|
||||||
struct sockaddr_in6* sin6 = (struct sockaddr_in6*)addr;
|
struct sockaddr_in6* sin6 = (struct sockaddr_in6*)addr;
|
||||||
if (inet_ntop(AF_INET6, &sin6->sin6_addr, buffer, len))
|
u_int8_t zeroes[IPV6_LEN];
|
||||||
|
|
||||||
|
memset(zeroes, 0, IPV6_LEN);
|
||||||
|
if (memcmp(zeroes, &(sin6->sin6_addr.s6_addr), IPV6_LEN) &&
|
||||||
|
inet_ntop(AF_INET6, &sin6->sin6_addr, buffer, len))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -144,8 +155,8 @@ static void ip_address2string(ip_address *addr, char *buffer, size_t len)
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* failed */
|
/* default */
|
||||||
snprintf(buffer, len, "0.0.0.0");
|
snprintf(buffer, len, "%%any");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user