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.42 by pcg, Mon Dec 5 12:58:08 2005 UTC vs.
Revision 1.52 by root, Tue Feb 8 23:11:35 2011 UTC

1/* 1/*
2 conf.c -- configuration code 2 conf.c -- configuration code
3 Copyright (C) 2003-2005 Marc Lehmann <gvpe@schmorp.de> 3 Copyright (C) 2003-2008 Marc Lehmann <gvpe@schmorp.de>
4 4
5 This file is part of GVPE. 5 This file is part of GVPE.
6 6
7 GVPE is free software; you can redistribute it and/or modify 7 GVPE is free software; you can redistribute it and/or modify it
8 it under the terms of the GNU General Public License as published by 8 under the terms of the GNU General Public License as published by the
9 the Free Software Foundation; either version 2 of the License, or 9 Free Software Foundation; either version 3 of the License, or (at your
10 (at your option) any later version. 10 option) any later version.
11 11
12 This program is distributed in the hope that it will be useful, 12 This program is distributed in the hope that it will be useful, but
13 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
15 GNU General Public License for more details. 15 Public License for more details.
16 16
17 You should have received a copy of the GNU General Public License 17 You should have received a copy of the GNU General Public License along
18 along with gvpe; if not, write to the Free Software 18 with this program; if not, see <http://www.gnu.org/licenses/>.
19 Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19
20 Additional permission under GNU GPL version 3 section 7
21
22 If you modify this Program, or any covered work, by linking or
23 combining it with the OpenSSL project's OpenSSL library (or a modified
24 version of that library), containing parts covered by the terms of the
25 OpenSSL or SSLeay licenses, the licensors of this Program grant you
26 additional permission to convey the resulting work. Corresponding
27 Source for a non-source form of such a combination shall include the
28 source code for the parts of OpenSSL used as well as that of the
29 covered work.
20*/ 30*/
21 31
22#include "config.h" 32#include "config.h"
23 33
24#include <cstdio> 34#include <cstdio>
47char *thisnode; 57char *thisnode;
48char *identname; 58char *identname;
49 59
50struct configuration conf; 60struct configuration conf;
51 61
62u8
52u8 best_protocol (u8 protset) 63best_protocol (u8 protset)
53{ 64{
54 if (protset & PROT_IPv4 ) return PROT_IPv4; 65 if (protset & PROT_IPv4 ) return PROT_IPv4;
55 if (protset & PROT_ICMPv4) return PROT_ICMPv4; 66 if (protset & PROT_ICMPv4) return PROT_ICMPv4;
56 if (protset & PROT_UDPv4 ) return PROT_UDPv4; 67 if (protset & PROT_UDPv4 ) return PROT_UDPv4;
57 if (protset & PROT_TCPv4 ) return PROT_TCPv4; 68 if (protset & PROT_TCPv4 ) return PROT_TCPv4;
58 if (protset & PROT_DNSv4 ) return PROT_DNSv4; 69 if (protset & PROT_DNSv4 ) return PROT_DNSv4;
59 70
60 return 0; 71 return 0;
61} 72}
62 73
74const char *
63const char *strprotocol (u8 protocol) 75strprotocol (u8 protocol)
64{ 76{
65 if (protocol & PROT_IPv4 ) return "rawip"; 77 if (protocol & PROT_IPv4 ) return "rawip";
66 if (protocol & PROT_ICMPv4) return "icmp"; 78 if (protocol & PROT_ICMPv4) return "icmp";
67 if (protocol & PROT_UDPv4 ) return "udp"; 79 if (protocol & PROT_UDPv4 ) return "udp";
68 if (protocol & PROT_TCPv4 ) return "tcp"; 80 if (protocol & PROT_TCPv4 ) return "tcp";
82 94
83 return false; 95 return false;
84} 96}
85 97
86bool 98bool
87conf_node::can_direct (struct conf_node *other) 99conf_node::may_direct (struct conf_node *other)
88{ 100{
89 if (match_list (allow_direct, other->nodename)) 101 if (match_list (allow_direct, other->nodename))
90 return true; 102 return true;
91 103
92 if (match_list (deny_direct, other->nodename)) 104 if (match_list (deny_direct, other->nodename))
100{ 112{
101 printf ("%4d fe:fd:80:00:0%1x:%02x %c %-8.8s %-10.10s %s%s%d\n", 113 printf ("%4d fe:fd:80:00:0%1x:%02x %c %-8.8s %-10.10s %s%s%d\n",
102 id, 114 id,
103 id >> 8, id & 0xff, 115 id >> 8, id & 0xff,
104 compress ? 'Y' : 'N', 116 compress ? 'Y' : 'N',
105 connectmode == C_ONDEMAND ? "ondemand" : 117 connectmode == C_ONDEMAND ? "ondemand"
106 connectmode == C_NEVER ? "never" : 118 : connectmode == C_NEVER ? "never"
107 connectmode == C_ALWAYS ? "always" : "", 119 : connectmode == C_ALWAYS ? "always"
120 : connectmode == C_DISABLED ? "disabled"
121 : "",
108 nodename, 122 nodename,
109 hostname ? hostname : "", 123 hostname ? hostname : "",
110 hostname ? ":" : "", 124 hostname ? ":" : "",
111 hostname ? udp_port : 0 125 hostname ? udp_port : 0
112 ); 126 );
128 free (dns_hostname); 142 free (dns_hostname);
129#endif 143#endif
130#endif 144#endif
131} 145}
132 146
147void
133void configuration::init () 148configuration::init ()
134{ 149{
135 memset (this, 0, sizeof (*this)); 150 memset (this, 0, sizeof (*this));
136 151
137 mtu = DEFAULT_MTU; 152 mtu = DEFAULT_MTU;
153 nfmark = 0;
138 rekey = DEFAULT_REKEY; 154 rekey = DEFAULT_REKEY;
139 keepalive = DEFAULT_KEEPALIVE; 155 keepalive = DEFAULT_KEEPALIVE;
140 llevel = L_INFO; 156 llevel = L_INFO;
141 ip_proto = IPPROTO_GRE; 157 ip_proto = IPPROTO_GRE;
142#if ENABLE_ICMP 158#if ENABLE_ICMP
147 default_node.tcp_port = DEFAULT_UDPPORT; // ehrm 163 default_node.tcp_port = DEFAULT_UDPPORT; // ehrm
148 default_node.connectmode = conf_node::C_ALWAYS; 164 default_node.connectmode = conf_node::C_ALWAYS;
149 default_node.compress = true; 165 default_node.compress = true;
150 default_node.protocols = 0; 166 default_node.protocols = 0;
151 default_node.max_retry = DEFAULT_MAX_RETRY; 167 default_node.max_retry = DEFAULT_MAX_RETRY;
168 default_node.max_ttl = DEFAULT_MAX_TTL;
169 default_node.max_queue = DEFAULT_MAX_QUEUE;
152 default_node.if_up_data = strdup (""); 170 default_node.if_up_data = strdup ("");
153 171
154#if ENABLE_DNS 172#if ENABLE_DNS
155 default_node.dns_port = 0; // default is 0 == client 173 default_node.dns_port = 0; // default is 0 == client
156 174
163#endif 181#endif
164 182
165 conf.pidfilename = strdup (LOCALSTATEDIR "/run/gvpe.pid"); 183 conf.pidfilename = strdup (LOCALSTATEDIR "/run/gvpe.pid");
166} 184}
167 185
186void
168void configuration::cleanup() 187configuration::cleanup ()
169{ 188{
170 if (rsa_key) 189 if (rsa_key)
171 RSA_free (rsa_key); 190 RSA_free (rsa_key);
172 191
173 rsa_key = 0; 192 rsa_key = 0;
174 193
175 free (pidfilename); pidfilename = 0; 194 free (pidfilename); pidfilename = 0;
176 free (ifname); ifname = 0; 195 free (ifname); ifname = 0;
177#if ENABLE_HTTP_PROXY 196#if ENABLE_HTTP_PROXY
178 free (proxy_host); proxy_host = 0; 197 free (proxy_host); proxy_host = 0;
179 free (proxy_auth); proxy_auth = 0; 198 free (proxy_auth); proxy_auth = 0;
180#endif 199#endif
181#if ENABLE_DNS 200#if ENABLE_DNS
182 free (dns_forw_host); dns_forw_host = 0; 201 free (dns_forw_host); dns_forw_host = 0;
183#endif 202#endif
203 free (script_if_up); script_if_up = 0;
204 free (script_node_up); script_node_up = 0;
205 free (script_node_change); script_node_change = 0;
206 free (script_node_down); script_node_down = 0;
184} 207}
185 208
186void 209void
187configuration::clear () 210configuration::clear ()
188{ 211{
316 conf.rekey = atoi (val); 339 conf.rekey = atoi (val);
317 else if (!strcmp (var, "keepalive")) 340 else if (!strcmp (var, "keepalive"))
318 conf.keepalive = atoi (val); 341 conf.keepalive = atoi (val);
319 else if (!strcmp (var, "mtu")) 342 else if (!strcmp (var, "mtu"))
320 conf.mtu = atoi (val); 343 conf.mtu = atoi (val);
344 else if (!strcmp (var, "nfmark"))
345 conf.nfmark = atoi (val);
321 else if (!strcmp (var, "if-up")) 346 else if (!strcmp (var, "if-up"))
322 free (conf.script_if_up), conf.script_if_up = strdup (val); 347 free (conf.script_if_up), conf.script_if_up = strdup (val);
323 else if (!strcmp (var, "node-up")) 348 else if (!strcmp (var, "node-up"))
324 free (conf.script_node_up), conf.script_node_up = strdup (val); 349 free (conf.script_node_up), conf.script_node_up = strdup (val);
350 else if (!strcmp (var, "node-change"))
351 free (conf.script_node_change), conf.script_node_change = strdup (val);
325 else if (!strcmp (var, "node-down")) 352 else if (!strcmp (var, "node-down"))
326 free (conf.script_node_down), conf.script_node_down = strdup (val); 353 free (conf.script_node_down), conf.script_node_down = strdup (val);
327 else if (!strcmp (var, "pid-file")) 354 else if (!strcmp (var, "pid-file"))
328 free (conf.pidfilename), conf.pidfilename = strdup (val); 355 free (conf.pidfilename), conf.pidfilename = strdup (val);
329 else if (!strcmp (var, "dns-forw-host")) 356 else if (!strcmp (var, "dns-forw-host"))
460 } 487 }
461 else if (!strcmp (var, "allow-direct")) 488 else if (!strcmp (var, "allow-direct"))
462 node->allow_direct.push_back (strdup (val)); 489 node->allow_direct.push_back (strdup (val));
463 else if (!strcmp (var, "deny-direct")) 490 else if (!strcmp (var, "deny-direct"))
464 node->deny_direct.push_back (strdup (val)); 491 node->deny_direct.push_back (strdup (val));
492 else if (!strcmp (var, "max-ttl"))
493 node->max_ttl = atof (val);
494 else if (!strcmp (var, "max-queue"))
495 node->max_queue = atoi (val);
465 496
466 // unknown or misplaced 497 // unknown or misplaced
467 else 498 else
468 return _("unknown configuration directive. (ignored)"); 499 return _("unknown configuration directive. (ignored)");
469 500
470 return 0; 501 return 0;
471} 502}
472 503
504void
505conf_node::finalise ()
506{
507 if (max_queue < 1)
508 {
509 slog (L_WARN, _("%s: max-queue value invalid, setting it to 1."), nodename);
510 max_queue = 1;
511 }
512
513 if (routerprio > 1 && (connectmode != C_ALWAYS && connectmode != C_DISABLED))
514 {
515 //slog (L_WARN, _("%s: has non-zero router-priority but either 'never' or 'ondemand' as connectmode, setting it to 'always'."), nodename);
516 connectmode = C_ALWAYS;
517 }
518}
519
520void
473void configuration_parser::parse_argv () 521configuration_parser::parse_argv ()
474{ 522{
475 for (int i = 0; i < argc; ++i) 523 for (int i = 0; i < argc; ++i)
476 { 524 {
477 char *v = argv [i]; 525 char *v = argv [i];
478 526
580 slog (L_NOTICE, _("private hostkey and public node key mismatch: is '%s' the correct node?"), ::thisnode); 628 slog (L_NOTICE, _("private hostkey and public node key mismatch: is '%s' the correct node?"), ::thisnode);
581 exit (EXIT_FAILURE); 629 exit (EXIT_FAILURE);
582 } 630 }
583 631
584 free (fname); 632 free (fname);
585}
586 633
634 for (configuration::node_vector::iterator i = conf.nodes.begin(); i != conf.nodes.end(); ++i)
635 (*i)->finalise ();
636}
637
638char *
587char *configuration::config_filename (const char *name, const char *dflt) 639configuration::config_filename (const char *name, const char *dflt)
588{ 640{
589 char *fname; 641 char *fname;
590 642
591 asprintf (&fname, name ? name : dflt, ::thisnode); 643 asprintf (&fname, name ? name : dflt, ::thisnode);
592 644
633configuration::~configuration () 685configuration::~configuration ()
634{ 686{
635 cleanup (); 687 cleanup ();
636} 688}
637 689
638

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines