X-Git-Url: https://git.librecmc.org/?p=oweals%2Ftinc.git;a=blobdiff_plain;f=src%2Fnet_setup.c;h=94e25b624035a2daba320ee8a392db7a568279b9;hp=ccd600b730c41816a49363f0e55464e74cd6f81d;hb=e012e752f4f1a2b06dfab4640bbbea8f084999ff;hpb=0714ac6c59099a398e67770ad9c72fcec615812b diff --git a/src/net_setup.c b/src/net_setup.c index ccd600b..94e25b6 100644 --- a/src/net_setup.c +++ b/src/net_setup.c @@ -1,7 +1,7 @@ /* net_setup.c -- Setup. Copyright (C) 1998-2005 Ivo Timmermans, - 2000-2006 Guus Sliepen + 2000-2009 Guus Sliepen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -286,9 +286,6 @@ bool setup_myself(void) if(get_config_bool(lookup_config(myself->connection->config_tree, "TCPOnly"), &choice) && choice) myself->options |= OPTION_TCPONLY; - if(get_config_bool(lookup_config(myself->connection->config_tree, "PMTUDiscovery"), &choice) && choice) - myself->options |= OPTION_PMTU_DISCOVERY; - if(myself->options & OPTION_TCPONLY) myself->options |= OPTION_INDIRECT; @@ -309,11 +306,15 @@ bool setup_myself(void) } else routing_mode = RMODE_ROUTER; + if(routing_mode == RMODE_ROUTER) + if(!get_config_bool(lookup_config(myself->connection->config_tree, "PMTUDiscovery"), &choice) || choice) + myself->options |= OPTION_PMTU_DISCOVERY; + get_config_bool(lookup_config(config_tree, "PriorityInheritance"), &priorityinheritance); #if !defined(SOL_IP) || !defined(IP_TOS) if(priorityinheritance) - logger(LOG_WARNING, _("PriorityInheritance not supported on this platform")); + logger(LOG_WARNING, _("%s not supported on this platform"), "PriorityInheritance"); #endif if(!get_config_int(lookup_config(config_tree, "MACExpire"), &macexpire)) @@ -348,88 +349,72 @@ bool setup_myself(void) if(get_config_string (lookup_config(myself->connection->config_tree, "Cipher"), &cipher)) { if(!strcasecmp(cipher, "none")) { - myself->cipher = NULL; + myself->incipher = NULL; } else { - myself->cipher = EVP_get_cipherbyname(cipher); + myself->incipher = EVP_get_cipherbyname(cipher); - if(!myself->cipher) { + if(!myself->incipher) { logger(LOG_ERR, _("Unrecognized cipher type!")); return false; } } } else - myself->cipher = EVP_bf_cbc(); + myself->incipher = EVP_bf_cbc(); - if(myself->cipher) - myself->keylength = myself->cipher->key_len + myself->cipher->iv_len; + if(myself->incipher) + myself->inkeylength = myself->incipher->key_len + myself->incipher->iv_len; else - myself->keylength = 1; + myself->inkeylength = 1; myself->connection->outcipher = EVP_bf_ofb(); - myself->key = xmalloc(myself->keylength); - RAND_pseudo_bytes((unsigned char *)myself->key, myself->keylength); - if(!get_config_int(lookup_config(config_tree, "KeyExpire"), &keylifetime)) keylifetime = 3600; keyexpires = now + keylifetime; - if(myself->cipher) { - EVP_CIPHER_CTX_init(&packet_ctx); - if(!EVP_DecryptInit_ex(&packet_ctx, myself->cipher, NULL, (unsigned char *)myself->key, (unsigned char *)myself->key + myself->cipher->key_len)) { - logger(LOG_ERR, _("Error during initialisation of cipher for %s (%s): %s"), - myself->name, myself->hostname, ERR_error_string(ERR_get_error(), NULL)); - return false; - } - - } - /* Check if we want to use message authentication codes... */ - if(get_config_string - (lookup_config(myself->connection->config_tree, "Digest"), &digest)) { + if(get_config_string(lookup_config(myself->connection->config_tree, "Digest"), &digest)) { if(!strcasecmp(digest, "none")) { - myself->digest = NULL; + myself->indigest = NULL; } else { - myself->digest = EVP_get_digestbyname(digest); + myself->indigest = EVP_get_digestbyname(digest); - if(!myself->digest) { + if(!myself->indigest) { logger(LOG_ERR, _("Unrecognized digest type!")); return false; } } } else - myself->digest = EVP_sha1(); + myself->indigest = EVP_sha1(); myself->connection->outdigest = EVP_sha1(); - if(get_config_int(lookup_config(myself->connection->config_tree, "MACLength"), - &myself->maclength)) { - if(myself->digest) { - if(myself->maclength > myself->digest->md_size) { + if(get_config_int(lookup_config(myself->connection->config_tree, "MACLength"), &myself->inmaclength)) { + if(myself->indigest) { + if(myself->inmaclength > myself->indigest->md_size) { logger(LOG_ERR, _("MAC length exceeds size of digest!")); return false; - } else if(myself->maclength < 0) { + } else if(myself->inmaclength < 0) { logger(LOG_ERR, _("Bogus MAC length!")); return false; } } } else - myself->maclength = 4; + myself->inmaclength = 4; myself->connection->outmaclength = 0; /* Compression */ - if(get_config_int(lookup_config(myself->connection->config_tree, "Compression"), - &myself->compression)) { - if(myself->compression < 0 || myself->compression > 11) { + if(get_config_int(lookup_config(myself->connection->config_tree, "Compression"), &myself->incompression)) { + if(myself->incompression < 0 || myself->incompression > 11) { logger(LOG_ERR, _("Bogus compression level!")); return false; } } else - myself->compression = 0; + myself->incompression = 0; myself->connection->outcompression = 0; @@ -518,9 +503,9 @@ bool setup_myself(void) } /* - setup all initial network connections + initialize network */ -bool setup_network_connections(void) +bool setup_network(void) { cp(); @@ -546,13 +531,11 @@ bool setup_network_connections(void) pingtimeout = pinginterval; if(!get_config_int(lookup_config(config_tree, "MaxOutputBufferSize"), &maxoutbufsize)) - maxoutbufsize = 4 * MTU; + maxoutbufsize = 10 * MTU; if(!setup_myself()) return false; - try_outgoing_connections(); - return true; } @@ -571,15 +554,16 @@ void close_network_connections(void) for(node = connection_tree->head; node; node = next) { next = node->next; c = node->data; - - if(c->outgoing) - free(c->outgoing->name), free(c->outgoing), c->outgoing = NULL; + c->outgoing = false; terminate_connection(c, false); } + list_delete_list(outgoing_list); + if(myself && myself->connection) { subnet_update(myself, NULL, false); terminate_connection(myself->connection, false); + free_connection(myself->connection); } for(i = 0; i < listen_sockets; i++) { @@ -602,6 +586,8 @@ void close_network_connections(void) execute_script("tinc-down", envp); + if(myport) free(myport); + for(i = 0; i < 4; i++) free(envp[i]);