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
, IKEV2_UDP_PORT
, remote_addr
, IKEV2_UDP_PORT
);
173 ike_cfg
->add_proposal(ike_cfg
, create_proposal(ike_proposal
, PROTO_IKE
));
174 this->peer_cfg
= peer_cfg_create(
175 name
, IKEV2
, ike_cfg
, CERT_SEND_IF_ASKED
, UNIQUE_NO
,
176 1, create_rekey(ike_rekey
), 0, /* keytries, rekey, reauth */
177 1800, 900, /* jitter, overtime */
178 TRUE
, FALSE
, 60, /* mobike, aggr., dpddelay */
179 NULL
, NULL
, /* vip, pool */
180 FALSE
, NULL
, NULL
); /* mediation, med by, peer id */
181 auth
= auth_cfg_create();
182 auth
->add(auth
, AUTH_RULE_AUTH_CLASS
, AUTH_CLASS_PSK
);
183 auth
->add(auth
, AUTH_RULE_IDENTITY
,
184 identification_create_from_string(local_id
));
185 this->peer_cfg
->add_auth_cfg(this->peer_cfg
, auth
, TRUE
);
187 auth
= auth_cfg_create();
188 auth
->add(auth
, AUTH_RULE_AUTH_CLASS
, AUTH_CLASS_PSK
);
191 auth
->add(auth
, AUTH_RULE_IDENTITY
,
192 identification_create_from_string(remote_id
));
194 this->peer_cfg
->add_auth_cfg(this->peer_cfg
, auth
, FALSE
);
196 child_cfg
= child_cfg_create(name
, &lifetime
, NULL
, TRUE
, MODE_TUNNEL
,
197 ACTION_NONE
, ACTION_NONE
, ACTION_NONE
,
198 FALSE
, 0, 0, NULL
, NULL
, 0);
199 child_cfg
->add_proposal(child_cfg
, create_proposal(esp_proposal
, PROTO_ESP
));
200 child_cfg
->add_traffic_selector(child_cfg
, TRUE
, create_ts(local_net
));
201 child_cfg
->add_traffic_selector(child_cfg
, FALSE
, create_ts(remote_net
));
202 this->peer_cfg
->add_child_cfg(this->peer_cfg
, child_cfg
);
203 *cfg
= this->peer_cfg
;
210 METHOD(enumerator_t
, peer_enumerator_destroy
, void,
211 peer_enumerator_t
*this)
213 DESTROY_IF(this->peer_cfg
);
214 this->inner
->destroy(this->inner
);
218 METHOD(backend_t
, create_peer_cfg_enumerator
, enumerator_t
*,
219 private_uci_config_t
*this, identification_t
*me
, identification_t
*other
)
221 peer_enumerator_t
*e
;
225 .enumerate
= (void*)_peer_enumerator_enumerate
,
226 .destroy
= _peer_enumerator_destroy
,
228 .inner
= this->parser
->create_section_enumerator(this->parser
,
229 "local_id", "remote_id", "local_addr", "remote_addr",
230 "local_net", "remote_net", "ike_proposal", "esp_proposal",
231 "ike_rekey", "esp_rekey", NULL
),
242 * enumerator implementation for create_ike_cfg_enumerator
245 /** implements enumerator */
247 /** currently enumerated ike config */
249 /** inner uci_parser section enumerator */
253 METHOD(enumerator_t
, ike_enumerator_enumerate
, bool,
254 ike_enumerator_t
*this, ike_cfg_t
**cfg
)
256 char *local_addr
, *remote_addr
, *ike_proposal
;
259 local_addr
= "0.0.0.0";
260 remote_addr
= "0.0.0.0";
263 if (this->inner
->enumerate(this->inner
, NULL
,
264 &local_addr
, &remote_addr
, &ike_proposal
))
266 DESTROY_IF(this->ike_cfg
);
267 this->ike_cfg
= ike_cfg_create(FALSE
, FALSE
, local_addr
, IKEV2_UDP_PORT
,
268 remote_addr
, IKEV2_UDP_PORT
);
269 this->ike_cfg
->add_proposal(this->ike_cfg
,
270 create_proposal(ike_proposal
, PROTO_IKE
));
272 *cfg
= this->ike_cfg
;
278 METHOD(enumerator_t
, ike_enumerator_destroy
, void,
279 ike_enumerator_t
*this)
281 DESTROY_IF(this->ike_cfg
);
282 this->inner
->destroy(this->inner
);
286 METHOD(backend_t
, create_ike_cfg_enumerator
, enumerator_t
*,
287 private_uci_config_t
*this, host_t
*me
, host_t
*other
)
293 .enumerate
= (void*)_ike_enumerator_enumerate
,
294 .destroy
= _ike_enumerator_destroy
,
296 .inner
= this->parser
->create_section_enumerator(this->parser
,
297 "local_addr", "remote_addr", "ike_proposal", NULL
),
307 METHOD(backend_t
, get_peer_cfg_by_name
, peer_cfg_t
*,
308 private_uci_config_t
*this, char *name
)
310 enumerator_t
*enumerator
;
311 peer_cfg_t
*current
, *found
= NULL
;
313 enumerator
= create_peer_cfg_enumerator(this, NULL
, NULL
);
316 while (enumerator
->enumerate(enumerator
, ¤t
))
318 if (streq(name
, current
->get_name(current
)))
320 found
= current
->get_ref(current
);
324 enumerator
->destroy(enumerator
);
329 METHOD(uci_config_t
, destroy
, void,
330 private_uci_config_t
*this)
336 * Described in header.
338 uci_config_t
*uci_config_create(uci_parser_t
*parser
)
340 private_uci_config_t
*this;
345 .create_peer_cfg_enumerator
= _create_peer_cfg_enumerator
,
346 .create_ike_cfg_enumerator
= _create_ike_cfg_enumerator
,
347 .get_peer_cfg_by_name
= _get_peer_cfg_by_name
,
354 return &this->public;