summaryrefslogtreecommitdiff
path: root/src/connection.c
diff options
context:
space:
mode:
authorJukka Rissanen <jukka.rissanen@linux.intel.com>2012-05-09 11:28:21 +0300
committerPatrik Flykt <patrik.flykt@linux.intel.com>2012-05-18 14:20:30 +0300
commit271ca983b3576a16f5685832c1e405bce8c15f44 (patch)
treeb77a29fe7d4f967e035c2564efad8b18a254e34c /src/connection.c
parentf81c82f1f60783de0723a68ecb856889b9da5834 (diff)
downloadconnman-271ca983b3576a16f5685832c1e405bce8c15f44.tar.gz
connman-271ca983b3576a16f5685832c1e405bce8c15f44.tar.bz2
connman-271ca983b3576a16f5685832c1e405bce8c15f44.zip
connection: Refactor VPN route setup
Diffstat (limited to 'src/connection.c')
-rw-r--r--src/connection.c136
1 files changed, 72 insertions, 64 deletions
diff --git a/src/connection.c b/src/connection.c
index f86f0ec5..d40f4281 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -136,58 +136,103 @@ static struct gateway_data *find_phy_gateway(int index, const char *gateway)
return NULL;
}
-static void set_vpn_routes(struct gateway_config *config,
+static void set_vpn_routes(struct gateway_data *new_gateway,
struct connman_service *service,
const char *gateway,
enum connman_ipconfig_type type,
- const char *peer)
+ const char *peer,
+ struct gateway_data *active_gateway)
{
+ struct gateway_config *config;
struct gateway_data *data;
struct connman_ipconfig *ipconfig;
+ char *dest;
int index;
+ if (type == CONNMAN_IPCONFIG_TYPE_IPV4) {
+ ipconfig = __connman_service_get_ip4config(service);
+ config = new_gateway->ipv4_gateway;
+ } else if (type == CONNMAN_IPCONFIG_TYPE_IPV6) {
+ ipconfig = __connman_service_get_ip6config(service);
+ config = new_gateway->ipv6_gateway;
+ } else
+ return;
+
+ if (config == NULL)
+ goto done;
+
config->vpn = TRUE;
if (peer != NULL)
config->vpn_ip = g_strdup(peer);
else if (gateway != NULL)
config->vpn_ip = g_strdup(gateway);
+ index = __connman_ipconfig_get_index(ipconfig);
+ data = find_phy_gateway(index, gateway);
+
+ if (data == NULL)
+ goto done;
+
+ /*
+ * data->service points now to original
+ * service that is serving the VPN link
+ */
if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
- ipconfig = __connman_service_get_ip4config(service);
+ ipconfig = __connman_service_get_ip4config(data->service);
else if (type == CONNMAN_IPCONFIG_TYPE_IPV6)
- ipconfig = __connman_service_get_ip6config(service);
+ ipconfig = __connman_service_get_ip6config(data->service);
else
return;
- index = __connman_ipconfig_get_index(ipconfig);
- data = find_phy_gateway(index, gateway);
+ if (ipconfig != NULL) {
+ const char *address;
+
+ address = __connman_ipconfig_get_local(ipconfig);
+ config->vpn_phy_ip = g_strdup(address);
+ }
+
+ config->vpn_phy_index = data->index;
+
+ DBG("vpn %s phy %s index %d", config->vpn_ip,
+ config->vpn_phy_ip, config->vpn_phy_index);
- if (data != NULL) {
+done:
+ if (active_gateway == NULL)
+ return;
+
+ if (type == CONNMAN_IPCONFIG_TYPE_IPV4) {
/*
- * data->service points now to original
- * service that is serving the VPN link
+ * Special route to VPN server via gateway. This
+ * is needed so that we can access hosts behind
+ * the VPN. The route might already exist depending
+ * on network topology.
*/
- if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
- ipconfig =
- __connman_service_get_ip4config(data->service);
- else if (type == CONNMAN_IPCONFIG_TYPE_IPV6)
- ipconfig =
- __connman_service_get_ip6config(data->service);
- else
+ if (active_gateway->ipv4_gateway == NULL)
return;
- if (ipconfig != NULL) {
- const char *address;
+ if (g_strcmp0(active_gateway->ipv4_gateway->gateway,
+ "0.0.0.0") != 0)
+ dest = active_gateway->ipv4_gateway->gateway;
+ else
+ dest = NULL;
- address = __connman_ipconfig_get_local(ipconfig);
- config->vpn_phy_ip = g_strdup(address);
- }
+ connman_inet_add_host_route(active_gateway->index, gateway,
+ dest);
- config->vpn_phy_index = data->index;
- }
+ } else if (type == CONNMAN_IPCONFIG_TYPE_IPV6) {
- DBG("vpn %s phy %s index %d", config->vpn_ip,
- config->vpn_phy_ip, config->vpn_phy_index);
+ if (active_gateway->ipv6_gateway == NULL)
+ return;
+
+ if (g_strcmp0(active_gateway->ipv6_gateway->gateway,
+ "::") != 0)
+ dest = active_gateway->ipv6_gateway->gateway;
+ else
+ dest = NULL;
+
+ connman_inet_add_ipv6_host_route(active_gateway->index,
+ gateway, dest);
+ }
}
static int del_routes(struct gateway_data *data,
@@ -832,46 +877,9 @@ int __connman_connection_gateway_add(struct connman_service *service,
}
if (service_type == CONNMAN_SERVICE_TYPE_VPN) {
- char *dest;
- if (type == CONNMAN_IPCONFIG_TYPE_IPV4) {
- if (new_gateway->ipv4_gateway != NULL)
- set_vpn_routes(new_gateway->ipv4_gateway,
- service, gateway, type, peer);
-
- /*
- * Special route to VPN server via gateway. This
- * is needed so that we can access hosts behind
- * the VPN. The route might already exist depending
- * on network topology.
- */
- if (active_gateway != NULL) {
- if (g_strcmp0(active_gateway->ipv4_gateway->gateway, "0.0.0.0") != 0)
- dest = active_gateway->ipv4_gateway->gateway;
- else
- dest = NULL;
-
- connman_inet_add_host_route(active_gateway->index,
- gateway,
- dest);
- }
-
- } else if (type == CONNMAN_IPCONFIG_TYPE_IPV6) {
- if (new_gateway->ipv6_gateway != NULL)
- set_vpn_routes(new_gateway->ipv6_gateway,
- service, gateway, type, peer);
-
- if (active_gateway != NULL) {
- if (g_strcmp0(active_gateway->ipv6_gateway->gateway, "::") != 0)
- dest = active_gateway->ipv6_gateway->gateway;
- else
- dest = NULL;
-
- connman_inet_add_ipv6_host_route(active_gateway->index,
- gateway,
- dest);
- }
- }
+ set_vpn_routes(new_gateway, service, gateway, type, peer,
+ active_gateway);
} else {
if (type == CONNMAN_IPCONFIG_TYPE_IPV4 &&