summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOndrej Zajicek <santiago@crfreenet.org>2014-11-03 20:35:58 +0100
committerOndrej Zajicek <santiago@crfreenet.org>2014-11-03 20:35:58 +0100
commitf92e6ab364d50900bc9104af4539f6ea42b25c43 (patch)
tree0754d6e35dc17cc8a06c5c15614f126695fb08e0
parentac9dc669d80cbfeea3d0cdba5ec7354c804b1ae9 (diff)
Changes order of iface/addr/neigh event hooks.
Now the order is: Up -> iface, addr, neigh Down -> neigh, addr, iface It fixes the case when an iface appears, related static routes are activated and exported to OSPF before the iface notification and therefore forwarding addresses are not encoded in generated external LSAs.
-rw-r--r--nest/iface.c31
1 files changed, 18 insertions, 13 deletions
diff --git a/nest/iface.c b/nest/iface.c
index 298698a7..4d73c2a4 100644
--- a/nest/iface.c
+++ b/nest/iface.c
@@ -150,7 +150,7 @@ ifa_send_notify(struct proto *p, unsigned c, struct ifa *a)
}
static void
-ifa_notify_change_dep(unsigned c, struct ifa *a)
+ifa_notify_change_(unsigned c, struct ifa *a)
{
struct proto *p;
@@ -163,8 +163,13 @@ ifa_notify_change_dep(unsigned c, struct ifa *a)
static inline void
ifa_notify_change(unsigned c, struct ifa *a)
{
- neigh_ifa_update(a);
- ifa_notify_change_dep(c, a);
+ if (c & IF_CHANGE_DOWN)
+ neigh_ifa_update(a);
+
+ ifa_notify_change_(c, a);
+
+ if (c & IF_CHANGE_UP)
+ neigh_ifa_update(a);
}
static inline void
@@ -201,14 +206,14 @@ if_notify_change(unsigned c, struct iface *i)
if_dump(i);
#endif
- if (c & IF_CHANGE_UP)
- neigh_if_up(i);
+ if (c & IF_CHANGE_DOWN)
+ neigh_if_down(i);
if (c & IF_CHANGE_DOWN)
WALK_LIST(a, i->addrs)
{
a->flags = (i->flags & ~IA_FLAGS) | (a->flags & IA_FLAGS);
- ifa_notify_change_dep(IF_CHANGE_DOWN, a);
+ ifa_notify_change_(IF_CHANGE_DOWN, a);
}
WALK_LIST(p, active_proto_list)
@@ -218,14 +223,14 @@ if_notify_change(unsigned c, struct iface *i)
WALK_LIST(a, i->addrs)
{
a->flags = (i->flags & ~IA_FLAGS) | (a->flags & IA_FLAGS);
- ifa_notify_change_dep(IF_CHANGE_UP, a);
+ ifa_notify_change_(IF_CHANGE_UP, a);
}
+ if (c & IF_CHANGE_UP)
+ neigh_if_up(i);
+
if ((c & (IF_CHANGE_UP | IF_CHANGE_DOWN | IF_CHANGE_LINK)) == IF_CHANGE_LINK)
neigh_if_link(i);
-
- if (c & IF_CHANGE_DOWN)
- neigh_if_down(i);
}
static unsigned
@@ -251,8 +256,8 @@ if_change_flags(struct iface *i, unsigned flags)
}
/**
- * if_delete - remove interface
- * @old: interface
+ * if_delete - remove interface
+ * @old: interface
*
* This function is called by the low-level platform dependent code
* whenever it notices an interface disappears. It is just a shorthand
@@ -676,7 +681,7 @@ iface_patt_match(struct iface_patt *ifp, struct iface *i, struct ifa *a)
if ((a->flags & IA_PEER) &&
ipa_in_net(a->opposite, p->prefix, p->pxlen))
return pos;
-
+
continue;
}