Annotation of embedaddon/strongswan/src/libcharon/config/child_cfg.h, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2008-2019 Tobias Brunner
3: * Copyright (C) 2016 Andreas Steffen
4: * Copyright (C) 2005-2007 Martin Willi
5: * Copyright (C) 2005 Jan Hutter
6: * HSR Hochschule fuer Technik Rapperswil
7: *
8: * This program is free software; you can redistribute it and/or modify it
9: * under the terms of the GNU General Public License as published by the
10: * Free Software Foundation; either version 2 of the License, or (at your
11: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
12: *
13: * This program is distributed in the hope that it will be useful, but
14: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16: * for more details.
17: */
18:
19: /**
20: * @defgroup child_cfg child_cfg
21: * @{ @ingroup config
22: */
23:
24: #ifndef CHILD_CFG_H_
25: #define CHILD_CFG_H_
26:
27: typedef enum action_t action_t;
28: typedef enum child_cfg_option_t child_cfg_option_t;
29: typedef struct child_cfg_t child_cfg_t;
30: typedef struct child_cfg_create_t child_cfg_create_t;
31:
32: #include <library.h>
33: #include <selectors/traffic_selector.h>
34: #include <crypto/proposal/proposal.h>
35: #include <kernel/kernel_ipsec.h>
36:
37: /**
38: * Action to take when connection is loaded, DPD is detected or
39: * connection gets closed by peer.
40: */
41: enum action_t {
42: /** No action */
43: ACTION_NONE,
44: /** Route config to establish or reestablish on demand */
45: ACTION_ROUTE,
46: /** Start or restart config immediately */
47: ACTION_RESTART,
48: };
49:
50: /**
51: * enum names for action_t.
52: */
53: extern enum_name_t *action_names;
54:
55: /**
56: * A child_cfg_t defines the config template for a CHILD_SA.
57: *
58: * After creation, proposals and traffic selectors may be added to the config.
59: * A child_cfg object is referenced multiple times, and is not thread save.
60: * Reading from the object is save, adding things is not allowed while other
61: * threads may access the object.
62: * A reference counter handles the number of references hold to this config.
63: *
64: * @see peer_cfg_t to get an overview over the configurations.
65: */
66: struct child_cfg_t {
67:
68: /**
69: * Get the name of the child_cfg.
70: *
71: * @return child_cfg's name
72: */
73: char *(*get_name) (child_cfg_t *this);
74:
75: /**
76: * Add a proposal to the list.
77: *
78: * The proposals are stored by priority, first added
79: * is the most preferred. It is safe to add NULL as proposal, which has no
80: * effect. After add, proposal is owned by child_cfg.
81: *
82: * @param proposal proposal to add, or NULL
83: */
84: void (*add_proposal) (child_cfg_t *this, proposal_t *proposal);
85:
86: /**
87: * Get the list of proposals for the CHILD_SA.
88: *
89: * Resulting list and all of its proposals must be freed after use.
90: *
91: * @param strip_dh TRUE strip out diffie hellman groups
92: * @return list of proposals
93: */
94: linked_list_t* (*get_proposals)(child_cfg_t *this, bool strip_dh);
95:
96: /**
97: * Select a proposal from a supplied list.
98: *
99: * Returned proposal is newly created and must be destroyed after usage.
100: *
101: * @param proposals list from which proposals are selected
102: * @param flags flags to consider during proposal selection
103: * @return selected proposal, or NULL if nothing matches
104: */
105: proposal_t* (*select_proposal)(child_cfg_t*this, linked_list_t *proposals,
106: proposal_selection_flag_t flags);
107:
108: /**
109: * Add a traffic selector to the config.
110: *
111: * Use the "local" parameter to add it for the local or the remote side.
112: * After add, traffic selector is owned by child_cfg.
113: *
114: * @param local TRUE for local side, FALSE for remote
115: * @param ts traffic_selector to add
116: */
117: void (*add_traffic_selector)(child_cfg_t *this, bool local,
118: traffic_selector_t *ts);
119:
120: /**
121: * Get a list of traffic selectors to use for the CHILD_SA.
122: *
123: * The config contains two set of traffic selectors, one for the local
124: * side, one for the remote side.
125: * If a list with traffic selectors is supplied, these are used to narrow
126: * down the traffic selector list to the greatest common divisor.
127: * Some traffic selector may be "dynamic", meaning they are narrowed down
128: * to a specific address (host-to-host or virtual-IP setups). Use
129: * the "host" parameter to narrow such traffic selectors to that address.
130: * Resulted list and its traffic selectors must be destroyed after use.
131: *
132: * @param local TRUE for TS on local side, FALSE for remote
133: * @param supplied list with TS to select from, or NULL
134: * @param hosts addresses to use for narrowing "dynamic" TS', host_t
135: * @param log FALSE to avoid logging details about the selection
136: * @return list containing the traffic selectors
137: */
138: linked_list_t *(*get_traffic_selectors)(child_cfg_t *this, bool local,
139: linked_list_t *supplied,
140: linked_list_t *hosts, bool log);
141:
142: /**
143: * Get the updown script to run for the CHILD_SA.
144: *
145: * @return path to updown script
146: */
147: char* (*get_updown)(child_cfg_t *this);
148:
149: /**
150: * Get the lifetime configuration of a CHILD_SA.
151: *
152: * The rekey limits automatically contain a jitter to avoid simultaneous
153: * rekeying. These values will change with each call to this function.
154: *
155: * @param jitter subtract jitter value to randomize lifetimes
156: * @return lifetime_cfg_t (has to be freed)
157: */
158: lifetime_cfg_t* (*get_lifetime) (child_cfg_t *this, bool jitter);
159:
160: /**
161: * Get the mode to use for the CHILD_SA.
162: *
163: * The mode is either tunnel, transport or BEET. The peer must agree
164: * on the method, fallback is tunnel mode.
165: *
166: * @return ipsec mode
167: */
168: ipsec_mode_t (*get_mode) (child_cfg_t *this);
169:
170: /**
171: * Action to take to start CHILD_SA.
172: *
173: * @return start action
174: */
175: action_t (*get_start_action) (child_cfg_t *this);
176:
177: /**
178: * Action to take on DPD.
179: *
180: * @return DPD action
181: */
182: action_t (*get_dpd_action) (child_cfg_t *this);
183:
184: /**
185: * Get the HW offload mode to use for the CHILD_SA.
186: *
187: * @return hw offload mode
188: */
189: hw_offload_t (*get_hw_offload) (child_cfg_t *this);
190:
191: /**
192: * Get the copy mode for the DS header field to use for the CHILD_SA.
193: *
194: * @return IP header copy mode
195: */
196: dscp_copy_t (*get_copy_dscp) (child_cfg_t *this);
197:
198: /**
199: * Action to take if CHILD_SA gets closed.
200: *
201: * @return close action
202: */
203: action_t (*get_close_action) (child_cfg_t *this);
204:
205: /**
206: * Get the DH group to use for CHILD_SA setup.
207: *
208: * @return dh group to use
209: */
210: diffie_hellman_group_t (*get_dh_group)(child_cfg_t *this);
211:
212: /**
213: * Get the inactivity timeout value.
214: *
215: * @return inactivity timeout in s
216: */
217: uint32_t (*get_inactivity)(child_cfg_t *this);
218:
219: /**
220: * Specific reqid to use for CHILD_SA.
221: *
222: * @return reqid
223: */
224: uint32_t (*get_reqid)(child_cfg_t *this);
225:
226: /**
227: * Optional interface ID to set on policies/SAs.
228: *
229: * @param inbound TRUE for inbound, FALSE for outbound
230: * @return interface ID
231: */
232: uint32_t (*get_if_id)(child_cfg_t *this, bool inbound);
233:
234: /**
235: * Optional mark to set on policies/SAs.
236: *
237: * @param inbound TRUE for inbound, FALSE for outbound
238: * @return mark
239: */
240: mark_t (*get_mark)(child_cfg_t *this, bool inbound);
241:
242: /**
243: * Optional mark the SAs should apply after processing packets.
244: *
245: * @param inbound TRUE for inbound, FALSE for outbound
246: * @return mark
247: */
248: mark_t (*get_set_mark)(child_cfg_t *this, bool inbound);
249:
250: /**
251: * Get the TFC padding value to use for CHILD_SA.
252: *
253: * @return TFC padding, 0 to disable, -1 for MTU
254: */
255: uint32_t (*get_tfc)(child_cfg_t *this);
256:
257: /**
258: * Get optional manually-set IPsec policy priority
259: *
260: * @return manually-set IPsec policy priority (automatic if 0)
261: */
262: uint32_t (*get_manual_prio)(child_cfg_t *this);
263:
264: /**
265: * Get optional network interface restricting IPsec policy
266: *
267: * @return network interface)
268: */
269: char* (*get_interface)(child_cfg_t *this);
270:
271: /**
272: * Get anti-replay window size
273: *
274: * @return anti-replay window size
275: */
276: uint32_t (*get_replay_window)(child_cfg_t *this);
277:
278: /**
279: * Set anti-replay window size
280: *
281: * @param window anti-replay window size
282: */
283: void (*set_replay_window)(child_cfg_t *this, uint32_t window);
284:
285: /**
286: * Check if an option flag is set.
287: *
288: * @param option option flag to check
289: * @return TRUE if option flag set, FALSE otherwise
290: */
291: bool (*has_option)(child_cfg_t *this, child_cfg_option_t option);
292:
293: /**
294: * Check if two child_cfg objects are equal.
295: *
296: * @param other candidate to check for equality against this
297: * @return TRUE if equal
298: */
299: bool (*equals)(child_cfg_t *this, child_cfg_t *other);
300:
301: /**
302: * Increase the reference count.
303: *
304: * @return reference to this
305: */
306: child_cfg_t* (*get_ref) (child_cfg_t *this);
307:
308: /**
309: * Destroys the child_cfg object.
310: *
311: * Decrements the internal reference counter and
312: * destroys the child_cfg when it reaches zero.
313: */
314: void (*destroy) (child_cfg_t *this);
315: };
316:
317: /**
318: * Option flags that may be set on a child_cfg_t object
319: */
320: enum child_cfg_option_t {
321:
322: /** Use IPsec transport proxy mode */
323: OPT_PROXY_MODE = (1<<0),
324:
325: /** Use IPComp, if peer supports it */
326: OPT_IPCOMP = (1<<1),
327:
328: /** Allow access to the local host */
329: OPT_HOSTACCESS = (1<<2),
330:
331: /** Don't install any IPsec policies */
332: OPT_NO_POLICIES = (1<<3),
333:
334: /** Install outbound FWD IPsec policies to bypass drop policies */
335: OPT_FWD_OUT_POLICIES = (1<<4),
336:
337: /** Force 96-bit truncation for SHA-256 */
338: OPT_SHA256_96 = (1<<5),
339:
340: /** Set mark on inbound SAs */
341: OPT_MARK_IN_SA = (1<<6),
342:
343: /** Disable copying the DF bit to the outer IPv4 header in tunnel mode */
344: OPT_NO_COPY_DF = (1<<7),
345:
346: /** Disable copying the ECN header field in tunnel mode */
347: OPT_NO_COPY_ECN = (1<<8),
348: };
349:
350: /**
351: * Data passed to the constructor of a child_cfg_t object.
352: */
353: struct child_cfg_create_t {
354: /** Options set for CHILD_SA */
355: child_cfg_option_t options;
356: /** Specific reqid to use for CHILD_SA, 0 for auto assignment */
357: uint32_t reqid;
358: /** Optional inbound interface ID */
359: uint32_t if_id_in;
360: /** Optional outbound interface ID */
361: uint32_t if_id_out;
362: /** Optional inbound mark */
363: mark_t mark_in;
364: /** Optional outbound mark */
365: mark_t mark_out;
366: /** Optional inbound mark the SA should apply to traffic */
367: mark_t set_mark_in;
368: /** Optional outbound mark the SA should apply to traffic */
369: mark_t set_mark_out;
370: /** Mode to propose for CHILD_SA */
371: ipsec_mode_t mode;
372: /** TFC padding size, 0 to disable, -1 to pad to PMTU */
373: uint32_t tfc;
374: /** Optional manually-set IPsec policy priority */
375: uint32_t priority;
376: /** Optional network interface restricting IPsec policy (cloned) */
377: char *interface;
378: /** lifetime_cfg_t for this child_cfg */
379: lifetime_cfg_t lifetime;
380: /** Inactivity timeout in s before closing a CHILD_SA */
381: uint32_t inactivity;
382: /** Start action */
383: action_t start_action;
384: /** DPD action */
385: action_t dpd_action;
386: /** Close action */
387: action_t close_action;
388: /** updown script to execute on up/down event (cloned) */
389: char *updown;
390: /** HW offload mode */
391: hw_offload_t hw_offload;
392: /** How to handle the DS header field in tunnel mode */
393: dscp_copy_t copy_dscp;
394: };
395:
396: /**
397: * Create a configuration template for CHILD_SA setup.
398: *
399: * After a call to create, a reference is obtained (refcount = 1).
400: *
401: * @param name name of the child_cfg (cloned)
402: * @param data data for this child_cfg
403: * @return child_cfg_t object
404: */
405: child_cfg_t *child_cfg_create(char *name, child_cfg_create_t *data);
406:
407: #endif /** CHILD_CFG_H_ @}*/
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>