]> git.ipfire.org Git - thirdparty/openvpn.git/commitdiff
Modified get_default_gateway code for Windows
authorjames <james@e7ae566f-a301-0410-adde-c780ea21d3b5>
Thu, 20 Oct 2005 07:42:01 +0000 (07:42 +0000)
committerjames <james@e7ae566f-a301-0410-adde-c780ea21d3b5>
Thu, 20 Oct 2005 07:42:01 +0000 (07:42 +0000)
to return the route with the smallest metric
if multiple 0.0.0.0/0.0.0.0 entries are present.

git-svn-id: http://svn.openvpn.net/projects/openvpn/branches/BETA21/openvpn@691 e7ae566f-a301-0410-adde-c780ea21d3b5

route.c

diff --git a/route.c b/route.c
index 3ec6c3f7d0688ddf207d783574a0ad9e6084888e..255d35c4225e684136c856231b1bcdf00ad12175 100644 (file)
--- a/route.c
+++ b/route.c
@@ -1102,9 +1102,11 @@ test_routes (const struct route_list *rl, const struct tuntap *tt)
 static const MIB_IPFORWARDROW *
 get_default_gateway_row (const MIB_IPFORWARDTABLE *routes)
 {
-  DWORD lowest_index = ~0;
+  struct gc_arena gc = gc_new ();
+  DWORD lowest_metric = ~0;
   const MIB_IPFORWARDROW *ret = NULL;
   int i;
+  int best = -1;
 
   if (routes)
     {
@@ -1114,22 +1116,27 @@ get_default_gateway_row (const MIB_IPFORWARDTABLE *routes)
          const in_addr_t net = ntohl (row->dwForwardDest);
          const in_addr_t mask = ntohl (row->dwForwardMask);
          const DWORD index = row->dwForwardIfIndex;
+         const DWORD metric = row->dwForwardMetric1;
 
-#if 0
-         msg (M_INFO, "route[%d] %s %s %s",
-              i,
-              print_in_addr_t ((in_addr_t) net, 0, &gc),
-              print_in_addr_t ((in_addr_t) mask, 0, &gc),
-              print_in_addr_t ((in_addr_t) gw, 0, &gc));
-#endif
+         dmsg (D_ROUTE_DEBUG, "GDGR: route[%d] %s/%s i=%d m=%d",
+               i,
+               print_in_addr_t ((in_addr_t) net, 0, &gc),
+               print_in_addr_t ((in_addr_t) mask, 0, &gc),
+               (int)index,
+               (int)metric);
 
-         if (!net && !mask && index < lowest_index)
+         if (!net && !mask && metric < lowest_metric)
            {
              ret = row;
-             lowest_index = index;
+             lowest_metric = metric;
+             best = i;
            }
        }
     }
+
+  dmsg (D_ROUTE_DEBUG, "GDGR: best=%d lm=%u", best, (unsigned int)lowest_metric);
+
+  gc_free (&gc);
   return ret;
 }