diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2010-01-05 05:52:03 -0800 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2010-01-05 05:52:03 -0800 |
commit | f2af98906f063a65f2933e6133a293c344a1f011 (patch) | |
tree | ea502ef222d59afeb2ad9b7dbe980b7fbbd3b930 /src/inet.c | |
parent | d31f3c8e6b025820697669ac60637a1e942a3f33 (diff) | |
download | connman-f2af98906f063a65f2933e6133a293c344a1f011.tar.gz connman-f2af98906f063a65f2933e6133a293c344a1f011.tar.bz2 connman-f2af98906f063a65f2933e6133a293c344a1f011.zip |
Use common set of INET routing helpers
Diffstat (limited to 'src/inet.c')
-rw-r--r-- | src/inet.c | 58 |
1 files changed, 53 insertions, 5 deletions
@@ -785,9 +785,6 @@ int connman_inet_set_gateway_interface(int index) DBG("ifname %s", ifr.ifr_name); memset(&rt, 0, sizeof(rt)); - - rt.rt_dev = ifr.ifr_name; - rt.rt_flags = RTF_UP; memset(&addr, 0, sizeof(addr)); @@ -795,11 +792,11 @@ int connman_inet_set_gateway_interface(int index) addr.sin_addr.s_addr = INADDR_ANY; memcpy(&rt.rt_genmask, &addr, sizeof(rt.rt_genmask)); - memcpy(&rt.rt_dst, &addr, sizeof(rt.rt_dst)); - memcpy(&rt.rt_gateway, &addr, sizeof(rt.rt_gateway)); + rt.rt_dev = ifr.ifr_name; + err = ioctl(sk, SIOCADDRT, &rt); if (err < 0) connman_error("Setting default interface route failed (%s)", @@ -808,3 +805,54 @@ int connman_inet_set_gateway_interface(int index) return err; } + +int connman_inet_clear_gateway_address(int index, const char *gateway) +{ + struct ifreq ifr; + struct rtentry rt; + struct sockaddr_in addr; + int sk, err; + + DBG(""); + + 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_GATEWAY; + + memset(&addr, 0, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = INADDR_ANY; + 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)); + + err = ioctl(sk, SIOCDELRT, &rt); + if (err < 0) + connman_error("Removing default gateway route failed (%s)", + strerror(errno)); + + close(sk); + + return err; +} |