diff --git a/sysdep/bsd/krt-sock.c b/sysdep/bsd/krt-sock.c index 176e11e..aaeb7d9 100644 --- a/sysdep/bsd/krt-sock.c +++ b/sysdep/bsd/krt-sock.c @@ -535,7 +535,7 @@ krt_read_ifannounce(struct ks_msg *msg) } static void -krt_read_ifinfo(struct ks_msg *msg) +krt_read_ifinfo(struct ks_msg *msg, int scan) { struct if_msghdr *ifm = (struct if_msghdr *)&msg->rtm; void *body = (void *)(ifm + 1); @@ -608,11 +608,14 @@ krt_read_ifinfo(struct ks_msg *msg) else f.flags |= IF_MULTIACCESS; /* NBMA */ - if_update(&f); + iface = if_update(&f); + + if (!scan) + if_end_partial_update(iface); } static void -krt_read_addr(struct ks_msg *msg) +krt_read_addr(struct ks_msg *msg, int scan) { struct ifa_msghdr *ifam = (struct ifa_msghdr *)&msg->rtm; void *body = (void *)(ifam + 1); @@ -715,6 +718,9 @@ krt_read_addr(struct ks_msg *msg) ifa_update(&ifa); else ifa_delete(&ifa); + + if (!scan) + if_end_partial_update(iface); } static void @@ -734,11 +740,11 @@ krt_read_msg(struct proto *p, struct ks_msg *msg, int scan) krt_read_ifannounce(msg); break; case RTM_IFINFO: - krt_read_ifinfo(msg); + krt_read_ifinfo(msg, scan); break; case RTM_NEWADDR: case RTM_DELADDR: - krt_read_addr(msg); + krt_read_addr(msg, scan); break; default: break; diff --git a/sysdep/linux/netlink.c b/sysdep/linux/netlink.c index ed8769b..7063e2c 100644 --- a/sysdep/linux/netlink.c +++ b/sysdep/linux/netlink.c @@ -437,12 +437,16 @@ nl_parse_link(struct nlmsghdr *h, int scan) f.flags |= IF_MULTIACCESS | IF_BROADCAST | IF_MULTICAST; else f.flags |= IF_MULTIACCESS; /* NBMA */ - if_update(&f); + + ifi = if_update(&f); + + if (!scan) + if_end_partial_update(ifi); } } static void -nl_parse_addr(struct nlmsghdr *h) +nl_parse_addr(struct nlmsghdr *h, int scan) { struct ifaddrmsg *i; struct rtattr *a[IFA_ANYCAST+1]; @@ -542,10 +546,14 @@ nl_parse_addr(struct nlmsghdr *h) ifi->index, ifi->name, new ? "added" : "removed", ifa.ip, ifa.flags, ifa.prefix, ifa.pxlen, ifa.brd, ifa.opposite); + if (new) ifa_update(&ifa); else ifa_delete(&ifa); + + if (!scan) + if_end_partial_update(ifi); } void @@ -565,7 +573,7 @@ kif_do_scan(struct kif_proto *p UNUSED) nl_request_dump(RTM_GETADDR); while (h = nl_get_scan()) if (h->nlmsg_type == RTM_NEWADDR || h->nlmsg_type == RTM_DELADDR) - nl_parse_addr(h); + nl_parse_addr(h, 1); else log(L_DEBUG "nl_scan_ifaces: Unknown packet received (type=%d)", h->nlmsg_type); @@ -967,7 +975,7 @@ nl_async_msg(struct nlmsghdr *h) case RTM_NEWADDR: case RTM_DELADDR: DBG("KRT: Received async address notification (%d)\n", h->nlmsg_type); - nl_parse_addr(h); + nl_parse_addr(h, 0); break; default: DBG("KRT: Received unknown async notification (%d)\n", h->nlmsg_type);