kernel-interface: Raise expires with a proto/SPI/dst tuple instead of reqid
This commit is contained in:
@@ -72,23 +72,23 @@ METHOD(kernel_listener_t, acquire, bool,
|
||||
}
|
||||
|
||||
METHOD(kernel_listener_t, expire, bool,
|
||||
private_kernel_handler_t *this, u_int32_t reqid, u_int8_t protocol,
|
||||
u_int32_t spi, bool hard)
|
||||
private_kernel_handler_t *this, u_int8_t protocol, u_int32_t spi,
|
||||
host_t *dst, bool hard)
|
||||
{
|
||||
protocol_id_t proto = proto_ip2ike(protocol);
|
||||
|
||||
DBG1(DBG_KNL, "creating %s job for %N CHILD_SA with SPI %.8x and reqid {%u}",
|
||||
hard ? "delete" : "rekey", protocol_id_names, proto, ntohl(spi), reqid);
|
||||
DBG1(DBG_KNL, "creating %s job for CHILD_SA %N/0x%08x/%H",
|
||||
hard ? "delete" : "rekey", protocol_id_names, proto, ntohl(spi), dst);
|
||||
|
||||
if (hard)
|
||||
{
|
||||
lib->processor->queue_job(lib->processor,
|
||||
(job_t*)delete_child_sa_job_create(reqid, proto, spi, hard));
|
||||
(job_t*)delete_child_sa_job_create(proto, spi, dst, hard));
|
||||
}
|
||||
else
|
||||
{
|
||||
lib->processor->queue_job(lib->processor,
|
||||
(job_t*)rekey_child_sa_job_create(reqid, proto, spi));
|
||||
(job_t*)rekey_child_sa_job_create(proto, spi, dst));
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -222,10 +222,10 @@ static inline bool policy_entry_equals(policy_entry_t *a,
|
||||
/**
|
||||
* Expiration callback
|
||||
*/
|
||||
static void expire(u_int32_t reqid, u_int8_t protocol, u_int32_t spi, bool hard)
|
||||
static void expire(u_int8_t protocol, u_int32_t spi, host_t *dst, bool hard)
|
||||
{
|
||||
hydra->kernel_interface->expire(hydra->kernel_interface, reqid, protocol,
|
||||
spi, hard);
|
||||
hydra->kernel_interface->expire(hydra->kernel_interface, protocol,
|
||||
spi, dst, hard);
|
||||
}
|
||||
|
||||
METHOD(kernel_ipsec_t, get_features, kernel_feature_t,
|
||||
|
||||
@@ -2032,9 +2032,8 @@ static void expire_data_destroy(expire_data_t *data)
|
||||
static job_requeue_t expire_job(expire_data_t *data)
|
||||
{
|
||||
private_kernel_wfp_ipsec_t *this = data->this;
|
||||
u_int32_t reqid = 0;
|
||||
u_int8_t protocol;
|
||||
entry_t *entry;
|
||||
entry_t *entry = NULL;
|
||||
sa_entry_t key = {
|
||||
.spi = data->spi,
|
||||
.dst = data->dst,
|
||||
@@ -2048,7 +2047,6 @@ static job_requeue_t expire_job(expire_data_t *data)
|
||||
if (entry)
|
||||
{
|
||||
protocol = entry->isa.protocol;
|
||||
reqid = entry->reqid;
|
||||
if (entry->osa.dst)
|
||||
{
|
||||
key.dst = entry->osa.dst;
|
||||
@@ -2065,15 +2063,14 @@ static job_requeue_t expire_job(expire_data_t *data)
|
||||
if (entry)
|
||||
{
|
||||
protocol = entry->isa.protocol;
|
||||
reqid = entry->reqid;
|
||||
}
|
||||
this->mutex->unlock(this->mutex);
|
||||
}
|
||||
|
||||
if (reqid)
|
||||
if (entry)
|
||||
{
|
||||
hydra->kernel_interface->expire(hydra->kernel_interface,
|
||||
reqid, protocol, data->spi, data->hard);
|
||||
hydra->kernel_interface->expire(hydra->kernel_interface, protocol,
|
||||
data->spi, data->dst, data->hard);
|
||||
}
|
||||
|
||||
return JOB_REQUEUE_NONE;
|
||||
|
||||
@@ -432,13 +432,13 @@ METHOD(stroke_control_t, rekey, void,
|
||||
while (children->enumerate(children, (void**)&child_sa))
|
||||
{
|
||||
if ((name && streq(name, child_sa->get_name(child_sa))) ||
|
||||
(id && id == child_sa->get_reqid(child_sa)))
|
||||
(id && id == child_sa->get_unique_id(child_sa)))
|
||||
{
|
||||
lib->processor->queue_job(lib->processor,
|
||||
(job_t*)rekey_child_sa_job_create(
|
||||
child_sa->get_reqid(child_sa),
|
||||
child_sa->get_protocol(child_sa),
|
||||
child_sa->get_spi(child_sa, TRUE)));
|
||||
child_sa->get_spi(child_sa, TRUE),
|
||||
ike_sa->get_my_host(ike_sa)));
|
||||
if (!all)
|
||||
{
|
||||
finished = TRUE;
|
||||
|
||||
@@ -30,11 +30,6 @@ struct private_delete_child_sa_job_t {
|
||||
*/
|
||||
delete_child_sa_job_t public;
|
||||
|
||||
/**
|
||||
* reqid of the CHILD_SA
|
||||
*/
|
||||
u_int32_t reqid;
|
||||
|
||||
/**
|
||||
* protocol of the CHILD_SA (ESP/AH)
|
||||
*/
|
||||
@@ -45,6 +40,11 @@ struct private_delete_child_sa_job_t {
|
||||
*/
|
||||
u_int32_t spi;
|
||||
|
||||
/**
|
||||
* SA destination address
|
||||
*/
|
||||
host_t *dst;
|
||||
|
||||
/**
|
||||
* Delete for an expired CHILD_SA
|
||||
*/
|
||||
@@ -54,6 +54,7 @@ struct private_delete_child_sa_job_t {
|
||||
METHOD(job_t, destroy, void,
|
||||
private_delete_child_sa_job_t *this)
|
||||
{
|
||||
this->dst->destroy(this->dst);
|
||||
free(this);
|
||||
}
|
||||
|
||||
@@ -62,12 +63,12 @@ METHOD(job_t, execute, job_requeue_t,
|
||||
{
|
||||
ike_sa_t *ike_sa;
|
||||
|
||||
ike_sa = charon->ike_sa_manager->checkout_by_id(charon->ike_sa_manager,
|
||||
this->reqid, TRUE);
|
||||
ike_sa = charon->child_sa_manager->checkout(charon->child_sa_manager,
|
||||
this->protocol, this->spi, this->dst, NULL);
|
||||
if (ike_sa == NULL)
|
||||
{
|
||||
DBG1(DBG_JOB, "CHILD_SA with reqid %d not found for delete",
|
||||
this->reqid);
|
||||
DBG1(DBG_JOB, "CHILD_SA %N/0x%08x/%H not found for delete",
|
||||
protocol_id_names, this->protocol, htonl(this->spi), this->dst);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -87,8 +88,8 @@ METHOD(job_t, get_priority, job_priority_t,
|
||||
/*
|
||||
* Described in header
|
||||
*/
|
||||
delete_child_sa_job_t *delete_child_sa_job_create(u_int32_t reqid,
|
||||
protocol_id_t protocol, u_int32_t spi, bool expired)
|
||||
delete_child_sa_job_t *delete_child_sa_job_create(protocol_id_t protocol,
|
||||
u_int32_t spi, host_t *dst, bool expired)
|
||||
{
|
||||
private_delete_child_sa_job_t *this;
|
||||
|
||||
@@ -100,12 +101,11 @@ delete_child_sa_job_t *delete_child_sa_job_create(u_int32_t reqid,
|
||||
.destroy = _destroy,
|
||||
},
|
||||
},
|
||||
.reqid = reqid,
|
||||
.protocol = protocol,
|
||||
.spi = spi,
|
||||
.dst = dst->clone(dst),
|
||||
.expired = expired,
|
||||
);
|
||||
|
||||
return &this->public;
|
||||
}
|
||||
|
||||
|
||||
@@ -44,16 +44,13 @@ struct delete_child_sa_job_t {
|
||||
/**
|
||||
* Creates a job of type DELETE_CHILD_SA.
|
||||
*
|
||||
* The CHILD_SA is identified by its reqid, protocol (AH/ESP) and its
|
||||
* inbound SPI.
|
||||
*
|
||||
* @param reqid reqid of the CHILD_SA, as used in kernel
|
||||
* @param protocol protocol of the CHILD_SA
|
||||
* @param spi security parameter index of the CHILD_SA
|
||||
* @param dst SA destination address
|
||||
* @param expired TRUE if CHILD_SA already expired
|
||||
* @return delete_child_sa_job_t object
|
||||
*/
|
||||
delete_child_sa_job_t *delete_child_sa_job_create(u_int32_t reqid,
|
||||
protocol_id_t protocol, u_int32_t spi, bool expired);
|
||||
delete_child_sa_job_t *delete_child_sa_job_create(protocol_id_t protocol,
|
||||
u_int32_t spi, host_t *dst, bool expired);
|
||||
|
||||
#endif /** DELETE_CHILD_SA_JOB_H_ @}*/
|
||||
|
||||
@@ -24,16 +24,12 @@ typedef struct private_rekey_child_sa_job_t private_rekey_child_sa_job_t;
|
||||
* Private data of an rekey_child_sa_job_t object.
|
||||
*/
|
||||
struct private_rekey_child_sa_job_t {
|
||||
|
||||
/**
|
||||
* Public rekey_child_sa_job_t interface.
|
||||
*/
|
||||
rekey_child_sa_job_t public;
|
||||
|
||||
/**
|
||||
* reqid of the child to rekey
|
||||
*/
|
||||
u_int32_t reqid;
|
||||
|
||||
/**
|
||||
* protocol of the CHILD_SA (ESP/AH)
|
||||
*/
|
||||
@@ -43,11 +39,17 @@ struct private_rekey_child_sa_job_t {
|
||||
* inbound SPI of the CHILD_SA
|
||||
*/
|
||||
u_int32_t spi;
|
||||
|
||||
/**
|
||||
* SA destination address
|
||||
*/
|
||||
host_t *dst;
|
||||
};
|
||||
|
||||
METHOD(job_t, destroy, void,
|
||||
private_rekey_child_sa_job_t *this)
|
||||
{
|
||||
this->dst->destroy(this->dst);
|
||||
free(this);
|
||||
}
|
||||
|
||||
@@ -56,12 +58,12 @@ METHOD(job_t, execute, job_requeue_t,
|
||||
{
|
||||
ike_sa_t *ike_sa;
|
||||
|
||||
ike_sa = charon->ike_sa_manager->checkout_by_id(charon->ike_sa_manager,
|
||||
this->reqid, TRUE);
|
||||
ike_sa = charon->child_sa_manager->checkout(charon->child_sa_manager,
|
||||
this->protocol, this->spi, this->dst, NULL);
|
||||
if (ike_sa == NULL)
|
||||
{
|
||||
DBG2(DBG_JOB, "CHILD_SA with reqid %d not found for rekeying",
|
||||
this->reqid);
|
||||
DBG1(DBG_JOB, "CHILD_SA %N/0x%08x/%H not found for rekey",
|
||||
protocol_id_names, this->protocol, htonl(this->spi), this->dst);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -80,9 +82,8 @@ METHOD(job_t, get_priority, job_priority_t,
|
||||
/*
|
||||
* Described in header
|
||||
*/
|
||||
rekey_child_sa_job_t *rekey_child_sa_job_create(u_int32_t reqid,
|
||||
protocol_id_t protocol,
|
||||
u_int32_t spi)
|
||||
rekey_child_sa_job_t *rekey_child_sa_job_create(protocol_id_t protocol,
|
||||
u_int32_t spi, host_t *dst)
|
||||
{
|
||||
private_rekey_child_sa_job_t *this;
|
||||
|
||||
@@ -94,9 +95,9 @@ rekey_child_sa_job_t *rekey_child_sa_job_create(u_int32_t reqid,
|
||||
.destroy = _destroy,
|
||||
},
|
||||
},
|
||||
.reqid = reqid,
|
||||
.protocol = protocol,
|
||||
.spi = spi,
|
||||
.dst = dst->clone(dst),
|
||||
);
|
||||
|
||||
return &this->public;
|
||||
|
||||
@@ -43,15 +43,11 @@ struct rekey_child_sa_job_t {
|
||||
/**
|
||||
* Creates a job of type REKEY_CHILD_SA.
|
||||
*
|
||||
* The CHILD_SA is identified by its protocol (AH/ESP) and its
|
||||
* inbound SPI.
|
||||
*
|
||||
* @param reqid reqid of the CHILD_SA to rekey
|
||||
* @param protocol protocol of the CHILD_SA
|
||||
* @param spi security parameter index of the CHILD_SA
|
||||
* @param dst SA destination address
|
||||
* @return rekey_child_sa_job_t object
|
||||
*/
|
||||
rekey_child_sa_job_t *rekey_child_sa_job_create(u_int32_t reqid,
|
||||
protocol_id_t protocol,
|
||||
u_int32_t spi);
|
||||
rekey_child_sa_job_t *rekey_child_sa_job_create(protocol_id_t protocol,
|
||||
u_int32_t spi, host_t *dst);
|
||||
#endif /** REKEY_CHILD_SA_JOB_H_ @}*/
|
||||
|
||||
@@ -96,9 +96,9 @@ static void schedule_delayed_rekey(private_child_rekey_t *this)
|
||||
|
||||
retry = RETRY_INTERVAL - (random() % RETRY_JITTER);
|
||||
job = (job_t*)rekey_child_sa_job_create(
|
||||
this->child_sa->get_reqid(this->child_sa),
|
||||
this->child_sa->get_protocol(this->child_sa),
|
||||
this->child_sa->get_spi(this->child_sa, TRUE));
|
||||
this->child_sa->get_spi(this->child_sa, TRUE),
|
||||
this->ike_sa->get_my_host(this->ike_sa));
|
||||
DBG1(DBG_IKE, "CHILD_SA rekeying failed, trying again in %d seconds", retry);
|
||||
this->child_sa->set_state(this->child_sa, CHILD_INSTALLED);
|
||||
lib->scheduler->schedule_job(lib->scheduler, job, retry);
|
||||
|
||||
Reference in New Issue
Block a user