mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-12-22 17:51:53 +00:00
Channels now can have external obstacles temporarily blocking their shutdown
This commit is contained in:
parent
e4e90c6f4d
commit
f0da632b3c
17
nest/proto.c
17
nest/proto.c
@ -745,7 +745,7 @@ channel_check_stopped(struct channel *c)
|
|||||||
switch (c->channel_state)
|
switch (c->channel_state)
|
||||||
{
|
{
|
||||||
case CS_STOP:
|
case CS_STOP:
|
||||||
if (!EMPTY_LIST(c->roa_subscriptions) || c->out_req.hook || c->refeed_req.hook || c->in_req.hook || c->reload_req.hook)
|
if (c->obstacles || !EMPTY_LIST(c->roa_subscriptions) || c->out_req.hook || c->refeed_req.hook || c->in_req.hook || c->reload_req.hook)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
channel_set_state(c, CS_DOWN);
|
channel_set_state(c, CS_DOWN);
|
||||||
@ -753,7 +753,7 @@ channel_check_stopped(struct channel *c)
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
case CS_PAUSE:
|
case CS_PAUSE:
|
||||||
if (!EMPTY_LIST(c->roa_subscriptions) || c->out_req.hook || c->refeed_req.hook || c->reload_req.hook)
|
if (c->obstacles || !EMPTY_LIST(c->roa_subscriptions) || c->out_req.hook || c->refeed_req.hook || c->reload_req.hook)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
channel_set_state(c, CS_START);
|
channel_set_state(c, CS_START);
|
||||||
@ -763,6 +763,19 @@ channel_check_stopped(struct channel *c)
|
|||||||
DBG("%s.%s: Channel requests/hooks stopped (in state %s)\n", c->proto->name, c->name, c_states[c->channel_state]);
|
DBG("%s.%s: Channel requests/hooks stopped (in state %s)\n", c->proto->name, c->name, c_states[c->channel_state]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
channel_add_obstacle(struct channel *c)
|
||||||
|
{
|
||||||
|
c->obstacles++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
channel_del_obstacle(struct channel *c)
|
||||||
|
{
|
||||||
|
if (!--c->obstacles)
|
||||||
|
channel_check_stopped(c);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
channel_import_stopped(struct rt_import_request *req)
|
channel_import_stopped(struct rt_import_request *req)
|
||||||
{
|
{
|
||||||
|
@ -605,6 +605,8 @@ struct channel {
|
|||||||
u8 gr_lock; /* Graceful restart mechanism should wait for this channel */
|
u8 gr_lock; /* Graceful restart mechanism should wait for this channel */
|
||||||
u8 gr_wait; /* Route export to channel is postponed until graceful restart */
|
u8 gr_wait; /* Route export to channel is postponed until graceful restart */
|
||||||
|
|
||||||
|
u32 obstacles; /* External obstacles remaining before cleanup */
|
||||||
|
|
||||||
btime last_state_change; /* Time of last state transition */
|
btime last_state_change; /* Time of last state transition */
|
||||||
|
|
||||||
struct rt_export_request reload_req; /* Feeder for import reload */
|
struct rt_export_request reload_req; /* Feeder for import reload */
|
||||||
@ -692,6 +694,9 @@ void channel_set_state(struct channel *c, uint state);
|
|||||||
void channel_schedule_reload(struct channel *c, struct channel_import_request *cir);
|
void channel_schedule_reload(struct channel *c, struct channel_import_request *cir);
|
||||||
int channel_import_request_prefilter(struct channel_import_request *cir_head, const net_addr *n);
|
int channel_import_request_prefilter(struct channel_import_request *cir_head, const net_addr *n);
|
||||||
|
|
||||||
|
void channel_add_obstacle(struct channel *c);
|
||||||
|
void channel_del_obstacle(struct channel *c);
|
||||||
|
|
||||||
static inline void channel_init(struct channel *c) { channel_set_state(c, CS_START); }
|
static inline void channel_init(struct channel *c) { channel_set_state(c, CS_START); }
|
||||||
static inline void channel_open(struct channel *c) { channel_set_state(c, CS_UP); }
|
static inline void channel_open(struct channel *c) { channel_set_state(c, CS_UP); }
|
||||||
static inline void channel_close(struct channel *c) { channel_set_state(c, CS_STOP); }
|
static inline void channel_close(struct channel *c) { channel_set_state(c, CS_STOP); }
|
||||||
|
Loading…
Reference in New Issue
Block a user