connection: Set host route to VPN server
authorJukka Rissanen <jukka.rissanen@linux.intel.com>
Fri, 27 Apr 2012 10:55:46 +0000 (13:55 +0300)
committerPatrik Flykt <patrik.flykt@linux.intel.com>
Wed, 2 May 2012 07:29:01 +0000 (10:29 +0300)
This is needed so that we can access hosts behind the VPN.
The route might already be setup if VPN server is the same
as nameserver or similar.

src/connection.c

index bd64c95..f4abd57 100644 (file)
@@ -832,15 +832,31 @@ int __connman_connection_gateway_add(struct connman_service *service,
        }
 
        if (service_type == CONNMAN_SERVICE_TYPE_VPN) {
-               if (type == CONNMAN_IPCONFIG_TYPE_IPV4 &&
-                                       new_gateway->ipv4_gateway != NULL)
-                       set_vpn_routes(new_gateway->ipv4_gateway,
-                               service, gateway, type, peer);
 
-               else if (type == CONNMAN_IPCONFIG_TYPE_IPV6 &&
-                                       new_gateway->ipv6_gateway != NULL)
-                       set_vpn_routes(new_gateway->ipv6_gateway,
-                               service, gateway, type, peer);
+               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.
+                        */
+                       connman_inet_add_host_route(active_gateway->index,
+                                       gateway,
+                                       active_gateway->ipv4_gateway->gateway);
+
+               } else if (type == CONNMAN_IPCONFIG_TYPE_IPV6) {
+                       if (new_gateway->ipv6_gateway != NULL)
+                               set_vpn_routes(new_gateway->ipv6_gateway,
+                                       service, gateway, type, peer);
+
+                       connman_inet_add_ipv6_host_route(active_gateway->index,
+                                       gateway,
+                                       active_gateway->ipv6_gateway->gateway);
+               }
 
        } else {
                if (type == CONNMAN_IPCONFIG_TYPE_IPV4 &&