@@ -797,6 +797,27 @@ static int vpn_route_env_parse(struct vpn_provider *provider, const char *key,
return 0;
}
+static bool vpn_uses_vpn_agent(struct vpn_provider *provider)
+{
+ struct vpn_driver_data *vpn_driver_data = NULL;
+ const char *name = NULL;
+
+ if (!provider)
+ return false;
+
+ name = vpn_provider_get_driver_name(provider);
+ vpn_driver_data = g_hash_table_lookup(driver_hash, name);
+
+ if (vpn_driver_data && vpn_driver_data->vpn_driver->uses_vpn_agent)
+ return vpn_driver_data->vpn_driver->uses_vpn_agent(provider);
+
+ /*
+ * Default to using the VPN agent, in cases where the function is not
+ * implemented. The use of VPN agent must be explicitly dropped.
+ */
+ return true;
+}
+
int vpn_register(const char *name, const struct vpn_driver *vpn_driver,
const char *program)
{
@@ -822,6 +843,7 @@ int vpn_register(const char *name, const struct vpn_driver *vpn_driver,
data->provider_driver.save = vpn_save;
data->provider_driver.set_state = vpn_set_state;
data->provider_driver.route_env_parse = vpn_route_env_parse;
+ data->provider_driver.uses_vpn_agent = vpn_uses_vpn_agent;
if (!driver_hash)
driver_hash = g_hash_table_new_full(g_str_hash,
@@ -57,6 +57,7 @@ struct vpn_driver {
int (*route_env_parse) (struct vpn_provider *provider, const char *key,
int *family, unsigned long *idx,
enum vpn_provider_route_type *type);
+ bool (*uses_vpn_agent) (struct vpn_provider *provider);
};
int vpn_register(const char *name, const struct vpn_driver *driver,
@@ -167,6 +167,7 @@ struct vpn_provider_driver {
int (*route_env_parse) (struct vpn_provider *provider, const char *key,
int *family, unsigned long *idx,
enum vpn_provider_route_type *type);
+ bool (*uses_vpn_agent) (struct vpn_provider *provider);
};
int vpn_provider_driver_register(struct vpn_provider_driver *driver);