defer MOBIKE update if we have no route to the peer
This commit is contained in:
parent
133623871d
commit
7afd9d6672
|
@ -1747,6 +1747,7 @@ static status_t roam(private_ike_sa_t *this, bool address)
|
||||||
{
|
{
|
||||||
case IKE_CREATED:
|
case IKE_CREATED:
|
||||||
case IKE_DELETING:
|
case IKE_DELETING:
|
||||||
|
case IKE_DESTROYING:
|
||||||
case IKE_PASSIVE:
|
case IKE_PASSIVE:
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
default:
|
default:
|
||||||
|
@ -1775,10 +1776,46 @@ static status_t roam(private_ike_sa_t *this, bool address)
|
||||||
DBG2(DBG_IKE, "keeping connection path %H - %H",
|
DBG2(DBG_IKE, "keeping connection path %H - %H",
|
||||||
src, this->other_host);
|
src, this->other_host);
|
||||||
src->destroy(src);
|
src->destroy(src);
|
||||||
|
set_condition(this, COND_STALE, FALSE);
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
src->destroy(src);
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* check if we find a route at all */
|
||||||
|
enumerator_t *enumerator;
|
||||||
|
host_t *addr;
|
||||||
|
|
||||||
|
src = charon->kernel_interface->get_source_addr(charon->kernel_interface,
|
||||||
|
this->other_host, NULL);
|
||||||
|
if (!src)
|
||||||
|
{
|
||||||
|
enumerator = this->additional_addresses->create_enumerator(
|
||||||
|
this->additional_addresses);
|
||||||
|
while (enumerator->enumerate(enumerator, &addr))
|
||||||
|
{
|
||||||
|
DBG1(DBG_IKE, "looking for a route to %H ...", addr);
|
||||||
|
src = charon->kernel_interface->get_source_addr(
|
||||||
|
charon->kernel_interface, addr, NULL);
|
||||||
|
if (src)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
enumerator->destroy(enumerator);
|
||||||
|
}
|
||||||
|
if (!src)
|
||||||
|
{
|
||||||
|
DBG1(DBG_IKE, "no route found to reach %H, MOBIKE update deferred",
|
||||||
|
this->other_host);
|
||||||
|
set_condition(this, COND_STALE, TRUE);
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
src->destroy(src);
|
src->destroy(src);
|
||||||
}
|
}
|
||||||
|
set_condition(this, COND_STALE, FALSE);
|
||||||
|
|
||||||
/* update addresses with mobike, if supported ... */
|
/* update addresses with mobike, if supported ... */
|
||||||
if (supports_extension(this, EXT_MOBIKE))
|
if (supports_extension(this, EXT_MOBIKE))
|
||||||
|
|
|
@ -127,6 +127,11 @@ enum ike_condition_t {
|
||||||
* Local peer is the "original" IKE initiator. Unaffected from rekeying.
|
* Local peer is the "original" IKE initiator. Unaffected from rekeying.
|
||||||
*/
|
*/
|
||||||
COND_ORIGINAL_INITIATOR = (1<<6),
|
COND_ORIGINAL_INITIATOR = (1<<6),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IKE_SA is stale, the peer is currently unreachable (MOBIKE)
|
||||||
|
*/
|
||||||
|
COND_STALE = (1<<7),
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue