Update copyright notices.
[oweals/tinc.git] / src / route.c
index 77bec047b4738f0c2c6a18789aebe3546714735c..664fed89fbd102edb543b637ed7148edaa2009d9 100644 (file)
@@ -1,7 +1,7 @@
 /*
     route.c -- routing
     Copyright (C) 2000-2005 Ivo Timmermans,
-                  2000-2009 Guus Sliepen <guus@tinc-vpn.org>
+                  2000-2010 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
@@ -94,7 +94,7 @@ static bool checklength(node_t *source, vpn_packet_t *packet, length_t length) {
 }
 
 static void clamp_mss(const node_t *source, const node_t *via, vpn_packet_t *packet) {
-       if(!via || via == myself)
+       if(!via || via == myself || !(via->options & OPTION_CLAMP_MSS))
                return;
 
        /* Find TCP header */
@@ -112,6 +112,9 @@ static void clamp_mss(const node_t *source, const node_t *via, vpn_packet_t *pac
        /* Use data offset field to calculate length of options field */
        int len = ((packet->data[start + 12] >> 4) - 5) * 4;
 
+       if(packet->len < start + 20 + len)
+               return;
+
        /* Search for MSS option header */
        for(int i = 0; i < len;) {
                if(packet->data[start + 20 + i] == 0)
@@ -185,6 +188,7 @@ static void learn_mac(mac_t *address) {
                subnet->net.mac.address = *address;
                subnet->weight = 10;
                subnet_add(myself, subnet);
+               subnet_update(myself, subnet, true);
 
                /* And tell all other tinc daemons it's our MAC */
 
@@ -220,6 +224,7 @@ void age_subnets(void) {
                                        send_del_subnet(c, s);
                        }
 
+                       subnet_update(myself, s, false);
                        subnet_del(myself, s);
                }
        }