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.
This commit is contained in:
Ondrej Zajicek 2014-11-03 20:35:58 +01:00
parent ac9dc669d8
commit f92e6ab364

View file

@ -150,7 +150,7 @@ ifa_send_notify(struct proto *p, unsigned c, struct ifa *a)
} }
static void static void
ifa_notify_change_dep(unsigned c, struct ifa *a) ifa_notify_change_(unsigned c, struct ifa *a)
{ {
struct proto *p; struct proto *p;
@ -163,8 +163,13 @@ ifa_notify_change_dep(unsigned c, struct ifa *a)
static inline void static inline void
ifa_notify_change(unsigned c, struct ifa *a) ifa_notify_change(unsigned c, struct ifa *a)
{ {
neigh_ifa_update(a); if (c & IF_CHANGE_DOWN)
ifa_notify_change_dep(c, a); neigh_ifa_update(a);
ifa_notify_change_(c, a);
if (c & IF_CHANGE_UP)
neigh_ifa_update(a);
} }
static inline void static inline void
@ -201,14 +206,14 @@ if_notify_change(unsigned c, struct iface *i)
if_dump(i); if_dump(i);
#endif #endif
if (c & IF_CHANGE_UP) if (c & IF_CHANGE_DOWN)
neigh_if_up(i); neigh_if_down(i);
if (c & IF_CHANGE_DOWN) if (c & IF_CHANGE_DOWN)
WALK_LIST(a, i->addrs) WALK_LIST(a, i->addrs)
{ {
a->flags = (i->flags & ~IA_FLAGS) | (a->flags & IA_FLAGS); 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) WALK_LIST(p, active_proto_list)
@ -218,14 +223,14 @@ if_notify_change(unsigned c, struct iface *i)
WALK_LIST(a, i->addrs) WALK_LIST(a, i->addrs)
{ {
a->flags = (i->flags & ~IA_FLAGS) | (a->flags & IA_FLAGS); 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) if ((c & (IF_CHANGE_UP | IF_CHANGE_DOWN | IF_CHANGE_LINK)) == IF_CHANGE_LINK)
neigh_if_link(i); neigh_if_link(i);
if (c & IF_CHANGE_DOWN)
neigh_if_down(i);
} }
static unsigned static unsigned
@ -251,8 +256,8 @@ if_change_flags(struct iface *i, unsigned flags)
} }
/** /**
* if_delete - remove interface * if_delete - remove interface
* @old: interface * @old: interface
* *
* This function is called by the low-level platform dependent code * This function is called by the low-level platform dependent code
* whenever it notices an interface disappears. It is just a shorthand * 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) && if ((a->flags & IA_PEER) &&
ipa_in_net(a->opposite, p->prefix, p->pxlen)) ipa_in_net(a->opposite, p->prefix, p->pxlen))
return pos; return pos;
continue; continue;
} }