Fixing P151224-03183, Redirect the DNS queries to VPN interface #2 71/67471/5
authortaesubkim <taesub.kim@samsung.com>
Wed, 27 Apr 2016 00:06:40 +0000 (09:06 +0900)
committertaesubkim <taesub.kim@samsung.com>
Wed, 27 Apr 2016 00:25:16 +0000 (09:25 +0900)
[Model] TM1
[Issue#] P151224-03183
[Request] PLM
[Occurrence Version] NA
[Problem] VPN is NOT working properly
[Cause & Measure] Redirect the DNS queries to VPN interface
[Checking Method] Redirect the DNS queries to VPN interface
[Team] Tizen platform lab(SWC)
[Developer] Taesub Kim <taesub.kim@samsung.com>
[Solution company] Samsung
[Change Type] Specification change

Change-Id: I15723669cdca453007ae5f54be8a5bbf8862c042
Signed-off-by: Taesub Kim <taesub.kim@samsung.com>
daemon/src/vpn_service_daemon.c
packaging/capi-vpn-service.spec

index 00ea4e2..f4f82b9 100755 (executable)
@@ -140,6 +140,56 @@ static int add_routes(char* iface_name, char* routes[], int prefix[], size_t nr_
        return VPNSVC_ERROR_NONE;
 }
 
+static int add_dns_routes(char* if_name, char** dns_servers, size_t nr_dns)
+{
+       struct rtentry rt;
+       struct sockaddr_in addr;
+       int sk;
+       unsigned int i = 0;
+
+       LOGD("Enter add_routes");
+
+       sk = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
+       if (sk < 0) {
+               LOGE("socket failed : %s", strerror(errno));
+               return VPNSVC_ERROR_IO_ERROR;
+       }
+
+       for (i = 0; i < nr_dns; i++) {
+               memset(&rt, 0, sizeof(rt));
+               rt.rt_flags = RTF_UP;
+
+               memset(&addr, 0, sizeof(addr));
+               addr.sin_family = AF_INET;
+               addr.sin_addr.s_addr = inet_addr(dns_servers[i]);
+               memcpy(&rt.rt_dst, &addr, sizeof(rt.rt_dst));
+
+               memset(&addr, 0, sizeof(addr));
+               addr.sin_family = AF_INET;
+               addr.sin_addr.s_addr = INADDR_ANY;
+               memcpy(&rt.rt_gateway, &addr, sizeof(rt.rt_gateway));
+
+               /* set mask using by prefix length */
+               memset(&addr, 0, sizeof(addr));
+               addr.sin_family = AF_INET;
+               addr.sin_addr.s_addr = INADDR_ANY;
+               addr.sin_addr.s_addr = host2net(make_mask(32));
+               memcpy(&rt.rt_genmask, &addr, sizeof(rt.rt_genmask));
+
+               rt.rt_dev = if_name;
+
+               if (ioctl(sk, SIOCADDRT, &rt) < 0) {
+                       LOGE("ioctl SIOCADDRT failed : %s", strerror(errno));
+                       close(sk);
+                       return VPNSVC_ERROR_IO_ERROR;
+               }
+       }
+
+       close(sk);
+
+       return VPNSVC_ERROR_NONE;
+}
+
 static void connman_connection_open(void)
 {
        if (global_connection == NULL) {
@@ -871,6 +921,16 @@ int vpn_daemon_up(int iface_index, const char* local_ip, const char* remote_ip,
                }
        }
 
+       /* add DNS routes */
+       if (nr_dns > 0) {
+               ret = add_dns_routes(ifr_tun.ifr_name, dns_servers, nr_dns);
+               if (ret != VPNSVC_ERROR_NONE) {
+                       LOGE("add_dns failed");
+                       return ret;
+               }
+       }
+
+#if 0
        /* add DNS servers */
        if (nr_dns > 0) {
                ret = add_dns_servers(dns_servers, nr_dns, total_dns_string_cnt);
@@ -892,10 +952,13 @@ int vpn_daemon_up(int iface_index, const char* local_ip, const char* remote_ip,
        if (nr_dns > 0) {
                dns_nat_register(dns_servers, nr_dns, local_ip);
        }
+#endif
 
        return ret;
 }
 
+
+
 int vpn_daemon_down(int iface_index)
 {
        struct ifreq ifr, addr_ifr;
index f44eacc..ce85600 100755 (executable)
@@ -1,6 +1,6 @@
 Name:       vpnsvc-pkg
 Summary:    VPN service library in TIZEN C API
-Version:    1.0.10
+Version:    1.0.11
 Release:    1
 Group:      System/Network
 License:    Apache-2.0