kernel-interface: support enumeration of virtual-only IPs
This commit is contained in:
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user