/* p->gr_ready -> at least one active channel is c->gr_ready */
ASSERT(p->gr_active_num > 0);
+ uint gr_time = CLAMP(p->conn->remote_caps->gr_time,
+ p->cf->min_gr_time, p->cf->max_gr_time);
+
proto_notify_state(&p->p, PS_START);
- tm_start_in(p->gr_timer, p->conn->remote_caps->gr_time S, p->p.loop);
- tm_start(p->gr_timer, gr_time S);
++ tm_start_in(p->gr_timer, gr_time S, p->p.loop);
+}
+
+
+static void
+bgp_graceful_restart_feed(struct bgp_channel *c)
+{
+ c->stale_feed = (struct rt_export_feeder) {
+ .name = mb_sprintf(c->c.proto->pool, "%s.%s.llgr", c->c.proto->name, c->c.name),
+ .trace_routes = c->c.debug,
+ };
+ c->stale_event = (event) {
+ .hook = bgp_rte_modify_stale,
+ .data = c,
+ };
+
+ rt_feeder_subscribe(&c->c.table->export_all, &c->stale_feed);
+ proto_send_event(c->c.proto, &c->stale_event);
}
+
+
/**
* bgp_graceful_restart_done - finish active BGP graceful restart
* @c: BGP channel
GRACEFUL, RESTART, AWARE, CHECK, LINK, PORT, EXTENDED, MESSAGES, SETKEY,
STRICT, BIND, CONFEDERATION, MEMBER, MULTICAST, FLOW4, FLOW6, LONG,
LIVED, STALE, IMPORT, IBGP, EBGP, MANDATORY, INTERNAL, EXTERNAL, SETS,
- DYNAMIC, RANGE, NAME, DIGITS, BGP_AIGP, AIGP, ORIGINATE, COST, ENFORCE,
+ DYNAMIC, RANGE, NAME, DIGITS, AIGP, ORIGINATE, COST, ENFORCE,
FIRST, FREE, VALIDATE, BASE, ROLE, ROLES, PEER, PROVIDER, CUSTOMER,
- RS_SERVER, RS_CLIENT, REQUIRE, BGP_OTC, GLOBAL, SEND, TX, SIZE, WARNING)
- RS_SERVER, RS_CLIENT, REQUIRE, BGP_OTC, GLOBAL, SEND, MIN, MAX)
++ RS_SERVER, RS_CLIENT, REQUIRE, BGP_OTC, GLOBAL, SEND, TX, SIZE, WARNING,
++ MIN, MAX)
+
+CF_ENUM(T_ENUM_BGP_ORIGIN, ORIGIN_, IGP, EGP, INCOMPLETE)
%type <i> bgp_nh
%type <i32> bgp_afi
BGP_CC->gr_able = 0xff; /* undefined */
BGP_CC->llgr_able = 0xff; /* undefined */
BGP_CC->llgr_time = ~0U; /* undefined */
+ BGP_CC->min_llgr_time = ~0U; /* undefined */
+ BGP_CC->max_llgr_time = ~0U; /* undefined */
BGP_CC->aigp = 0xff; /* undefined */
+ BGP_CC->ptx_exporter_settle = (struct settle_config) { 10 MS_, 100 MS_ };
}
};