#include "conf_net.h"
#include "conf.h"
#include "connection.h"
+#include "compression.h"
#include "control.h"
#include "device.h"
#include "digest.h"
#include "process.h"
#include "protocol.h"
#include "route.h"
-#include "rsa.h"
#include "script.h"
#include "subnet.h"
#include "utils.h"
return true;
}
- splay_tree_t *config_tree;
FILE *fp;
char *pubname = NULL;
char *p;
- init_configuration(&config_tree);
+ splay_tree_t config;
+ init_configuration(&config);
- if(!read_host_config(config_tree, n->name, true)) {
+ if(!read_host_config(&config, n->name, true)) {
goto exit;
}
/* First, check for simple Ed25519PublicKey statement */
- if(get_config_string(lookup_config(config_tree, "Ed25519PublicKey"), &p)) {
+ if(get_config_string(lookup_config(&config, "Ed25519PublicKey"), &p)) {
n->ecdsa = ecdsa_set_base64_public_key(p);
free(p);
goto exit;
/* Else, check for Ed25519PublicKeyFile statement and read it */
- if(!get_config_string(lookup_config(config_tree, "Ed25519PublicKeyFile"), &pubname)) {
+ if(!get_config_string(lookup_config(&config, "Ed25519PublicKeyFile"), &pubname)) {
xasprintf(&pubname, "%s" SLASH "hosts" SLASH "%s", confbase, n->name);
}
fclose(fp);
exit:
- exit_configuration(&config_tree);
+ splay_empty_tree(&config);
free(pubname);
return n->ecdsa;
}
logger(DEBUG_STATUS, LOG_INFO, "Expiring symmetric keys");
send_key_changed();
- for splay_each(node_t, n, node_tree) {
+ for splay_each(node_t, n, &node_tree) {
n->status.validkey_in = false;
}
}
node_t *n = lookup_node(ent->d_name);
- splay_tree_t *config_tree;
- init_configuration(&config_tree);
- read_config_options(config_tree, ent->d_name);
- read_host_config(config_tree, ent->d_name, true);
+ splay_tree_t config;
+ init_configuration(&config);
+ read_config_options(&config, ent->d_name);
+ read_host_config(&config, ent->d_name, true);
if(!n) {
n = new_node();
}
if(strictsubnets) {
- for(config_t *cfg = lookup_config(config_tree, "Subnet"); cfg; cfg = lookup_config_next(config_tree, cfg)) {
+ for(config_t *cfg = lookup_config(&config, "Subnet"); cfg; cfg = lookup_config_next(&config, cfg)) {
subnet_t *s, *s2;
if(!get_config_subnet(cfg, &s)) {
}
}
- if(lookup_config(config_tree, "Address")) {
+ if(lookup_config(&config, "Address")) {
n->status.has_address = true;
}
- exit_configuration(&config_tree);
+ splay_empty_tree(&config);
}
closedir(dir);
char *name = NULL;
char *returned_name;
- get_config_string(lookup_config(config_tree, "Name"), &name);
+ get_config_string(lookup_config(&config_tree, "Name"), &name);
if(!name) {
return NULL;
free(scriptinterpreter);
scriptinterpreter = NULL;
- get_config_string(lookup_config(config_tree, "ScriptsInterpreter"), &scriptinterpreter);
+ get_config_string(lookup_config(&config_tree, "ScriptsInterpreter"), &scriptinterpreter);
free(scriptextension);
- if(!get_config_string(lookup_config(config_tree, "ScriptsExtension"), &scriptextension)) {
+ if(!get_config_string(lookup_config(&config_tree, "ScriptsExtension"), &scriptextension)) {
scriptextension = xstrdup("");
}
char *proxy = NULL;
- get_config_string(lookup_config(config_tree, "Proxy"), &proxy);
+ get_config_string(lookup_config(&config_tree, "Proxy"), &proxy);
if(proxy) {
char *space;
bool choice;
- if(get_config_bool(lookup_config(config_tree, "IndirectData"), &choice) && choice) {
+ if(get_config_bool(lookup_config(&config_tree, "IndirectData"), &choice) && choice) {
myself->options |= OPTION_INDIRECT;
}
- if(get_config_bool(lookup_config(config_tree, "TCPOnly"), &choice) && choice) {
+ if(get_config_bool(lookup_config(&config_tree, "TCPOnly"), &choice) && choice) {
myself->options |= OPTION_TCPONLY;
}
myself->options |= OPTION_INDIRECT;
}
- get_config_bool(lookup_config(config_tree, "UDPDiscovery"), &udp_discovery);
- get_config_int(lookup_config(config_tree, "UDPDiscoveryKeepaliveInterval"), &udp_discovery_keepalive_interval);
- get_config_int(lookup_config(config_tree, "UDPDiscoveryInterval"), &udp_discovery_interval);
- get_config_int(lookup_config(config_tree, "UDPDiscoveryTimeout"), &udp_discovery_timeout);
+ get_config_bool(lookup_config(&config_tree, "UDPDiscovery"), &udp_discovery);
+ get_config_int(lookup_config(&config_tree, "UDPDiscoveryKeepaliveInterval"), &udp_discovery_keepalive_interval);
+ get_config_int(lookup_config(&config_tree, "UDPDiscoveryInterval"), &udp_discovery_interval);
+ get_config_int(lookup_config(&config_tree, "UDPDiscoveryTimeout"), &udp_discovery_timeout);
- get_config_int(lookup_config(config_tree, "MTUInfoInterval"), &mtu_info_interval);
- get_config_int(lookup_config(config_tree, "UDPInfoInterval"), &udp_info_interval);
+ get_config_int(lookup_config(&config_tree, "MTUInfoInterval"), &mtu_info_interval);
+ get_config_int(lookup_config(&config_tree, "UDPInfoInterval"), &udp_info_interval);
- get_config_bool(lookup_config(config_tree, "DirectOnly"), &directonly);
- get_config_bool(lookup_config(config_tree, "LocalDiscovery"), &localdiscovery);
+ get_config_bool(lookup_config(&config_tree, "DirectOnly"), &directonly);
+ get_config_bool(lookup_config(&config_tree, "LocalDiscovery"), &localdiscovery);
char *rmode = NULL;
- if(get_config_string(lookup_config(config_tree, "Mode"), &rmode)) {
+ if(get_config_string(lookup_config(&config_tree, "Mode"), &rmode)) {
if(!strcasecmp(rmode, "router")) {
routing_mode = RMODE_ROUTER;
} else if(!strcasecmp(rmode, "switch")) {
char *fmode = NULL;
- if(get_config_string(lookup_config(config_tree, "Forwarding"), &fmode)) {
+ if(get_config_string(lookup_config(&config_tree, "Forwarding"), &fmode)) {
if(!strcasecmp(fmode, "off")) {
forwarding_mode = FMODE_OFF;
} else if(!strcasecmp(fmode, "internal")) {
}
choice = !(myself->options & OPTION_TCPONLY);
- get_config_bool(lookup_config(config_tree, "PMTUDiscovery"), &choice);
+ get_config_bool(lookup_config(&config_tree, "PMTUDiscovery"), &choice);
if(choice) {
myself->options |= OPTION_PMTU_DISCOVERY;
}
choice = true;
- get_config_bool(lookup_config(config_tree, "ClampMSS"), &choice);
+ get_config_bool(lookup_config(&config_tree, "ClampMSS"), &choice);
if(choice) {
myself->options |= OPTION_CLAMP_MSS;
}
- get_config_bool(lookup_config(config_tree, "PriorityInheritance"), &priorityinheritance);
- get_config_bool(lookup_config(config_tree, "DecrementTTL"), &decrement_ttl);
+ get_config_bool(lookup_config(&config_tree, "PriorityInheritance"), &priorityinheritance);
+ get_config_bool(lookup_config(&config_tree, "DecrementTTL"), &decrement_ttl);
char *bmode = NULL;
- if(get_config_string(lookup_config(config_tree, "Broadcast"), &bmode)) {
+ if(get_config_string(lookup_config(&config_tree, "Broadcast"), &bmode)) {
if(!strcasecmp(bmode, "no")) {
broadcast_mode = BMODE_NONE;
} else if(!strcasecmp(bmode, "yes") || !strcasecmp(bmode, "mst")) {
/* Delete all broadcast subnets before re-adding them */
- for splay_each(subnet_t, s, subnet_tree) {
+ for splay_each(subnet_t, s, &subnet_tree) {
if(!s->owner) {
- splay_delete_node(subnet_tree, node);
+ splay_delete_node(&subnet_tree, node);
}
}
subnet_add(NULL, s);
}
- for(config_t *cfg = lookup_config(config_tree, "BroadcastSubnet"); cfg; cfg = lookup_config_next(config_tree, cfg)) {
+ for(config_t *cfg = lookup_config(&config_tree, "BroadcastSubnet"); cfg; cfg = lookup_config_next(&config_tree, cfg)) {
subnet_t *s;
if(!get_config_subnet(cfg, &s)) {
#endif
- if(!get_config_int(lookup_config(config_tree, "MACExpire"), &macexpire)) {
+ if(!get_config_int(lookup_config(&config_tree, "MACExpire"), &macexpire)) {
macexpire = 600;
}
- if(get_config_int(lookup_config(config_tree, "MaxTimeout"), &maxtimeout)) {
+ if(get_config_int(lookup_config(&config_tree, "MaxTimeout"), &maxtimeout)) {
if(maxtimeout <= 0) {
logger(DEBUG_ALWAYS, LOG_ERR, "Bogus maximum timeout!");
return false;
char *afname = NULL;
- if(get_config_string(lookup_config(config_tree, "AddressFamily"), &afname)) {
+ if(get_config_string(lookup_config(&config_tree, "AddressFamily"), &afname)) {
if(!strcasecmp(afname, "IPv4")) {
addressfamily = AF_INET;
} else if(!strcasecmp(afname, "IPv6")) {
free(afname);
}
- get_config_bool(lookup_config(config_tree, "Hostnames"), &hostnames);
+ get_config_bool(lookup_config(&config_tree, "Hostnames"), &hostnames);
- if(!get_config_int(lookup_config(config_tree, "KeyExpire"), &keylifetime)) {
+ if(!get_config_int(lookup_config(&config_tree, "KeyExpire"), &keylifetime)) {
keylifetime = 3600;
}
- if(!get_config_bool(lookup_config(config_tree, "AutoConnect"), &autoconnect)) {
+ if(!get_config_bool(lookup_config(&config_tree, "AutoConnect"), &autoconnect)) {
autoconnect = true;
}
- get_config_bool(lookup_config(config_tree, "DisableBuggyPeers"), &disablebuggypeers);
+ get_config_bool(lookup_config(&config_tree, "DisableBuggyPeers"), &disablebuggypeers);
- if(!get_config_int(lookup_config(config_tree, "InvitationExpire"), &invitation_lifetime)) {
+ if(!get_config_int(lookup_config(&config_tree, "InvitationExpire"), &invitation_lifetime)) {
invitation_lifetime = 604800; // 1 week
}
myself->connection = new_connection();
myself->name = name;
myself->connection->name = xstrdup(name);
- read_host_config(config_tree, name, true);
+ read_host_config(&config_tree, name, true);
- if(!get_config_string(lookup_config(config_tree, "Port"), &myport)) {
+ if(!get_config_string(lookup_config(&config_tree, "Port"), &myport)) {
myport = xstrdup("655");
} else {
port_specified = true;
myself->options |= PROT_MINOR << 24;
#ifdef DISABLE_LEGACY
- myself->connection->ecdsa = read_ecdsa_private_key(config_tree, NULL);
+ myself->connection->ecdsa = read_ecdsa_private_key(&config_tree, NULL);
experimental = myself->connection->ecdsa != NULL;
if(!experimental) {
#else
- if(!get_config_bool(lookup_config(config_tree, "ExperimentalProtocol"), &experimental)) {
- myself->connection->ecdsa = read_ecdsa_private_key(config_tree, NULL);
+ if(!get_config_bool(lookup_config(&config_tree, "ExperimentalProtocol"), &experimental)) {
+ myself->connection->ecdsa = read_ecdsa_private_key(&config_tree, NULL);
experimental = myself->connection->ecdsa != NULL;
if(!experimental) {
}
} else {
if(experimental) {
- myself->connection->ecdsa = read_ecdsa_private_key(config_tree, NULL);
+ myself->connection->ecdsa = read_ecdsa_private_key(&config_tree, NULL);
if(!myself->connection->ecdsa) {
return false;
}
}
- myself->connection->rsa = read_rsa_private_key(config_tree, NULL);
+ myself->connection->rsa = read_rsa_private_key(&config_tree, NULL);
if(!myself->connection->rsa) {
if(experimental) {
/* Read in all the subnets specified in the host configuration file */
- for(config_t *cfg = lookup_config(config_tree, "Subnet"); cfg; cfg = lookup_config_next(config_tree, cfg)) {
+ for(config_t *cfg = lookup_config(&config_tree, "Subnet"); cfg; cfg = lookup_config_next(&config_tree, cfg)) {
subnet_t *subnet;
if(!get_config_subnet(cfg, &subnet)) {
return false;
}
- get_config_bool(lookup_config(config_tree, "StrictSubnets"), &strictsubnets);
- get_config_bool(lookup_config(config_tree, "TunnelServer"), &tunnelserver);
+ get_config_bool(lookup_config(&config_tree, "StrictSubnets"), &strictsubnets);
+ get_config_bool(lookup_config(&config_tree, "TunnelServer"), &tunnelserver);
strictsubnets |= tunnelserver;
- if(get_config_int(lookup_config(config_tree, "MaxConnectionBurst"), &max_connection_burst)) {
+ if(get_config_int(lookup_config(&config_tree, "MaxConnectionBurst"), &max_connection_burst)) {
if(max_connection_burst <= 0) {
logger(DEBUG_ALWAYS, LOG_ERR, "MaxConnectionBurst cannot be negative!");
return false;
}
}
- if(get_config_int(lookup_config(config_tree, "UDPRcvBuf"), &udp_rcvbuf)) {
+ if(get_config_int(lookup_config(&config_tree, "UDPRcvBuf"), &udp_rcvbuf)) {
if(udp_rcvbuf < 0) {
logger(DEBUG_ALWAYS, LOG_ERR, "UDPRcvBuf cannot be negative!");
return false;
udp_rcvbuf_warnings = true;
}
- if(get_config_int(lookup_config(config_tree, "UDPSndBuf"), &udp_sndbuf)) {
+ if(get_config_int(lookup_config(&config_tree, "UDPSndBuf"), &udp_sndbuf)) {
if(udp_sndbuf < 0) {
logger(DEBUG_ALWAYS, LOG_ERR, "UDPSndBuf cannot be negative!");
return false;
udp_sndbuf_warnings = true;
}
- get_config_int(lookup_config(config_tree, "FWMark"), &fwmark);
+ get_config_int(lookup_config(&config_tree, "FWMark"), &fwmark);
#ifndef SO_MARK
if(fwmark) {
int replaywin_int;
- if(get_config_int(lookup_config(config_tree, "ReplayWindow"), &replaywin_int)) {
+ if(get_config_int(lookup_config(&config_tree, "ReplayWindow"), &replaywin_int)) {
if(replaywin_int < 0) {
logger(DEBUG_ALWAYS, LOG_ERR, "ReplayWindow cannot be negative!");
return false;
char *cipher;
- if(!get_config_string(lookup_config(config_tree, "Cipher"), &cipher)) {
+ if(!get_config_string(lookup_config(&config_tree, "Cipher"), &cipher)) {
cipher = xstrdup("aes-256-cbc");
}
/* Check if we want to use message authentication codes... */
int maclength = 4;
- get_config_int(lookup_config(config_tree, "MACLength"), &maclength);
+ get_config_int(lookup_config(&config_tree, "MACLength"), &maclength);
if(maclength < 0) {
logger(DEBUG_ALWAYS, LOG_ERR, "Bogus MAC length!");
char *digest;
- if(!get_config_string(lookup_config(config_tree, "Digest"), &digest)) {
+ if(!get_config_string(lookup_config(&config_tree, "Digest"), &digest)) {
digest = xstrdup("sha256");
}
#endif
/* Compression */
-
- if(get_config_int(lookup_config(config_tree, "Compression"), &myself->incompression)) {
+ if(get_config_int(lookup_config(&config_tree, "Compression"), &myself->incompression)) {
switch(myself->incompression) {
- case 12:
+ case COMPRESS_LZ4:
#ifdef HAVE_LZ4
break;
#else
return false;
#endif
- case 11:
- case 10:
+ case COMPRESS_LZO_HI:
+ case COMPRESS_LZO_LO:
#ifdef HAVE_LZO
break;
#else
return false;
#endif
- case 9:
- case 8:
- case 7:
- case 6:
- case 5:
- case 4:
- case 3:
- case 2:
- case 1:
+ case COMPRESS_ZLIB_9:
+ case COMPRESS_ZLIB_8:
+ case COMPRESS_ZLIB_7:
+ case COMPRESS_ZLIB_6:
+ case COMPRESS_ZLIB_5:
+ case COMPRESS_ZLIB_4:
+ case COMPRESS_ZLIB_3:
+ case COMPRESS_ZLIB_2:
+ case COMPRESS_ZLIB_1:
#ifdef HAVE_ZLIB
break;
#else
return false;
#endif
- case 0:
+ case COMPRESS_NONE:
break;
default:
return false;
}
} else {
- myself->incompression = 0;
+ myself->incompression = COMPRESS_NONE;
}
- myself->connection->outcompression = 0;
+ myself->connection->outcompression = COMPRESS_NONE;
/* Done */
devops = os_devops;
- if(get_config_string(lookup_config(config_tree, "DeviceType"), &type)) {
+ if(get_config_string(lookup_config(&config_tree, "DeviceType"), &type)) {
if(!strcasecmp(type, "dummy")) {
devops = dummy_devops;
} else if(!strcasecmp(type, "raw_socket")) {
free(type);
}
- get_config_bool(lookup_config(config_tree, "DeviceStandby"), &device_standby);
+ get_config_bool(lookup_config(&config_tree, "DeviceStandby"), &device_standby);
if(!devops.setup()) {
return false;
listen_sockets = 0;
int cfgs = 0;
- for(config_t *cfg = lookup_config(config_tree, "BindToAddress"); cfg; cfg = lookup_config_next(config_tree, cfg)) {
+ for(config_t *cfg = lookup_config(&config_tree, "BindToAddress"); cfg; cfg = lookup_config_next(&config_tree, cfg)) {
cfgs++;
get_config_string(cfg, &address);
}
}
- for(config_t *cfg = lookup_config(config_tree, "ListenAddress"); cfg; cfg = lookup_config_next(config_tree, cfg)) {
+ for(config_t *cfg = lookup_config(&config_tree, "ListenAddress"); cfg; cfg = lookup_config_next(&config_tree, cfg)) {
cfgs++;
get_config_string(cfg, &address);
myself->connection->hostname = xstrdup(myself->hostname);
char *upnp = NULL;
- get_config_string(lookup_config(config_tree, "UPnP"), &upnp);
+ get_config_string(lookup_config(&config_tree, "UPnP"), &upnp);
bool upnp_tcp = false;
bool upnp_udp = false;
bool setup_network(void) {
init_connections();
init_subnets();
- init_nodes();
- init_edges();
- init_requests();
- if(get_config_int(lookup_config(config_tree, "PingInterval"), &pinginterval)) {
+ if(get_config_int(lookup_config(&config_tree, "PingInterval"), &pinginterval)) {
if(pinginterval < 1) {
pinginterval = 86400;
}
pinginterval = 60;
}
- if(!get_config_int(lookup_config(config_tree, "PingTimeout"), &pingtimeout)) {
+ if(!get_config_int(lookup_config(&config_tree, "PingTimeout"), &pingtimeout)) {
pingtimeout = 5;
}
pingtimeout = pinginterval;
}
- if(!get_config_int(lookup_config(config_tree, "MaxOutputBufferSize"), &maxoutbufsize)) {
+ if(!get_config_int(lookup_config(&config_tree, "MaxOutputBufferSize"), &maxoutbufsize)) {
maxoutbufsize = 10 * MTU;
}
close all open network connections
*/
void close_network_connections(void) {
- for(list_node_t *node = connection_list->head, *next; node; node = next) {
+ for(list_node_t *node = connection_list.head, *next; node; node = next) {
next = node->next;
connection_t *c = node->data;
terminate_connection(c, false);
}
- if(outgoing_list) {
- list_delete_list(outgoing_list);
- }
+ list_empty_list(&outgoing_list);
if(myself && myself->connection) {
subnet_update(myself, NULL, false);