ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/conf.C
(Generate patch)

Comparing gvpe/src/conf.C (file contents):
Revision 1.2 by pcg, Thu Mar 6 18:43:07 2003 UTC vs.
Revision 1.15 by pcg, Sun Apr 13 00:35:46 2003 UTC

31#include <netdb.h> 31#include <netdb.h>
32#include <sys/stat.h> 32#include <sys/stat.h>
33#include <sys/types.h> 33#include <sys/types.h>
34#include <unistd.h> 34#include <unistd.h>
35 35
36#include <netinet/in.h>
37#include <netinet/ip_icmp.h>
38
36#include <openssl/err.h> 39#include <openssl/err.h>
37#include <openssl/pem.h> 40#include <openssl/pem.h>
38#include <openssl/rsa.h> 41#include <openssl/rsa.h>
39#include <openssl/rand.h> 42#include <openssl/rand.h>
40 43
49char *identname; 52char *identname;
50char *pidfilename; 53char *pidfilename;
51 54
52struct configuration conf; 55struct configuration conf;
53 56
54configuration::configuration () 57u8 best_protocol (u8 protset)
55{ 58{
56 init (); 59 if (protset & PROT_IPv4 ) return PROT_IPv4;
57} 60 if (protset & PROT_ICMPv4) return PROT_ICMPv4;
61 if (protset & PROT_UDPv4 ) return PROT_UDPv4;
62 if (protset & PROT_TCPv4 ) return PROT_TCPv4;
58 63
59configuration::~configuration () 64 return 0;
65}
66
67const char *strprotocol (u8 protocol)
60{ 68{
61 cleanup (); 69 if (protocol & PROT_IPv4 ) return "rawip";
70 if (protocol & PROT_ICMPv4) return "icmp";
71 if (protocol & PROT_UDPv4 ) return "udp";
72 if (protocol & PROT_TCPv4 ) return "tcp";
73
74 return "<unknown>";
75}
76
77void
78conf_node::print ()
79{
80 printf ("%4d fe:fd:80:00:0%1x:%02x %c %-8.8s %-10.10s %s%s%d\n",
81 id,
82 id >> 8, id & 0xff,
83 compress ? 'Y' : 'N',
84 connectmode == C_ONDEMAND ? "ondemand" :
85 connectmode == C_NEVER ? "never" :
86 connectmode == C_ALWAYS ? "always" : "",
87 nodename,
88 hostname ? hostname : "",
89 hostname ? ":" : "",
90 hostname ? udp_port : 0
91 );
92}
93
94conf_node::~conf_node ()
95{
96 if (rsa_key)
97 RSA_free (rsa_key);
98
99 free (nodename);
100 free (hostname);
62} 101}
63 102
64void configuration::init () 103void configuration::init ()
65{ 104{
66 memset (this, 0, sizeof (*this)); 105 memset (this, 0, sizeof (*this));
67 106
68 rekey = DEFAULT_REKEY; 107 rekey = DEFAULT_REKEY;
69 keepalive = DEFAULT_KEEPALIVE; 108 keepalive = DEFAULT_KEEPALIVE;
70 llevel = L_INFO; 109 llevel = L_INFO;
110 ip_proto = IPPROTO_GRE;
111 icmp_type = ICMP_ECHOREPLY;
71 112
72 default_node.port = DEFAULT_PORT; 113 default_node.udp_port = DEFAULT_UDPPORT;
114 default_node.tcp_port = DEFAULT_UDPPORT;
73 default_node.connectmode = conf_node::C_ALWAYS; 115 default_node.connectmode = conf_node::C_ALWAYS;
74 default_node.compress = true; 116 default_node.compress = true;
117 default_node.protocols = PROT_UDPv4;
75} 118}
76 119
77void configuration::cleanup() 120void configuration::cleanup()
78{ 121{
79 if (rsa_key) 122 if (rsa_key)
80 RSA_free (rsa_key); 123 RSA_free (rsa_key);
81 124
82 free (ifname);
83
84 rsa_key = 0; 125 rsa_key = 0;
85 ifname = 0; 126
127 free (ifname); ifname = 0;
128#if ENABLE_HTTP_PROXY
129 free (proxy_host); proxy_host = 0;
130 free (proxy_auth); proxy_auth = 0;
131#endif
86} 132}
87 133
88void 134void
89configuration::clear_config () 135configuration::clear_config ()
90{ 136{
94 nodes.clear (); 140 nodes.clear ();
95 141
96 cleanup (); 142 cleanup ();
97 init (); 143 init ();
98} 144}
145
146#define parse_bool(target,name,trueval,falseval) \
147 if (!strcmp (val, "yes")) target = trueval; \
148 else if (!strcmp (val, "no")) target = falseval; \
149 else if (!strcmp (val, "true")) target = trueval; \
150 else if (!strcmp (val, "false")) target = falseval; \
151 else if (!strcmp (val, "on")) target = trueval; \
152 else if (!strcmp (val, "off")) target = falseval; \
153 else \
154 slog (L_WARN, \
155 _("illegal value for '%s', only 'yes|true|on' or 'no|false|off' allowed, at '%s' line %d"), \
156 name, var, fname, lineno);
99 157
100void configuration::read_config (bool need_keys) 158void configuration::read_config (bool need_keys)
101{ 159{
102 char *fname; 160 char *fname;
103 FILE *f; 161 FILE *f;
167 if (l != L_NONE) 225 if (l != L_NONE)
168 llevel = l; 226 llevel = l;
169 else 227 else
170 slog (L_WARN, "'%s': %s, at '%s' line %d", val, UNKNOWN_LOGLEVEL, fname, line); 228 slog (L_WARN, "'%s': %s, at '%s' line %d", val, UNKNOWN_LOGLEVEL, fname, line);
171 } 229 }
230 else if (!strcmp (var, "ip-proto"))
231 ip_proto = atoi (val);
232 else if (!strcmp (var, "icmp-type"))
233 icmp_type = atoi (val);
172 234
173 // per config 235 // per config
174 else if (!strcmp (var, "node")) 236 else if (!strcmp (var, "node"))
175 { 237 {
176 default_node.id++; 238 default_node.id++;
219 } 281 }
220 else if (!strcmp (var, "private-key")) 282 else if (!strcmp (var, "private-key"))
221 prikeyfile = strdup (val); 283 prikeyfile = strdup (val);
222 else if (!strcmp (var, "ifpersist")) 284 else if (!strcmp (var, "ifpersist"))
223 { 285 {
224 if (!strcmp (val, "yes")) 286 parse_bool (ifpersist, "ifpersist", true, false);
225 ifpersist = true;
226 else if (!strcmp (val, "no"))
227 ifpersist = false;
228 else
229 slog (L_WARN,
230 _("illegal value for 'ifpersist', only 'yes' or 'no' allowed, at '%s' line %d"),
231 var, fname, lineno);
232 } 287 }
233 else if (!strcmp (var, "ifname")) 288 else if (!strcmp (var, "ifname"))
234 ifname = strdup (val); 289 ifname = strdup (val);
235 else if (!strcmp (var, "rekey")) 290 else if (!strcmp (var, "rekey"))
236 rekey = atoi (val); 291 rekey = atoi (val);
242 script_if_up = strdup (val); 297 script_if_up = strdup (val);
243 else if (!strcmp (var, "node-up")) 298 else if (!strcmp (var, "node-up"))
244 script_node_up = strdup (val); 299 script_node_up = strdup (val);
245 else if (!strcmp (var, "node-down")) 300 else if (!strcmp (var, "node-down"))
246 script_node_down = strdup (val); 301 script_node_down = strdup (val);
302#if ENABLE_HTTP_PROXY
303 else if (!strcmp (var, "http-proxy-host"))
304 proxy_host = strdup (val);
305 else if (!strcmp (var, "http-proxy-port"))
306 proxy_port = atoi (val);
307 else if (!strcmp (var, "http-proxy-auth"))
308 proxy_auth = (char *)base64_encode ((const u8 *)val, strlen (val));
309#endif
247 310
248 /* node-specific, non-defaultable */ 311 /* node-specific, non-defaultable */
249 else if (node != &default_node && !strcmp (var, "hostname")) 312 else if (node != &default_node && !strcmp (var, "hostname"))
250 { 313 {
251 free (node->hostname); 314 free (node->hostname);
252 node->hostname = strdup (val); 315 node->hostname = strdup (val);
253 } 316 }
254 317
255 /* node-specific, defaultable */ 318 /* node-specific, defaultable */
256 else if (!strcmp (var, "port")) 319 else if (!strcmp (var, "udp-port"))
257 node->port = atoi (val); 320 node->udp_port = atoi (val);
321 else if (!strcmp (var, "tcp-port"))
322 node->tcp_port = atoi (val);
258 else if (!strcmp (var, "router-priority")) 323 else if (!strcmp (var, "router-priority"))
259 node->routerprio = atoi (val); 324 node->routerprio = atoi (val);
260 else if (!strcmp (var, "connect")) 325 else if (!strcmp (var, "connect"))
261 { 326 {
262 if (!strcmp (val, "ondemand")) 327 if (!strcmp (val, "ondemand"))
263 node->connectmode = conf_node::C_ONDEMAND; 328 node->connectmode = conf_node::C_ONDEMAND;
264 else if (!strcmp (val, "never")) 329 else if (!strcmp (val, "never"))
265 node->connectmode = conf_node::C_NEVER; 330 node->connectmode = conf_node::C_NEVER;
266 else if (!strcmp (val, "always")) 331 else if (!strcmp (val, "always"))
267 node->connectmode = conf_node::C_ALWAYS; 332 node->connectmode = conf_node::C_ALWAYS;
333 else if (!strcmp (val, "disabled"))
334 node->connectmode = conf_node::C_DISABLED;
268 else 335 else
269 slog (L_WARN, 336 slog (L_WARN,
270 _("illegal value for 'connectmode', use one of 'ondemand', 'never' or 'always', at '%s' line %d"), 337 _("illegal value for 'connectmode', use one of 'ondemand', 'never', 'always' or 'disabled', at '%s' line %d"),
271 var, fname, lineno); 338 var, fname, lineno);
272 } 339 }
340 else if (!strcmp (var, "inherit-tos"))
341 {
342 parse_bool (node->inherit_tos, "inherit-tos", true, false);
343 }
273 else if (!strcmp (var, "compress")) 344 else if (!strcmp (var, "compress"))
274 { 345 {
275 if (!strcmp (val, "yes")) 346 parse_bool (node->compress, "compress", true, false);
276 node->compress = true;
277 else if (!strcmp (val, "no"))
278 node->compress = false;
279 else 347 }
280 slog (L_WARN, 348 // all these bool options really really cost a lot of executable size!
281 _("illegal value for 'compress', only 'yes' or 'no' allowed, at '%s' line %d"), 349 else if (!strcmp (var, "enable-tcp"))
282 var, fname, lineno); 350 {
351#if ENABLE_TCP
352 u8 v; parse_bool (v, "enable-tcp" , PROT_TCPv4, 0); node->protocols = (node->protocols & ~PROT_TCPv4) | v;
353#endif
354 }
355 else if (!strcmp (var, "enable-icmp"))
356 {
357#if ENABLE_ICMP
358 u8 v; parse_bool (v, "enable-icmp" , PROT_ICMPv4, 0); node->protocols = (node->protocols & ~PROT_ICMPv4) | v;
359#endif
360 }
361 else if (!strcmp (var, "enable-udp"))
362 {
363 u8 v; parse_bool (v, "enable-udp" , PROT_UDPv4, 0); node->protocols = (node->protocols & ~PROT_UDPv4) | v;
364 }
365 else if (!strcmp (var, "enable-rawip"))
366 {
367 u8 v; parse_bool (v, "enable-rawip", PROT_IPv4, 0); node->protocols = (node->protocols & ~PROT_IPv4 ) | v;
283 } 368 }
284 369
285 // unknown or misplaced 370 // unknown or misplaced
286 else 371 else
287 {
288 slog (L_WARN, 372 slog (L_WARN,
289 _("unknown or misplaced variable `%s', at '%s' line %d"), 373 _("unknown or misplaced variable `%s', at '%s' line %d"),
290 var, fname, lineno); 374 var, fname, lineno);
291 }
292 } 375 }
293 376
294 fclose (f); 377 fclose (f);
295 } 378 }
296 else 379 else
355 printf (_("MTU: %d\n"), mtu); 438 printf (_("MTU: %d\n"), mtu);
356 printf (_("rekeying interval: %d\n"), rekey); 439 printf (_("rekeying interval: %d\n"), rekey);
357 printf (_("keepalive interval: %d\n"), keepalive); 440 printf (_("keepalive interval: %d\n"), keepalive);
358 printf (_("interface: %s\n"), ifname); 441 printf (_("interface: %s\n"), ifname);
359 printf (_("primary rsa key: %s\n"), prikeyfile ? prikeyfile : "<default>"); 442 printf (_("primary rsa key: %s\n"), prikeyfile ? prikeyfile : "<default>");
360 printf (_("rsa key size: %d\n"), rsa_key ? RSA_size (rsa_key) : -1); 443 printf (_("rsa key size: %d\n"), rsa_key ? RSA_size (rsa_key) * 8 : -1);
361 printf ("\n"); 444 printf ("\n");
362 445
363 printf ("%4s %-17s %s %-8.8s %-10.10s %s\n", 446 printf ("%4s %-17s %s %-8.8s %-10.10s %s\n",
364 _("ID#"), _("MAC"), _("Com"), _("Conmode"), _("Node"), _("Host:Port")); 447 _("ID#"), _("MAC"), _("Com"), _("Conmode"), _("Node"), _("Host:Port"));
365 448
367 (*i)->print (); 450 (*i)->print ();
368 451
369 printf ("\n"); 452 printf ("\n");
370} 453}
371 454
372void 455configuration::configuration ()
373conf_node::print ()
374{ 456{
375 printf ("%4d fe:fd:80:00:0%1x:%02x %c %-8.8s %-10.10s %s%s%d\n", 457 init ();
376 id,
377 id >> 8, id & 0xff,
378 compress ? 'Y' : 'N',
379 connectmode == C_ONDEMAND ? "ondemand" :
380 connectmode == C_NEVER ? "never" :
381 connectmode == C_ALWAYS ? "always" : "",
382 nodename,
383 hostname ? hostname : "",
384 hostname ? ":" : "",
385 hostname ? port : 0
386 );
387} 458}
388 459
460configuration::~configuration ()
461{
462 cleanup ();
463}
464
465

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines