]> git.ipfire.org Git - thirdparty/openvpn.git/commitdiff
Added new option --route-method adaptive (Win32)
authorjames <james@e7ae566f-a301-0410-adde-c780ea21d3b5>
Thu, 22 Dec 2005 18:55:49 +0000 (18:55 +0000)
committerjames <james@e7ae566f-a301-0410-adde-c780ea21d3b5>
Thu, 22 Dec 2005 18:55:49 +0000 (18:55 +0000)
which tries IP helper API first, then falls back to
route.exe.
Made --route-method adaptive the default.

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

ChangeLog
options.c
route.c
route.h

index e8c2005f0e9c07e4d7a3dbe9f412e3497b92ce97..ac0dbc4b810ec7be99772170eb9f263636443ed8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -36,6 +36,10 @@ $Id$
 * --ip-win32 netsh (or --ip-win32 adaptive when in netsh
   mode) can now set DNS/WINS addresses on the TAP-Win32
   adapter.
+* Added new option --route-method adaptive (Win32)
+  which tries IP helper API first, then falls back to
+  route.exe.
+* Made --route-method adaptive the default.
        
 2005.11.12 -- Version 2.1-beta7
 
index 75c8825d11988926f37f6f0f4299c626bd984f2e..6614c3e3a603f875c68421e8bd6bd0c65f9cdd95 100644 (file)
--- a/options.c
+++ b/options.c
@@ -644,7 +644,7 @@ init_options (struct options *o)
 #endif
   o->tuntap_options.dhcp_lease_time = 31536000; /* one year */
   o->tuntap_options.dhcp_masq_offset = 0;       /* use network address as internal DHCP server address */
-  o->route_method = ROUTE_METHOD_IPAPI;
+  o->route_method = ROUTE_METHOD_ADAPTIVE;
 #endif
 #ifdef USE_PTHREAD
   o->n_threads = 1;
@@ -4318,13 +4318,15 @@ add_option (struct options *options,
   else if (streq (p[0], "route-method") && p[1])
     {
       VERIFY_PERMISSION (OPT_P_ROUTE_EXTRAS);
-      if (streq (p[1], "ipapi"))
+      if (streq (p[1], "adaptive"))
+       options->route_method = ROUTE_METHOD_ADAPTIVE;
+      else if (streq (p[1], "ipapi"))
        options->route_method = ROUTE_METHOD_IPAPI;
       else if (streq (p[1], "exe"))
        options->route_method = ROUTE_METHOD_EXE;
       else
        {
-         msg (msglevel, "--route method must be 'ipapi' or 'exe'");
+         msg (msglevel, "--route method must be 'adaptive', 'ipapi', or 'exe'");
          goto err;
        }
     }
diff --git a/route.c b/route.c
index 06e1facd641838cc58d96fa0d23a56fd9ecf4dcc..5ca48bcbf77d51beaa63b7b17b10fcd9751fb241 100644 (file)
--- a/route.c
+++ b/route.c
@@ -22,8 +22,6 @@
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-/* JYFIXME WIN32 todo: add adaptive route-method */
-
 /*
  * Support routines for adding/deleting network routes.
  */
@@ -812,6 +810,18 @@ add_route (struct route *r, const struct tuntap *tt, unsigned int flags, const s
       status = system_check (BSTR (&buf), es, 0, "ERROR: Windows route add command failed");
       netcmd_semaphore_release ();
     }
+  else if ((flags & ROUTE_METHOD_MASK) == ROUTE_METHOD_ADAPTIVE)
+    {
+      status = add_route_ipapi (r, tt);
+      msg (D_ROUTE, "Route addition via IPAPI %s [adaptive]", status ? "succeeded" : "failed");
+      if (!status)
+       {
+         msg (D_ROUTE, "Route addition fallback to route.exe");
+         netcmd_semaphore_lock ();
+         status = system_check (BSTR (&buf), es, 0, "ERROR: Windows route add command failed [adaptive]");
+         netcmd_semaphore_release ();
+       }
+    }
   else
     {
       ASSERT (0);
@@ -949,6 +959,18 @@ delete_route (const struct route *r, const struct tuntap *tt, unsigned int flags
       system_check (BSTR (&buf), es, 0, "ERROR: Windows route delete command failed");
       netcmd_semaphore_release ();
     }
+  else if ((flags & ROUTE_METHOD_MASK) == ROUTE_METHOD_ADAPTIVE)
+    {
+      const bool status = del_route_ipapi (r, tt);
+      msg (D_ROUTE, "Route deletion via IPAPI %s [adaptive]", status ? "succeeded" : "failed");
+      if (!status)
+       {
+         msg (D_ROUTE, "Route deletion fallback to route.exe");
+         netcmd_semaphore_lock ();
+         system_check (BSTR (&buf), es, 0, "ERROR: Windows route delete command failed [adaptive]");
+         netcmd_semaphore_release ();
+       }
+    }
   else
     {
       ASSERT (0);
diff --git a/route.h b/route.h
index c2da5331bc4ee90049216261f8846ab37fcc9cc2..9cbc77311b66258f07f029a838e81f81c491f189 100644 (file)
--- a/route.h
+++ b/route.h
 /*
  * Windows route methods
  */
-#define ROUTE_METHOD_IPAPI  0  /* use IP helper API */
-#define ROUTE_METHOD_EXE    1  /* use route.exe */
-#define ROUTE_METHOD_MASK   1
+#define ROUTE_METHOD_ADAPTIVE  0  /* try IP helper first then route.exe */
+#define ROUTE_METHOD_IPAPI     1  /* use IP helper API */
+#define ROUTE_METHOD_EXE       2  /* use route.exe */
+#define ROUTE_METHOD_MASK      3
 #endif
 
 /*
  * Route add flags (must stay clear of ROUTE_METHOD bits)
  */
-#define ROUTE_DELETE_FIRST  2
+#define ROUTE_DELETE_FIRST  4
 
 struct route_bypass
 {