2 * Copyright (C) 2010 Tobias Brunner
3 * Hochschule fuer Technik Rapperswil
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the
7 * Free Software Foundation; either version 2 of the License, or (at your
8 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 #include "kernel_handler.h"
20 #include <processing/jobs/acquire_job.h>
21 #include <processing/jobs/delete_child_sa_job.h>
22 #include <processing/jobs/migrate_job.h>
23 #include <processing/jobs/rekey_child_sa_job.h>
24 #include <processing/jobs/update_sa_job.h>
26 typedef struct private_kernel_handler_t private_kernel_handler_t
;
29 * Private data of a kernel_handler_t object.
31 struct private_kernel_handler_t
{
34 * Public part of kernel_handler_t object.
36 kernel_handler_t
public;
40 METHOD(kernel_listener_t
, acquire
, bool,
41 private_kernel_handler_t
*this, u_int32_t reqid
,
42 traffic_selector_t
*src_ts
, traffic_selector_t
*dst_ts
)
47 DBG1(DBG_KNL
, "creating acquire job for policy %R === %R "
48 "with reqid {%u}", src_ts
, dst_ts
, reqid
);
52 DBG1(DBG_KNL
, "creating acquire job for policy with reqid {%u}", reqid
);
54 job
= (job_t
*)acquire_job_create(reqid
, src_ts
, dst_ts
);
55 hydra
->processor
->queue_job(hydra
->processor
, job
);
59 METHOD(kernel_listener_t
, expire
, bool,
60 private_kernel_handler_t
*this, u_int32_t reqid
, protocol_id_t protocol
,
61 u_int32_t spi
, bool hard
)
64 DBG1(DBG_KNL
, "creating %s job for %N CHILD_SA with SPI %.8x "
65 "and reqid {%u}", hard ?
"delete" : "rekey",
66 protocol_id_names
, protocol
, ntohl(spi
), reqid
);
69 job
= (job_t
*)delete_child_sa_job_create(reqid
, protocol
, spi
);
73 job
= (job_t
*)rekey_child_sa_job_create(reqid
, protocol
, spi
);
75 hydra
->processor
->queue_job(hydra
->processor
, job
);
79 METHOD(kernel_listener_t
, mapping
, bool,
80 private_kernel_handler_t
*this, u_int32_t reqid
, u_int32_t spi
,
84 DBG1(DBG_KNL
, "NAT mappings of ESP CHILD_SA with SPI %.8x and "
85 "reqid {%u} changed, queuing update job", ntohl(spi
), reqid
);
86 job
= (job_t
*)update_sa_job_create(reqid
, remote
);
87 hydra
->processor
->queue_job(hydra
->processor
, job
);
91 METHOD(kernel_listener_t
, migrate
, bool,
92 private_kernel_handler_t
*this, u_int32_t reqid
,
93 traffic_selector_t
*src_ts
, traffic_selector_t
*dst_ts
,
94 policy_dir_t direction
, host_t
*local
, host_t
*remote
)
97 DBG1(DBG_KNL
, "creating migrate job for policy %R === %R %N with "
98 "reqid {%u}", src_ts
, dst_ts
, policy_dir_names
, direction
,
100 job
= (job_t
*)migrate_job_create(reqid
, src_ts
, dst_ts
, direction
, local
,
102 hydra
->processor
->queue_job(hydra
->processor
, job
);
106 METHOD(kernel_handler_t
, destroy
, void,
107 private_kernel_handler_t
*this)
109 charon
->kernel_interface
->remove_listener(charon
->kernel_interface
,
110 &this->public.listener
);
114 kernel_handler_t
*kernel_handler_create()
116 private_kernel_handler_t
*this;
130 charon
->kernel_interface
->add_listener(charon
->kernel_interface
,
131 &this->public.listener
);
133 return &this->public;