0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2025-01-18 06:51:54 +00:00

BGP: Long-lived graceful restart enhancements

When use of LLGR is negotiated, handle hold timeout by LLGR instead of by
hard restart. Allow to configure whether BFD session down event should be
handled by GR/LLGR or by hard restart.
This commit is contained in:
Ondrej Zajicek (work) 2018-07-04 16:42:42 +02:00
parent a9d869c484
commit aa2ec912f5
4 changed files with 32 additions and 4 deletions

View File

@ -1977,13 +1977,16 @@ using the following configuration parameters:
immediately shut down. Note that this option cannot be used with immediately shut down. Note that this option cannot be used with
multihop BGP. Default: disabled. multihop BGP. Default: disabled.
<tag><label id="bgp-bfd">bfd <M>switch</M></tag> <tag><label id="bgp-bfd">bfd <M>switch</M>|graceful</tag>
BGP could use BFD protocol as an advisory mechanism for neighbor BGP could use BFD protocol as an advisory mechanism for neighbor
liveness and failure detection. If enabled, BIRD setups a BFD session liveness and failure detection. If enabled, BIRD setups a BFD session
for the BGP neighbor and tracks its liveness by it. This has an for the BGP neighbor and tracks its liveness by it. This has an
advantage of an order of magnitude lower detection times in case of advantage of an order of magnitude lower detection times in case of
failure. Note that BFD protocol also has to be configured, see failure. When a neighbor failure is detected, the BGP session is
<ref id="bfd" name="BFD"> section for details. Default: disabled. restarted. Optionally, it can be configured (by <cf/graceful/ argument)
to trigger graceful restart instead of regular restart. Note that BFD
protocol also has to be configured, see <ref id="bfd" name="BFD">
section for details. Default: disabled.
<tag><label id="bgp-ttl-security">ttl security <m/switch/</tag> <tag><label id="bgp-ttl-security">ttl security <m/switch/</tag>
Use GTSM (<rfc id="5082"> - the generalized TTL security mechanism). GTSM Use GTSM (<rfc id="5082"> - the generalized TTL security mechanism). GTSM

View File

@ -704,6 +704,12 @@ bgp_hold_timeout(timer *t)
if (sk_rx_ready(conn->sk) > 0) if (sk_rx_ready(conn->sk) > 0)
bgp_start_timer(conn->hold_timer, 10); bgp_start_timer(conn->hold_timer, 10);
else if ((conn->state == BS_ESTABLISHED) && p->gr_ready && conn->peer_llgr_able)
{
BGP_TRACE(D_EVENTS, "Hold timer expired");
bgp_handle_graceful_restart(p);
bgp_conn_enter_idle_state(conn);
}
else else
bgp_error(conn, 4, 0, NULL, 0); bgp_error(conn, 4, 0, NULL, 0);
} }
@ -1046,13 +1052,29 @@ bgp_bfd_notify(struct bfd_request *req)
int ps = p->p.proto_state; int ps = p->p.proto_state;
if (req->down && ((ps == PS_START) || (ps == PS_UP))) if (req->down && ((ps == PS_START) || (ps == PS_UP)))
{
BGP_TRACE(D_EVENTS, "BFD session down");
/* Ignore if already in GR */
if (p->gr_active && (p->cf->bfd == BGP_BFD_GRACEFUL))
return;
if (p->conn && (p->conn->state == BS_ESTABLISHED) &&
p->gr_ready && (p->cf->bfd == BGP_BFD_GRACEFUL))
{ {
BGP_TRACE(D_EVENTS, "BFD session down"); /* Trigger graceful restart */
bgp_handle_graceful_restart(p);
bgp_conn_enter_idle_state(p->conn);
}
else
{
/* Trigger session down */
bgp_store_error(p, NULL, BE_MISC, BEM_BFD_DOWN); bgp_store_error(p, NULL, BE_MISC, BEM_BFD_DOWN);
if (ps == PS_UP) if (ps == PS_UP)
bgp_update_startup_delay(p); bgp_update_startup_delay(p);
bgp_stop(p, 0, NULL, 0); bgp_stop(p, 0, NULL, 0);
} }
}
} }
static void static void

View File

@ -102,6 +102,8 @@ struct bgp_config {
#define BGP_GRS_LLGR_1 2 /* Long-lived GR phase 1 (restart time) */ #define BGP_GRS_LLGR_1 2 /* Long-lived GR phase 1 (restart time) */
#define BGP_GRS_LLGR_2 3 /* Long-lived GR phase 2 (stale time) */ #define BGP_GRS_LLGR_2 3 /* Long-lived GR phase 2 (stale time) */
#define BGP_BFD_GRACEFUL 2 /* BFD down triggers graceful restart */
struct bgp_conn { struct bgp_conn {
struct bgp_proto *bgp; struct bgp_proto *bgp;

View File

@ -172,6 +172,7 @@ bgp_proto:
| bgp_proto TTL SECURITY bool ';' { BGP_CFG->ttl_security = $4; } | bgp_proto TTL SECURITY bool ';' { BGP_CFG->ttl_security = $4; }
| bgp_proto CHECK LINK bool ';' { BGP_CFG->check_link = $4; } | bgp_proto CHECK LINK bool ';' { BGP_CFG->check_link = $4; }
| bgp_proto BFD bool ';' { BGP_CFG->bfd = $3; cf_check_bfd($3); } | bgp_proto BFD bool ';' { BGP_CFG->bfd = $3; cf_check_bfd($3); }
| bgp_proto BFD GRACEFUL ';' { BGP_CFG->bfd = BGP_BFD_GRACEFUL; cf_check_bfd(1); }
; ;
CF_ADDTO(dynamic_attr, BGP_ORIGIN CF_ADDTO(dynamic_attr, BGP_ORIGIN