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
)
90 traffic_selector_t
*ts
;
92 ts
= traffic_selector_create_from_cidr(string
, 0, 0, 65535);
98 return traffic_selector_create_dynamic(0, 0, 65535);
102 * create a rekey time from a string with hours, with fallback
104 static u_int
create_rekey(char *string
)
110 rekey
= atoi(string
);
120 METHOD(enumerator_t
, peer_enumerator_enumerate
, bool,
121 peer_enumerator_t
*this, peer_cfg_t
**cfg
)
123 char *name
, *ike_proposal
, *esp_proposal
, *ike_rekey
, *esp_rekey
;
124 char *local_id
, *local_addr
, *local_net
;
125 char *remote_id
, *remote_addr
, *remote_net
;
126 child_cfg_t
*child_cfg
;
129 lifetime_cfg_t lifetime
= {
131 .life
= create_rekey(esp_rekey
) + 300,
132 .rekey
= create_rekey(esp_rekey
),
141 local_addr
= "0.0.0.0";
142 remote_addr
= "0.0.0.0";
150 if (this->inner
->enumerate(this->inner
, &name
, &local_id
, &remote_id
,
151 &local_addr
, &remote_addr
, &local_net
, &remote_net
,
152 &ike_proposal
, &esp_proposal
, &ike_rekey
, &esp_rekey
))
154 DESTROY_IF(this->peer_cfg
);
155 ike_cfg
= ike_cfg_create(IKEV2
, FALSE
, FALSE
,
157 charon
->socket
->get_port(charon
->socket
, FALSE
),
158 remote_addr
, FALSE
, IKEV2_UDP_PORT
,
159 FRAGMENTATION_NO
, 0);
160 ike_cfg
->add_proposal(ike_cfg
, create_proposal(ike_proposal
, PROTO_IKE
));
161 this->peer_cfg
= peer_cfg_create(
162 name
, ike_cfg
, CERT_SEND_IF_ASKED
, UNIQUE_NO
,
163 1, create_rekey(ike_rekey
), 0, /* keytries, rekey, reauth */
164 1800, 900, /* jitter, overtime */
165 TRUE
, FALSE
, /* mobike, aggressive */
166 60, 0, /* DPD delay, timeout */
167 FALSE
, NULL
, NULL
); /* mediation, med by, peer id */
168 auth
= auth_cfg_create();
169 auth
->add(auth
, AUTH_RULE_AUTH_CLASS
, AUTH_CLASS_PSK
);
170 auth
->add(auth
, AUTH_RULE_IDENTITY
,
171 identification_create_from_string(local_id
));
172 this->peer_cfg
->add_auth_cfg(this->peer_cfg
, auth
, TRUE
);
174 auth
= auth_cfg_create();
175 auth
->add(auth
, AUTH_RULE_AUTH_CLASS
, AUTH_CLASS_PSK
);
178 auth
->add(auth
, AUTH_RULE_IDENTITY
,
179 identification_create_from_string(remote_id
));
181 this->peer_cfg
->add_auth_cfg(this->peer_cfg
, auth
, FALSE
);
183 child_cfg
= child_cfg_create(name
, &lifetime
, NULL
, TRUE
, MODE_TUNNEL
,
184 ACTION_NONE
, ACTION_NONE
, ACTION_NONE
,
185 FALSE
, 0, 0, NULL
, NULL
, 0);
186 child_cfg
->add_proposal(child_cfg
, create_proposal(esp_proposal
, PROTO_ESP
));
187 child_cfg
->add_traffic_selector(child_cfg
, TRUE
, create_ts(local_net
));
188 child_cfg
->add_traffic_selector(child_cfg
, FALSE
, create_ts(remote_net
));
189 this->peer_cfg
->add_child_cfg(this->peer_cfg
, child_cfg
);
190 *cfg
= this->peer_cfg
;
197 METHOD(enumerator_t
, peer_enumerator_destroy
, void,
198 peer_enumerator_t
*this)
200 DESTROY_IF(this->peer_cfg
);
201 this->inner
->destroy(this->inner
);
205 METHOD(backend_t
, create_peer_cfg_enumerator
, enumerator_t
*,
206 private_uci_config_t
*this, identification_t
*me
, identification_t
*other
)
208 peer_enumerator_t
*e
;
212 .enumerate
= (void*)_peer_enumerator_enumerate
,
213 .destroy
= _peer_enumerator_destroy
,
215 .inner
= this->parser
->create_section_enumerator(this->parser
,
216 "local_id", "remote_id", "local_addr", "remote_addr",
217 "local_net", "remote_net", "ike_proposal", "esp_proposal",
218 "ike_rekey", "esp_rekey", NULL
),
229 * enumerator implementation for create_ike_cfg_enumerator
232 /** implements enumerator */
234 /** currently enumerated ike config */
236 /** inner uci_parser section enumerator */
240 METHOD(enumerator_t
, ike_enumerator_enumerate
, bool,
241 ike_enumerator_t
*this, ike_cfg_t
**cfg
)
243 char *local_addr
, *remote_addr
, *ike_proposal
;
246 local_addr
= "0.0.0.0";
247 remote_addr
= "0.0.0.0";
250 if (this->inner
->enumerate(this->inner
, NULL
,
251 &local_addr
, &remote_addr
, &ike_proposal
))
253 DESTROY_IF(this->ike_cfg
);
254 this->ike_cfg
= ike_cfg_create(IKEV2
, FALSE
, FALSE
,
256 charon
->socket
->get_port(charon
->socket
, FALSE
),
257 remote_addr
, FALSE
, IKEV2_UDP_PORT
,
258 FRAGMENTATION_NO
, 0);
259 this->ike_cfg
->add_proposal(this->ike_cfg
,
260 create_proposal(ike_proposal
, PROTO_IKE
));
262 *cfg
= this->ike_cfg
;
268 METHOD(enumerator_t
, ike_enumerator_destroy
, void,
269 ike_enumerator_t
*this)
271 DESTROY_IF(this->ike_cfg
);
272 this->inner
->destroy(this->inner
);
276 METHOD(backend_t
, create_ike_cfg_enumerator
, enumerator_t
*,
277 private_uci_config_t
*this, host_t
*me
, host_t
*other
)
283 .enumerate
= (void*)_ike_enumerator_enumerate
,
284 .destroy
= _ike_enumerator_destroy
,
286 .inner
= this->parser
->create_section_enumerator(this->parser
,
287 "local_addr", "remote_addr", "ike_proposal", NULL
),
297 METHOD(backend_t
, get_peer_cfg_by_name
, peer_cfg_t
*,
298 private_uci_config_t
*this, char *name
)
300 enumerator_t
*enumerator
;
301 peer_cfg_t
*current
, *found
= NULL
;
303 enumerator
= create_peer_cfg_enumerator(this, NULL
, NULL
);
306 while (enumerator
->enumerate(enumerator
, ¤t
))
308 if (streq(name
, current
->get_name(current
)))
310 found
= current
->get_ref(current
);
314 enumerator
->destroy(enumerator
);
319 METHOD(uci_config_t
, destroy
, void,
320 private_uci_config_t
*this)
326 * Described in header.
328 uci_config_t
*uci_config_create(uci_parser_t
*parser
)
330 private_uci_config_t
*this;
335 .create_peer_cfg_enumerator
= _create_peer_cfg_enumerator
,
336 .create_ike_cfg_enumerator
= _create_ike_cfg_enumerator
,
337 .get_peer_cfg_by_name
= _get_peer_cfg_by_name
,
344 return &this->public;