From 3216eb03ddddc057bb18fa4dd02b7935a604f71f Mon Sep 17 00:00:00 2001 From: Ondrej Zajicek Date: Wed, 26 Feb 2014 12:52:00 +0100 Subject: Fixes longstanding issue with interfaces staying in IF_TMP_DOWN. Thanks to Pierluigi Rolando and others for the bugreport. --- sysdep/bsd/krt-sock.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'sysdep/bsd') diff --git a/sysdep/bsd/krt-sock.c b/sysdep/bsd/krt-sock.c index 176e11ed..aaeb7d90 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; -- cgit v1.2.3