Commit 6d87cf4b authored by Maria Matejka's avatar Maria Matejka
Browse files

Kernel routes are flushed on shutdown by kernel scan, not by table scan

parent 0767a0c2
Loading
Loading
Loading
Loading
+14 −17
Original line number Diff line number Diff line
@@ -542,23 +542,6 @@ krt_is_installed(struct krt_proto *p, net *n)
  return n->routes && bmap_test(&p->p.main_channel->export_map, n->routes->rte.id);
}

static void
krt_flush_routes(struct krt_proto *p)
{
  struct rtable *t = p->p.main_channel->table;

  KRT_TRACE(p, D_EVENTS, "Flushing kernel routes");
  FIB_WALK(&t->fib, net, n)
    {
      if (krt_is_installed(p, n))
	{
	  /* FIXME: this does not work if gw is changed in export filter */
	  krt_replace_rte(p, n->n.addr, NULL, &n->routes->rte);
	}
    }
  FIB_WALK_END;
}

static struct rte *
krt_export_net(struct krt_proto *p, net *net)
{
@@ -637,6 +620,9 @@ krt_got_route(struct krt_proto *p, rte *e, s8 src)
#endif
  /* The rest is for KRT_SRC_BIRD (or KRT_SRC_UNKNOWN) */

  /* Deleting all routes if flush is requested */
  if (p->flush_routes)
    goto delete;

  /* We wait for the initial feed to have correct installed state */
  if (!p->ready)
@@ -729,6 +715,17 @@ krt_prune(struct krt_proto *p)
    p->initialized = 1;
}

static void
krt_flush_routes(struct krt_proto *p)
{
  KRT_TRACE(p, D_EVENTS, "Flushing kernel routes");
  p->flush_routes = 1;
  krt_init_scan(p);
  krt_do_scan(p);
  /* No prune! */
  p->flush_routes = 0;
}

void
krt_got_route_async(struct krt_proto *p, rte *e, int new, s8 src)
{
+1 −0
Original line number Diff line number Diff line
@@ -66,6 +66,7 @@ struct krt_proto {
  byte ready;			/* Initial feed has been finished */
  byte initialized;		/* First scan has been finished */
  byte reload;			/* Next scan is doing reload */
  byte flush_routes;		/* Scanning to flush */
};

extern pool *krt_pool;