libipsec: Add possibility to relay acquire events
Keeping it simple and just forwarding the reqid.
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2012 Tobias Brunner
|
* Copyright (C) 2012-2013 Tobias Brunner
|
||||||
*
|
*
|
||||||
* Copyright (C) secunet Security Networks AG
|
* Copyright (C) secunet Security Networks AG
|
||||||
*
|
*
|
||||||
@@ -25,6 +25,7 @@
|
|||||||
typedef struct ipsec_event_listener_t ipsec_event_listener_t;
|
typedef struct ipsec_event_listener_t ipsec_event_listener_t;
|
||||||
|
|
||||||
#include <library.h>
|
#include <library.h>
|
||||||
|
#include <selectors/traffic_selector.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Listener interface for IPsec events
|
* Listener interface for IPsec events
|
||||||
@@ -42,6 +43,13 @@ struct ipsec_event_listener_t {
|
|||||||
* @param hard TRUE if this is a hard expire, FALSE otherwise
|
* @param hard TRUE if this is a hard expire, FALSE otherwise
|
||||||
*/
|
*/
|
||||||
void (*expire)(uint8_t protocol, uint32_t spi, host_t *dst, bool hard);
|
void (*expire)(uint8_t protocol, uint32_t spi, host_t *dst, bool hard);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when no IPsec SA is found for an outbound policy
|
||||||
|
*
|
||||||
|
* @param reqid reqid of the policy for which to acquire an SA
|
||||||
|
*/
|
||||||
|
void (*acquire)(uint32_t reqid);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /** IPSEC_EVENT_LISTENER_H_ @}*/
|
#endif /** IPSEC_EVENT_LISTENER_H_ @}*/
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2012 Tobias Brunner
|
* Copyright (C) 2012-2013 Tobias Brunner
|
||||||
* Copyright (C) 2012 Giuliano Grassi
|
* Copyright (C) 2012 Giuliano Grassi
|
||||||
* Copyright (C) 2012 Ralf Sager
|
* Copyright (C) 2012 Ralf Sager
|
||||||
*
|
*
|
||||||
@@ -63,33 +63,30 @@ typedef struct {
|
|||||||
*/
|
*/
|
||||||
enum {
|
enum {
|
||||||
IPSEC_EVENT_EXPIRE,
|
IPSEC_EVENT_EXPIRE,
|
||||||
|
IPSEC_EVENT_ACQUIRE,
|
||||||
} type;
|
} type;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Protocol of the SA
|
* Data for specific event types
|
||||||
*/
|
|
||||||
uint8_t protocol;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SPI of the SA, if any
|
|
||||||
*/
|
|
||||||
uint32_t spi;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SA destination address
|
|
||||||
*/
|
|
||||||
host_t *dst;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Additional data for specific event types
|
|
||||||
*/
|
*/
|
||||||
union {
|
union {
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
|
/** Protocol of the SA */
|
||||||
|
uint8_t protocol;
|
||||||
|
/** SPI of the SA */
|
||||||
|
uint32_t spi;
|
||||||
|
/** SA destination address */
|
||||||
|
host_t *dst;
|
||||||
/** TRUE in case of a hard expire */
|
/** TRUE in case of a hard expire */
|
||||||
bool hard;
|
bool hard;
|
||||||
} expire;
|
} expire;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
/** Reqid of the SA */
|
||||||
|
uint32_t reqid;
|
||||||
|
} acquire;
|
||||||
|
|
||||||
} data;
|
} data;
|
||||||
|
|
||||||
} ipsec_event_t;
|
} ipsec_event_t;
|
||||||
@@ -99,7 +96,14 @@ typedef struct {
|
|||||||
*/
|
*/
|
||||||
static void ipsec_event_destroy(ipsec_event_t *event)
|
static void ipsec_event_destroy(ipsec_event_t *event)
|
||||||
{
|
{
|
||||||
event->dst->destroy(event->dst);
|
switch (event->type)
|
||||||
|
{
|
||||||
|
case IPSEC_EVENT_EXPIRE:
|
||||||
|
event->data.expire.dst->destroy(event->data.expire.dst);
|
||||||
|
break;
|
||||||
|
case IPSEC_EVENT_ACQUIRE:
|
||||||
|
break;
|
||||||
|
}
|
||||||
free(event);
|
free(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -123,10 +127,18 @@ static job_requeue_t handle_events(private_ipsec_event_relay_t *this)
|
|||||||
case IPSEC_EVENT_EXPIRE:
|
case IPSEC_EVENT_EXPIRE:
|
||||||
if (current->expire)
|
if (current->expire)
|
||||||
{
|
{
|
||||||
current->expire(event->protocol, event->spi, event->dst,
|
current->expire(event->data.expire.protocol,
|
||||||
|
event->data.expire.spi,
|
||||||
|
event->data.expire.dst,
|
||||||
event->data.expire.hard);
|
event->data.expire.hard);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case IPSEC_EVENT_ACQUIRE:
|
||||||
|
if (current->acquire)
|
||||||
|
{
|
||||||
|
current->acquire(event->data.acquire.reqid);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
enumerator->destroy(enumerator);
|
enumerator->destroy(enumerator);
|
||||||
@@ -143,11 +155,11 @@ METHOD(ipsec_event_relay_t, expire, void,
|
|||||||
|
|
||||||
INIT(event,
|
INIT(event,
|
||||||
.type = IPSEC_EVENT_EXPIRE,
|
.type = IPSEC_EVENT_EXPIRE,
|
||||||
.protocol = protocol,
|
|
||||||
.spi = spi,
|
|
||||||
.dst = dst->clone(dst),
|
|
||||||
.data = {
|
.data = {
|
||||||
.expire = {
|
.expire = {
|
||||||
|
.protocol = protocol,
|
||||||
|
.spi = spi,
|
||||||
|
.dst = dst->clone(dst),
|
||||||
.hard = hard,
|
.hard = hard,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -155,6 +167,22 @@ METHOD(ipsec_event_relay_t, expire, void,
|
|||||||
this->queue->enqueue(this->queue, event);
|
this->queue->enqueue(this->queue, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
METHOD(ipsec_event_relay_t, acquire, void,
|
||||||
|
private_ipsec_event_relay_t *this, uint32_t reqid)
|
||||||
|
{
|
||||||
|
ipsec_event_t *event;
|
||||||
|
|
||||||
|
INIT(event,
|
||||||
|
.type = IPSEC_EVENT_ACQUIRE,
|
||||||
|
.data = {
|
||||||
|
.acquire = {
|
||||||
|
.reqid = reqid,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
);
|
||||||
|
this->queue->enqueue(this->queue, event);
|
||||||
|
}
|
||||||
|
|
||||||
METHOD(ipsec_event_relay_t, register_listener, void,
|
METHOD(ipsec_event_relay_t, register_listener, void,
|
||||||
private_ipsec_event_relay_t *this, ipsec_event_listener_t *listener)
|
private_ipsec_event_relay_t *this, ipsec_event_listener_t *listener)
|
||||||
{
|
{
|
||||||
@@ -190,6 +218,7 @@ ipsec_event_relay_t *ipsec_event_relay_create()
|
|||||||
INIT(this,
|
INIT(this,
|
||||||
.public = {
|
.public = {
|
||||||
.expire = _expire,
|
.expire = _expire,
|
||||||
|
.acquire = _acquire,
|
||||||
.register_listener = _register_listener,
|
.register_listener = _register_listener,
|
||||||
.unregister_listener = _unregister_listener,
|
.unregister_listener = _unregister_listener,
|
||||||
.destroy = _destroy,
|
.destroy = _destroy,
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
|
* Copyright (C) 2013 Tobias Brunner
|
||||||
* Copyright (C) 2012 Giuliano Grassi
|
* Copyright (C) 2012 Giuliano Grassi
|
||||||
* Copyright (C) 2012 Ralf Sager
|
* Copyright (C) 2012 Ralf Sager
|
||||||
*
|
*
|
||||||
@@ -47,6 +48,13 @@ struct ipsec_event_relay_t {
|
|||||||
void (*expire)(ipsec_event_relay_t *this, uint8_t protocol, uint32_t spi,
|
void (*expire)(ipsec_event_relay_t *this, uint8_t protocol, uint32_t spi,
|
||||||
host_t *dst, bool hard);
|
host_t *dst, bool hard);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Raise an acquire event.
|
||||||
|
*
|
||||||
|
* @param reqid reqid of the policy for which to acquire an SA
|
||||||
|
*/
|
||||||
|
void (*acquire)(ipsec_event_relay_t *this, uint32_t reqid);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register a listener to events raised by this manager
|
* Register a listener to events raised by this manager
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user