1e6fe3fe919fd6c40c29afc193f0cae7ba880a3f
2 * Copyright (C) 2008-2009 Tobias Brunner
3 * Copyright (C) 2005-2007 Martin Willi
4 * Copyright (C) 2005 Jan Hutter
5 * Hochschule fuer Technik Rapperswil
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2 of the License, or (at your
10 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19 * @defgroup child_cfg child_cfg
26 typedef enum action_t action_t
;
27 typedef struct child_cfg_t child_cfg_t
;
30 #include <selectors/traffic_selector.h>
31 #include <config/proposal.h>
32 #include <kernel/kernel_ipsec.h>
35 * Action to take when DPD detected/connection gets closed by peer.
40 /** Route config to reestablish on demand */
42 /** Restart config immediately */
47 * enum names for action_t.
49 extern enum_name_t
*action_names
;
52 * A child_cfg_t defines the config template for a CHILD_SA.
54 * After creation, proposals and traffic selectors may be added to the config.
55 * A child_cfg object is referenced multiple times, and is not thread save.
56 * Reading from the object is save, adding things is not allowed while other
57 * threads may access the object.
58 * A reference counter handles the number of references hold to this config.
60 * @see peer_cfg_t to get an overview over the configurations.
65 * Get the name of the child_cfg.
67 * @return child_cfg's name
69 char *(*get_name
) (child_cfg_t
*this);
72 * Add a proposal to the list.
74 * The proposals are stored by priority, first added
75 * is the most prefered.
76 * After add, proposal is owned by child_cfg.
78 * @param proposal proposal to add
80 void (*add_proposal
) (child_cfg_t
*this, proposal_t
*proposal
);
83 * Get the list of proposals for the CHILD_SA.
85 * Resulting list and all of its proposals must be freed after use.
87 * @param strip_dh TRUE strip out diffie hellman groups
88 * @return list of proposals
90 linked_list_t
* (*get_proposals
)(child_cfg_t
*this, bool strip_dh
);
93 * Select a proposal from a supplied list.
95 * Returned propsal is newly created and must be destroyed after usage.
97 * @param proposals list from from wich proposals are selected
98 * @param strip_dh TRUE strip out diffie hellman groups
99 * @param private accept algorithms from a private range
100 * @return selected proposal, or NULL if nothing matches
102 proposal_t
* (*select_proposal
)(child_cfg_t
*this, linked_list_t
*proposals
,
103 bool strip_dh
, bool private);
106 * Add a traffic selector to the config.
108 * Use the "local" parameter to add it for the local or the remote side.
109 * After add, traffic selector is owned by child_cfg.
111 * @param local TRUE for local side, FALSE for remote
112 * @param ts traffic_selector to add
114 void (*add_traffic_selector
)(child_cfg_t
*this, bool local
,
115 traffic_selector_t
*ts
);
118 * Get a list of traffic selectors to use for the CHILD_SA.
120 * The config contains two set of traffic selectors, one for the local
121 * side, one for the remote side.
122 * If a list with traffic selectors is supplied, these are used to narrow
123 * down the traffic selector list to the greatest common divisor.
124 * Some traffic selector may be "dymamic", meaning they are narrowed down
125 * to a specific address (host-to-host or virtual-IP setups). Use
126 * the "host" parameter to narrow such traffic selectors to that address.
127 * Resulted list and its traffic selectors must be destroyed after use.
129 * @param local TRUE for TS on local side, FALSE for remote
130 * @param supplied list with TS to select from, or NULL
131 * @param host address to use for narrowing "dynamic" TS', or NULL
132 * @return list containing the traffic selectors
134 linked_list_t
*(*get_traffic_selectors
)(child_cfg_t
*this, bool local
,
135 linked_list_t
*supplied
,
138 * Get the updown script to run for the CHILD_SA.
140 * @return path to updown script
142 char* (*get_updown
)(child_cfg_t
*this);
145 * Should we allow access to the local host (gateway)?
147 * @return value of hostaccess flag
149 bool (*get_hostaccess
) (child_cfg_t
*this);
152 * Get the lifetime configuration of a CHILD_SA.
154 * The rekey limits automatically contain a jitter to avoid simultaneous
155 * rekeying. These values will change with each call to this function.
157 * @return lifetime_cfg_t (has to be freed)
159 lifetime_cfg_t
* (*get_lifetime
) (child_cfg_t
*this);
162 * Get the mode to use for the CHILD_SA.
164 * The mode is either tunnel, transport or BEET. The peer must agree
165 * on the method, fallback is tunnel mode.
169 ipsec_mode_t (*get_mode
) (child_cfg_t
*this);
172 * Action to take on DPD.
176 action_t (*get_dpd_action
) (child_cfg_t
*this);
179 * Action to take if CHILD_SA gets closed.
181 * @return close action
183 action_t (*get_close_action
) (child_cfg_t
*this);
186 * Get the DH group to use for CHILD_SA setup.
188 * @return dh group to use
190 diffie_hellman_group_t (*get_dh_group
)(child_cfg_t
*this);
193 * Check whether IPComp should be used, if the other peer supports it.
195 * @return TRUE, if IPComp should be used
198 bool (*use_ipcomp
)(child_cfg_t
*this);
201 * Get the inactivity timeout value.
203 * @return inactivity timeout in s
205 u_int32_t (*get_inactivity
)(child_cfg_t
*this);
208 * Specific reqid to use for CHILD_SA
212 u_int32_t (*get_reqid
)(child_cfg_t
*this);
215 * Optional mark for CHILD_SA
217 * @param inbound TRUE for inbound, FALSE for outbound
220 mark_t (*get_mark
)(child_cfg_t
*this, bool inbound
);
223 * Sets two options needed for Mobile IPv6 interoperability
225 * @param proxy_mode use IPsec transport proxy mode (default FALSE)
226 * @param install_policy install IPsec kernel policies (default TRUE)
228 void (*set_mipv6_options
)(child_cfg_t
*this, bool proxy_mode
,
229 bool install_policy
);
232 * Check whether IPsec transport SA should be set up in proxy mode
234 * @return TRUE, if proxy mode should be used
237 bool (*use_proxy_mode
)(child_cfg_t
*this);
240 * Check whether IPsec policies should be installed in the kernel
242 * @return TRUE, if IPsec kernel policies should be installed
245 bool (*install_policy
)(child_cfg_t
*this);
248 * Increase the reference count.
250 * @return reference to this
252 child_cfg_t
* (*get_ref
) (child_cfg_t
*this);
255 * Destroys the child_cfg object.
257 * Decrements the internal reference counter and
258 * destroys the child_cfg when it reaches zero.
260 void (*destroy
) (child_cfg_t
*this);
264 * Create a configuration template for CHILD_SA setup.
266 * The "name" string gets cloned.
268 * The lifetime_cfg_t object gets cloned.
269 * To prevent two peers to start rekeying at the same time, a jitter may be
270 * specified. Rekeying of an SA starts at (x.rekey - random(0, x.jitter)).
272 * After a call to create, a reference is obtained (refcount = 1).
274 * @param name name of the child_cfg
275 * @param lifetime lifetime_cfg_t for this child_cfg
276 * @param updown updown script to execute on up/down event
277 * @param hostaccess TRUE to allow access to the local host
278 * @param mode mode to propose for CHILD_SA, transport, tunnel or BEET
279 * @param dpd_action DPD action
280 * @param close_action close action
281 * @param ipcomp use IPComp, if peer supports it
282 * @param inactivity inactivity timeout in s before closing a CHILD_SA
283 * @param reqid specific reqid to use for CHILD_SA, 0 for auto assign
284 * @param mark_in optional inbound mark (can be NULL)
285 * @param mark_out optional outbound mark (can be NULL)
286 * @return child_cfg_t object
288 child_cfg_t
*child_cfg_create(char *name
, lifetime_cfg_t
*lifetime
,
289 char *updown
, bool hostaccess
,
290 ipsec_mode_t mode
, action_t dpd_action
,
291 action_t close_action
, bool ipcomp
,
292 u_int32_t inactivity
, u_int32_t reqid
,
293 mark_t
*mark_in
, mark_t
*mark_out
);
295 #endif /** CHILD_CFG_H_ @}*/