- if(!get_config_port(lookup_config(myself->connection->config_tree, "Port"), &myself->port))
- myself->port = 655;
-
- myself->connection->port = myself->port;
-
-/* Read in all the subnets specified in the host configuration file */
-
- cfg = lookup_config(myself->connection->config_tree, "Subnet");
-
- while(cfg)
- {
- if(!get_config_subnet(cfg, &subnet))
- return -1;
-
- subnet_add(myself, subnet);
-
- cfg = lookup_config_next(myself->connection->config_tree, cfg);
- }
-
-cp
- /* Check some options */
-
- if(get_config_bool(lookup_config(config_tree, "IndirectData"), &choice))
- if(choice)
- myself->options |= OPTION_INDIRECT;
-
- if(get_config_bool(lookup_config(config_tree, "TCPOnly"), &choice))
- if(choice)
- myself->options |= OPTION_TCPONLY;
-
- if(get_config_bool(lookup_config(myself->connection->config_tree, "IndirectData"), &choice))
- if(choice)
- myself->options |= OPTION_INDIRECT;
-
- if(get_config_bool(lookup_config(myself->connection->config_tree, "TCPOnly"), &choice))
- if(choice)
- myself->options |= OPTION_TCPONLY;
-
- if(myself->options & OPTION_TCPONLY)
- myself->options |= OPTION_INDIRECT;
-
- if(get_config_string(lookup_config(config_tree, "Mode"), &mode))
- {
- if(!strcasecmp(mode, "router"))
- routing_mode = RMODE_ROUTER;
- else if (!strcasecmp(mode, "switch"))
- routing_mode = RMODE_SWITCH;
- else if (!strcasecmp(mode, "hub"))
- routing_mode = RMODE_HUB;
- else
- {
- syslog(LOG_ERR, _("Invalid routing mode!"));
- return -1;
- }
- }
- else
- routing_mode = RMODE_ROUTER;
-
-cp
- /* Open sockets */
-
- if((tcp_socket = setup_listen_socket(myself->port)) < 0)
- {
- syslog(LOG_ERR, _("Unable to set up a listening TCP socket!"));
- return -1;
- }
-
- if((udp_socket = setup_vpn_in_socket(myself->port)) < 0)
- {
- syslog(LOG_ERR, _("Unable to set up a listening UDP socket!"));
- return -1;
- }
-cp
- /* Generate packet encryption key */
-
- if(get_config_string(lookup_config(myself->connection->config_tree, "Cipher"), &cipher))
- {
- if(!strcasecmp(cipher, "none"))
- {
- myself->cipher = NULL;
- }
- else
- {
- if(!(myself->cipher = EVP_get_cipherbyname(cipher)))
- {
- syslog(LOG_ERR, _("Unrecognized cipher type!"));
- return -1;
- }
- }
- }
- else
- myself->cipher = EVP_bf_cbc();
-
- if(myself->cipher)
- myself->keylength = myself->cipher->key_len + myself->cipher->iv_len;
- else
- myself->keylength = 1;
-
- myself->key = (char *)xmalloc(myself->keylength);
- RAND_pseudo_bytes(myself->key, myself->keylength);
-
- if(!get_config_int(lookup_config(config_tree, "KeyExpire"), &keylifetime))
- keylifetime = 3600;
-
- keyexpires = time(NULL) + keylifetime;
-
- /* Check if we want to use message authentication codes... */
-
- if(get_config_string(lookup_config(myself->connection->config_tree, "Digest"), &digest))
- {
- if(!strcasecmp(digest, "none"))
- {
- myself->digest = NULL;
+static void timeout_handler(void *arg) {
+ event_t *event = arg;
+ splay_node_t *node, *next;
+ connection_t *c;
+ time_t now = time(NULL);
+
+ for(node = connection_tree->head; node; node = next) {
+ next = node->next;
+ c = node->data;
+
+ if(c->last_ping_time + pingtimeout < now) {
+ if(c->status.active) {
+ if(c->status.pinged) {
+ ifdebug(CONNECTIONS) logger(LOG_INFO, "%s (%s) didn't respond to PING in %ld seconds",
+ c->name, c->hostname, now - c->last_ping_time);
+ terminate_connection(c, true);
+ continue;
+ } else if(c->last_ping_time + pinginterval < now) {
+ send_ping(c);
+ }
+ } else {
+ if(c->status.connecting) {
+ ifdebug(CONNECTIONS)
+ logger(LOG_WARNING, "Timeout while connecting to %s (%s)", c->name, c->hostname);
+ c->status.connecting = false;
+ closesocket(c->socket);
+ do_outgoing_connection(c);
+ } else {
+ ifdebug(CONNECTIONS) logger(LOG_WARNING, "Timeout from %s (%s) during authentication", c->name, c->hostname);
+ terminate_connection(c, false);
+ continue;
+ }
+ }
+ }