}
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);
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);
ifa_update(&ifa);
else
ifa_delete(&ifa);
+
+ if (!scan)
+ if_end_partial_update(iface);
}
static void
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;
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];
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
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);
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);