--- include/inet.h | 2 + src/inet.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+), 0 deletions(-)
diff --git a/include/inet.h b/include/inet.h index 19f4455..1aa23ea 100644 --- a/include/inet.h +++ b/include/inet.h @@ -69,6 +69,8 @@ int connman_inet_del_ipv6_network_route(int index, const char *host, int connman_inet_del_ipv6_host_route(int index, const char *host); int connman_inet_set_ipv6_gateway_address(int index, const char *gateway); int connman_inet_clear_ipv6_gateway_address(int index, const char *gateway); +int connman_inet_set_ipv6_gateway_interface(int index); +int connman_inet_clear_ipv6_gateway_interface(int index); int connman_inet_add_to_bridge(int index, const char *bridge); int connman_inet_remove_from_bridge(int index, const char *bridge); diff --git a/src/inet.c b/src/inet.c index 05ead31..d898650 100644 --- a/src/inet.c +++ b/src/inet.c @@ -1014,6 +1014,52 @@ int connman_inet_set_gateway_interface(int index) return err; } +int connman_inet_set_ipv6_gateway_interface(int index) +{ + struct ifreq ifr; + struct rtentry rt; + struct sockaddr_in6 addr; + const struct in6_addr any = IN6ADDR_ANY_INIT; + int sk, err; + + DBG(""); + + sk = socket(PF_INET6, 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; + + memset(&addr, 0, sizeof(addr)); + addr.sin6_family = AF_INET6; + addr.sin6_addr = 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)", + strerror(errno)); + close(sk); + + return err; +} + int connman_inet_clear_gateway_address(int index, const char *gateway) { struct ifreq ifr; @@ -1110,6 +1156,52 @@ int connman_inet_clear_gateway_interface(int index) return err; } +int connman_inet_clear_ipv6_gateway_interface(int index) +{ + struct ifreq ifr; + struct rtentry rt; + struct sockaddr_in6 addr; + const struct in6_addr any = IN6ADDR_ANY_INIT; + int sk, err; + + DBG(""); + + sk = socket(PF_INET6, 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; + + memset(&addr, 0, sizeof(addr)); + addr.sin6_family = AF_INET6; + addr.sin6_addr = 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, SIOCDELRT, &rt); + if (err < 0) + connman_error("Removing default interface route failed (%s)", + strerror(errno)); + close(sk); + + return err; +} + connman_bool_t connman_inet_compare_subnet(int index, const char *host) { struct ifreq ifr; -- 1.7.1 _______________________________________________ connman mailing list connman@connman.net http://lists.connman.net/listinfo/connman