2 * Copyright (C) 2008 Thomas Kallenberg
3 * Copyright (C) 2008 Tobias Brunner
4 * Copyright (C) 2008 Martin Willi
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
21 #include "uci_config.h"
22 #include "uci_parser.h"
26 typedef struct private_uci_config_t private_uci_config_t
;
29 * Private data of an uci_config_t object
31 struct private_uci_config_t
{
45 * enumerator implementation for create_peer_cfg_enumerator
48 /** implements enumerator */
50 /** currently enumerated peer config */
52 /** inner uci_parser section enumerator */
57 * create a proposal from a string, with fallback to default
59 static proposal_t
*create_proposal(char *string
, protocol_id_t proto
)
61 proposal_t
*proposal
= NULL
;
65 proposal
= proposal_create_from_string(proto
, string
);
68 { /* UCI default is aes/sha1 only */
69 if (proto
== PROTO_IKE
)
71 proposal
= proposal_create_from_string(proto
,
72 "aes128-aes192-aes256-sha1-modp1536-modp2048");
76 proposal
= proposal_create_from_string(proto
,
77 "aes128-aes192-aes256-sha1");
84 * create an traffic selector, fallback to dynamic
86 static traffic_selector_t
*create_ts(char *string
)
94 string
= strdupa(string
);
95 pos
= strchr(string
, '/');
103 if (strchr(string
, ':'))
108 net
= host_create_from_string(string
, 0);
111 return traffic_selector_create_from_subnet(net
, netbits
, 0, 0);
114 return traffic_selector_create_dynamic(0, 0, 65535);
118 * create a rekey time from a string with hours, with fallback
120 static u_int
create_rekey(char *string
)
126 rekey
= atoi(string
);
136 METHOD(enumerator_t
, peer_enumerator_enumerate
, bool,
137 peer_enumerator_t
*this, peer_cfg_t
**cfg
)
139 char *name
, *ike_proposal
, *esp_proposal
, *ike_rekey
, *esp_rekey
;
140 char *local_id
, *local_addr
, *local_net
;
141 char *remote_id
, *remote_addr
, *remote_net
;
142 child_cfg_t
*child_cfg
;
145 lifetime_cfg_t lifetime
= {
147 .life
= create_rekey(esp_rekey
) + 300,
148 .rekey
= create_rekey(esp_rekey
),
157 local_addr
= "0.0.0.0";
158 remote_addr
= "0.0.0.0";
166 if (this->inner
->enumerate(this->inner
, &name
, &local_id
, &remote_id
,
167 &local_addr
, &remote_addr
, &local_net
, &remote_net
,
168 &ike_proposal
, &esp_proposal
, &ike_rekey
, &esp_rekey
))
170 DESTROY_IF(this->peer_cfg
);
171 ike_cfg
= ike_cfg_create(FALSE
, FALSE
,
172 local_addr
, FALSE
, IKEV2_UDP_PORT
,
173 remote_addr
, FALSE
, IKEV2_UDP_PORT
);
174 ike_cfg
->add_proposal(ike_cfg
, create_proposal(ike_proposal
, PROTO_IKE
));
175 this->peer_cfg
= peer_cfg_create(
176 name
, IKEV2
, ike_cfg
, CERT_SEND_IF_ASKED
, UNIQUE_NO
,
177 1, create_rekey(ike_rekey
), 0, /* keytries, rekey, reauth */
178 1800, 900, /* jitter, overtime */
179 TRUE
, FALSE
, /* mobike, aggressive */
180 60, 0, /* DPD delay, timeout */
181 NULL
, NULL
, /* vip, pool */
182 FALSE
, NULL
, NULL
); /* mediation, med by, peer id */
183 auth
= auth_cfg_create();
184 auth
->add(auth
, AUTH_RULE_AUTH_CLASS
, AUTH_CLASS_PSK
);
185 auth
->add(auth
, AUTH_RULE_IDENTITY
,
186 identification_create_from_string(local_id
));
187 this->peer_cfg
->add_auth_cfg(this->peer_cfg
, auth
, TRUE
);
189 auth
= auth_cfg_create();
190 auth
->add(auth
, AUTH_RULE_AUTH_CLASS
, AUTH_CLASS_PSK
);
193 auth
->add(auth
, AUTH_RULE_IDENTITY
,
194 identification_create_from_string(remote_id
));
196 this->peer_cfg
->add_auth_cfg(this->peer_cfg
, auth
, FALSE
);
198 child_cfg
= child_cfg_create(name
, &lifetime
, NULL
, TRUE
, MODE_TUNNEL
,
199 ACTION_NONE
, ACTION_NONE
, ACTION_NONE
,
200 FALSE
, 0, 0, NULL
, NULL
, 0);
201 child_cfg
->add_proposal(child_cfg
, create_proposal(esp_proposal
, PROTO_ESP
));
202 child_cfg
->add_traffic_selector(child_cfg
, TRUE
, create_ts(local_net
));
203 child_cfg
->add_traffic_selector(child_cfg
, FALSE
, create_ts(remote_net
));
204 this->peer_cfg
->add_child_cfg(this->peer_cfg
, child_cfg
);
205 *cfg
= this->peer_cfg
;
212 METHOD(enumerator_t
, peer_enumerator_destroy
, void,
213 peer_enumerator_t
*this)
215 DESTROY_IF(this->peer_cfg
);
216 this->inner
->destroy(this->inner
);
220 METHOD(backend_t
, create_peer_cfg_enumerator
, enumerator_t
*,
221 private_uci_config_t
*this, identification_t
*me
, identification_t
*other
)
223 peer_enumerator_t
*e
;
227 .enumerate
= (void*)_peer_enumerator_enumerate
,
228 .destroy
= _peer_enumerator_destroy
,
230 .inner
= this->parser
->create_section_enumerator(this->parser
,
231 "local_id", "remote_id", "local_addr", "remote_addr",
232 "local_net", "remote_net", "ike_proposal", "esp_proposal",
233 "ike_rekey", "esp_rekey", NULL
),
244 * enumerator implementation for create_ike_cfg_enumerator
247 /** implements enumerator */
249 /** currently enumerated ike config */
251 /** inner uci_parser section enumerator */
255 METHOD(enumerator_t
, ike_enumerator_enumerate
, bool,
256 ike_enumerator_t
*this, ike_cfg_t
**cfg
)
258 char *local_addr
, *remote_addr
, *ike_proposal
;
261 local_addr
= "0.0.0.0";
262 remote_addr
= "0.0.0.0";
265 if (this->inner
->enumerate(this->inner
, NULL
,
266 &local_addr
, &remote_addr
, &ike_proposal
))
268 DESTROY_IF(this->ike_cfg
);
269 this->ike_cfg
= ike_cfg_create(FALSE
, FALSE
,
270 local_addr
, FALSE
, IKEV2_UDP_PORT
,
271 remote_addr
, FALSE
, IKEV2_UDP_PORT
);
272 this->ike_cfg
->add_proposal(this->ike_cfg
,
273 create_proposal(ike_proposal
, PROTO_IKE
));
275 *cfg
= this->ike_cfg
;
281 METHOD(enumerator_t
, ike_enumerator_destroy
, void,
282 ike_enumerator_t
*this)
284 DESTROY_IF(this->ike_cfg
);
285 this->inner
->destroy(this->inner
);
289 METHOD(backend_t
, create_ike_cfg_enumerator
, enumerator_t
*,
290 private_uci_config_t
*this, host_t
*me
, host_t
*other
)
296 .enumerate
= (void*)_ike_enumerator_enumerate
,
297 .destroy
= _ike_enumerator_destroy
,
299 .inner
= this->parser
->create_section_enumerator(this->parser
,
300 "local_addr", "remote_addr", "ike_proposal", NULL
),
310 METHOD(backend_t
, get_peer_cfg_by_name
, peer_cfg_t
*,
311 private_uci_config_t
*this, char *name
)
313 enumerator_t
*enumerator
;
314 peer_cfg_t
*current
, *found
= NULL
;
316 enumerator
= create_peer_cfg_enumerator(this, NULL
, NULL
);
319 while (enumerator
->enumerate(enumerator
, ¤t
))
321 if (streq(name
, current
->get_name(current
)))
323 found
= current
->get_ref(current
);
327 enumerator
->destroy(enumerator
);
332 METHOD(uci_config_t
, destroy
, void,
333 private_uci_config_t
*this)
339 * Described in header.
341 uci_config_t
*uci_config_create(uci_parser_t
*parser
)
343 private_uci_config_t
*this;
348 .create_peer_cfg_enumerator
= _create_peer_cfg_enumerator
,
349 .create_ike_cfg_enumerator
= _create_ike_cfg_enumerator
,
350 .get_peer_cfg_by_name
= _get_peer_cfg_by_name
,
357 return &this->public;