mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-11-09 20:58:44 +00:00
Merge commit '3859e4efc1597368df647323c5a3cc1771cb64ca' into thread-next
This commit is contained in:
commit
985c060342
@ -2783,9 +2783,16 @@ using the following configuration parameters:
|
||||
|
||||
<tag><label id="bgp-hold-time">hold time <m/number/</tag>
|
||||
Time in seconds to wait for a Keepalive message from the other side
|
||||
before considering the connection stale. Default: depends on agreement
|
||||
with the neighboring router, we prefer 240 seconds if the other side is
|
||||
willing to accept it.
|
||||
before considering the connection stale. The effective value is
|
||||
negotiated during session establishment and it is a minimum of this
|
||||
configured value and the value proposed by the peer. The zero value has
|
||||
a special meaning, signifying that no keepalives are used. Default: 240
|
||||
seconds.
|
||||
|
||||
<tag><label id="bgp-min-hold-time">min hold time <m/number/</tag>
|
||||
Minimum value of the hold time that is accepted during session negotiation.
|
||||
If the peer proposes a lower value, the session is rejected with error.
|
||||
Default: none.
|
||||
|
||||
<tag><label id="bgp-startup-hold-time">startup hold time <m/number/</tag>
|
||||
Value of the hold timer used before the routers have a chance to exchange
|
||||
@ -2793,8 +2800,15 @@ using the following configuration parameters:
|
||||
|
||||
<tag><label id="bgp-keepalive-time">keepalive time <m/number/</tag>
|
||||
Delay in seconds between sending of two consecutive Keepalive messages.
|
||||
The effective value depends on the negotiated hold time, as it is scaled
|
||||
to maintain proportion between the keepalive time and the hold time.
|
||||
Default: One third of the hold time.
|
||||
|
||||
<tag><label id="bgp-min-keepalive-time">min keepalive time <m/number/</tag>
|
||||
Minimum value of the keepalive time that is accepted during session
|
||||
negotiation. If the proposed hold time would lead to a lower value of
|
||||
the keepalive time, the session is rejected with error. Default: none.
|
||||
|
||||
<tag><label id="bgp-connect-delay-time">connect delay time <m/number/</tag>
|
||||
Delay in seconds between protocol startup and the first attempt to
|
||||
connect. Default: 5 seconds.
|
||||
|
@ -2075,6 +2075,21 @@ bgp_postconfig(struct proto_config *CF)
|
||||
if (internal && cf->enforce_first_as)
|
||||
cf_error("Enforce first AS check is requires EBGP sessions");
|
||||
|
||||
if (cf->keepalive_time > cf->hold_time)
|
||||
cf_error("Keepalive time must be at most hold time");
|
||||
|
||||
if (cf->keepalive_time > (cf->hold_time / 2))
|
||||
log(L_WARN "Keepalive time should be at most 1/2 of hold time");
|
||||
|
||||
if (cf->min_hold_time > cf->hold_time)
|
||||
cf_error("Min hold time (%u) exceeds hold time (%u)",
|
||||
cf->min_hold_time, cf->hold_time);
|
||||
|
||||
uint keepalive_time = cf->keepalive_time ?: cf->hold_time / 3;
|
||||
if (cf->min_keepalive_time > keepalive_time)
|
||||
cf_error("Min keepalive time (%u) exceeds keepalive time (%u)",
|
||||
cf->min_keepalive_time, keepalive_time);
|
||||
|
||||
|
||||
struct bgp_channel_config *cc;
|
||||
BGP_CF_WALK_CHANNELS(cf, cc)
|
||||
|
@ -120,8 +120,11 @@ struct bgp_config {
|
||||
unsigned llgr_time; /* Long-lived graceful restart stale time */
|
||||
unsigned connect_delay_time; /* Minimum delay between connect attempts */
|
||||
unsigned connect_retry_time; /* Timeout for connect attempts */
|
||||
unsigned hold_time, initial_hold_time;
|
||||
unsigned hold_time;
|
||||
unsigned min_hold_time; /* Minimum accepted hold time */
|
||||
unsigned initial_hold_time;
|
||||
unsigned keepalive_time;
|
||||
unsigned min_keepalive_time; /* Minimum accepted keepalive time */
|
||||
unsigned error_amnesia_time; /* Errors are forgotten after */
|
||||
unsigned error_delay_time_min; /* Time to wait after an error is detected */
|
||||
unsigned error_delay_time_max;
|
||||
|
@ -154,7 +154,8 @@ bgp_proto:
|
||||
| bgp_proto RS CLIENT bool ';' { BGP_CFG->rs_client = $4; }
|
||||
| bgp_proto CONFEDERATION expr ';' { BGP_CFG->confederation = $3; }
|
||||
| bgp_proto CONFEDERATION MEMBER bool ';' { BGP_CFG->confederation_member = $4; }
|
||||
| bgp_proto HOLD TIME expr ';' { BGP_CFG->hold_time = $4; }
|
||||
| bgp_proto HOLD TIME expr ';' { BGP_CFG->hold_time = $4; if (($4 && $4<3) || ($4>65535)) cf_error("Hold time must be in range 3-65535 or zero"); }
|
||||
| bgp_proto MIN HOLD TIME expr ';' { BGP_CFG->min_hold_time = $5; }
|
||||
| bgp_proto STARTUP HOLD TIME expr ';' { BGP_CFG->initial_hold_time = $5; }
|
||||
| bgp_proto DIRECT ';' { BGP_CFG->multihop = 0; }
|
||||
| bgp_proto MULTIHOP ';' { BGP_CFG->multihop = 64; }
|
||||
@ -178,7 +179,8 @@ bgp_proto:
|
||||
| bgp_proto START DELAY TIME expr ';' { BGP_CFG->connect_delay_time = $5; log(L_WARN "%s: Start delay time option is deprecated, use connect delay time", this_proto->name); }
|
||||
| bgp_proto CONNECT DELAY TIME expr ';' { BGP_CFG->connect_delay_time = $5; }
|
||||
| bgp_proto CONNECT RETRY TIME expr ';' { BGP_CFG->connect_retry_time = $5; }
|
||||
| bgp_proto KEEPALIVE TIME expr ';' { BGP_CFG->keepalive_time = $4; }
|
||||
| bgp_proto KEEPALIVE TIME expr ';' { BGP_CFG->keepalive_time = $4; if (($4<1) || ($4>65535)) cf_error("Keepalive time must be in range 1-65535"); }
|
||||
| bgp_proto MIN KEEPALIVE TIME expr ';' { BGP_CFG->min_keepalive_time = $5; }
|
||||
| bgp_proto ERROR FORGET TIME expr ';' { BGP_CFG->error_amnesia_time = $5; }
|
||||
| bgp_proto ERROR WAIT TIME expr ',' expr ';' { BGP_CFG->error_delay_time_min = $5; BGP_CFG->error_delay_time_max = $7; }
|
||||
| bgp_proto DISABLE AFTER ERROR bool ';' { BGP_CFG->disable_after_error = $5; }
|
||||
|
@ -847,9 +847,25 @@ bgp_rx_open(struct bgp_conn *conn, byte *pkt, uint len)
|
||||
if (bgp_read_options(conn, pkt+29, pkt[28], len-29) < 0)
|
||||
return;
|
||||
|
||||
/* RFC 4271 4.2 - hold time must be either 0 or at least 3 */
|
||||
if (hold > 0 && hold < 3)
|
||||
{ bgp_error(conn, 2, 6, pkt+22, 2); return; }
|
||||
|
||||
/* Compute effective hold and keepalive times */
|
||||
uint hold_time = MIN(hold, p->cf->hold_time);
|
||||
uint keepalive_time = p->cf->keepalive_time ?
|
||||
(p->cf->keepalive_time * hold_time / p->cf->hold_time) :
|
||||
hold_time / 3;
|
||||
|
||||
/* Keepalive time might be rounded down to zero */
|
||||
if (hold_time && !keepalive_time)
|
||||
keepalive_time = 1;
|
||||
|
||||
/* Check effective values against configured minimums */
|
||||
if ((hold_time < p->cf->min_hold_time) ||
|
||||
(keepalive_time < p->cf->min_keepalive_time))
|
||||
{ bgp_error(conn, 2, 6, pkt+22, 2); return; }
|
||||
|
||||
/* RFC 6286 2.2 - router ID is nonzero and AS-wide unique */
|
||||
if (!id || (p->is_internal && id == p->local_id))
|
||||
{ bgp_error(conn, 2, 3, pkt+24, -4); return; }
|
||||
@ -947,8 +963,8 @@ bgp_rx_open(struct bgp_conn *conn, byte *pkt, uint len)
|
||||
}
|
||||
|
||||
/* Update our local variables */
|
||||
conn->hold_time = MIN(hold, p->cf->hold_time);
|
||||
conn->keepalive_time = p->cf->keepalive_time ? : conn->hold_time / 3;
|
||||
conn->hold_time = hold_time;
|
||||
conn->keepalive_time = keepalive_time;
|
||||
conn->as4_session = conn->local_caps->as4_support && caps->as4_support;
|
||||
conn->ext_messages = conn->local_caps->ext_messages && caps->ext_messages;
|
||||
p->remote_id = id;
|
||||
|
Loading…
Reference in New Issue
Block a user