Added support to delete ipv6 route using netlink. 41/180241/1
authorNiraj Kumar Goit <niraj.g@samsung.com>
Fri, 25 May 2018 14:59:57 +0000 (20:29 +0530)
committerNiraj Kumar Goit <niraj.g@samsung.com>
Fri, 25 May 2018 14:59:57 +0000 (20:29 +0530)
Change-Id: I48ce91cf0adffdd93806529e3e77930727f963ed
Signed-off-by: Niraj Kumar Goit <niraj.g@samsung.com>
include/util.h
src/network-state.c
src/utils/util.c

index 04cc9d4..fd8168a 100755 (executable)
@@ -82,7 +82,7 @@ int netconfig_execute_file_no_wait(const char *file_path,
                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);
 
index 02c60e0..1c08078 100755 (executable)
@@ -1351,10 +1351,6 @@ static gboolean handle_remove_route(
        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);
 
@@ -1378,17 +1374,7 @@ static gboolean handle_remove_route(
                        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;
index 9127c36..9e1b46a 100755 (executable)
@@ -1095,56 +1095,23 @@ int netconfig_add_route_ipv6(gchar *interface, gchar *gateway)
        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)