aboutsummaryrefslogtreecommitdiffstats
path: root/src/libstrongswan
diff options
context:
space:
mode:
authorMartin Willi <martin@revosec.ch>2013-04-16 12:08:38 +0200
committerMartin Willi <martin@revosec.ch>2013-05-06 16:10:11 +0200
commit2d8a01d1c60ab84c0f9185bd7c18e8aa9738221c (patch)
treeda89ef1f7d1513d2c11bf19ba5a8cc35a42c9ad8 /src/libstrongswan
parent4dc83e9facf050b0aba6f974f23057797c84325f (diff)
downloadstrongswan-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.c49
-rw-r--r--src/libstrongswan/networking/host.h8
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