From cfa115ca423e88499db99645203880c1381f37d4 Mon Sep 17 00:00:00 2001 From: taesubkim Date: Wed, 27 Apr 2016 09:06:40 +0900 Subject: [PATCH] Fixing P151224-03183, Redirect the DNS queries to VPN interface #2 [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 [Solution company] Samsung [Change Type] Specification change Change-Id: I15723669cdca453007ae5f54be8a5bbf8862c042 Signed-off-by: Taesub Kim --- daemon/src/vpn_service_daemon.c | 63 +++++++++++++++++++++++++++++++++++++++++ packaging/capi-vpn-service.spec | 2 +- 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/daemon/src/vpn_service_daemon.c b/daemon/src/vpn_service_daemon.c index 00ea4e2..f4f82b9 100755 --- a/daemon/src/vpn_service_daemon.c +++ b/daemon/src/vpn_service_daemon.c @@ -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; diff --git a/packaging/capi-vpn-service.spec b/packaging/capi-vpn-service.spec index f44eacc..ce85600 100755 --- a/packaging/capi-vpn-service.spec +++ b/packaging/capi-vpn-service.spec @@ -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 -- 2.7.4