pluto: Handle changed NAT mappings via libhydra's kernel interface.

This commit is contained in:
Tobias Brunner
2010-09-02 19:04:24 +02:00
parent a0cbce9e7c
commit 76467e030c
3 changed files with 87 additions and 81 deletions
+41 -5
View File
@@ -1737,6 +1737,11 @@ failed:
return result;
}
/**
* Handler for kernel events (called by thread-pool thread)
*/
kernel_listener_t *kernel_handler;
/**
* Data for acquire events
*/
@@ -1756,11 +1761,6 @@ void handle_acquire(acquire_data_t *this)
"%acquire");
}
/**
* Handler for kernel events (called by thread-pool thread)
*/
kernel_listener_t *kernel_handler;
METHOD(kernel_listener_t, acquire, bool,
kernel_listener_t *this, u_int32_t reqid,
traffic_selector_t *src_ts, traffic_selector_t *dst_ts)
@@ -1789,6 +1789,41 @@ METHOD(kernel_listener_t, acquire, bool,
return TRUE;
}
/**
* Data for mapping events
*/
typedef struct {
/** reqid, spi of affected SA */
u_int32_t reqid, spi;
/** new endpont */
ip_address new_end;
} mapping_data_t;
/**
* Callback for mapping events (called by main thread)
*/
void handle_mapping(mapping_data_t *this)
{
process_nat_t_new_mapping(this->reqid, this->spi, &this->new_end);
}
METHOD(kernel_listener_t, mapping, bool,
kernel_listener_t *this, u_int32_t reqid, u_int32_t spi, host_t *remote)
{
mapping_data_t *data;
DBG(DBG_CONTROL,
DBG_log("creating mapping event for SA with SPI %.8x and reqid {%u}",
spi, reqid));
INIT(data,
.reqid = reqid,
.spi = spi,
.new_end = *(ip_address*)remote->get_sockaddr(remote),
);
pluto->events->queue(pluto->events, (void*)handle_mapping, data, free);
return TRUE;
}
void init_kernel(void)
{
/* register SA types that we can negotiate */
@@ -1797,6 +1832,7 @@ void init_kernel(void)
INIT(kernel_handler,
.acquire = _acquire,
.mapping = _mapping,
);
hydra->kernel_interface->add_listener(hydra->kernel_interface,
kernel_handler);