if (up)
{
- iterator_t *iterator;
+ enumerator_t *enumerator;
peer_cfg_t *peer_cfg;
u_int32_t extension, condition;
host_t *addr;
m->add_attribute(m, HA_CONDITIONS, condition);
m->add_attribute(m, HA_EXTENSIONS, extension);
m->add_attribute(m, HA_CONFIG_NAME, peer_cfg->get_name(peer_cfg));
- iterator = ike_sa->create_additional_address_iterator(ike_sa);
- while (iterator->iterate(iterator, (void**)&addr))
+ enumerator = ike_sa->create_additional_address_enumerator(ike_sa);
+ while (enumerator->enumerate(enumerator, (void**)&addr))
{
m->add_attribute(m, HA_ADDITIONAL_ADDR, addr);
}
- iterator->destroy(iterator);
+ enumerator->destroy(enumerator);
}
else
{
this->additional_addresses->insert_last(this->additional_addresses, host);
}
-METHOD(ike_sa_t, create_additional_address_iterator, iterator_t*,
+METHOD(ike_sa_t, create_additional_address_enumerator, enumerator_t*,
private_ike_sa_t *this)
{
- return this->additional_addresses->create_iterator(
- this->additional_addresses, TRUE);
+ return this->additional_addresses->create_enumerator(
+ this->additional_addresses);
+}
+
+METHOD(ike_sa_t, remove_additional_addresses, void,
+ private_ike_sa_t *this)
+{
+ enumerator_t *enumerator = create_additional_address_enumerator(this);
+ host_t *host;
+ while (enumerator->enumerate(enumerator, (void**)&host))
+ {
+ this->additional_addresses->remove_at(this->additional_addresses,
+ enumerator);
+ host->destroy(host);
+ }
+ enumerator->destroy(enumerator);
}
METHOD(ike_sa_t, has_mapping_changed, bool,
.has_condition = _has_condition,
.set_pending_updates = _set_pending_updates,
.get_pending_updates = _get_pending_updates,
- .create_additional_address_iterator = _create_additional_address_iterator,
+ .create_additional_address_enumerator = _create_additional_address_enumerator,
.add_additional_address = _add_additional_address,
+ .remove_additional_addresses = _remove_additional_addresses,
.has_mapping_changed = _has_mapping_changed,
.retransmit = _retransmit,
.delete = _delete_,
void (*add_additional_address)(ike_sa_t *this, host_t *host);
/**
- * Create an iterator over all additional addresses of the peer.
+ * Create an enumerator over all additional addresses of the peer.
*
- * @return iterator over addresses
+ * @return enumerator over addresses
*/
- iterator_t* (*create_additional_address_iterator)(ike_sa_t *this);
+ enumerator_t* (*create_additional_address_enumerator)(ike_sa_t *this);
+
+ /**
+ * Remove all additional addresses of the peer.
+ */
+ void (*remove_additional_addresses)(ike_sa_t *this);
/**
* Check if mappings have changed on a NAT for our source address.
};
/**
- * flush the IKE_SAs list of additional addresses
- */
-static void flush_additional_addresses(private_ike_mobike_t *this)
-{
- iterator_t *iterator;
- host_t *host;
-
- iterator = this->ike_sa->create_additional_address_iterator(this->ike_sa);
- while (iterator->iterate(iterator, (void**)&host))
- {
- iterator->remove(iterator);
- host->destroy(host);
- }
- iterator->destroy(iterator);
-}
-
-
-/**
* read notifys from message and evaluate them
*/
static void process_payloads(private_ike_mobike_t *this, message_t *message)
{
if (first)
{ /* an ADDITIONAL_*_ADDRESS means replace, so flush once */
- flush_additional_addresses(this);
+ this->ike_sa->remove_additional_addresses(this->ike_sa);
first = FALSE;
}
data = notify->get_notification_data(notify);
}
case NO_ADDITIONAL_ADDRESSES:
{
- flush_additional_addresses(this);
+ this->ike_sa->remove_additional_addresses(this->ike_sa);
this->addresses_updated = TRUE;
break;
}
private_ike_mobike_t *this, packet_t *packet)
{
host_t *me, *other, *me_old, *other_old;
- iterator_t *iterator;
+ enumerator_t *enumerator;
ike_cfg_t *ike_cfg;
packet_t *copy;
charon->sender->send(charon->sender, copy);
}
- iterator = this->ike_sa->create_additional_address_iterator(this->ike_sa);
- while (iterator->iterate(iterator, (void**)&other))
+ enumerator = this->ike_sa->create_additional_address_enumerator(this->ike_sa);
+ while (enumerator->enumerate(enumerator, (void**)&other))
{
me = hydra->kernel_interface->get_source_addr(
hydra->kernel_interface, other, NULL);
charon->sender->send(charon->sender, copy);
}
}
- iterator->destroy(iterator);
+ enumerator->destroy(enumerator);
}
METHOD(task_t, build_i, status_t,