Annotation of embedaddon/strongswan/src/libcharon/kernel/kernel_handler.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2010 Tobias Brunner
3: * HSR Hochschule fuer Technik Rapperswil
4: *
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>.
9: *
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
13: * for more details.
14: */
15:
16: #include "kernel_handler.h"
17:
18: #include <daemon.h>
19: #include <processing/jobs/acquire_job.h>
20: #include <processing/jobs/delete_child_sa_job.h>
21: #include <processing/jobs/migrate_job.h>
22: #include <processing/jobs/rekey_child_sa_job.h>
23: #include <processing/jobs/roam_job.h>
24: #include <processing/jobs/update_sa_job.h>
25:
26: typedef struct private_kernel_handler_t private_kernel_handler_t;
27:
28: /**
29: * Private data of a kernel_handler_t object.
30: */
31: struct private_kernel_handler_t {
32:
33: /**
34: * Public part of kernel_handler_t object.
35: */
36: kernel_handler_t public;
37: };
38:
39: /**
40: * convert an IP protocol identifier to the IKEv2 specific protocol identifier.
41: */
42: static inline protocol_id_t proto_ip2ike(uint8_t protocol)
43: {
44: switch (protocol)
45: {
46: case IPPROTO_ESP:
47: return PROTO_ESP;
48: case IPPROTO_AH:
49: return PROTO_AH;
50: default:
51: return protocol;
52: }
53: }
54:
55: METHOD(kernel_listener_t, acquire, bool,
56: private_kernel_handler_t *this, uint32_t reqid,
57: traffic_selector_t *src_ts, traffic_selector_t *dst_ts)
58: {
59: if (src_ts && dst_ts)
60: {
61: DBG1(DBG_KNL, "creating acquire job for policy %R === %R with "
62: "reqid {%u}", src_ts, dst_ts, reqid);
63: }
64: else
65: {
66: DBG1(DBG_KNL, "creating acquire job for policy with reqid {%u}", reqid);
67: }
68: lib->processor->queue_job(lib->processor,
69: (job_t*)acquire_job_create(reqid, src_ts, dst_ts));
70: return TRUE;
71: }
72:
73: METHOD(kernel_listener_t, expire, bool,
74: private_kernel_handler_t *this, uint8_t protocol, uint32_t spi,
75: host_t *dst, bool hard)
76: {
77: protocol_id_t proto = proto_ip2ike(protocol);
78:
79: DBG1(DBG_KNL, "creating %s job for CHILD_SA %N/0x%08x/%H",
80: hard ? "delete" : "rekey", protocol_id_names, proto, ntohl(spi), dst);
81:
82: if (hard)
83: {
84: lib->processor->queue_job(lib->processor,
85: (job_t*)delete_child_sa_job_create(proto, spi, dst, hard));
86: }
87: else
88: {
89: lib->processor->queue_job(lib->processor,
90: (job_t*)rekey_child_sa_job_create(proto, spi, dst));
91: }
92: return TRUE;
93: }
94:
95: METHOD(kernel_listener_t, mapping, bool,
96: private_kernel_handler_t *this, uint8_t protocol, uint32_t spi,
97: host_t *dst, host_t *remote)
98: {
99: protocol_id_t proto = proto_ip2ike(protocol);
100:
101: DBG1(DBG_KNL, "NAT mappings of CHILD_SA %N/0x%08x/%H changed to %#H, "
102: "queuing update job", protocol_id_names, proto, ntohl(spi), dst,
103: remote);
104:
105: lib->processor->queue_job(lib->processor,
106: (job_t*)update_sa_job_create(proto, spi, dst, remote));
107: return TRUE;
108: }
109:
110: METHOD(kernel_listener_t, migrate, bool,
111: private_kernel_handler_t *this, uint32_t reqid,
112: traffic_selector_t *src_ts, traffic_selector_t *dst_ts,
113: policy_dir_t direction, host_t *local, host_t *remote)
114: {
115: DBG1(DBG_KNL, "creating migrate job for policy %R === %R %N with reqid {%u}",
116: src_ts, dst_ts, policy_dir_names, direction, reqid, local);
117:
118: lib->processor->queue_job(lib->processor,
119: (job_t*)migrate_job_create(reqid, src_ts, dst_ts,
120: direction, local, remote));
121: return TRUE;
122: }
123:
124: METHOD(kernel_listener_t, roam, bool,
125: private_kernel_handler_t *this, bool address)
126: {
127: DBG2(DBG_KNL, "creating roam job %s",
128: address ? "due to address/link change" : "due to route change");
129:
130: lib->processor->queue_job(lib->processor, (job_t*)roam_job_create(address));
131: return TRUE;
132: }
133:
134: METHOD(kernel_handler_t, destroy, void,
135: private_kernel_handler_t *this)
136: {
137: charon->kernel->remove_listener(charon->kernel, &this->public.listener);
138: free(this);
139: }
140:
141: kernel_handler_t *kernel_handler_create()
142: {
143: private_kernel_handler_t *this;
144:
145: INIT(this,
146: .public = {
147: .listener = {
148: .acquire = _acquire,
149: .expire = _expire,
150: .mapping = _mapping,
151: .migrate = _migrate,
152: .roam = _roam,
153: },
154: .destroy = _destroy,
155: },
156: );
157:
158: charon->kernel->add_listener(charon->kernel, &this->public.listener);
159:
160: return &this->public;
161: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>