diff options
author | Mohamed Abbas <mohamed.abbas@intel.com> | 2010-02-03 16:16:40 -0800 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2010-02-11 05:33:05 +0100 |
commit | 648d5be5ee5830b3b056c78b86c34899f411c47c (patch) | |
tree | e8aaf715f09185e2e763aba209c6fd616cbe7d1b /src/inet.c | |
parent | e78dd7a43a9484882ff4edb3cbd89a0e56f9f63e (diff) | |
download | connman-648d5be5ee5830b3b056c78b86c34899f411c47c.tar.gz connman-648d5be5ee5830b3b056c78b86c34899f411c47c.tar.bz2 connman-648d5be5ee5830b3b056c78b86c34899f411c47c.zip |
Fix VPN issue when setting up host route
Diffstat (limited to 'src/inet.c')
-rw-r--r-- | src/inet.c | 51 |
1 files changed, 51 insertions, 0 deletions
@@ -631,6 +631,57 @@ int connman_inet_clear_address(int index) return 0; } +int connman_inet_add_host_route_vpn(int index, const char *gateway, const char *host) +{ + struct ifreq ifr; + struct rtentry rt; + struct sockaddr_in addr; + int sk, err; + + sk = socket(PF_INET, SOCK_DGRAM, 0); + if (sk < 0) + return -1; + + memset(&ifr, 0, sizeof(ifr)); + ifr.ifr_ifindex = index; + + if (ioctl(sk, SIOCGIFNAME, &ifr) < 0) { + close(sk); + return -1; + } + + DBG("ifname %s", ifr.ifr_name); + + memset(&rt, 0, sizeof(rt)); + rt.rt_flags = RTF_UP | RTF_HOST | RTF_GATEWAY; + + memset(&addr, 0, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = inet_addr(host); + memcpy(&rt.rt_dst, &addr, sizeof(rt.rt_dst)); + + memset(&addr, 0, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = inet_addr(gateway);; + memcpy(&rt.rt_gateway, &addr, sizeof(rt.rt_gateway)); + + memset(&addr, 0, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = INADDR_ANY; + memcpy(&rt.rt_genmask, &addr, sizeof(rt.rt_genmask)); + + rt.rt_dev = ifr.ifr_name; + + err = ioctl(sk, SIOCADDRT, &rt); + if (err < 0) + connman_error("Adding host route failed (%s)", + strerror(errno)); + + close(sk); + + return err; +} + int connman_inet_add_host_route(int index, const char *host) { struct ifreq ifr; |