2 * Copyright (C) 2008 Martin Willi
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
18 #include "load_tester_plugin.h"
19 #include "load_tester_config.h"
20 #include "load_tester_creds.h"
21 #include "load_tester_ipsec.h"
22 #include "load_tester_listener.h"
23 #include "load_tester_diffie_hellman.h"
28 #include <processing/jobs/callback_job.h>
30 typedef struct private_load_tester_plugin_t private_load_tester_plugin_t
;
33 * private data of load_tester plugin
35 struct private_load_tester_plugin_t
{
38 * implements plugin interface
40 load_tester_plugin_t
public;
43 * load_tester configuration backend
45 load_tester_config_t
*config
;
48 * load_tester credential set implementation
50 load_tester_creds_t
*creds
;
53 * event handler, listens on bus
55 load_tester_listener_t
*listener
;
58 * number of iterations per thread
68 * delay between initiations, in ms
76 static job_requeue_t
do_load_test(private_load_tester_plugin_t
*this)
79 child_cfg_t
*child_cfg
= NULL
;;
80 enumerator_t
*enumerator
;
85 s
= this->delay
/ 1000;
86 ms
= this->delay
% 1000;
88 peer_cfg
= charon
->backends
->get_peer_cfg_by_name(charon
->backends
,
92 enumerator
= peer_cfg
->create_child_cfg_enumerator(peer_cfg
);
93 if (enumerator
->enumerate(enumerator
, &child_cfg
))
95 child_cfg
->get_ref(child_cfg
);
97 enumerator
->destroy(enumerator
);
101 for (i
= 0; this->iterations
== 0 || i
< this->iterations
; i
++)
103 charon
->controller
->initiate(charon
->controller
,
104 peer_cfg
->get_ref(peer_cfg
), child_cfg
->get_ref(child_cfg
),
116 child_cfg
->destroy(child_cfg
);
118 peer_cfg
->destroy(peer_cfg
);
120 return JOB_REQUEUE_NONE
;
124 * Implementation of plugin_t.destroy
126 static void destroy(private_load_tester_plugin_t
*this)
128 charon
->kernel_interface
->remove_ipsec_interface(charon
->kernel_interface
,
129 (kernel_ipsec_constructor_t
)load_tester_ipsec_create
);
130 charon
->backends
->remove_backend(charon
->backends
, &this->config
->backend
);
131 charon
->credentials
->remove_set(charon
->credentials
, &this->creds
->credential_set
);
132 charon
->bus
->remove_listener(charon
->bus
, &this->listener
->listener
);
133 this->config
->destroy(this->config
);
134 this->creds
->destroy(this->creds
);
135 this->listener
->destroy(this->listener
);
136 lib
->crypto
->remove_dh(lib
->crypto
,
137 (dh_constructor_t
)load_tester_diffie_hellman_create
);
144 plugin_t
*plugin_create()
146 private_load_tester_plugin_t
*this = malloc_thing(private_load_tester_plugin_t
);
149 this->public.plugin
.destroy
= (void(*)(plugin_t
*))destroy
;
151 lib
->crypto
->add_dh(lib
->crypto
, MODP_NULL
,
152 (dh_constructor_t
)load_tester_diffie_hellman_create
);
154 this->config
= load_tester_config_create();
155 this->creds
= load_tester_creds_create();
156 this->listener
= load_tester_listener_create();
157 charon
->backends
->add_backend(charon
->backends
, &this->config
->backend
);
158 charon
->credentials
->add_set(charon
->credentials
, &this->creds
->credential_set
);
159 charon
->bus
->add_listener(charon
->bus
, &this->listener
->listener
);
161 if (lib
->settings
->get_bool(lib
->settings
,
162 "charon.plugins.load_tester.fake_kernel", FALSE
))
164 charon
->kernel_interface
->add_ipsec_interface(charon
->kernel_interface
,
165 (kernel_ipsec_constructor_t
)load_tester_ipsec_create
);
167 this->delay
= lib
->settings
->get_int(lib
->settings
,
168 "charon.plugins.load_tester.delay", 0);
169 this->iterations
= lib
->settings
->get_int(lib
->settings
,
170 "charon.plugins.load_tester.iterations", 1);
171 this->initiators
= lib
->settings
->get_int(lib
->settings
,
172 "charon.plugins.load_tester.initiators", 0);
173 for (i
= 0; i
< this->initiators
; i
++)
175 charon
->processor
->queue_job(charon
->processor
,
176 (job_t
*)callback_job_create((callback_job_cb_t
)do_load_test
,
179 return &this->public.plugin
;