diff options
author | Martin Willi <martin@revosec.ch> | 2013-04-16 12:08:38 +0200 |
---|---|---|
committer | Martin Willi <martin@revosec.ch> | 2013-05-06 16:10:11 +0200 |
commit | 2d8a01d1c60ab84c0f9185bd7c18e8aa9738221c (patch) | |
tree | da89ef1f7d1513d2c11bf19ba5a8cc35a42c9ad8 /src/libstrongswan | |
parent | 4dc83e9facf050b0aba6f974f23057797c84325f (diff) | |
download | strongswan-2d8a01d1c60ab84c0f9185bd7c18e8aa9738221c.tar.bz2 strongswan-2d8a01d1c60ab84c0f9185bd7c18e8aa9738221c.tar.xz |
host: add a netmask constructor taking the number of network bits
Diffstat (limited to 'src/libstrongswan')
-rw-r--r-- | src/libstrongswan/networking/host.c | 49 | ||||
-rw-r--r-- | src/libstrongswan/networking/host.h | 8 |
2 files changed, 57 insertions, 0 deletions
diff --git a/src/libstrongswan/networking/host.c b/src/libstrongswan/networking/host.c index c94a1597b..d275a835e 100644 --- a/src/libstrongswan/networking/host.c +++ b/src/libstrongswan/networking/host.c @@ -559,6 +559,55 @@ host_t *host_create_from_subnet(char *string, int *bits) } /* + * 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. */ host_t *host_create_any(int family) diff --git a/src/libstrongswan/networking/host.h b/src/libstrongswan/networking/host.h index b36a131d1..ae25076ed 100644 --- a/src/libstrongswan/networking/host.h +++ b/src/libstrongswan/networking/host.h @@ -192,6 +192,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. * * @param family family of the any host |