aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Willi <martin@revosec.ch>2013-04-19 14:52:29 +0200
committerMartin Willi <martin@revosec.ch>2013-05-06 16:10:13 +0200
commit1a2a8bffedd633dbfd8ed7fe6ff28218cd535497 (patch)
tree830a26733a4da01f1a0d4dc3039e47716fd6708e
parent5f7f8c92cab171a0bfe20dfcea076642bedd52b0 (diff)
downloadstrongswan-1a2a8bffedd633dbfd8ed7fe6ff28218cd535497.tar.bz2
strongswan-1a2a8bffedd633dbfd8ed7fe6ff28218cd535497.tar.xz
kernel-interface: support enumeration of virtual-only IPs
-rw-r--r--src/libhydra/kernel/kernel_net.h12
-rw-r--r--src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c13
-rw-r--r--src/libhydra/plugins/kernel_pfroute/kernel_pfroute_net.c4
3 files changed, 20 insertions, 9 deletions
diff --git a/src/libhydra/kernel/kernel_net.h b/src/libhydra/kernel/kernel_net.h
index 0d3417f1d..165036231 100644
--- a/src/libhydra/kernel/kernel_net.h
+++ b/src/libhydra/kernel/kernel_net.h
@@ -35,17 +35,17 @@ typedef enum kernel_address_type_t kernel_address_type_t;
*/
enum kernel_address_type_t {
/** normal addresses (on regular, up, non-ignored) interfaces */
- ADDR_TYPE_REGULAR = 0,
+ ADDR_TYPE_REGULAR = (1 << 0),
/** addresses on down interfaces */
- ADDR_TYPE_DOWN = (1 << 0),
+ ADDR_TYPE_DOWN = (1 << 1),
/** addresses on ignored interfaces */
- ADDR_TYPE_IGNORED = (1 << 1),
+ ADDR_TYPE_IGNORED = (1 << 2),
/** addresses on loopback interfaces */
- ADDR_TYPE_LOOPBACK = (1 << 2),
+ ADDR_TYPE_LOOPBACK = (1 << 3),
/** virtual IP addresses */
- ADDR_TYPE_VIRTUAL = (1 << 3),
+ ADDR_TYPE_VIRTUAL = (1 << 4),
/** to enumerate all available addresses */
- ADDR_TYPE_ALL = (1 << 4) - 1,
+ ADDR_TYPE_ALL = (1 << 5) - 1,
};
/**
diff --git a/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c b/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c
index 739a1f407..d4cb4e1ac 100644
--- a/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c
+++ b/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c
@@ -1165,6 +1165,10 @@ static bool filter_addresses(address_enumerator_t *data,
{ /* skip virtual interfaces added by us */
return FALSE;
}
+ if (!(data->which & ADDR_TYPE_REGULAR) && !(*in)->refcount)
+ { /* address is regular, but not requested */
+ return FALSE;
+ }
if ((*in)->scope >= RT_SCOPE_LINK)
{ /* skip addresses with a unusable scope */
return FALSE;
@@ -1209,9 +1213,12 @@ static bool filter_interfaces(address_enumerator_t *data, iface_entry_t** in,
METHOD(kernel_net_t, create_address_enumerator, enumerator_t*,
private_kernel_netlink_net_t *this, kernel_address_type_t which)
{
- address_enumerator_t *data = malloc_thing(address_enumerator_t);
- data->this = this;
- data->which = which;
+ address_enumerator_t *data;
+
+ INIT(data,
+ .this = this,
+ .which = which,
+ );
this->lock->read_lock(this->lock);
return enumerator_create_nested(
diff --git a/src/libhydra/plugins/kernel_pfroute/kernel_pfroute_net.c b/src/libhydra/plugins/kernel_pfroute/kernel_pfroute_net.c
index f8d3f2c44..2aeb840b2 100644
--- a/src/libhydra/plugins/kernel_pfroute/kernel_pfroute_net.c
+++ b/src/libhydra/plugins/kernel_pfroute/kernel_pfroute_net.c
@@ -704,6 +704,10 @@ static bool filter_addresses(address_enumerator_t *data,
{ /* skip virtual interfaces added by us */
return FALSE;
}
+ if (!(data->which & ADDR_TYPE_REGULAR) && !(*in)->virtual)
+ { /* address is regular, but not requested */
+ return FALSE;
+ }
ip = (*in)->ip;
if (ip->get_family(ip) == AF_INET6)
{