host: add a netmask constructor taking the number of network bits

This commit is contained in:
Martin Willi 2013-04-16 12:08:38 +02:00
parent 4dc83e9fac
commit 2d8a01d1c6
2 changed files with 57 additions and 0 deletions

View File

@ -558,6 +558,55 @@ host_t *host_create_from_subnet(char *string, int *bits)
return net;
}
/*
* See header.
*/
host_t *host_create_netmask(int family, int netbits)
{
private_host_t *this;
int bits, bytes, len = 0;
char *target;
switch (family)
{
case AF_INET:
if (netbits < 0 || netbits > 32)
{
return NULL;
}
this = host_create_empty();
this->socklen = sizeof(struct sockaddr_in);
target = (char*)&this->address4.sin_addr;
len = 4;
break;
case AF_INET6:
if (netbits < 0 || netbits > 128)
{
return NULL;
}
this = host_create_empty();
this->socklen = sizeof(struct sockaddr_in6);
target = (char*)&this->address6.sin6_addr;
len = 16;
break;
default:
return NULL;
}
memset(&this->address_max, 0, sizeof(struct sockaddr_storage));
this->address.sa_family = family;
update_sa_len(this);
bytes = (netbits + 7) / 8;
bits = (bytes * 8) - netbits;
memset(target, 0xff, bytes);
memset(target + bytes, 0x00, len - bytes);
target[bytes - 1] = bits ? (u_int8_t)(0xff << bits) : 0xff;
return &this->public;
}
/*
* Described in header.
*/

View File

@ -191,6 +191,14 @@ host_t *host_create_from_sockaddr(sockaddr_t *sockaddr);
*/
host_t *host_create_from_subnet(char *string, int *bits);
/**
* Create a netmask host having the first netbits bits set.
*
* @param netbits number of leading bits set in the host
* @return netmask host
*/
host_t *host_create_netmask(int family, int netbits);
/**
* Create a host without an address, a "any" host.
*