From 7798d502f4c2e89a2493c0ea7a800a9359ee0bbc Mon Sep 17 00:00:00 2001 From: Hans Dedecker Date: Fri, 29 Mar 2019 15:10:29 +0100 Subject: netlink: rework IPv4 address refresh logic Rework logic to refresh IPv4 addresses so we can get rid of the second for loop Signed-off-by: Hans Dedecker --- src/netlink.c | 41 +++++++++++++++++------------------------ 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/src/netlink.c b/src/netlink.c index 4e151f5..d9c2b40 100644 --- a/src/netlink.c +++ b/src/netlink.c @@ -140,23 +140,6 @@ static void refresh_iface_addr4(int ifindex) return; avl_for_each_element(&interfaces, iface, avl) { - if (iface->ifindex != ifindex) - continue; - - 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 = true; - } - break; - } - - if (!change) { - free(addr); - return; - } - - avl_for_element_range(iface, avl_last_element(&interfaces, iface, avl), iface, avl) { struct netevent_handler_info event_info; if (iface->ifindex != ifindex) @@ -167,20 +150,30 @@ static void refresh_iface_addr4(int ifindex) event_info.addrs_old.addrs = iface->addr4; event_info.addrs_old.len = iface->addr4_len; + 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 = true; + } + } + iface->addr4 = addr; iface->addr4_len = len; - call_netevent_handler_list(NETEV_ADDRLIST_CHANGE, &event_info); + if (change) + call_netevent_handler_list(NETEV_ADDRLIST_CHANGE, &event_info); free(event_info.addrs_old.addrs); - if (len) { - addr = malloc(len * sizeof(*addr)); - if (!addr) - return; + if (!len) + continue; + + addr = malloc(len * sizeof(*addr)); + if (!addr) + break; - memcpy(addr, iface->addr4, len * sizeof(*addr)); - } + memcpy(addr, iface->addr4, len * sizeof(*addr)); } free(addr); -- cgit v1.2.3