aboutsummaryrefslogtreecommitdiffstats
path: root/src/charon/plugins/load_tester/load_tester_plugin.c
blob: b7eb675f05b1818e07e486f2ee41870b286c2c31 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/*
 * Copyright (C) 2008 Martin Willi
 * Hochschule fuer Technik Rapperswil
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2 of the License, or (at your
 * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 *
 * $Id$
 */

#include "load_tester_plugin.h"
#include "load_tester_config.h"
#include "load_tester_creds.h"
#include "load_tester_ipsec.h"

#include <daemon.h>
#include <processing/jobs/callback_job.h>

typedef struct private_load_tester_plugin_t private_load_tester_plugin_t;

/**
 * private data of load_tester plugin
 */
struct private_load_tester_plugin_t {

	/**
	 * implements plugin interface
	 */
	load_tester_plugin_t public;
	
	/**
	 * load_tester configuration backend
	 */
	load_tester_config_t *config;
	
	/**
	 * load_tester credential set implementation
	 */
	load_tester_creds_t *creds;
};

/**
 * Begin the load test
 */
static job_requeue_t do_load_test(private_load_tester_plugin_t *this)
{
	peer_cfg_t *peer_cfg;
	child_cfg_t *child_cfg = NULL;;
	enumerator_t *enumerator;
	int iterations, i;
	
	iterations = lib->settings->get_int(lib->settings,
							"charon.plugins.load_tester.iterations", 0);
	
	peer_cfg = charon->backends->get_peer_cfg_by_name(charon->backends,
													  "load-test");
	if (peer_cfg)
	{
		enumerator = peer_cfg->create_child_cfg_enumerator(peer_cfg);
		if (enumerator->enumerate(enumerator, &child_cfg))
		{
			child_cfg->get_ref(child_cfg);
		}
		enumerator->destroy(enumerator);
		
		if (child_cfg)
		{
			for (i = 0; i < iterations; i++)
			{
				charon->controller->initiate(charon->controller,
					peer_cfg->get_ref(peer_cfg), child_cfg->get_ref(child_cfg),
					NULL, NULL);
			}
			child_cfg->destroy(child_cfg);
		}
		peer_cfg->destroy(peer_cfg);
	}
	return JOB_REQUEUE_NONE;
}

/**
 * Implementation of plugin_t.destroy
 */
static void destroy(private_load_tester_plugin_t *this)
{
	charon->kernel_interface->remove_ipsec_interface(charon->kernel_interface,
						(kernel_ipsec_constructor_t)load_tester_ipsec_create);
	charon->backends->remove_backend(charon->backends, &this->config->backend);
	charon->credentials->remove_set(charon->credentials, &this->creds->credential_set);
	this->config->destroy(this->config);
	this->creds->destroy(this->creds);
	free(this);
}

/*
 * see header file
 */
plugin_t *plugin_create()
{
	private_load_tester_plugin_t *this = malloc_thing(private_load_tester_plugin_t);
	
	this->public.plugin.destroy = (void(*)(plugin_t*))destroy;
	
	this->config = load_tester_config_create();
	this->creds = load_tester_creds_create();
	charon->backends->add_backend(charon->backends, &this->config->backend);
	charon->credentials->add_set(charon->credentials, &this->creds->credential_set);
	charon->kernel_interface->add_ipsec_interface(charon->kernel_interface, 
						(kernel_ipsec_constructor_t)load_tester_ipsec_create);
	
	charon->processor->queue_job(charon->processor, (job_t*)callback_job_create(
							(callback_job_cb_t)do_load_test, this, NULL, NULL));
	return &this->public.plugin;
}