kernel-interface: Raise expires with a proto/SPI/dst tuple instead of reqid
This commit is contained in:
1 parent
971a91685d
commit
f81a949748
20 files changed
+124
-118
No files matched your search
@@ -35,14 +35,12 @@ struct ipsec_event_listener_t {
|
||||
/**
|
||||
* Called when the lifetime of an IPsec SA expired
|
||||
*
|
||||
* @param reqid reqid of the expired SA
|
||||
* @param protocol protocol of the expired SA
|
||||
* @param spi spi of the expired SA
|
||||
* @param dst destination address of expired SA
|
||||
* @param hard TRUE if this is a hard expire, FALSE otherwise
|
||||
*/
|
||||
void (*expire)(u_int32_t reqid, u_int8_t protocol, u_int32_t spi,
|
||||
bool hard);
|
||||
|
||||
void (*expire)(u_int8_t protocol, u_int32_t spi, host_t *dst, bool hard);
|
||||
};
|
||||
|
||||
#endif /** IPSEC_EVENT_LISTENER_H_ @}*/
|
||||
@@ -65,23 +65,26 @@ typedef struct {
|
||||
} type;
|
||||
|
||||
/**
|
||||
* Reqid of the SA, if any
|
||||
* Protocol of the SA
|
||||
*/
|
||||
u_int32_t reqid;
|
||||
u_int8_t protocol;
|
||||
|
||||
/**
|
||||
* SPI of the SA, if any
|
||||
*/
|
||||
u_int32_t spi;
|
||||
|
||||
/**
|
||||
* SA destination address
|
||||
*/
|
||||
host_t *dst;
|
||||
|
||||
/**
|
||||
* Additional data for specific event types
|
||||
*/
|
||||
union {
|
||||
|
||||
struct {
|
||||
/** Protocol of the SA */
|
||||
u_int8_t protocol;
|
||||
/** TRUE in case of a hard expire */
|
||||
bool hard;
|
||||
} expire;
|
||||
@@ -90,6 +93,15 @@ typedef struct {
|
||||
|
||||
} ipsec_event_t;
|
||||
|
||||
/**
|
||||
* Destroy IPsec event data
|
||||
*/
|
||||
static void ipsec_event_destroy(ipsec_event_t *event)
|
||||
{
|
||||
event->dst->destroy(event->dst);
|
||||
free(event);
|
||||
}
|
||||
|
||||
/**
|
||||
* Dequeue events and relay them to listeners
|
||||
*/
|
||||
@@ -110,31 +122,31 @@ static job_requeue_t handle_events(private_ipsec_event_relay_t *this)
|
||||
case IPSEC_EVENT_EXPIRE:
|
||||
if (current->expire)
|
||||
{
|
||||
current->expire(event->reqid, event->data.expire.protocol,
|
||||
event->spi, event->data.expire.hard);
|
||||
current->expire(event->protocol, event->spi, event->dst,
|
||||
event->data.expire.hard);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
enumerator->destroy(enumerator);
|
||||
this->lock->unlock(this->lock);
|
||||
free(event);
|
||||
ipsec_event_destroy(event);
|
||||
return JOB_REQUEUE_DIRECT;
|
||||
}
|
||||
|
||||
METHOD(ipsec_event_relay_t, expire, void,
|
||||
private_ipsec_event_relay_t *this, u_int32_t reqid, u_int8_t protocol,
|
||||
u_int32_t spi, bool hard)
|
||||
private_ipsec_event_relay_t *this, u_int8_t protocol, u_int32_t spi,
|
||||
host_t *dst, bool hard)
|
||||
{
|
||||
ipsec_event_t *event;
|
||||
|
||||
INIT(event,
|
||||
.type = IPSEC_EVENT_EXPIRE,
|
||||
.reqid = reqid,
|
||||
.protocol = protocol,
|
||||
.spi = spi,
|
||||
.dst = dst->clone(dst),
|
||||
.data = {
|
||||
.expire = {
|
||||
.protocol = protocol,
|
||||
.hard = hard,
|
||||
},
|
||||
},
|
||||
|
||||
@@ -38,13 +38,13 @@ struct ipsec_event_relay_t {
|
||||
/**
|
||||
* Raise an expire event.
|
||||
*
|
||||
* @param reqid reqid of the expired IPsec SA
|
||||
* @param protocol protocol (e.g ESP) of the expired SA
|
||||
* @param spi SPI of the expired SA
|
||||
* @param dst destination address of expired SA
|
||||
* @param hard TRUE for a hard expire, FALSE otherwise
|
||||
*/
|
||||
void (*expire)(ipsec_event_relay_t *this, u_int32_t reqid,
|
||||
u_int8_t protocol, u_int32_t spi, bool hard);
|
||||
void (*expire)(ipsec_event_relay_t *this, u_int8_t protocol, u_int32_t spi,
|
||||
host_t *dst, bool hard);
|
||||
|
||||
/**
|
||||
* Register a listener to events raised by this manager
|
||||
|
||||
@@ -194,8 +194,8 @@ METHOD(ipsec_sa_t, expire, void,
|
||||
if (!this->hard_expired)
|
||||
{
|
||||
this->hard_expired = TRUE;
|
||||
ipsec->events->expire(ipsec->events, this->reqid, this->protocol,
|
||||
this->spi, TRUE);
|
||||
ipsec->events->expire(ipsec->events, this->protocol, this->spi,
|
||||
this->dst, TRUE);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -203,8 +203,8 @@ METHOD(ipsec_sa_t, expire, void,
|
||||
if (!this->hard_expired && !this->soft_expired)
|
||||
{
|
||||
this->soft_expired = TRUE;
|
||||
ipsec->events->expire(ipsec->events, this->reqid, this->protocol,
|
||||
this->spi, FALSE);
|
||||
ipsec->events->expire(ipsec->events, this->protocol, this->spi,
|
||||
this->dst, FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user