summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonatas Abraitis <donatas@opensourcerouting.org>2025-03-26 10:30:52 +0200
committerton31337 <3352707+ton31337@users.noreply.github.com>2025-03-28 15:08:05 +0000
commitb670864aedb7c318554b5c11c0d9353b98e832d1 (patch)
tree692514495f85c3e87b6f90ff77ef75913eda3999
parent5ae516b5a3d6d36f69d2efa5934ea664e0f24ae8 (diff)
bgpd: Set the label for MP_UNREACH_NLRI 0x800000 instead of 0x000000
RFC8277 says: The procedures in [RFC3107] for withdrawing the binding of a label or sequence of labels to a prefix are not specified clearly and correctly. => How to Explicitly Withdraw the Binding of a Label to a Prefix Suppose a BGP speaker has announced, on a given BGP session, the binding of a given label or sequence of labels to a given prefix. Suppose it now wishes to withdraw that binding. To do so, it may send a BGP UPDATE message with an MP_UNREACH_NLRI attribute. The NLRI field of this attribute is encoded as follows: 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Length | Compatibility | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Prefix ~ ~ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Figure 4: NLRI for Withdrawal Upon transmission, the Compatibility field SHOULD be set to 0x800000. Upon reception, the value of the Compatibility field MUST be ignored. [RFC3107] also made it possible to withdraw a binding without specifying the label explicitly, by setting the Compatibility field to 0x800000. However, some implementations set it to 0x000000. In order to ensure backwards compatibility, it is RECOMMENDED by this document that the Compatibility field be set to 0x800000, but it is REQUIRED that it be ignored upon reception. In FRR case where a single label is used per-prefix, we should send 0x800000, and not 0x000000. Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org> (cherry picked from commit 94e2aadf7187d7d695babce21033b5bc8e454f25)
-rw-r--r--bgpd/bgp_attr.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/bgpd/bgp_attr.c b/bgpd/bgp_attr.c
index d349922c52..e5dc558fcf 100644
--- a/bgpd/bgp_attr.c
+++ b/bgpd/bgp_attr.c
@@ -5023,7 +5023,13 @@ void bgp_packet_mpunreach_prefix(struct stream *s, const struct prefix *p,
{
uint8_t wlabel[4] = {0x80, 0x00, 0x00};
- if (safi == SAFI_LABELED_UNICAST) {
+ /* [RFC3107] also made it possible to withdraw a binding without
+ * specifying the label explicitly, by setting the Compatibility field
+ * to 0x800000. However, some implementations set it to 0x000000. In
+ * order to ensure backwards compatibility, it is RECOMMENDED by this
+ * document that the Compatibility field be set to 0x800000.
+ */
+ if (safi == SAFI_LABELED_UNICAST || safi == SAFI_MPLS_VPN) {
label = (mpls_label_t *)wlabel;
num_labels = 1;
}