Commit f92e6ab3 authored by Ondrej Zajicek's avatar Ondrej Zajicek
Browse files

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.
parent ac9dc669
Loading
Loading
Loading
Loading
+18 −13
Original line number Diff line number Diff line
@@ -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)
{
  if (c & IF_CHANGE_DOWN)
    neigh_ifa_update(a);

  ifa_notify_change_(c, a);

  if (c & IF_CHANGE_UP)
    neigh_ifa_update(a);
  ifa_notify_change_dep(c, 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