kernel-iph: Implement address enumeration
This commit is contained in:
@@ -382,10 +382,88 @@ METHOD(kernel_net_t, get_interface_name, bool,
|
||||
return entry != NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address enumerator
|
||||
*/
|
||||
typedef struct {
|
||||
/** implements enumerator_t */
|
||||
enumerator_t public;
|
||||
/** what kind of address should we enumerate? */
|
||||
kernel_address_type_t which;
|
||||
/** enumerator over interfaces */
|
||||
enumerator_t *ifaces;
|
||||
/** current enumerator over addresses, or NULL */
|
||||
enumerator_t *addrs;
|
||||
/** mutex to unlock on destruction */
|
||||
mutex_t *mutex;
|
||||
} addr_enumerator_t;
|
||||
|
||||
METHOD(enumerator_t, addr_enumerate, bool,
|
||||
addr_enumerator_t *this, host_t **host)
|
||||
{
|
||||
iface_t *entry;
|
||||
|
||||
while (TRUE)
|
||||
{
|
||||
while (!this->addrs)
|
||||
{
|
||||
if (!this->ifaces->enumerate(this->ifaces, &entry))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
if (entry->iftype == IF_TYPE_SOFTWARE_LOOPBACK &&
|
||||
!(this->which & ADDR_TYPE_LOOPBACK))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (entry->status != IfOperStatusUp &&
|
||||
!(this->which & ADDR_TYPE_DOWN))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
this->addrs = entry->addrs->create_enumerator(entry->addrs);
|
||||
}
|
||||
if (this->addrs->enumerate(this->addrs, host))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
this->addrs->destroy(this->addrs);
|
||||
this->addrs = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
METHOD(enumerator_t, addr_destroy, void,
|
||||
addr_enumerator_t *this)
|
||||
{
|
||||
DESTROY_IF(this->addrs);
|
||||
this->ifaces->destroy(this->ifaces);
|
||||
this->mutex->unlock(this->mutex);
|
||||
free(this);
|
||||
}
|
||||
|
||||
METHOD(kernel_net_t, create_address_enumerator, enumerator_t*,
|
||||
private_kernel_iph_net_t *this, kernel_address_type_t which)
|
||||
{
|
||||
return enumerator_create_empty();
|
||||
addr_enumerator_t *enumerator;
|
||||
|
||||
if (!(which & ADDR_TYPE_REGULAR))
|
||||
{
|
||||
/* we currently have no virtual, but regular IPs only */
|
||||
return enumerator_create_empty();
|
||||
}
|
||||
|
||||
this->mutex->lock(this->mutex);
|
||||
|
||||
INIT(enumerator,
|
||||
.public = {
|
||||
.enumerate = (void*)_addr_enumerate,
|
||||
.destroy = _addr_destroy,
|
||||
},
|
||||
.which = which,
|
||||
.ifaces = this->ifaces->create_enumerator(this->ifaces),
|
||||
.mutex = this->mutex,
|
||||
);
|
||||
return &enumerator->public;
|
||||
}
|
||||
|
||||
METHOD(kernel_net_t, get_source_addr, host_t*,
|
||||
|
||||
Reference in New Issue
Block a user