uloop_timeout_cancel(&iface->timer_rs);
clean_interface(iface);
- free(iface->addr4);
+ free(iface->oaddrs4);
free(iface->addr6);
free(iface->ifname);
free(iface);
int config_parse_interface(void *data, size_t len, const char *name, bool overwrite)
{
- struct odhcpd_ipaddr *addrs = NULL;
struct interface *iface;
struct blob_attr *tb[IFACE_ATTR_MAX], *c;
- ssize_t addrs_len;
+ struct odhcpd_ipaddr *oaddrs = NULL;
+ ssize_t oaddrs_cnt;
bool get_addrs = false;
int mode;
const char *ifname = NULL;
}
if (get_addrs) {
- addrs_len = netlink_get_interface_addrs(iface->ifindex,
- true, &iface->addr6);
+ oaddrs_cnt = netlink_get_interface_addrs(iface->ifindex,
+ true, &iface->addr6);
- if (addrs_len > 0)
- iface->addr6_len = addrs_len;
+ if (oaddrs_cnt > 0)
+ iface->addr6_len = oaddrs_cnt;
- addrs_len = netlink_get_interface_addrs(iface->ifindex,
- false, &iface->addr4);
- if (addrs_len > 0)
- iface->addr4_len = addrs_len;
+ oaddrs_cnt = netlink_get_interface_addrs(iface->ifindex,
+ false, &iface->oaddrs4);
+ if (oaddrs_cnt > 0)
+ iface->oaddrs4_cnt = oaddrs_cnt;
}
- addrs_len = netlink_get_interface_linklocal(iface->ifindex, &addrs);
- if (addrs_len > 0) {
- for (ssize_t i = 0; i < addrs_len; i++) {
- if (!addrs[i].tentative) {
+ oaddrs_cnt = netlink_get_interface_linklocal(iface->ifindex, &oaddrs);
+ if (oaddrs_cnt > 0) {
+ for (ssize_t i = 0; i < oaddrs_cnt; i++) {
+ if (!oaddrs[i].tentative) {
iface->have_link_local = true;
break;
}
}
- free(addrs);
+ free(oaddrs);
}
iface->inuse = true;
iface->dhcpv4_bcast.s_addr = INADDR_ANY;
iface->dhcpv4_mask.s_addr = INADDR_ANY;
- if (!iface->addr4_len) {
+ if (!iface->oaddrs4_cnt) {
warn("No network(s) available on %s", iface->name);
return -1;
}
- for (size_t i = 0; i < iface->addr4_len && start && end; i++) {
- struct in_addr *addr = &iface->addr4[i].addr.in;
+ for (size_t i = 0; i < iface->oaddrs4_cnt && start && end; i++) {
+ struct in_addr *addr = &iface->oaddrs4[i].addr.in;
struct in_addr mask;
if (addr_is_fr_ip(iface, addr))
continue;
- odhcpd_bitlen2netmask(false, iface->addr4[i].prefix_len, &mask);
+ odhcpd_bitlen2netmask(false, iface->oaddrs4[i].prefix_len, &mask);
if ((start & ntohl(~mask.s_addr)) == start &&
(end & ntohl(~mask.s_addr)) == end &&
end < ntohl(~mask.s_addr)) { /* Exclude broadcast address */
iface->dhcpv4_end_ip.s_addr = htonl(end) |
(addr->s_addr & mask.s_addr);
iface->dhcpv4_local = *addr;
- iface->dhcpv4_bcast = iface->addr4[i].broadcast;
+ iface->dhcpv4_bcast = iface->oaddrs4[i].broadcast;
iface->dhcpv4_mask = mask;
return 0;
}
}
/* Don't allocate IP range for subnets smaller than /28 */
- if (iface->addr4[0].prefix_len > MAX_PREFIX_LEN) {
+ if (iface->oaddrs4[0].prefix_len > MAX_PREFIX_LEN) {
warn("Auto allocation of DHCP range fails on %s (prefix length must be < %d).",
iface->name, MAX_PREFIX_LEN + 1);
return -1;
}
- iface->dhcpv4_local = iface->addr4[0].addr.in;
- iface->dhcpv4_bcast = iface->addr4[0].broadcast;
- odhcpd_bitlen2netmask(false, iface->addr4[0].prefix_len, &iface->dhcpv4_mask);
+ iface->dhcpv4_local = iface->oaddrs4[0].addr.in;
+ iface->dhcpv4_bcast = iface->oaddrs4[0].broadcast;
+ odhcpd_bitlen2netmask(false, iface->oaddrs4[0].prefix_len, &iface->dhcpv4_mask);
end = start = iface->dhcpv4_local.s_addr & iface->dhcpv4_mask.s_addr;
/* Auto allocate ranges */
static void refresh_iface_addr4(int ifindex)
{
- struct odhcpd_ipaddr *addr = NULL;
+ struct odhcpd_ipaddr *oaddrs4 = NULL;
struct interface *iface;
- ssize_t len = netlink_get_interface_addrs(ifindex, false, &addr);
+ ssize_t oaddrs4_cnt = netlink_get_interface_addrs(ifindex, false, &oaddrs4);
bool change = false;
- if (len < 0)
+ if (oaddrs4_cnt < 0)
return;
avl_for_each_element(&interfaces, iface, avl) {
memset(&event_info, 0, sizeof(event_info));
event_info.iface = iface;
- event_info.addrs_old.addrs = iface->addr4;
- event_info.addrs_old.len = iface->addr4_len;
+ event_info.addrs_old.addrs = iface->oaddrs4;
+ event_info.addrs_old.len = iface->oaddrs4_cnt;
if (!change) {
- change = len != (ssize_t)iface->addr4_len;
- for (ssize_t i = 0; !change && i < len; ++i) {
- if (addr[i].addr.in.s_addr != iface->addr4[i].addr.in.s_addr)
+ change = oaddrs4_cnt != (ssize_t)iface->oaddrs4_cnt;
+ for (ssize_t i = 0; !change && i < oaddrs4_cnt; i++) {
+ if (oaddrs4[i].addr.in.s_addr != iface->oaddrs4[i].addr.in.s_addr)
change = true;
}
}
- iface->addr4 = addr;
- iface->addr4_len = len;
+ iface->oaddrs4 = oaddrs4;
+ iface->oaddrs4_cnt = oaddrs4_cnt;
if (change)
call_netevent_handler_list(NETEV_ADDRLIST_CHANGE, &event_info);
free(event_info.addrs_old.addrs);
- if (!len)
+ if (!oaddrs4_cnt)
continue;
- addr = malloc(len * sizeof(*addr));
- if (!addr)
+ oaddrs4 = malloc(oaddrs4_cnt * sizeof(*oaddrs4));
+ if (!oaddrs4)
break;
- memcpy(addr, iface->addr4, len * sizeof(*addr));
+ memcpy(oaddrs4, iface->oaddrs4, oaddrs4_cnt * sizeof(*oaddrs4));
}
- free(addr);
+ free(oaddrs4);
}
static void refresh_iface_addr6(int ifindex)
int ndp_ping_fd;
// IPv4 runtime data
- struct odhcpd_ipaddr *addr4;
- size_t addr4_len;
+ struct odhcpd_ipaddr *oaddrs4; // IPv4 addresses assigned to this interface
+ size_t oaddrs4_cnt; // Number of IPv4 addresses assigned to this interface
// DHCPv4 runtime data
struct odhcpd_event dhcpv4_event;