Annotation of embedaddon/strongswan/src/libcharon/processing/jobs/inactivity_job.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2010 Martin Willi
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 "inactivity_job.h"
17:
18: #include <daemon.h>
19:
20: typedef struct private_inactivity_job_t private_inactivity_job_t;
21:
22: /**
23: * Private data of an inactivity_job_t object.
24: */
25: struct private_inactivity_job_t {
26:
27: /**
28: * Public inactivity_job_t interface.
29: */
30: inactivity_job_t public;
31:
32: /**
33: * Unique CHILD_SA identifier to check
34: */
35: uint32_t id;
36:
37: /**
38: * Inactivity timeout
39: */
40: uint32_t timeout;
41:
42: /**
43: * Close IKE_SA if last remaining CHILD inactive?
44: */
45: bool close_ike;
46: };
47:
48: METHOD(job_t, destroy, void,
49: private_inactivity_job_t *this)
50: {
51: free(this);
52: }
53:
54: METHOD(job_t, execute, job_requeue_t,
55: private_inactivity_job_t *this)
56: {
57: ike_sa_t *ike_sa;
58: uint32_t reschedule = 0;
59:
60: ike_sa = charon->child_sa_manager->checkout_by_id(charon->child_sa_manager,
61: this->id, NULL);
62: if (ike_sa)
63: {
64: enumerator_t *enumerator;
65: child_sa_t *child_sa;
66: uint32_t delete = 0;
67: protocol_id_t proto = 0;
68: int children = 0;
69: status_t status = SUCCESS;
70:
71: enumerator = ike_sa->create_child_sa_enumerator(ike_sa);
72: while (enumerator->enumerate(enumerator, &child_sa))
73: {
74: if (child_sa->get_unique_id(child_sa) == this->id)
75: {
76: time_t in, out, install, diff;
77:
78: child_sa->get_usestats(child_sa, TRUE, &in, NULL, NULL);
79: child_sa->get_usestats(child_sa, FALSE, &out, NULL, NULL);
80: install = child_sa->get_installtime(child_sa);
81:
82: diff = time_monotonic(NULL) - max(max(in, out), install);
83:
84: if (diff >= this->timeout)
85: {
86: delete = child_sa->get_spi(child_sa, TRUE);
87: proto = child_sa->get_protocol(child_sa);
88: }
89: else
90: {
91: reschedule = this->timeout - diff;
92: }
93: }
94: children++;
95: }
96: enumerator->destroy(enumerator);
97:
98: if (delete)
99: {
100: if (children == 1 && this->close_ike)
101: {
102: DBG1(DBG_JOB, "deleting IKE_SA after %d seconds "
103: "of CHILD_SA inactivity", this->timeout);
104: status = ike_sa->delete(ike_sa, FALSE);
105: }
106: else
107: {
108: DBG1(DBG_JOB, "deleting CHILD_SA after %d seconds "
109: "of inactivity", this->timeout);
110: status = ike_sa->delete_child_sa(ike_sa, proto, delete, FALSE);
111: }
112: }
113: if (status == DESTROY_ME)
114: {
115: charon->ike_sa_manager->checkin_and_destroy(charon->ike_sa_manager,
116: ike_sa);
117: }
118: else
119: {
120: charon->ike_sa_manager->checkin(charon->ike_sa_manager, ike_sa);
121: }
122: }
123: if (reschedule)
124: {
125: return JOB_RESCHEDULE(reschedule);
126: }
127: return JOB_REQUEUE_NONE;
128: }
129:
130: METHOD(job_t, get_priority, job_priority_t,
131: private_inactivity_job_t *this)
132: {
133: return JOB_PRIO_MEDIUM;
134: }
135:
136: /**
137: * See header
138: */
139: inactivity_job_t *inactivity_job_create(uint32_t unique_id, uint32_t timeout,
140: bool close_ike)
141: {
142: private_inactivity_job_t *this;
143:
144: INIT(this,
145: .public = {
146: .job_interface = {
147: .execute = _execute,
148: .get_priority = _get_priority,
149: .destroy = _destroy,
150: },
151: },
152: .id = unique_id,
153: .timeout = timeout,
154: .close_ike = close_ike,
155: );
156:
157: return &this->public;
158: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>