char *const args[]);
int netconfig_execute_clatd(const char *file_path, char *const args[]);
int netconfig_add_route_ipv6(gchar *interface, gchar *gateway);
-int netconfig_del_route_ipv6(gchar *ip_addr, gchar *interface, gchar *gateway, unsigned char prefix_len);
+int netconfig_del_route_ipv6(gchar *interface, gchar *gateway);
int netconfig_add_route_ipv4(gchar *ip_addr, gchar *subnet, gchar *interface, gint address_family);
int netconfig_del_route_ipv4(gchar *ip_addr, gchar *subnet, gchar *interface, gint address_family);
gchar *const args[] = { "/sbin/route", "del", "-net", ip_addr, gw_str,
"netmask", netmask, "dev", interface, NULL };
char *const envs[] = { NULL };
- const char* buf = NULL;
- char* ch = NULL;
- int prefix_len = 0;
- int pos = 0;
DBG("ip_addr(%s), netmask(%s), interface(%s), gateway(%s)", ip_addr, netmask, interface, gateway);
return TRUE;
}
- buf = ip_addr;
- ch = strchr(buf, '/');
- pos = ch - buf + 1;
- if (ch) {
- prefix_len = atoi(ch + 1);
- ip_addr[pos-1] = '\0';
- } else {
- prefix_len = 128;
- }
-
- if (netconfig_del_route_ipv6(ip_addr, interface, gateway, prefix_len) < 0) {
+ if (netconfig_del_route_ipv6(interface, gateway) < 0) {
DBG("Failed to remove the route");
netconfig_error_permission_denied(context);
return TRUE;
return 0;
}
-int netconfig_del_route_ipv6(gchar *ip_addr, gchar *interface, gchar *gateway, unsigned char prefix_len)
+int netconfig_del_route_ipv6(gchar *interface, gchar *gateway)
{
- struct in6_rtmsg rt;
- int fd = 0;
- int err = 0;
-
- memset(&rt, 0, sizeof(rt));
-
- rt.rtmsg_dst_len = prefix_len;
-
- rt.rtmsg_flags = RTF_UP | RTF_HOST;
-
- if (inet_pton(AF_INET6, ip_addr, &rt.rtmsg_dst) < 0) {
- err = -errno;
- return err;
- }
-
- if (gateway != NULL) {
- rt.rtmsg_flags |= RTF_GATEWAY;
- if (inet_pton(AF_INET6, gateway, &rt.rtmsg_gateway) < 0) {
- err = -errno;
- return err;
- }
- }
-
- rt.rtmsg_metric = 1;
-
- fd = socket(AF_INET6, SOCK_DGRAM, 0);
- if (fd < 0)
+ int ret = __netconfig_rtnl_open(&rth, 0, NETLINK_ROUTE);
+ if (ret < 0) {
+ DBG("Failed to open rtnl socket");
return -1;
-
- rt.rtmsg_ifindex = 0;
-
- if (interface) {
- struct ifreq ifr;
- memset(&ifr, 0, sizeof(ifr));
- strncpy(ifr.ifr_name, interface, sizeof(ifr.ifr_name)-1);
- ioctl(fd, SIOCGIFINDEX, &ifr);
- rt.rtmsg_ifindex = ifr.ifr_ifindex;
}
- if ((err = ioctl(fd, SIOCDELRT, &rt)) < 0) {
- DBG("Failed to del route: %d\n", err);
- close(fd);
+ ret = __netconfig_iproute_modify(RTM_DELROUTE, NLM_F_CREATE|NLM_F_EXCL, interface, gateway);
+ if (ret < 0) {
+ DBG("Failed to delete ipv6 route.");
+ __netconfig_rtnl_close();
return -1;
}
- close(fd);
-
- return 1;
+ __netconfig_rtnl_close();
+ return 0;
}
gboolean handle_launch_direct(Wifi *wifi, GDBusMethodInvocation *context)