diff --git a/doc/bird.sgml b/doc/bird.sgml index 86ae5b0d..24bc3026 100644 --- a/doc/bird.sgml +++ b/doc/bird.sgml @@ -477,7 +477,7 @@ to zero to disable it. An empty is equivalent to disabled && nc->disabled) log(L_INFO "Disabling protocol %s", p->name); - PD(p, "Restarting"); p->down_code = nc->disabled ? PDC_CF_DISABLE : PDC_CF_RESTART; p->cf_new = nc; } - else + else if (!shutting_down) { - if (!shutting_down) - log(L_INFO "Removing protocol %s", p->name); - PD(p, "Unconfigured"); + log(L_INFO "Removing protocol %s", p->name); p->down_code = PDC_CF_REMOVE; p->cf_new = NULL; } - p->reconfiguring = 1; + else /* global shutdown */ + { + p->down_code = PDC_CMD_SHUTDOWN; + p->cf_new = NULL; + } + p->reconfiguring = 1; config_add_obstacle(old); proto_rethink_goal(p); } diff --git a/nest/protocol.h b/nest/protocol.h index 8a632715..11fcb164 100644 --- a/nest/protocol.h +++ b/nest/protocol.h @@ -222,8 +222,9 @@ struct proto_spec { #define PDC_CF_RESTART 0x03 /* Restart due to reconfiguration */ #define PDC_CMD_DISABLE 0x11 /* Result of disable command */ #define PDC_CMD_RESTART 0x12 /* Result of restart command */ +#define PDC_CMD_SHUTDOWN 0x13 /* Result of global shutdown */ #define PDC_IN_LIMIT_HIT 0x21 /* Route import limit reached */ -#define PDC_OUT_LIMIT_HIT 0x22 /* Route export limit reached - not implemented */ +#define PDC_OUT_LIMIT_HIT 0x22 /* Route export limit reached */ void *proto_new(struct proto_config *, unsigned size); diff --git a/proto/bgp/bgp.c b/proto/bgp/bgp.c index 0b52dedc..dbc59eea 100644 --- a/proto/bgp/bgp.c +++ b/proto/bgp/bgp.c @@ -870,6 +870,7 @@ bgp_shutdown(struct proto *P) break; case PDC_CMD_DISABLE: + case PDC_CMD_SHUTDOWN: subcode = 2; // Errcode 6, 2 - administrative shutdown break;