bias the lookup sorting towards directly reachable IPs
authorAndrew Tridgell <tridge@samba.org>
Mon, 1 Jul 2002 05:39:32 +0000 (05:39 +0000)
committerAndrew Tridgell <tridge@samba.org>
Mon, 1 Jul 2002 05:39:32 +0000 (05:39 +0000)
(This used to be commit 514b91827a970a0041314af341b8c66a01668e4a)

source3/lib/interface.c
source3/libsmb/namequery.c

index 85c49789c4b345c2d1cf4adb4a2a876ee98c6436..2704397fb2e94a04ab2fb6a485cf2f399f76fdd2 100644 (file)
@@ -355,3 +355,11 @@ struct in_addr *iface_ip(struct in_addr ip)
        struct interface *i = iface_find(ip, True);
        return(i ? &i->ip : &local_interfaces->ip);
 }
+
+/*
+  return True if a IP is directly reachable on one of our interfaces
+*/
+BOOL iface_local(struct in_addr ip)
+{
+       return iface_find(ip, True) ? True : False;
+}
index 242601d1da2b0bdf792bbef7ca58df1e1464b54d..2bf72fbaac9f0bb9f30f525a18613524867616b2 100644 (file)
@@ -317,6 +317,14 @@ static int ip_compare(struct in_addr *ip1, struct in_addr *ip2)
                max_bits1 = MAX(bits1, max_bits1);
                max_bits2 = MAX(bits2, max_bits2);
        }       
+       
+       /* bias towards directly reachable IPs */
+       if (iface_local(*ip1)) {
+               max_bits1 += 32;
+       }
+       if (iface_local(*ip2)) {
+               max_bits2 += 32;
+       }
 
        return max_bits2 - max_bits1;
 }