aboutsummaryrefslogtreecommitdiffstats
path: root/src/libcharon/sa/ikev1/task_manager_v1.c
diff options
context:
space:
mode:
authorMartin Willi <martin@revosec.ch>2013-09-04 10:35:26 +0200
committerMartin Willi <martin@revosec.ch>2013-09-04 10:35:26 +0200
commitf7cb6eaaa88d8f43e7d65fbca5f81d9c117aa959 (patch)
treee4065153815b9eebc0e7bf2b19a8b8372b046760 /src/libcharon/sa/ikev1/task_manager_v1.c
parent0b47bb5377193520d8d95fe66d6d3644abaf2307 (diff)
parenta858064455bc2fda9f54889395eccee8f91fd424 (diff)
downloadstrongswan-f7cb6eaaa88d8f43e7d65fbca5f81d9c117aa959.tar.bz2
strongswan-f7cb6eaaa88d8f43e7d65fbca5f81d9c117aa959.tar.xz
Merge branch 'ikev1-pushmode'
Implements Mode Config Push mode in IKEv1 using the existing modeconfig=push ipsec.conf option.
Diffstat (limited to 'src/libcharon/sa/ikev1/task_manager_v1.c')
-rw-r--r--src/libcharon/sa/ikev1/task_manager_v1.c34
1 files changed, 26 insertions, 8 deletions
diff --git a/src/libcharon/sa/ikev1/task_manager_v1.c b/src/libcharon/sa/ikev1/task_manager_v1.c
index dfceb5446..d97ef0ebe 100644
--- a/src/libcharon/sa/ikev1/task_manager_v1.c
+++ b/src/libcharon/sa/ikev1/task_manager_v1.c
@@ -539,23 +539,40 @@ static bool mode_config_expected(private_task_manager_t *this)
enumerator_t *enumerator;
peer_cfg_t *peer_cfg;
char *pool;
+ bool local;
host_t *host;
peer_cfg = this->ike_sa->get_peer_cfg(this->ike_sa);
if (peer_cfg)
{
- enumerator = peer_cfg->create_pool_enumerator(peer_cfg);
- if (!enumerator->enumerate(enumerator, &pool))
- { /* no pool configured */
+ if (peer_cfg->use_pull_mode(peer_cfg))
+ {
+ enumerator = peer_cfg->create_pool_enumerator(peer_cfg);
+ if (!enumerator->enumerate(enumerator, &pool))
+ { /* no pool configured */
+ enumerator->destroy(enumerator);
+ return FALSE;
+ }
enumerator->destroy(enumerator);
- return FALSE;
+
+ local = FALSE;
}
- enumerator->destroy(enumerator);
+ else
+ {
+ enumerator = peer_cfg->create_virtual_ip_enumerator(peer_cfg);
+ if (!enumerator->enumerate(enumerator, &host))
+ { /* not requesting a vip */
+ enumerator->destroy(enumerator);
+ return FALSE;
+ }
+ enumerator->destroy(enumerator);
+ local = TRUE;
+ }
enumerator = this->ike_sa->create_virtual_ip_enumerator(this->ike_sa,
- FALSE);
+ local);
if (!enumerator->enumerate(enumerator, &host))
- { /* have a pool, but no VIP assigned yet */
+ { /* expecting a VIP exchange, but no VIP assigned yet */
enumerator->destroy(enumerator);
return TRUE;
}
@@ -1087,7 +1104,8 @@ static status_t process_request(private_task_manager_t *this,
case TRANSACTION:
if (this->ike_sa->get_state(this->ike_sa) != IKE_CONNECTING)
{
- task = (task_t *)mode_config_create(this->ike_sa, FALSE);
+ task = (task_t *)mode_config_create(this->ike_sa,
+ FALSE, TRUE);
}
else
{