summaryrefslogtreecommitdiff
path: root/src/charon/control/interface_manager.h
blob: 06a5fe6c426f73b82fa5987ddbb71e209db13de9 (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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
/**
 * @file interface_manager.h
 *
 * @brief Interface of interface_manager_t.
 *
 */

/*
 * Copyright (C) 2007 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.
 */

#ifndef INTERFACE_MANAGER_H_
#define INTERFACE_MANAGER_H_

#include <bus/bus.h>

/**
 * callback to log things triggered by interface_manager.
 *
 * @param param			echoed parameter supplied when function invoked
 * @param signal		type of signal
 * @param level			verbosity level if log
 * @param ike_sa		associated IKE_SA, if any
 * @param format		printf like format string
 * @param args			list of arguments to use for format
 * @return				FALSE to return from invoked function
 * @ingroup control
 */
typedef bool(*interface_manager_cb_t)(void* param, signal_t signal, level_t level,
							   ike_sa_t* ike_sa, char* format, va_list args);

typedef struct interface_manager_t interface_manager_t;

/**
 * @brief The interface_manager loads control interfaces and has helper methods.
 *
 * One job of the interface manager is to load pluggable control interface
 * modules, implemented as interface_t.
 * @verbatim

   +---------+      +------------+         +--------------+     |
   |         |      |            |<----- +--------------+ |     |
   | daemon  |<-----| interface- |     +--------------+ |-+  <==|==> IPC
   |  core   |      | manager    |<----|  interfaces  |-+       |
   |         |<-----|            |     +--------------+         |
   |         |      |            |                              |
   +---------+      +------------+                              |

   @endverbatim
 * The manager does not really use the interfaces, instead, the interface
 * use the manager to fullfill their tasks (initiating, terminating, ...). 
 * The interface_manager starts actions by creating jobs. It then tries to
 * evaluate the result of the operation by listening on the bus.
 * 
 * @b Constructors:
 * - interface_manager_create()
 * 
 * @ingroup control
 */
struct interface_manager_t {

	/**
	 * @brief Create an iterator for all IKE_SAs.
	 *
	 * The iterator blocks the IKE_SA manager until it gets destroyed. Do
	 * not call another interface/manager method while the iterator is alive.
	 *
	 * @param this			calling object
	 * @return				iterator, locks IKE_SA manager until destroyed
	 */
	iterator_t* (*create_ike_sa_iterator)(interface_manager_t *this);

	/**
	 * @brief Initiate a CHILD_SA, and if required, an IKE_SA.
	 *
	 * The inititate() function is synchronous and thus blocks until the
	 * IKE_SA is established or failed. Because of this, the initiate() function
	 * contains a thread cancellation point.
	 *
	 * @param this			calling object
	 * @param peer_cfg		peer_cfg to use for IKE_SA setup
	 * @param child_cfg		child_cfg to set up CHILD_SA from
	 * @param cb			logging callback
	 * @param param			parameter to include in each call of cb
	 * @return
	 *						- SUCCESS, if CHILD_SA established
	 *						- FAILED, if setup failed
	 *						- NEED_MORE, if callback returned FALSE
	 */
	status_t (*initiate)(interface_manager_t *this,
						 peer_cfg_t *peer_cfg, child_cfg_t *child_cfg,
						 interface_manager_cb_t callback, void *param);

	/**
	 * @brief Terminate an IKE_SA and all of its CHILD_SAs.
	 *
	 * The terminate() function is synchronous and thus blocks until the
	 * IKE_SA is properly deleted, or the delete timed out. 
	 * The terminate() function contains a thread cancellation point.
	 *
	 * @param this			calling object
	 * @param unique_id		unique id of the IKE_SA to terminate.
	 * @param cb			logging callback
	 * @param param			parameter to include in each call of cb
	 * @return
	 *						- SUCCESS, if CHILD_SA terminated
	 *						- NOT_FOUND, if no such CHILD_SA found
	 *						- NEED_MORE, if callback returned FALSE
	 */
	status_t (*terminate_ike)(interface_manager_t *this, u_int32_t unique_id, 
							  interface_manager_cb_t callback, void *param);
	
	/**
	 * @brief Terminate a CHILD_SA.
	 *
	 * @param this			calling object
	 * @param reqid			reqid of the CHILD_SA to terminate
	 * @param cb			logging callback
	 * @param param			parameter to include in each call of cb
	 * @return
	 *						- SUCCESS, if CHILD_SA terminated
	 *						- NOT_FOUND, if no such CHILD_SA found
	 *						- NEED_MORE, if callback returned FALSE
	 */
	status_t (*terminate_child)(interface_manager_t *this, u_int32_t reqid, 
								interface_manager_cb_t callback, void *param);
	
	/**
	 * @brief Route a CHILD_SA (install triggering policies).
	 *
	 * @param this			calling object
	 * @param peer_cfg		peer_cfg to use for IKE_SA setup, if triggered
	 * @param child_cfg		child_cfg to route
	 * @param cb			logging callback
	 * @param param			parameter to include in each call of cb
	 * @return
	 *						- SUCCESS, if CHILD_SA routed
	 *						- FAILED, if routing failed
	 *						- NEED_MORE, if callback returned FALSE
	 */
	status_t (*route)(interface_manager_t *this,
					  peer_cfg_t *peer_cfg, child_cfg_t *child_cfg,
					  interface_manager_cb_t callback, void *param);
	
	/**
	 * @brief Unroute a routed CHILD_SA (uninstall triggering policies).
	 *
	 * Only the route is removed, not the CHILD_SAs the route triggered.
	 *
	 * @param this			calling object
	 * @param reqid			reqid of the CHILD_SA to unroute
	 * @param cb			logging callback
	 * @param param			parameter to include in each call of cb
	 * @return
	 *						- SUCCESS, if CHILD_SA terminated
	 *						- NOT_FOUND, if no such CHILD_SA routed
	 *						- NEED_MORE, if callback returned FALSE
	 */
	status_t (*unroute)(interface_manager_t *this, u_int32_t reqid, 
						interface_manager_cb_t callback, void *param);
	
	/**
	 * @brief Destroy a interface_manager_t instance.
	 * 
	 * @param this		interface_manager_t objec to destroy
	 */
	void (*destroy) (interface_manager_t *this);
};


/**
 * @brief Creates a interface_manager instance and loads all interface modules.
 * 
 * @return 			interface_manager_t object
 * 
 * @ingroup control
 */
interface_manager_t *interface_manager_create(void);

#endif /* INTERFACE_MANAGER_H_ */