static int urandom_fd = -1;
+static void sighandler(_unused int signal)
+{
+ uloop_end();
+}
+
+
int main()
{
openlog("odhcpd", LOG_PERROR | LOG_PID, LOG_DAEMON);
return 4;
signal(SIGUSR1, SIG_IGN);
+ signal(SIGINT, sighandler);
+ signal(SIGTERM, sighandler);
if (init_router())
return 4;
{
// Construct headers
uint8_t cmsg_buf[CMSG_SPACE(sizeof(struct in6_pktinfo))] = {0};
- struct msghdr msg = {(void*)dest, sizeof(*dest), iov, iov_len,
- cmsg_buf, sizeof(cmsg_buf), 0};
+ struct msghdr msg = {
+ .msg_name = (void *) dest,
+ .msg_namelen = sizeof(*dest),
+ .msg_iov = iov,
+ .msg_iovlen = iov_len,
+ .msg_control = cmsg_buf,
+ .msg_controllen = sizeof(cmsg_buf),
+ .msg_flags = 0
+ };
// Set control data (define destination interface)
struct cmsghdr *chdr = CMSG_FIRSTHDR(&msg);
if (ifa->ifa_flags & IFA_F_DEPRECATED)
addrs[ret].preferred = 0;
- addrs[ret].has_class = false;
- addrs[ret].class = 0;
-#ifdef WITH_UBUS
- struct interface *iface = odhcpd_get_interface_by_index(ifindex);
- if (iface)
- addrs[ret].has_class = ubus_get_class(iface->ifname,
- &addrs[ret].addr, &addrs[ret].class);
-#endif
++ret;
}
return ret;
}
+int odhcpd_get_preferred_interface_address(int ifindex, struct in6_addr *addr)
+{
+ struct odhcpd_ipaddr ipaddrs[8];
+ ssize_t ip_cnt = odhcpd_get_interface_addresses(ifindex, ipaddrs, ARRAY_SIZE(ipaddrs));
+ uint32_t preferred = 0;
+ int ret = 0;
+
+ for (ssize_t i = 0; i < ip_cnt; i++) {
+ struct odhcpd_ipaddr *ipaddr = &ipaddrs[i];
+
+ if (ipaddr->preferred > preferred || !preferred) {
+ preferred = ipaddr->preferred;
+ *addr = ipaddr->addr;
+ ret = 1;
+ }
+ }
+
+ return ret;
+}
struct interface* odhcpd_get_interface_by_index(int ifindex)
{
while (true) {
struct iovec iov = {data_buf, sizeof(data_buf)};
- struct msghdr msg = {&addr, sizeof(addr), &iov, 1,
- cmsg_buf, sizeof(cmsg_buf), 0};
+ struct msghdr msg = {
+ .msg_name = (void *) &addr,
+ .msg_namelen = sizeof(addr),
+ .msg_iov = &iov,
+ .msg_iovlen = 1,
+ .msg_control = cmsg_buf,
+ .msg_controllen = sizeof(cmsg_buf),
+ .msg_flags = 0
+ };
ssize_t len = recvmsg(u->fd, &msg, MSG_DONTWAIT);
if (len < 0) {
return uloop_fd_add(&event->uloop, ULOOP_READ);
}
-void odhcpd_urandom(void *data, size_t len)
+void odhcpd_process(struct odhcpd_event *event)
+{
+ odhcpd_receive_packets(&event->uloop, 0);
+}
+
+int odhcpd_urandom(void *data, size_t len)
{
- read(urandom_fd, data, len);
+ return read(urandom_fd, data, len);
}