Annotation of embedaddon/strongswan/src/libcharon/processing/jobs/migrate_job.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2008 Andreas Steffen
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 "migrate_job.h"
17:
18: #include <daemon.h>
19:
20: #include <config/child_cfg.h>
21:
22:
23: typedef struct private_migrate_job_t private_migrate_job_t;
24:
25: /**
26: * Private data of a migrate_job_t object.
27: */
28: struct private_migrate_job_t {
29: /**
30: * Public migrate_job_t interface.
31: */
32: migrate_job_t public;
33:
34: /**
35: * reqid of the CHILD_SA if it already exists
36: */
37: uint32_t reqid;
38:
39: /**
40: * source traffic selector
41: */
42: traffic_selector_t *src_ts;
43:
44: /**
45: * destination traffic selector
46: */
47: traffic_selector_t *dst_ts;
48:
49: /**
50: * local host address to be used for IKE
51: */
52: host_t *local;
53:
54: /**
55: * remote host address to be used for IKE
56: */
57: host_t *remote;
58: };
59:
60: METHOD(job_t, destroy, void,
61: private_migrate_job_t *this)
62: {
63: DESTROY_IF(this->src_ts);
64: DESTROY_IF(this->dst_ts);
65: DESTROY_IF(this->local);
66: DESTROY_IF(this->remote);
67: free(this);
68: }
69:
70: METHOD(job_t, execute, job_requeue_t,
71: private_migrate_job_t *this)
72: {
73: enumerator_t *ike_sas, *children;
74: ike_sa_t *ike_sa;
75:
76: ike_sas = charon->ike_sa_manager->create_enumerator(charon->ike_sa_manager,
77: TRUE);
78: while (ike_sas->enumerate(ike_sas, &ike_sa))
79: {
80: child_sa_t *current, *child_sa = NULL;
81: linked_list_t *vips;
82: status_t status;
83: host_t *host;
84:
85: children = ike_sa->create_child_sa_enumerator(ike_sa);
86: while (children->enumerate(children, ¤t))
87: {
88: if (current->get_reqid(current) == this->reqid)
89: {
90: child_sa = current;
91: break;
92: }
93: }
94: children->destroy(children);
95:
96: if (!child_sa)
97: {
98: continue;
99: }
100:
101: DBG2(DBG_JOB, "found CHILD_SA with reqid {%d}", this->reqid);
102:
103: ike_sa->set_kmaddress(ike_sa, this->local, this->remote);
104:
105: host = this->local->clone(this->local);
106: host->set_port(host, charon->socket->get_port(charon->socket, FALSE));
107: ike_sa->set_my_host(ike_sa, host);
108:
109: host = this->remote->clone(this->remote);
110: host->set_port(host, IKEV2_UDP_PORT);
111: ike_sa->set_other_host(ike_sa, host);
112:
113: vips = linked_list_create_from_enumerator(
114: ike_sa->create_virtual_ip_enumerator(ike_sa, TRUE));
115:
116: status = child_sa->update(child_sa, this->local, this->remote, vips,
117: ike_sa->has_condition(ike_sa, COND_NAT_ANY));
118: switch (status)
119: {
120: case NOT_SUPPORTED:
121: ike_sa->rekey_child_sa(ike_sa, child_sa->get_protocol(child_sa),
122: child_sa->get_spi(child_sa, TRUE));
123: break;
124: case SUCCESS:
125: charon->child_sa_manager->remove(charon->child_sa_manager,
126: child_sa);
127: charon->child_sa_manager->add(charon->child_sa_manager,
128: child_sa, ike_sa);
129: default:
130: break;
131: }
132: vips->destroy(vips);
133: }
134: ike_sas->destroy(ike_sas);
135: return JOB_REQUEUE_NONE;
136: }
137:
138: METHOD(job_t, get_priority, job_priority_t,
139: private_migrate_job_t *this)
140: {
141: return JOB_PRIO_MEDIUM;
142: }
143:
144: /*
145: * Described in header
146: */
147: migrate_job_t *migrate_job_create(uint32_t reqid,
148: traffic_selector_t *src_ts,
149: traffic_selector_t *dst_ts,
150: policy_dir_t dir,
151: host_t *local, host_t *remote)
152: {
153: private_migrate_job_t *this;
154:
155: INIT(this,
156: .public = {
157: .job_interface = {
158: .execute = _execute,
159: .get_priority = _get_priority,
160: .destroy = _destroy,
161: },
162: },
163: .reqid = reqid,
164: .src_ts = (dir == POLICY_OUT) ? src_ts : dst_ts,
165: .dst_ts = (dir == POLICY_OUT) ? dst_ts : src_ts,
166: .local = local,
167: .remote = remote,
168: );
169:
170: return &this->public;
171: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>