#endif
/* The rest is for KRT_SRC_BIRD (or KRT_SRC_UNKNOWN) */
- /* Deleting all routes if final flush is requested */
- if (p->sync_state == KPS_FLUSHING)
- goto delete;
/* We wait for the initial feed to have correct installed state */
if (!p->ready)
log(L_WARN "%s: Can't scan, still pruning", p->p.name);
return 0;
- case KPS_FLUSHING:
- bug("Can't scan, flushing");
}
bug("Bad kernel sync state");
case KPS_PRUNING:
bug("Kernel scan double-prune");
- case KPS_FLUSHING:
- bug("Attemted kernel scan prune when flushing");
}
}
krt_replace_rte(p, net, new, old);
break;
- case KPS_FLUSHING:
- /* Drop any incoming route */
- krt_replace_rte(p, net, NULL, old ?: new);
}
}
p->sync_state = KPS_IDLE;
break;
- case KPS_FLUSHING:
- krt_do_scan(p);
- krt_cleanup(p);
- proto_notify_state(&p->p, PS_DOWN);
- return;
}
}
/* FIXME we should flush routes even when persist during reconfiguration */
if (p->initialized && !KRT_CF->persist && (P->down_code != PDC_CMD_GR_DOWN))
{
- p->sync_state = KPS_FLUSHING;
- channel_request_full_refeed(p->p.main_channel);
+ struct rt_export_feeder req = (struct rt_export_feeder)
+ {
+ .name = "shutdown.feeder",
+ .trace_routes = P->main_channel->debug,
+ };
+ rt_feeder_subscribe(&P->main_channel->table->export_best, &req);
+
+ RT_FEED_WALK(&req, f)
+ {
+ for (uint i = 0; i < f->count_routes; i++)
+ {
+ rte *e = &f->block[i];
+ if (bmap_test(&P->main_channel->export_rejected_map, e->id))
+ continue;
- /* Keeping the protocol UP until the feed-to-flush is done */
- return PS_UP;
+ /* if exported then delete from kernel */
+ krt_replace_rte(p, e->net, NULL, e);
+ }
+ }
+
+ krt_do_scan(p);
+ krt_cleanup(p);
+ proto_notify_state(&p->p, PS_DOWN);
+ rt_feeder_unsubscribe(&req);
}
else
- {
krt_cleanup(p);
- return PS_DOWN;
- }
+ return PS_DOWN;
}
static void