From 2d8a01d1c60ab84c0f9185bd7c18e8aa9738221c Mon Sep 17 00:00:00 2001 From: Martin Willi Date: Tue, 16 Apr 2013 12:08:38 +0200 Subject: host: add a netmask constructor taking the number of network bits --- src/libstrongswan/networking/host.c | 49 +++++++++++++++++++++++++++++++++++++ src/libstrongswan/networking/host.h | 8 ++++++ 2 files changed, 57 insertions(+) (limited to 'src/libstrongswan') 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 @@ -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. */ 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 @@ -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. * -- cgit v1.2.3