]> git.meshlink.io Git - meshlink/commitdiff
Merge branch 'master' into 1.1
authorGuus Sliepen <guus@tinc-vpn.org>
Fri, 11 Dec 2009 21:31:27 +0000 (22:31 +0100)
committerGuus Sliepen <guus@tinc-vpn.org>
Fri, 11 Dec 2009 21:31:27 +0000 (22:31 +0100)
Conflicts:
src/subnet.c

src/graph.c
src/route.c
src/subnet.c
src/subnet.h

index 06bf36d793cc43e6d76bba2fee33df75b5f26c33..d54e5cd6a99de011bb64030ed648b9190deeb8b1 100644 (file)
@@ -378,6 +378,9 @@ void check_reachability() {
                                free(envp[i]);
 
                        subnet_update(n, NULL, n->status.reachable);
+
+                       if(!n->status.reachable)
+                               update_node_udp(n, NULL);
                }
        }
 }
index 758801be80bbd38582b08d5a39724b453652a6db..3c0cf5b5b3a0d7aedc02807da006d46f26dbcc1a 100644 (file)
@@ -141,7 +141,7 @@ static void learn_mac(mac_t *address) {
        splay_node_t *node;
        connection_t *c;
 
-       subnet = lookup_subnet_mac(address);
+       subnet = lookup_subnet_mac(myself, address);
 
        /* If we don't know this MAC address yet, store it */
 
@@ -720,7 +720,7 @@ static void route_mac(node_t *source, vpn_packet_t *packet) {
        /* Lookup destination address */
 
        memcpy(&dest, &packet->data[0], sizeof dest);
-       subnet = lookup_subnet_mac(&dest);
+       subnet = lookup_subnet_mac(NULL, &dest);
 
        if(!subnet) {
                broadcast_packet(source, packet);
index 0669b8a0bceaf649ce39a7ae8c5338962f7c2e41..8bc8fce89efdc5040f6ba1c04c27b6d157d7c917 100644 (file)
@@ -330,8 +330,8 @@ subnet_t *lookup_subnet(const node_t *owner, const subnet_t *subnet) {
        return splay_search(owner->subnet_tree, subnet);
 }
 
-subnet_t *lookup_subnet_mac(const mac_t *address) {
-       subnet_t *p, *r = NULL, subnet = {0};
+subnet_t *lookup_subnet_mac(const node_t *owner, const mac_t *address) {
+       subnet_t *p, *r = NULL;
        splay_node_t *n;
        int i;
 
@@ -340,20 +340,18 @@ subnet_t *lookup_subnet_mac(const mac_t *address) {
        for(i = 0; i < 2; i++) {
                if(!cache_mac_valid[i])
                        continue;
+               if(owner && cache_mac_subnet[i] && cache_mac_subnet[i]->owner != owner)
+                       continue;
                if(!memcmp(address, &cache_mac_address[i], sizeof *address))
                        return cache_mac_subnet[i];
        }
 
        // Search all subnets for a matching one
 
-       subnet.type = SUBNET_MAC;
-       subnet.net.mac.address = *address;
-       subnet.owner = NULL;
-
-       for(n = subnet_tree->head; n; n = n->next) {
+       for(n = owner ? owner->subnet_tree->head : subnet_tree->head; n; n = n->next) {
                p = n->data;
                
-               if(!p || p->type != subnet.type)
+               if(!p || p->type != SUBNET_MAC)
                        continue;
 
                if(!memcmp(address, &p->net.mac.address, sizeof *address)) {
@@ -374,7 +372,7 @@ subnet_t *lookup_subnet_mac(const mac_t *address) {
 }
 
 subnet_t *lookup_subnet_ipv4(const ipv4_t *address) {
-       subnet_t *p, *r = NULL, subnet = {0};
+       subnet_t *p, *r = NULL;
        splay_node_t *n;
        int i;
 
@@ -389,15 +387,10 @@ subnet_t *lookup_subnet_ipv4(const ipv4_t *address) {
 
        // Search all subnets for a matching one
 
-       subnet.type = SUBNET_IPV4;
-       subnet.net.ipv4.address = *address;
-       subnet.net.ipv4.prefixlength = 32;
-       subnet.owner = NULL;
-
        for(n = subnet_tree->head; n; n = n->next) {
                p = n->data;
                
-               if(!p || p->type != subnet.type)
+               if(!p || p->type != SUBNET_IPV4)
                        continue;
 
                if(!maskcmp(address, &p->net.ipv4.address, p->net.ipv4.prefixlength)) {
@@ -418,7 +411,7 @@ subnet_t *lookup_subnet_ipv4(const ipv4_t *address) {
 }
 
 subnet_t *lookup_subnet_ipv6(const ipv6_t *address) {
-       subnet_t *p, *r = NULL, subnet = {0};
+       subnet_t *p, *r = NULL;
        splay_node_t *n;
        int i;
 
@@ -433,15 +426,10 @@ subnet_t *lookup_subnet_ipv6(const ipv6_t *address) {
 
        // Search all subnets for a matching one
 
-       subnet.type = SUBNET_IPV6;
-       subnet.net.ipv6.address = *address;
-       subnet.net.ipv6.prefixlength = 128;
-       subnet.owner = NULL;
-
        for(n = subnet_tree->head; n; n = n->next) {
                p = n->data;
                
-               if(!p || p->type != subnet.type)
+               if(!p || p->type != SUBNET_IPV6)
                        continue;
 
                if(!maskcmp(address, &p->net.ipv6.address, p->net.ipv6.prefixlength)) {
index 466eb20c1806f11fc9cfbea3bdbec0eedb346e09..df48f60eda8268cc989cb9591bf47b4c72076c8f 100644 (file)
@@ -77,7 +77,7 @@ extern void subnet_update(struct node_t *, subnet_t *, bool);
 extern bool net2str(char *, int, const subnet_t *);
 extern bool str2net(subnet_t *, const char *);
 extern subnet_t *lookup_subnet(const struct node_t *, const subnet_t *);
-extern subnet_t *lookup_subnet_mac(const mac_t *);
+extern subnet_t *lookup_subnet_mac(const struct node_t *, const mac_t *);
 extern subnet_t *lookup_subnet_ipv4(const ipv4_t *);
 extern subnet_t *lookup_subnet_ipv6(const ipv6_t *);
 extern bool dump_subnets(struct connection_t *);