#include <fcntl.h>
#include <netlink/msg.h>
+#include <netlink/attr.h>
+#include <netlink/socket.h>
#include <libubox/uloop.h>
#include "netifd.h"
nlmsg_free(m);
}
-#ifdef NLA_PUT_DATA
rtnl_event.fd = nl_socket_get_fd(sock_rtnl_event);
-#else
- rtnl_event.fd = sock_rtnl_event->s_fd; // libnl-tiny hack...
-#endif
uloop_fd_add(&rtnl_event, ULOOP_READ | ULOOP_EDGE_TRIGGER);
}
return ioctl(sock_ioctl, SIOCSIFFLAGS, &ifr);
}
+static int system_if_resolve(struct device *dev)
+{
+ struct ifreq ifr;
+ strncpy(ifr.ifr_name, dev->ifname, sizeof(ifr.ifr_name));
+ if (!ioctl(sock_ioctl, SIOCGIFINDEX, &ifr))
+ return ifr.ifr_ifindex;
+ else
+ return 0;
+}
+
int system_if_up(struct device *dev)
{
+ dev->ifindex = system_if_resolve(dev);
return system_if_flags(dev, IFF_UP, 0);
}
int system_if_check(struct device *dev)
{
- struct ifreq ifr;
- strncpy(ifr.ifr_name, dev->ifname, sizeof(ifr.ifr_name));
- if (ioctl(sock_ioctl, SIOCGIFINDEX, &ifr))
- return -1;
-
- dev->ifindex = ifr.ifr_ifindex;
-
- /* if (!strcmp(dev->ifname, "eth0"))
- device_set_present(dev, true); */
+ device_set_present(dev, (system_if_resolve(dev) >= 0));
return 0;
}
return -1;
nlmsg_append(msg, &ifa, sizeof(ifa), 0);
- nla_put(msg, IFA_ADDRESS, alen, &addr->addr);
+ nla_put(msg, IFA_LOCAL, alen, &addr->addr);
return system_rtnl_call(msg);
}