kernel-interface: support enumeration of virtual-only IPs

This commit is contained in:
Martin Willi
2013-05-06 16:10:13 +02:00
parent 5f7f8c92ca
commit 1a2a8bffed
3 changed files with 20 additions and 9 deletions
+6 -6
View File
@@ -35,17 +35,17 @@ typedef enum kernel_address_type_t kernel_address_type_t;
*/ */
enum kernel_address_type_t { enum kernel_address_type_t {
/** normal addresses (on regular, up, non-ignored) interfaces */ /** normal addresses (on regular, up, non-ignored) interfaces */
ADDR_TYPE_REGULAR = 0, ADDR_TYPE_REGULAR = (1 << 0),
/** addresses on down interfaces */ /** addresses on down interfaces */
ADDR_TYPE_DOWN = (1 << 0), ADDR_TYPE_DOWN = (1 << 1),
/** addresses on ignored interfaces */ /** addresses on ignored interfaces */
ADDR_TYPE_IGNORED = (1 << 1), ADDR_TYPE_IGNORED = (1 << 2),
/** addresses on loopback interfaces */ /** addresses on loopback interfaces */
ADDR_TYPE_LOOPBACK = (1 << 2), ADDR_TYPE_LOOPBACK = (1 << 3),
/** virtual IP addresses */ /** virtual IP addresses */
ADDR_TYPE_VIRTUAL = (1 << 3), ADDR_TYPE_VIRTUAL = (1 << 4),
/** to enumerate all available addresses */ /** to enumerate all available addresses */
ADDR_TYPE_ALL = (1 << 4) - 1, ADDR_TYPE_ALL = (1 << 5) - 1,
}; };
/** /**
@@ -1165,6 +1165,10 @@ static bool filter_addresses(address_enumerator_t *data,
{ /* skip virtual interfaces added by us */ { /* skip virtual interfaces added by us */
return FALSE; return FALSE;
} }
if (!(data->which & ADDR_TYPE_REGULAR) && !(*in)->refcount)
{ /* address is regular, but not requested */
return FALSE;
}
if ((*in)->scope >= RT_SCOPE_LINK) if ((*in)->scope >= RT_SCOPE_LINK)
{ /* skip addresses with a unusable scope */ { /* skip addresses with a unusable scope */
return FALSE; 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*, METHOD(kernel_net_t, create_address_enumerator, enumerator_t*,
private_kernel_netlink_net_t *this, kernel_address_type_t which) private_kernel_netlink_net_t *this, kernel_address_type_t which)
{ {
address_enumerator_t *data = malloc_thing(address_enumerator_t); address_enumerator_t *data;
data->this = this;
data->which = which; INIT(data,
.this = this,
.which = which,
);
this->lock->read_lock(this->lock); this->lock->read_lock(this->lock);
return enumerator_create_nested( return enumerator_create_nested(
@@ -704,6 +704,10 @@ static bool filter_addresses(address_enumerator_t *data,
{ /* skip virtual interfaces added by us */ { /* skip virtual interfaces added by us */
return FALSE; return FALSE;
} }
if (!(data->which & ADDR_TYPE_REGULAR) && !(*in)->virtual)
{ /* address is regular, but not requested */
return FALSE;
}
ip = (*in)->ip; ip = (*in)->ip;
if (ip->get_family(ip) == AF_INET6) if (ip->get_family(ip) == AF_INET6)
{ {