aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2014-07-28 13:51:27 +0200
committerTobias Brunner <tobias@strongswan.org>2014-09-12 10:29:37 +0200
commitde6ab8e85a5f8e37a0e055b0eeb0a3e5042b1fb2 (patch)
treeec2dc1b658a43a8be0dbb4af5dfe311b0aef607e /src
parent8956dcecd4f123da03993fcb22ea874610ca82f7 (diff)
downloadstrongswan-de6ab8e85a5f8e37a0e055b0eeb0a3e5042b1fb2.tar.bz2
strongswan-de6ab8e85a5f8e37a0e055b0eeb0a3e5042b1fb2.tar.xz
ikev2: Defer MOBIKE updates if no path is available
Diffstat (limited to 'src')
-rw-r--r--src/libcharon/sa/ikev2/task_manager_v2.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/src/libcharon/sa/ikev2/task_manager_v2.c b/src/libcharon/sa/ikev2/task_manager_v2.c
index 8094e34ac..c73bf0168 100644
--- a/src/libcharon/sa/ikev2/task_manager_v2.c
+++ b/src/libcharon/sa/ikev2/task_manager_v2.c
@@ -241,16 +241,12 @@ METHOD(task_manager_t, retransmit, status_t,
if (task->get_type(task) == TASK_IKE_MOBIKE)
{
mobike = (ike_mobike_t*)task;
- if (!mobike->is_probing(mobike))
- {
- mobike = NULL;
- }
break;
}
}
enumerator->destroy(enumerator);
- if (mobike == NULL)
+ if (!mobike || !mobike->is_probing(mobike))
{
if (this->initiating.retransmitted <= this->retransmit_tries)
{
@@ -273,8 +269,19 @@ METHOD(task_manager_t, retransmit, status_t,
charon->bus->alert(charon->bus, ALERT_RETRANSMIT_SEND,
this->initiating.packet);
}
- packet = this->initiating.packet->clone(this->initiating.packet);
- charon->sender->send(charon->sender, packet);
+ if (!mobike)
+ {
+ packet = this->initiating.packet->clone(this->initiating.packet);
+ charon->sender->send(charon->sender, packet);
+ }
+ else if (!mobike->transmit(mobike, this->initiating.packet))
+ {
+ DBG1(DBG_IKE, "no route found to reach peer, MOBIKE update "
+ "deferred");
+ this->ike_sa->set_condition(this->ike_sa, COND_STALE, TRUE);
+ this->initiating.deferred = TRUE;
+ return SUCCESS;
+ }
}
else
{ /* for routeability checks, we use a more aggressive behavior */