Enable PMTUDiscovery only if BOTH sides wants it.
[oweals/tinc.git] / src / net.c
index e2e2833c80a71af8c448861f92ae79e0e3274865..ca9db7cfacc37b9939e9d08ada67af8d9de862d6 100644 (file)
--- a/src/net.c
+++ b/src/net.c
@@ -1,7 +1,7 @@
 /*
     net.c -- most of the network code
     Copyright (C) 1998-2005 Ivo Timmermans,
-                  2000-2006 Guus Sliepen <guus@tinc-vpn.org>
+                  2000-2007 Guus Sliepen <guus@tinc-vpn.org>
 
     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
@@ -295,8 +295,10 @@ static void check_network_activity(fd_set * readset, fd_set * writeset)
 
        /* check input from kernel */
        if(FD_ISSET(device_fd, readset)) {
-               if(read_packet(&packet))
+               if(read_packet(&packet)) {
+                       packet.priority = 0;
                        route(myself, &packet);
+               }
        }
 
        /* check meta connections */
@@ -354,13 +356,15 @@ int main_loop(void)
        fd_set readset, writeset;
        struct timeval tv;
        int r, maxfd;
-       time_t last_ping_check, last_config_check;
+       time_t last_ping_check, last_config_check, last_graph_dump;
        event_t *event;
 
        cp();
 
        last_ping_check = now;
        last_config_check = now;
+       last_graph_dump = now;
+       
        srand(now);
 
        running = true;
@@ -419,23 +423,17 @@ int main_loop(void)
                        }
                }
 
-
-               while((event = get_expired_event())) {
-                       event->handler(event->data);
-                       free(event);
-               }
-
                if(sigalrm) {
                        logger(LOG_INFO, _("Flushing event queue"));
-
-                       while(event_tree->head) {
-                               event = event_tree->head->data;
-                               event->handler(event->data);
-                               event_del(event);
-                       }
+                       expire_events();
                        sigalrm = false;
                }
 
+               while((event = get_expired_event())) {
+                       event->handler(event->data);
+                       free_event(event);
+               }
+
                if(sighup) {
                        connection_t *c;
                        avl_node_t *node;
@@ -459,13 +457,6 @@ int main_loop(void)
                        for(node = connection_tree->head; node; node = node->next) {
                                c = node->data;
                                
-                               if(c->outgoing) {
-                                       free(c->outgoing->name);
-                                       freeaddrinfo(c->outgoing->ai);
-                                       free(c->outgoing);
-                                       c->outgoing = NULL;
-                               }
-                               
                                asprintf(&fname, "%s/hosts/%s", confbase, c->name);
                                if(stat(fname, &s) || s.st_mtime > last_config_check)
                                        terminate_connection(c, c->status.active);
@@ -478,6 +469,13 @@ int main_loop(void)
                        
                        try_outgoing_connections();
                }
+               
+               /* Dump graph if wanted every 60 seconds*/
+
+               if(last_graph_dump + 60 < now) {
+                       dump_graph();
+                       last_graph_dump = now;
+               }
        }
 
        return 0;