diff options
Diffstat (limited to 'src/charon/sa/ike_sa.c')
-rw-r--r-- | src/charon/sa/ike_sa.c | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/src/charon/sa/ike_sa.c b/src/charon/sa/ike_sa.c index c5d3a63cd..55c3302ca 100644 --- a/src/charon/sa/ike_sa.c +++ b/src/charon/sa/ike_sa.c @@ -920,8 +920,6 @@ static status_t initiate(private_ike_sa_t *this, this->logger->log(this->logger, CONTROL, "initiating IKE_SA"); - - set_name(this, connection->get_name(connection)); DESTROY_IF(this->my_host); this->my_host = connection->get_my_host(connection); this->my_host = this->my_host->clone(this->my_host); @@ -1130,27 +1128,30 @@ static status_t route(private_ike_sa_t *this, connection_t *connection, policy_t iterator = this->child_sas->create_iterator(this->child_sas, TRUE); while (iterator->iterate(iterator, (void**)&child_sa)) { - linked_list_t *my_ts_conf, *other_ts_conf; - - my_ts = child_sa->get_my_traffic_selectors(child_sa); - other_ts = child_sa->get_other_traffic_selectors(child_sa); - - my_ts_conf = policy->get_my_traffic_selectors(policy, this->my_host); - other_ts_conf = policy->get_other_traffic_selectors(policy, this->other_host); - - if (ts_list_equals(my_ts, my_ts_conf) && - ts_list_equals(other_ts, other_ts_conf)) + if (child_sa->get_state(child_sa) == CHILD_ROUTED) { + linked_list_t *my_ts_conf, *other_ts_conf; + + my_ts = child_sa->get_my_traffic_selectors(child_sa); + other_ts = child_sa->get_other_traffic_selectors(child_sa); + + my_ts_conf = policy->get_my_traffic_selectors(policy, this->my_host); + other_ts_conf = policy->get_other_traffic_selectors(policy, this->other_host); + + if (ts_list_equals(my_ts, my_ts_conf) && + ts_list_equals(other_ts, other_ts_conf)) + { + ts_list_destroy(my_ts_conf); + ts_list_destroy(other_ts_conf); + iterator->destroy(iterator); + this->logger->log(this->logger, CONTROL, + "a CHILD_SA with such a policy already routed"); + + return FAILED; + } ts_list_destroy(my_ts_conf); ts_list_destroy(other_ts_conf); - iterator->destroy(iterator); - this->logger->log(this->logger, CONTROL, - "a CHILD_SA with such a policy already routed"); - - return FAILED; } - ts_list_destroy(my_ts_conf); - ts_list_destroy(other_ts_conf); } iterator->destroy(iterator); |