if (enable && iface->dhcpv6) {
int sock = socket(AF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, IPPROTO_UDP);
if (sock < 0) {
- syslog(LOG_ERR, "Failed to create DHCPv6 server socket: %s",
- strerror(errno));
+ syslog(LOG_ERR, "Failed to create DHCPv6 server socket: %m");
return -1;
}
0, IN6ADDR_ANY_INIT, 0};
if (bind(sock, (struct sockaddr*)&bind_addr, sizeof(bind_addr))) {
- syslog(LOG_ERR, "Failed to open DHCPv6 server socket: %s",
- strerror(errno));
+ syslog(LOG_ERR, "Failed to open DHCPv6 server socket: %m");
return -1;
}
if (IN6_IS_ADDR_UNSPECIFIED(&cerid.addr)) {
struct odhcpd_ipaddr *addrs;
- ssize_t len = odhcpd_get_interface_addresses(0, true, &addrs);
+ ssize_t len = netlink_get_interface_addrs(0, true, &addrs);
for (ssize_t i = 0; i < len; ++i)
if (IN6_IS_ADDR_UNSPECIFIED(&cerid.addr)
|| memcmp(&addrs[i].addr, &cerid.addr, sizeof(cerid.addr)) < 0)
- cerid.addr = addrs[i].addr;
+ cerid.addr = addrs[i].addr.in6;
free(addrs);
}
struct odhcpd_ipaddr *addr = NULL;
time_t now = odhcpd_time();
- for (size_t i = 0; i < iface->ia_addr_len; i++) {
- if (iface->ia_addr[i].valid <= (uint32_t)now)
+ for (size_t i = 0; i < iface->addr6_len; i++) {
+ if (iface->addr6[i].valid <= (uint32_t)now)
continue;
- if (iface->ia_addr[i].preferred > (uint32_t)now) {
- addr = &iface->ia_addr[i];
+ if (iface->addr6[i].preferred > (uint32_t)now) {
+ addr = &iface->addr6[i];
break;
}
- if (!addr || (iface->ia_addr[i].valid > addr->valid))
- addr = &iface->ia_addr[i];
+ if (!addr || (iface->addr6[i].valid > addr->valid))
+ addr = &iface->addr6[i];
}
return addr;