[Idr] BGP Directorate Review of draft-ietf-idr-dynamic-cap-19
Alvaro Retana <aretana.ietf@gmail.com> Thu, 19 February 2026 22:17 UTC
Return-Path: <aretana.ietf@gmail.com>
X-Original-To: idr@mail2.ietf.org
Delivered-To: idr@mail2.ietf.org
Received: from localhost (localhost [127.0.0.1]) by mail2.ietf.org (Postfix) with ESMTP id A1876BA1B78B for <idr@mail2.ietf.org>; Thu, 19 Feb 2026 14:17:28 -0800 (PST)
X-Virus-Scanned: amavisd-new at ietf.org
X-Spam-Flag: NO
X-Spam-Score: -2.098
X-Spam-Level:
X-Spam-Status: No, score=-2.098 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001] autolearn=unavailable autolearn_force=no
Authentication-Results: mail2.ietf.org (amavisd-new); dkim=pass (2048-bit key) header.d=gmail.com
Received: from mail2.ietf.org ([166.84.6.31]) by localhost (mail2.ietf.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 1JYgVjz00P8e for <idr@mail2.ietf.org>; Thu, 19 Feb 2026 14:17:25 -0800 (PST)
Received: from mail-dl1-x1230.google.com (mail-dl1-x1230.google.com [IPv6:2607:f8b0:4864:20::1230]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature ECDSA (P-256) server-digest SHA256) (No client certificate requested) by mail2.ietf.org (Postfix) with ESMTPS id CBEB2BA1B391 for <idr@ietf.org>; Thu, 19 Feb 2026 14:17:09 -0800 (PST)
Received: by mail-dl1-x1230.google.com with SMTP id a92af1059eb24-1275750cf9cso1341612c88.0 for <idr@ietf.org>; Thu, 19 Feb 2026 14:17:09 -0800 (PST)
ARC-Seal: i=1; a=rsa-sha256; t=1771539422; cv=none; d=google.com; s=arc-20240605; b=ZfvKGwOjvWcyoLuTupBlmIUIq0YxS/uO7Fz/+QX+XFk9mCRFZ3y/8EvtsDNiU3QHza +9+i/o6VnGgkYXI2vDJBlE4mKMMoHXUvr8aIvln7WS6G+epWAFylsAD71Nq6BcCGbYHv x5rDZq9q6eI/GnV473AJSi8XjvmfyyFjHTNs0m9LiqRaSI7wxlKUpcvtaJj70nfNsij+ 9V26CuV6AW0rh1CvXvM99meL+LdqezAVcaOjeuWf8GtAgB3TBF1YYdS4OVDxrNzxesxh x4dpBZyDILgM4j3ZG2EtzWAqcbRe9WkaYIvk4+LFhY0O2nM9drS3NF+vR/svfAvCp8yq /ckQ==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:mime-version:from:dkim-signature; bh=CAWMNm+qjUrH4sdaWzs4vg5q0aZmldv3t3UGOky3r2E=; fh=BCLv7RYNC/0FRox1u8INXopNOGcOfJv0DrgKnhbANBw=; b=CuyiHDcDyFVm24Pc86KwGfSS6EXt9SpmPRzWr36dRhBLDh/238L4dSgFpJfAJVnCxK EPo8bMaTxznRJCI6GL23swiIPTr4KTDiuO2//E8Do//Ugi0aKCgIQdRkCSj0/Rv0eMaR J524MwTVw2qiY/6yOa78nXnyLZtSiC9f5D0Sk4OcEnm3fmc4qeG9aniu8gMXKtqxyjsy IjSE8ZTrGaT/0wCm89e0dghqjf6YLRx4xSMvZvgN11MQ9AdgnoT3EnzI8OZryTGGPvAI YcCP/aUkeSv44XkYwNoz/abzetZpsukkMD+8l5KG4Xl7nRgVJEvWfwi1cWEVeebnkOYo HxkA==; darn=ietf.org
ARC-Authentication-Results: i=1; mx.google.com; arc=none
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1771539422; x=1772144222; darn=ietf.org; h=cc:to:subject:message-id:date:mime-version:from:from:to:cc:subject :date:message-id:reply-to; bh=CAWMNm+qjUrH4sdaWzs4vg5q0aZmldv3t3UGOky3r2E=; b=U7P3J3hNLBXdQhiQjpOvMotu9nqW9vUfNnzFXKMBAZbkN+dhgyKMUFtHbZrXcqNADN R8Nr3gdSv8HowlEcP0EI4auUMv/CiOoJFKGR/VmR3LSCpG+4W40q0E5GVhVhvKelnDol uDArDKdIPc5ypAm+Izt8jrWlmfNoK2iEeZ7kt9Ep2Kv7yA/ZJKJPdvUak5o0S83acb0H Qvr5U168KkZjydEX4Q9yy0mJVneaN/MBiDd1W7gwUrYaKvocWbcNRIF3a9Kzcyx1Vnzw T35MYJNaXuScQS2I0VRTT6vg58Ty0YcuC9irM/Nd/gDNlmszRjmoKTfpGjqn8wKn/Wlt hnvA==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771539422; x=1772144222; h=cc:to:subject:message-id:date:mime-version:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=CAWMNm+qjUrH4sdaWzs4vg5q0aZmldv3t3UGOky3r2E=; b=RuLj6jXcpWp1kFf1yv7e2dFyuv8OIz+j2J7ha53vW0MfRflz4iKrefaeBgdfkqSeu2 Z2KyPVZbfv8wQ0M5BDhoMGdLC7QxXb+fYckwSJf/ihK8sdmRZfrhcnfFLvWyvbIyMs9o AtEqvuQqscxLv33agd8Ba4Szd5jVsrokAVelvedZwLCDKLJWY8LlEEWF7VOXYrVPrEgr LVqeHJkbimL0qst2vjkTBmYcizbLEuDNDbyZAahukU9nwkdNYAmSx719np6UjEULyHRG 420jJ18nTpgMZPzBiRdS6kns9umQFAtPy2ijVqdDqKXxB3C5SgSCp3GNXkpBRMEpsHSu 27Rg==
X-Gm-Message-State: AOJu0Ywib1h6Hid0wIPD5ie9Mcnos3RvCLs23iV7Chi1YiTc5Xa8nPN1 DZR8Lef0SIaK+L4vcJFx6v/5ywlo9NkzP+9I+sYqiVdhco94sV0t9imB3NALHDevPka82x51x22 dSevVJ/kKNmd3R8VJFqkEgNvPupPjhLY=
X-Gm-Gg: AZuq6aJ2dCCkMDKyfY1NmBshgv3k5RBn1wHrZ9DZbgzVqINTXRYM7NiIJ1fo/QL/9q7 s6j19aFxIrnuFxydS+dVCpDLq7clUqWCfdKaOfXHZODSxHi61Dj2HRONpaHfhJGmOsWI1H6bbt8 8vj3rVgXVFeNpu+A3NE92EQVWc1KUO4QwlGm13NLRPvJfPPIM0OKDwREyxcagBHXMs4k0vyLYJw Hfw9v56F755E7Xxo6/CZAXwQq5crRkKZNpMeJzwmSTtZFdQk1mRaGXsGq7hwrya9oRYTaCvaSzu 9ColCauKvw==
X-Received: by 2002:a05:7022:f9e:b0:11b:d561:bc10 with SMTP id a92af1059eb24-12739840640mr11453044c88.41.1771539421575; Thu, 19 Feb 2026 14:17:01 -0800 (PST)
Received: from 1058052472880 named unknown by gmailapi.google.com with HTTPREST; Thu, 19 Feb 2026 14:17:00 -0800
Received: from 1058052472880 named unknown by gmailapi.google.com with HTTPREST; Thu, 19 Feb 2026 14:17:00 -0800
From: Alvaro Retana <aretana.ietf@gmail.com>
MIME-Version: 1.0
Date: Thu, 19 Feb 2026 14:17:00 -0800
X-Gm-Features: AaiRm50mh0FlNhk5jU-6oUupxLl8RmoWyJHwQQEp4hJw_VgYsC-wAxGxJBedMEA
Message-ID: <CAMMESswriXg8gLHpWvRBLt6TCk3yZnCvXbEuToLbqg+wPr3QNw@mail.gmail.com>
To: draft-ietf-idr-dynamic-cap@ietf.org, idr-chairs <idr-chairs@ietf.org>
Content-Type: multipart/alternative; boundary="000000000000edbf02064b34a957"
Message-ID-Hash: 546QIBZBXK5HVSPEEH4UHI4IR6RVVJXR
X-Message-ID-Hash: 546QIBZBXK5HVSPEEH4UHI4IR6RVVJXR
X-MailFrom: aretana.ietf@gmail.com
X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-idr.ietf.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header
CC: "idr@ietf. org" <idr@ietf.org>, bgpdir@ietf.org
X-Mailman-Version: 3.3.9rc6
Precedence: list
Subject: [Idr] BGP Directorate Review of draft-ietf-idr-dynamic-cap-19
List-Id: Inter-Domain Routing <idr.ietf.org>
Archived-At: <https://mailarchive.ietf.org/arch/msg/idr/hpZTCBlBuytLGyfY3pJRBzbwgSQ>
List-Archive: <https://mailarchive.ietf.org/arch/browse/idr>
List-Help: <mailto:idr-request@ietf.org?subject=help>
List-Owner: <mailto:idr-owner@ietf.org>
List-Post: <mailto:idr@ietf.org>
List-Subscribe: <mailto:idr-join@ietf.org>
List-Unsubscribe: <mailto:idr-leave@ietf.org>
Enke/Srihari:
Hi! How are you?
I have been selected to do a BGP Directorate review of this draft. I'm very
happy to see this work revived!
In summary, I have some significant concerns with the document. I put
in-line comments (below), but want to highlight some major issues here:
(1) Implementations of Previous Versions
Do implementations exist for previous versions of this document? Have
they been deployed?
I ask because some of the text intends to work with those implementations
(by maintaining the "Ack Request", or the "Unknown Sequence Number" error
subcode, for example), or even interoperate with them (by suggesting that
a NOTIFICATION be ignored (!), or all of Section 8). This concerns me for
two reasons: the obvious squatting and the added complexity to the
specification.
(2) Network-wide Capabilities
While capabilities are negotiated on a session-by-session basis, the
functionality they signal may need to be deployed across the entire
network. For example, adding a new AF requires support beyond a single
hop.
This document should discuss this type of deployment and the risks of not
being able to revise a capability across multiple hops. The procedures in
Section 4 may result in incomplete or inconsistent instantiation of e2e
services, without a failsafe.
(3) Receiver Demarcation
A specific case of inconsistency is the demarcation for the Receiver
(§4.2),
where it can take action without the loop being closed with the
Initiator.
Specifically:
If the Init/Ack bit is set to 0...the Receiver MUST treat it as an
indication of demarcation for that capability revision.
The operation, as described, may result in an open loop: the Initiator
may
never receive the Ack (or timeout, etc.), which could lead to an
inconsistent state. Note that if the Initiator tries again, the Receiver
will ignore them and the loop will never close:
The Receiver SHALL ignore such a capability revision that either
results in no change to an existing capability, or removes a
capability that was not advertised previously.
(4) Security Considerations
The current text says that this specification "does not change the
underlying security or confidentiality issues inherent in the existing
BGP". Even if that were true, the attack surface is extended by the
addition of a new message type, new functionality, etc. See the comments
below for specific risks.
(5) FSM
The FSM from Appendix 3 should be moved into the main text. It should
indicate any changes or additions to the FSM in RFC 4271. Also, the
current
text needs a better description and should use terminology similar to
that
in rfc4271.
To the Chairs: this draft should be marked as replacing
draft-chen-bgp-dynamic-cap.
Thanks!
Alvaro.
[Line numbers from idnits.]
...
11 Abstract
13 This document defines a new BGP capability termed "Dynamic
14 Capability", which would allow the dynamic update of capabilities
15 over an established BGP session. This capability would facilitate
16 non-disruptive capability changes by BGP speakers.
[nit] This document is moving towards being a specification, not a
proposal. The use of "would" makes the specification sound like a proposal.
Suggestion>
This document defines a new BGP capability termed "Dynamic
Capability", which allows the dynamic update of capabilities over
an established BGP session. This capability facilitates
non-disruptive capability changes by BGP speakers.
...
86 1. Introduction
...
98 Most capabilities define just one instance of the capability (also
99 known as single-instance capabilities). Certain other capabilities
100 have multiple instances of capability (also known as multi-instance
101 capabilities). Route Refresh capability [RFC2918], is an example for
102 single-instance capability and the Multiprotocol extensions for BGP-4
103 capability [RFC2858] is a multi-instance capability as it can list
104 one or more individual address-family, sub-address-family
105 capabilities.
[nit] s/instances of capability/instances of the capability
[nit] s/Route Refresh capability/The Route Refresh capability/g
[nit] s/example for/example of a
[major] s/RFC2858/RFC4760
[minor] s/individual address-family, sub-address-family capabilities/
Address Family Identifier and Subsequent Address Family Identifier pairs
107 The IANA BGP protocol registry lists the capabilities that a BGP
108 speaker can advertise during session establishment phase. It would
109 benefit network operations if each of these capabilities can be
110 revised dynamically without resetting the session.
[minor] "The IANA BGP protocol registry lists the capabilities that a BGP
speaker can advertise during session establishment phase."
The registry is just a table: it doesn't specify how/when the capabilities
can be advertised (that is left to rfc5492 and documents like this). If
this document moves forward, it should add a column to the registry to
indicate when the capability can be advertised.
[nit] The Capabilities Codes registry is technically not part of the IANA
BGP Parameters.
https://www.iana.org/assignments/capability-codes/capability-codes.xhtml
All this is to say that I believe this paragraph can be deleted.
112 This document defines a new BGP capability termed "Dynamic
113 Capability", which would allow the dynamic update of capabilities
114 over an established BGP session. This capability would facilitate
115 non-disruptive capability changes by BGP speakers.
[] See the comments in the Abstract.
...
125 2. Enabling a Capability on a peering session
[] This section talks about the current operation. Some of the text
describes behavior at a high-level without being specific ("certain
capabilities"). IMO, the text could be replaced by a simple statement
pointing to rfc5492:
[RFC5492] specifies how capabilities can be advertised in the BGP
OPEN message. All the currently-defined capabilities adhere to that
specification, including the need to restart a BGP session if one of
the BGP speakers wishes to enable new functionality during the
lifetime of the BGP session.
[Only the first sentence is really needed.]
127 [RFC5492] specifies Capabilities advertisement for BGP as an optional
128 parameter in OPEN message. By announcing the capability via OPEN
129 message a BGP speaker conveys that it is capable of receiving and
130 properly handling messages related to that capability. A BGP speaker
131 may publish one or more capabilities during the session
132 establishment. This document extends the usage of capability.
[nit] s/OPEN message/in the OPEN message/g
...
143 The type of capability advertised by a BGP speaker will determine its
144 behavior during the peering session. For example, Route Refresh
145 Capability can be advertised by only one BGP speaker and by doing so,
146 it interprets and handles incoming Route-Refresh messages. A BGP
147 speaker that supports the Multiprotocol Extensions for BGP-4
148 capability, may use it after determining that the peer also supports
149 this capability. if an operator wishes to enable new functionality
150 during the lifetime of a BGP session, and if that requires a BGP
151 speaker to revise one or more capabilities, it can do so by resetting
152 the session and advertise the capabilities during OPEN as per
153 [RFC5492]
[nit] s/if an operator...per [RFC5492]/If an operator...per [RFC5492].
155 2.1. Dynamic revision of a Capability via BGP Dynamic Capability
[] Perhaps rename this section to "Dynamic Capability BGP Capability" (or
something that makes it clear the specification of the new capability is
done here).
157 This document proposes a new BGP capability called Dynamic
158 Capability, defined as per BGP capability [RFC5492]. The Capability
159 Code for this capability is specified in the "IANA Considerations"
160 section of this document. The Capability Value field consists of a
161 list of capability codes (one-octet for each) that specify the
162 capabilities that MAY be revised dynamically by the remote BGP
163 speaker during the lifetime of a session. The list of capabilities
164 in the value field of Dynamic Capability TLV s hereby referred as
165 DCAP list.
[minor] s/proposes a new BGP capability/defines a new BGP capability
[minor] No need for an indirection...the code point is already assigned.
s/is specified in the "IANA Considerations" section of this document/is 67
[major] The Capability Length is not specified. It is easy to assume what
it may be, but we shouldn't have to assume.
[minor] It would be nice to add a drawing of what the capability looks like.
[nit] Even though the Capabilities format is effectively a TLV, I've never
seen a capability be called a TLV.
s/in the value field of Dynamic Capability TLV s/in the Capability Value
field is
[minor] "DCAP list"
DCAP is mentioned in §3 as "DYNAMIC CAPABILITY (hereby referred to as DCAP)
Message". To avoid confusion with DCAP being associated with the new
message, introduce the terminology earlier.
[major] To confirm, the set of capabilities in the DCAL List may include
more capabilities than the ones advertised in the OPEN message, right? In
fact, the lists (OPEN Capability Negotiation vs DCAP List) may be
completely different.
167 By advertising the Dynamic Capability to a peer in the OPEN, a BGP
168 speaker conveys to the peer that the speaker is capable of receiving
169 and properly handling the DYNAMIC CAPABILITY message (as defined in
170 the next Section) from the peer after the BGP session has been
171 established. A BGP speaker may announce Dynamic Capability in the
172 OPEN message and during the lifetime of the session, and it may
173 revise one or more capabilities or capability-instances. The BGP
174 speaker that revises its capability by sending the Dynamic Capability
175 message is hereby referred to as Initiator. The remote BGP speaker
176 that responds to the Dynamic Capability message is hereby referred to
177 as Receiver.
[major] "A BGP speaker may announce Dynamic Capability in the OPEN message
and during the lifetime of the session..."
The ability to (initially) advertise the Dynamic Capability remains in the
OPEN only. IOW, if it is not included in the OPEN, it cannot be advertised
later on. It can be revised, but not advertised (for the first time).
179 Via the Dynamic Capability message, a BGP speaker (Initiator) will
180 revise its capabilities. The receiving BGP speaker (Receiver) will
181 make a note of the Initiator's capability revisions and sends
182 messages to the Initiator pertaining to that capability. While many
183 capabilities enable information exchange via existing BGP messages,
184 some require a change in the format of the message. For example, the
185 add-path capability [RFC7911] or 4-octet AS capability [RFC6793]
186 change the structure of BGP update messages.
[minor]"sends messages to the Initiator pertaining to that capability"
This sounds as if the Receiver sends more than one message, but it only
sends an Ack.
188 This document limits the scope of the dynamic revision of
189 capabilities and following capability revisions are allowed.
[nit] s/and following capability /and the following capability
...
197 This document describes procedures for a 2-way handshake for
198 capability revision. Given the underlying TCP's reliable transport,
199 the 2-way handshake procedure is sufficient to create consistent
200 state on both Initiator and Receiver as they implement the capability
201 revision. The Initiator will initiate the handshaking process with a
202 capability revision Init message. The Receiver will acknowledge the
203 capability revision by sending a Ack message. The receipt of the ack
204 message completes the 2-way handshaking procedure and the two
205 speakers can then put the revised capability into effect. The
206 capabilities that do not result in change in the format of any
207 existing message structure can be revised dynamically via 2-way
208 handshake. The capabilities that change the format of existing
209 message structure can be revised during OPEN message or dynamically
210 via [I-D.chen-idr-enhanced-dynamic-cap] which proposes additional
211 protocol procedures.
[nit] s/underlying TCP's reliable transport/underlying reliable transport
[major] "Init Message...Ack message"
These types of messages are not defined anywhere. Yes, after reading
Section 3, I can guess that it refers to the setting of the Init/Ack bit.
But we shouldn't have to guess -- please add a definition in Section 3.
[major] "The Receiver will acknowledge the capability revision by sending a
Ack message."
The definition in Section 3 says that "The Ack Request bit indicates
whether an acknowledgment is requested (when set to 1), or not (when set to
0) for a capability revision being initiated." How is that related to the
text in this section, where it sounds like an Ack is always needed?
[major] "The capabilities that change the format of existing message
structure can be revised during OPEN message or dynamically via
[I-D.chen-idr-enhanced-dynamic-cap] which proposes additional protocol
procedures."
This text should be removed because the document's scope is clear above.
When the other ID advances, then it can refer to this document.
[] The text in this section that refers to the new DCAP message may fit
better *after* the new message is defined.
213 3. BGP Dynamic Capability Message
...
220 +------------------------------+
221 | Init/Ack (1 bit) |
222 +------------------------------+
223 | Ack Request (1 bit) |
224 +------------------------------+
225 | Reserved (5 bits) |
226 +------------------------------+
227 | Action (1 bit) |
228 +------------------------------+
229 | Sequence Number (4 octets) |
230 +------------------------------+
231 | Capability Code (1 octet) |
232 +------------------------------+
233 | Capability Length (2 octets) |
234 +------------------------------+
235 | Capability Value (variable) |
236 +------------------------------+
238 Table 1
[nit] s/Table/Figure
Also, please add a description.
240 The Init/Ack bit indicates whether a capability revision is being
241 initiated (when set to 0), or being acknowledged (when set to 1).
243 The Ack Request bit indicates whether an acknowledgment is requested
244 (when set to 1), or not (when set to 0) for a capability revision
245 being initiated.
[minor] Given the text in §2.1 about enabling a 2-way handshake, when
should this bit not be set? In fact, it looks like this bit is not needed.
...
250 The Action bit is 0 for advertising a capability, and 1 for removing
251 a capability.
[major] Much of the text talks about "revising" a capability, which (to me)
means "changing". Sure, advertising or removing changes the capability.
Can a capability be changed (the time for GR, for example), or does it need
to be removed and then advertised?
253 The Sequence Number field MAY be used by a BGP speaker to co-relate
254 the responses to the capability revision that the speaker initiated
255 previously for debugging purposes.
[minor] I was going to ask about the use of the Sequence Number, and then
found this text in §4.1 -- consider moving it here.
The assignment of the Sequence Number is a local matter, and may be
used to correlate the responses from the Receiver. This can be helpful
during troubleshooting any problems in capability revision.
257 Conceptually the triple <Capability Code, Capability Length,
258 Capability Value> is the same as the one defined in [RFC5492], and it
259 specifies a capability for which the "Action" shall be applied. The
260 Capability Length field, though, is larger than the one specified in
261 [RFC5492].
[major] Why are you defining a longer Capability Length? How should the
length be aligned so that it matched the Capability Length defined in
rfc5492?
[major] I know that there's an error code to indicate "Invalid Capability
Length". Indicate here the valid lengths.
...
277 4. Procedures for handling BGP Dynamic Capability Revisions
279 A BGP speaker that is willing to receive the DCAP message for a
280 capability from its peer SHOULD use the BGP Capabilities
281 Advertisement [RFC5492] to advertise the Dynamic Capability
282 containing the capability code. A DCAP message MAY be received only
283 in the Established state. Receiving a DCAP message in any other
284 state is a Finite State Machine Error as defined in [RFC4271]. A BGP
285 speaker SHOULD reset the HoldTimer upon receiving a DCAP message from
286 its peer.
[major] "A DCAP message MAY be received"
In this case, "MAY" is not indicating a normative option, but a fact:
s/MAY/may
[major] Any changes/updates to the FSM should be explicitly included. See
the comments in Appendix 3.
[major] "SHOULD reset the HoldTimer upon receiving a DCAP message"
Why is this action recommended and not required? The FSM (rfc4271) resets
the HoldTimer when any other message is received. Why is the DCAP message
different?
...
295 4.1. Procedures for the Initiator
297 The Initiator MUST only proceed with following steps if the Receiver
298 has advertised Dynamic Capability indicating that it is capable of
299 handling DCAP message. For the capability 'c' that the Initiator is
300 going to revise, it MUST also verify if the Receiver has listed
301 capability 'c' in the DCAP list. If the Receiver is not capable of
302 Dynamic Capability or if 'c' is not in the DCAP list, the Initiator
303 should log and discard the capability revision.
[nit] s/with following steps...advertised Dynamic Capability...handling
DCAP message/
with the following steps...advertised the Dynamic Capability...handling the
DCAP message
[major] The summary of this first paragraph is: "the Initiator MUST NOT
send a DCAP message is the indented Receiver did not advertise the
capability to be revised in its DCAP list."
IMO, that is a lot clearer than the current text. Among other reasons: (1)
there is no interoperability need to use "MUST also verify" because that is
an internal operation, and (2) it is not clear what action is taken when
"discard the capability revision" is mentioned.
[major] What should the Receiver do if it receives a DCAP message for a
capability it doesn't support?
305 When the Initiator sends a DCAP message to its peer to initiate a
306 capability revision, the Init/Ack bit for the capability revision in
307 the message MUST be set to 0 indicating that the capability revision
308 has been initiated. The Ack Request bit MUST be set to 1 indicating
309 that capability MUST be acknowledged. The assignment of the Sequence
310 Number is a local matter, and may be used to correlate the responses
311 from the Receiver. This can be helpful during troubleshooting any
312 problems in capability revision. The capability that is being
313 revised will be encoded as per IANA BGP Protocol registry capability
314 codes. While a capability revision is in progress, the Initiator
315 MUST NOT initiate another revision of the same capability (or the
316 same capability instance for a multi-instance capability).
[major] "The capability that is being revised will be encoded as per IANA
BGP Protocol registry capability codes."
The registry is just a list of numbers; it doesn't explain the encoding.
Suggestion>
The revised capability is encoded per the corresponding specification
that defines it.
[major] "the Initiator MUST NOT initiate another revision"
What action should the Receiver take if the Initiator does?
...
325 * If the Initiator intends to add a new capability, it must not
326 enable the capability or send messages based on the new capability
327 revision. As there is no prior state, it MUST discard any
328 received messages pertaining to that capability.
330 * If the Initiator intends to remove an existing capability, it must
331 not disable the capability but continue to send and process the
332 received messages pertaining to that capability.
[nit] Should the "MUST NOT" in the second bullet also be an rfc2119
keyword? To match the style of the first bullet.
334 After receiving the DCAP message carrying capability acknowledgement
335 with Init/Ack bit set to 1 from the Receiver, the Initiator MUST
336 validate the DCAP message verifying the Capability code that was
337 revised. This is the demarcation indicator for the Initiator. With
338 this, the Initiator's capability revision finite state machine is
339 complete and it can then function in accordance with the new
340 capability revision as follows:
[minor] "the Initiator's capability revision finite state machine"
Please put a reference to the Appendix.
342 * If the Initiator added the capability, it can now process any new
343 messages received, based on the revised capability.
345 * If the capability was withdrawn by the Initiator, it may reset the
346 internal state. Since the prior state is cleared, it may begin to
347 discard the new messages that may be received from the Receiver
348 pertaining to the removed capability.
350 To put an upper bound on the amount of time for capability revision,
351 an implementation MUST support a (configurable) timer
352 CapabilityRevisionTimer that imposes this upper bound. The Initiator
353 starts the CapabilityRevisionTimer when it starts the capability
354 revision by sending the Init message. The timer is stopped with
355 Initiator receives the Ack message from the Receiver. When
356 CapabilityRevisionTimer times out and the capability revision is
357 still in progress, the dynamic capability revision MUST be discarded.
358 This document recommends logging this error condition for
359 troubleshooting purpose and no further attempts for dynamic
360 capability revision should be made without administrator
361 intervention. This document recommends 10 minute timeout value or a
362 similar large value to avoid premature discard of capability
363 revision.
[nit] s/The timer is stopped with/The timer is stopped when the
[major] "recommends 10 minute timeout value or a similar large value"
This document should specify the default value and allow it to be changed.
If the default is not specified, the timers may be incongruent, with one
side following the recommendation for a "large value" while the other may
consider 1 min (for example) to be "large" enough.
Suggestion>
CapabilityRevisionTimer MUST be set to 10 minutes by default. If
the operator decides to change the value, it should be the same
on both sides of the BGP session.
365 4.2. Procedures for the Receiver
367 The Receiver should expect more than one capability tuple in the DCAP
368 message and should process each capability revision independently.
369 In the received DCAP message, if the Init/Ack bit is set to 1, it
370 SHOULD silently discard the capability revision. For troubleshooting
371 purposes, the unexpected acknowledgement may be logged.
[major] "The Receiver should expect more than one capability tuple in the
DCAP message and should process each capability revision independently."
Does this mean that the Initiator may include more than one capability
"block" (what is in Table 1) in a DCAP message? If so, then it is not
clear in Section 3. In fact, this seems to be the only place where that is
implied. Am I reading too much into it?
[major] This text made me think of this text in §3:
If multiple capability instances..., then each capability
instance MUST be revised individually, one capability instance
at a time.
...and its relationship to this from §4.1:
...the Initiator MUST NOT initiate another revision of the same
capability (or the same capability instance for a multi-instance
capability).
...and the text above.
If multiple capabilities (or instances) are included in the same DCAP
message, how does that fit with §3? Is that operation considered to be at
different times since the Receiver may Ack them individually (can they?)?
373 If the Init/Ack bit is set to 0, the Receiver MUST first validate the
374 capability code. If the capability code is not listed in the Dynamic
375 Capability (DCAP list) advertised by the Receiver itself, and the
376 Receiver MUST send a NOTIFICATION message back to the Initiator as
377 specified in the Error Handling section. For a valid capability
378 code, the Receiver MUST treat it as an indication of demarcation for
379 that capability revision.
[major] See the comment above about "MUST first validate".
Suggestion>
If a DCAP message is received with the Init/Ack bit set to 0 and
containing a Capability Code not advertised by the Receiver, it
MUST send a NOTIFICATION...
[See the comments in the Error Handling section about this type of
NOTIFICATION.]
[major] "the Receiver MUST treat it as an indication of demarcation for
that capability revision"
AFAIU, the demarcation means that the Receiver can start processing the
revision. But what exactly does that mean? If the capability is being
removed, for example, should the Receiver start ignoring related UPDATES
from its Peer? Note that the Initiator has not received the Ack from the
Receiver (and may never receive it), so the state could become inconsistent.
...
386 The Receiver SHALL update the capability previously received from the
387 Initiator based on the Action bit in the message, and then function
388 in accordance with the revised capability for the peer. The Receiver
389 SHALL ignore such a capability revision that either results in no
390 change to an existing capability, or removes a capability that was
391 not advertised previously. The procedures specified in the "Error
392 Handling" section SHOULD be followed when an error is detected in
393 processing the CAPABILITY message.
[major] "SHOULD be followed"
When is it ok not to follow the Error Handling section? IOW, why is this
action recommended and not required? It is not necessary to include a
Normative statement here. Instead, just point at the section.
Suggestion>
The "Error Handling" section (Section 7) provides more details
in cases when an error is detected.
395 5. Revising capabilities via Dynamic Capability
...
404 A BGP speaker may choose to advertise one of more capabilities. If
405 it has advertised Dynamic Capability (via OPEN or dynamically) it can
406 accept Dynamic Capability message from remote BGP speaker, The value
407 of Dynamic Capability TLV is DCAP list. By having a capability in
408 the DCAP list, the local BGP speaker is indicating that it has the
409 support and ability to handle the revision (add or delete) of that
410 capability. The remote BGP speaker makes a note of the list of
411 capabilities in the DCAP list and performs the revision during the
412 lifetime of the peering session.
[] Everything in this paragraph is already covered elsewhere.
[major] "has advertised Dynamic Capability (via OPEN or dynamically)"
The ability to (initially) advertise the Dynamic Capability remains in the
OPEN only. IOW, if it is not included in the OPEN, it cannot be advertised
later on. It can be revised, but not advertised (for the first time).
[nit] s/Dynamic Capability/the Dynamic Capability/g
[nit] s/from remote BGP speaker/from a BGP speaker
[nit] ", The value of Dynamic Capability TLV is DCAP list."
This sounds like an orphan fragment.
414 It is quite possible to list Dynamic Capability itself in DCAP list.
415 This means that local BGP speaker can handle the revision of Dynamic
416 Capability itself, thereby allowing add/delete capabilities from DCAP
417 list. This document recommends that BGP speakers list the Dynamic
418 Capability Code in Dynamic Capability. This will allow a BGP speaker
419 to revise the list capability instances during the lifetime of the
420 peering session by sending a DCAP message with Dynamic Capability
421 revising DCAP list.
[nit] s/DCAP list/the DCAP list/g
[nit] s/that local BGP speaker/that the local BGP speaker
[nit] The last sentence repeats the first three.
423 6. Limitations of the BGP Dynamic Capability
425 If the capability results in change of the format of the messages, it
426 is important to have tighter co-ordination. For example, the
427 procedures specified in this document does not provide demarcation
428 enough for the Receiver to know when the Initiator will advertise the
429 messages based on the revised capability. Hence, the capabilities
430 that have bi-directional capability dependency requiring 3-way
431 handshake will not function accurately. With this limitation,
432 following capabilities can be revised using the procedures mentioned
433 in this document.
[?] "bi-directional capability dependency requiring 3-way handshake will
not function accurately"
Which are these? Can you provide an example?
[major] The definition/specification in this paragraph is mentioned as an
example.
Suggestion>
Not all capabilities can be revised using the procedures in
this document. Capabilities that result in a change in the
message format, or that require bi-directional advertisement
are not supported. Only the following capabilities can be
revised using the specification in this document:
435 * Multiprotocol Extensions for BGP-4
437 * Route Refresh Capability for BGP-4
439 * BGP Role
441 * Graceful Restart
443 * Enhanced Route Refresh
445 * Long-Lived Graceful Restart
447 * Routing Policy Distribution
449 * FQDN
[major] FQDN is documented in an expired individual draft. If you list it,
you should also consider other capabilities that are currently documented
in a draft. For example, Multisession, software version, paths-limit, or
metadata…. In fact, because the registration policy of part of the registry
is FCFS, all capabilities in that space should be covered.
[major] The Dynamic Capability itself is not listed.
[major] What about ORF?
[major] The BGP Extended Message capability doesn't strictly result in
changing the message format...why is it not included?
[major] Please add a statement requiring future capabilities to include a
statement of whether they can be dynamically revised.
[major] It would also be a good idea to include the ability to revise a
capability in the registry. This would also require a change in the
registration policy to at least include DE review.
[] It would be nice to include a table that includes the Capability name,
code point, and whether it is supported...and if not, why.
451 The remaining capabilities may only be advertised via OPEN message
452 during session establishment.
[major] What should a receiver do if one of those capabilities is included
in the DCAP message?
454 7. Error Handling
...
464 Subcode Description
465 1 Unknown Sequence Number (deprecated)
466 2 Invalid Capability Length
467 3 Malformed Capability Value
468 4 Unsupported Capability Code
[major] This document establishes this set of subcodes. It doesn't need to
indicate anything as "deprecated" unless implementations have already been
deployed with that codepoint. Do implementations exist??
470 If a BGP speaker detects an error while processing a CAPABILITY
471 message, it MUST send a NOTIFICATION message with Error Code
472 CAPABILITY Message Error. If any of the defined error subcode is
473 applicable, the Data field of the NOTIFICATION message MUST contain
474 the tuple for the capability revision that causes the speaker to send
475 the message. On the receipt of such a NOTIFICATION message, the BGP
476 speaker should log for troubleshooting purposes. The ongoing
477 capability revision MUST be discarded by both Initiator and Receiver.
478 No new capability revisions can be initiated until administrator
479 intervention.
[major] "The ongoing capability revision MUST be discarded by both
Initiator and Receiver."
This sentence is unnecessary because if a NOTIFICATION is sent, then the
session is reset, so whatever was going on there is discarded.
[major] "No new capability revisions can be initiated until administrator
intervention."
What does this mean? The session will restart—is that considered an
administrative event, or do you expect a knob to allow revisions through
session restarts? I'm assuming any revision would result from a
configuration change, which I would call "administrator intervention".
481 This document revises the usage of Sequence Number. The DCAP message
482 fields are sufficient to correlate the message between the Initiator
483 and the Receiver, hence the Sequence Number usage is limited to
484 diagnostic purposes. The BGP speaker MUST not validate the Sequence
485 Number received and MUST not send NOTIFICATION message with Unknown
486 Sequence Number. If a NOTIFICATION message with Error code Unknown
487 Sequence Number is received, it MUST be logged for troubleshooting
488 purposes before silently discarding it.
[major] "This document revises the usage of Sequence Number."
See the comment about the deprecated value...
[major] "If a NOTIFICATION message with Error code Unknown Sequence Number
is received, it MUST be logged for troubleshooting purposes before silently
discarding it."
Once a NOTIFICATION is received, the session is reset, no matter what.
Even if the local speaker could ignore the event, the sender should have
already reset the session. :-( IOW, the reason for the reset is irrelevant.
[major] s/MUST not/MUST NOT
...
498 If the Capability Code in the CAPABILITY message is not any of the
499 capability codes advertised in the Dynamic Capability by the speaker,
500 then the error subcode is set to Unsupported Capability Code.
[major] Why should the session be reset in this case? Note that rfc5493 is
explicit about an unknown capability not resulting in a session reset:
If a BGP speaker receives from its peer a capability that it does not
itself support or recognize, it MUST ignore that capability. In
particular, the Unsupported Capability NOTIFICATION message MUST NOT
be generated and the BGP session MUST NOT be terminated in response
to reception of a capability that is not supported by the local
speaker.
502 8. Backward compatibility with existing deployment
[nit] s/deployment/deployments
504 The new protocol procedures can work with existing implementations of
505 Initiator and Receiver. The following section describes the
506 different scenarios.
[major] "existing implementations of Initiator and Receiver"
Existing implementations?? This is the first specification -- any
pre-specification implementation should be out of scope!
...
538 9. IANA Considerations
540 This document introduces a new CAPABILITY message type for BGP. IANA
541 is requested to allocate the message type.
[major] Indicate the registry that this value will come from.
543 This document proposes NOTIFICATION message to handle errors during
544 capability revision. IANA is requested to allocate NOTIFICATION
545 error code for handling such errors.
[nit] s/propose/specify/g
[major] Indicate the registry that this value will come from.
547 This document proposes Dynamic Capability that BGP speaker announces
548 in the OPEN message. IANA has assigned code point 67 for Dynamic
549 Capability.
[major] This has already been assigned. Mention the value and the registry
instead, and request that the entry point to this document.
[major] This section should also include the request for the new registry
(Error Subcodes), the initial values, references, and allocation policy
[rfc8126].
551 10. Security Considerations
553 The extension proposed in this document does not change the
554 underlying security or confidentiality issues inherent in the
555 existing BGP [RFC4271].
[minor] Also mention that the considerations from rfc5492 apply.
[major] Several things come to mind:
- Dynamically enabling a capability has similar characteristics to enabling
it using the OPEN message. For the different supported capabilities, their
Security Considerations should apply here as well.
- Having a new message type increases the potential attack surface of the
protocol. A rogue node may send the new message with incorrect information
to cause a session reset. Yes, this can be done with current messages, but
the new message increases that risk. Look at the message analysis in
rfc4272.
- A (rogue) Receiver may not ACK a message, resulting in a timeout and a
delay (or complete failure) of the capability revision. The practical
result is that a service in the network may not be deployable, which
implies the ability to perform a denial-of-service attack.
- A downgrade attack is also possible: a rogue Initiator may remove a
capability. For example, removing RR/ERR.
- While capabilities are negotiated on a session basis, some functionality
has to be enabled network-wide -- for example, support for a new AF. If
the chain of BGP sessions doesn't all successfully revise a capability, the
service in the network may be inconsistent (some support it, but some
don't), which could also result in unexpected forwarding, increased
congestion, transient loops/dropped packets (as the revision is
propagated), etc...
- Before dynamic capabilities, a rogue BGP speaker could, for example,
inject or withdraw routes. Now it can also change the rules of the session
-- "session compromise". The blast radius may expand beyond a single
peering session.
- A rogue Initiator can repeatedly add/remove a capability, which will
force reconfiguration, maybe exchange of UPDATES, RIBs built/torn down
repeatedly, control plane instability, etc..
- Except for ADD_PATH, which is not supported, I don't remember a
capability that alters the route selection semantics. But if there was one
in the future, a dynamic revision could result in bypassing policy or other
unintended behavior. This is a general risk...
...
628 12.3. Appendix 3: Operational states for Capability Revision
630 A BGP speaker MUST maintain states about whether a capability has
631 been advertised, or received during the lifetime of the BGP session.
632 For a multi-instance capability, the states of the capability and its
633 revision MUST be instance specific.
[major] Is the FSM shown here intended to be Normative/Mandatory (as
indicated by the MUSTs above)? I suggest that his part of the appendix be
moved to the main body of the document, and an introductory paragraph
similar to rfc4271 be included:
The data structures and FSM described in this document are conceptual
and do not have to be implemented precisely as described here, as
long as the implementations support the described functionality and
they exhibit the same externally visible behavior.
635 The following symbols are designated for that purpose:
637 "L:" refers to the local speaker and "R:" refers to the remote
speaker
639 L:Cap.True - Capability advertised
640 R:Cap.True - Capability received
642 L:Cap.False - Capability not advertised
643 R:Cap.False - Capability not received
[major] Advertised and received in the OPEN or in the DCAP message or ??
645 L:Dyn.Oper.None/Add/Del - Following Capability revision may be
triggered
646 at Idle state
647 Operator adds a capability OR
648 Operator deletes a capability
[major] "None/Add/Del"
What does "None" mean?
[major] "at Idle state"
I assume you mean "in the Established State".
650 L.Send.None - Router does not send DCAP message
651 R.Send.None - Router does not send DCAP message
653 L.Recv.None - Router does not receive DCAP messages
654 R.Recv.None - Router does not receive DCAP messages
[] I'm assuming this is a state where the routers haven't sent or received.
656 L.Send.Init - Router sends DCAP message with Init/Ack=0
657 R.Recv.Init - Router receives DCAP message with
Init/Ack=0
659 L.Recv.Ack - Router receives DCAP message with
Init/Ack=1
660 R.Send.Ack - Router sends DCAP message with Init/Ack=1
662 During the dynamic revision of a capability, there are separate
663 states, "Sending State", and "Receiving State" driven by the Dynamic
664 Capability revision.
[] Describe the FSM using similar notation as in rfc4271.
666 12.3.1. Appendix 3.1: Initiator Capability Revision
668 States for Initiator as it revises its capability.
670 L.Dyn.Oper.None/Add/Del
671 L:Send.None
672 L:Recv.None
673 L:Send.Init
674 L:Recv.Ack
676 State transitions:
678 L:Cap.True/False
679 L:Dyn.Oper.None/Add/Del
680 L:Send.None ---> L:Send.Init ------+
681 L:Recv.None |
682 | |
683 ^ v
684 | |
685 |------<--- Timeout ----<----+
686 | |
687 ^ v
688 | |
689 +----<---- L:Recv.Ack --<----+
[] There should be a description of the events that cause transitions, etc..
...
712 12.4. Deployment use cases
[] Include a pointer in the main text to the Appendix.
...
719 12.4.1. Adding a capability dynamically
721 During session establishment, the Receiver advertises Cap-1, Cap-2
722 and DynCap in OPEN message. The DynCap contains Cap-1 and Cap-2
723 indicating that Receiver is capable of handling dynamic revision of
724 capabilities Cap-1 and Cap-2 dynamically. The Initiator during
725 session establishment advertises Cap-1 and DynCap in OPEN message.
726 After session is established, sometime during the lifetime of the
727 peering session, the Operator enables a functionality on the
728 Initiator that requires Cap-2. Since Receiver allows dynamic
729 revision of Cap-2, the Initiator sends DCAP message with Action "add"
730 for Cap-2. The Receiver acknowledges addition of Cap-2 and after
731 receiving the ack, the Initiator puts additions of Cap-2 into effect.
[minor] Only this section uses the "DynCap" term. Please be consistent.
[minor] s/DynCap list/DCAP list/g
733 12.4.2. Deleting a capability dynamically
[minor] In the main body, the text talks about "removing" (not deleting) a
capability. Be consistent.
...
745 12.4.3. Network upgrade without Non-Stop-Routing
[] Reference for NSR??
747 The Initiator is upgraded and during session establishment, it
748 advertises Cap-1 and DynCap in OPEN message. The Receiver is not
749 upgraded and during the session establishment, it advertises Cap-1
750 and DynCap in OPEN message. The DynCap lists Cap-1 indicating that
751 Receiver is capable of habdling dynamic revision of Cap-1 only. As
752 part of the upgrade, the Initiator supports new functionality and new
753 capability Cap-2. The Operator wishes to enable new functionality
754 during the lifetime of the peering session and as a result the
755 Initiator wants to "add" Cap-2. It cannot send DCAP message with
756 Action "add" for Cap-2 because the Receiver does not have support to
757 handle Cap-2. The Initiator can add Cap-2 only when Receiver allows
758 the dynamic revision of Cap-2.
[] This example seems obvious (and unnecessary) to me: if the peer doesn't
support the dynamic revision of a capability, it cannot be revised...
760 12.4.4. Network upgrade with Non-Stop-Routing
762 The Initiator has advertised Cap-1 and DynCap capabilities in the
763 OPEN message. The Receiver has advertised Cap-1 and DynCap
764 capabilities in the OPEN message. The DynCap lists contains Cap-1
765 and DynCap capabilities indicating that Receiver is capable of
766 handling dynamic revision of Cap-1 and DynCap list. The Initiator is
767 upgraded without resetting the BGP session and the Initiator now has
768 additional capability Cap-2 that it wants to revise. The Initiator
769 will revise DynCap capability with action "add" and the DynCap list
770 will contain Cap-1, Cap-2 and DynCap capabilities. The receiver
771 acknowledges that revision of DynCap capability. When the Receiver
772 is updated without resetting the session, it may revise the DynCap
773 capability adding Cap-1, Cap-2 and DynCap capabilities. With this,
774 the Receiver is indicating that it is capable of handling Cap-2
775 capability revision. The Initiator may send DCAP message with Action
776 "add" for Cap-2. The Receiver may follow the similar process
777 independently, thus allowing asynchronous network upgrade without
778 resetting the BGP session.
[] I may be missing something obvious, but I see no difference in these
examples: until both have the support for Cap-2, it cannot be revised.
[EoR-19]
- [Idr] BGP Directorate Review of draft-ietf-idr-dy… Alvaro Retana