return 0;
}
-int netconfig_del_route_ipv6(gchar *interface, gchar *gateway)
+int netconfig_del_route_ipv6(gchar *ip_addr, gchar *interface, gchar *gateway, unsigned char prefix_len)
{
- int ret = __netconfig_rtnl_open(&rth, 0, NETLINK_ROUTE);
- if (ret < 0) {
- DBG("Failed to open rtnl socket");
+ 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)
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;
}
- 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();
+ if ((err = ioctl(fd, SIOCDELRT, &rt)) < 0) {
+ DBG("Failed to del route: %d\n", err);
+ close(fd);
return -1;
}
- __netconfig_rtnl_close();
- return 0;
+ close(fd);
+
+ return 1;
}
gboolean handle_launch_direct(Wifi *wifi, GDBusMethodInvocation *context)
if (execute_mdnsd_script("start") < 0) {
ERR("Failed to launch mdnsresponder daemon");
netconfig_error_invalid_parameter(context);
- return FALSE;
+ return TRUE;
}
mdnsd_ref_count++;
case NETCONFIG_SUPPORTED_FEATURE_WIFI_DIRECT:
key = WIFI_DIRECT_FEATURE;
break;
+ case NETCONFIG_SUPPORTED_FEATURE_WIFI_SOFTAP:
+ key = WIFI_SOFTAP_FEATURE;
+ break;
default:
ERR("Uknown feature");
return false;