RFC 9552

Distribution of Link-State and Traffic Engineering Information Using BGP

📅 published December 2023, from ietf

okay bestie, this one is by K. Talaulikar (Ed.) from Cisco Systems 🎀. It's a Standards Track doc from the IETF, dated December 2023, and it obsoletes RFC 7752 and RFC 9029 💅. Obsoleting 7752 means this doc completely replaces it, and it also folds in the updates from 9029, so you can throw the older ones out 🗑️ (it's giving clean slate ✨). It's ISSN 2070-1721, if you're into that kind of thing 🧚.

Abstract

okay so the main idea is that sometimes something outside a network needs to do math based on how the network looks, like its topology and what's connected to what, plus the Traffic Engineering (TE) info 🌸. Normally your IGP routing protocols pass that info around inside the network.

This doc describes a way to collect link-state and TE info from networks and share it with those outside components using the BGP routing protocol 🦋. It works through a BGP Network Layer Reachability Information (NLRI) encoding format. It covers physical AND virtual (e.g., tunnel) IGP links, and the whole thing is subject to policy control 💜.

Who's it for? Application-Layer Traffic Optimization (ALTO) servers and Path Computation Elements (PCEs) 👑. Iconic 🙌.

This document obsoletes RFC 7752 by completely replacing that document. It makes some small changes and clarifications to the previous spec. It also obsoletes RFC 9029 by incorporating the updates that it made to RFC 7752 🍓.

Status of This Memo

this is an Internet Standards Track document 🌈. It's a product of the Internet Engineering Task Force (IETF), it represents the consensus of the IETF community, got public review, and was approved for publication by the Internet Engineering Steering Group (IESG) ✨. If you want more on Internet Standards, check Section 2 of RFC 7841 📚.

For the current status, any errata, and how to give feedback, go to https://www.rfc-editor.org/info/rfc9552 🔗.

Copyright (c) 2023 IETF Trust and the persons identified as the document authors. All rights reserved 🎀.

This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) as in effect on the date of publication. Please read them carefully, because they describe your rights and restrictions for this doc 🙈. Code Components pulled out of this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions, and they come without warranty as described in the Revised BSD License 💅.

Table of Contents

1.  Introduction
  1.1.  Requirements Language
2.  Motivation and Applicability
  2.1.  MPLS-TE with PCE
  2.2.  ALTO Server Network API
3.  BGP Speaker Roles for BGP-LS
4.  Advertising IGP Information into BGP-LS
5.  Carrying Link-State Information in BGP
  5.1.  TLV Format
  5.2.  The Link-State NLRI
    5.2.1.  Node Descriptors
    5.2.2.  Link Descriptors
    5.2.3.  Prefix Descriptors
  5.3.  The BGP-LS Attribute
    5.3.1.  Node Attribute TLVs
    5.3.2.  Link Attribute TLVs
    5.3.3.  Prefix Attribute TLVs
  5.4.  Private Use
  5.5.  BGP Next-Hop Information
  5.6.  Inter-AS Links
  5.7.  OSPF Virtual Links and Sham Links
  5.8.  OSPFv2 Type 4 Summary-LSA & OSPFv3 Inter-Area-Router-LSA
  5.9.  Handling of Unreachable IGP Nodes
  5.10. Router-ID Anchoring Example: ISO Pseudonode
  5.11. Router-ID Anchoring Example: OSPF Pseudonode
  5.12. Router-ID Anchoring Example: OSPFv2 to IS-IS Migration
6.  Link to Path Aggregation
  6.1.  Example: No Link Aggregation
  6.2.  Example: ASBR to ASBR Path Aggregation
  6.3.  Example: Multi-AS Path Aggregation
7.  IANA Considerations
  7.1.  BGP-LS Registries
    7.1.1.  BGP-LS NLRI Types Registry
    7.1.2.  BGP-LS Protocol-IDs Registry
    7.1.3.  BGP-LS Well-Known Instance-IDs Registry
    7.1.4.  BGP-LS Node Flags Registry
    7.1.5.  BGP-LS MPLS Protocol Mask Registry
    7.1.6.  BGP-LS IGP Prefix Flags Registry
    7.1.7.  BGP-LS TLVs Registry
  7.2.  Guidance for Designated Experts
8.  Manageability Considerations
  8.1.  Operational Considerations
    8.1.1.  Operations
    8.1.2.  Installation and Initial Setup
    8.1.3.  Migration Path
    8.1.4.  Requirements for Other Protocols and Functional
            Components
    8.1.5.  Impact on Network Operation
    8.1.6.  Verifying Correct Operation
  8.2.  Management Considerations
    8.2.1.  Management Information
    8.2.2.  Fault Management
    8.2.3.  Configuration Management
    8.2.4.  Accounting Management
    8.2.5.  Performance Management
    8.2.6.  Security Management
9.  TLV/Sub-TLV Code Points Summary
10. Security Considerations
11. References
  11.1.  Normative References
  11.2.  Informative References
Appendix A.  Changes from RFC 7752
Acknowledgements
Contributors
Author's Address

1. Introduction 🧚

okay so here's the tea. A Link-State Database (LSDB) or an IGP's Traffic Engineering Database (TED) only knows about the links and nodes inside one IGP area 🙈. But some apps, like end-to-end Traffic Engineering (TE), would be way better off seeing past one area or Autonomous System (AS) so they can make smarter choices 💅.

The IETF defined the Path Computation Element (PCE) [RFC4655] as a mechanism for computing end-to-end TE paths that span more than one TED, or that need CPU-intensive or coordinated computations 👑. The IETF also defined the ALTO server [RFC5693], which is an entity that builds an abstracted network topology and hands it to network-aware apps 🦋.

Both a PCE and an ALTO server need to gather info about the topologies and capabilities of the network so they can do their job 🌸.

So this doc describes a mechanism for collecting link-state and TE info from networks and sharing it with external components, using the BGP routing protocol [RFC4271] 💜. It's done with a BGP Network Layer Reachability Information (NLRI) encoding format. It applies to physical and virtual (e.g., tunnel) links, and the whole mechanism is subject to policy control ✨.

A router keeps one or more databases storing link-state info about nodes and links in any given area 🎀. Link attributes stored in those databases include: local/remote IP addresses, local/remote interface identifiers, link IGP metric, link TE metric, link bandwidth, reservable bandwidth, per Class-of-Service (CoS) class reservation state, preemption, and Shared Risk Link Groups (SRLGs) 🍓. The router's BGP - Link State (BGP-LS) process can pull topology out of these LSDBs and distribute it to a consumer, either directly or through a peer BGP Speaker (usually a dedicated route reflector), using the encoding in this doc 🌈.

Here's the picture of how collection and distribution of link-state and TE info works, shown in Figure 1 🦋:

           +-----------+
           | Consumer  |
           +-----------+
                 ^
                 |
           +-----------+             +-----------+
           |    BGP    |             |    BGP    |
           |  Speaker  |<----------->|  Speaker  |  +-----------+
           |    RR1    |             |    RRm    |  | Consumer  |
           +-----------+             +-----------+  +-----------+
               ^   ^                       ^             ^
               |   |                       |             |
         +-----+   +---------+             +---------+   |
         |                   |                       |   |
   +-----------+       +-----------+             +-----------+
   |    BGP    |       |    BGP    |             |    BGP    |
   |  Speaker  |       |  Speaker  |    . . .    |  Speaker  |
   |    R1     |       |     R2    |             |    Rn     |
   +-----------+       +-----------+             +-----------+
         ^                   ^                         ^
         |                   |                         |
        IGP                 IGP                       IGP

       Figure 1: Collection of Link-State and TE Information

A BGP Speaker can apply a configurable policy to the info it distributes 💖. So it can send out the real physical topology from the LSDB or the TED. Or it can build an abstracted topology, where virtual, aggregated nodes are connected by virtual paths ✨. Aggregated nodes can be made, for example, out of multiple routers in a Point of Presence (POP) 🌸. An abstracted topology can also mix physical and virtual nodes, and physical and virtual links 🫶. The BGP Speaker can also use policy to decide when info gets updated to the consumer, so there's less info flowing from the network to consumers 🧚. How topologies get aggregated or virtualized is outside the scope of this doc 💅.

This doc focuses on the specs for originating IGP-derived info and propagating it via BGP-LS 👑. It also describes advertising into BGP-LS info that's local to a node, whether it's configured or derived 🦋. In general, the procedures in this doc are part of the base BGP-LS protocol spec, and they apply to info from other sources that gets introduced into BGP-LS 🌈.

This document obsoletes [RFC7752] by completely replacing that document. It makes some small changes and clarifications to the previous spec, as documented in Appendix A 🍓.

1.1. Requirements Language 🎀

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here 💜.

2. Motivation and Applicability 💅

this section walks through the use cases the requirements come from 🌸. Think of it as the "why" before the "how" ✨.

to be continued... part 2 is where the actual message formats start getting spicy 👀💖

2.1. MPLS-TE with PCE ✨

okay so bestie, [RFC4655] tells us a PCE can compute MPLS-TE paths inside a "domain" (like an IGP area) or across several domains (a multi-area AS or multiple ASes) 🧚

  • Within a single area, the PCE is giving enhanced computational power that individual routers might not have 💅 It also brings sophisticated policy control, fancy algorithms, and coordination of computation across the whole area. iconic 👑
  • Across IGP areas, a router's own TED is missing the full topology 😭 So it can't work out the end-to-end path, and it can't even pick the right exit router (the Area Border Router (ABR)) for an optimal path. This is a big problem for large networks that split their core into separate areas but still want MPLS-TE 🎀

Earlier solutions used per-domain path computation [RFC5152]. The source router could only compute the path for the first area, because it only had full visibility into the first area along the path and not the ones after it 🙈 Per-domain computation picks the exit ABR and other ABRs or AS Border Routers (ASBRs) as loose-hops [RFC3209], then uses the IGP-computed shortest path topology for the rest of the route. The result? Suboptimal paths 💀 Alternate and back-up path computation gets messy, and sometimes no TE path gets found even when one actually exists.

The PCE is a computation server. It might see more than one IGP area or AS, or it might team up with other PCEs to do distributed path computation 🫶 The PCE needs access to the TED for the area(s) it serves, but [RFC4655] doesn't explain how to make that happen. Lots of implementations make the PCE a passive participant in the IGP so it can learn the latest state of the network. That can be suboptimal, though, especially when the network is churning like crazy or when the PCE is responsible for multiple areas 😵‍💫

Here's how a PCE can grab its TED information using the mechanism in this document:

            +----------+                           +---------+
            |  -----   |                           |   BGP   |
            | | TED |<-+-------------------------->| Speaker |
            |  -----   |   TED synchronization     |         |
            |    |     |        mechanism          +---------+
            |    |     |
            |    v     |
            |  -----   |
            | | PCE |  |
            |  -----   |
            +----------+
                 ^
                 | Request/
                 | Response
                 v
   Service  +----------+   Signaling  +----------+
   Request  | Head-End |   Protocol   | Adjacent |
   -------->|  Node    |<------------>|   Node   |
            +----------+              +----------+

     Figure 2: External PCE Node Using a TED Synchronization Mechanism

The mechanism in this document collects the TED info the PCE needs from the IGP within the network, filters it according to configurable policy, and distributes it to the PCE as necessary 🦋

2.2. ALTO Server Network API 🌸

An ALTO server [RFC5693] is an entity that generates an abstracted network topology and serves it up to network-aware applications over a web-service-based API. Example apps are peer-to-peer (P2P) clients or trackers, or Content Distribution Networks (CDNs) 💖 The abstracted topology comes as two maps: a Network Map that specifies the allocation of prefixes to Partition Identifiers (PIDs), and a Cost Map that specifies the cost between the PIDs listed in the Network Map. For more details, see [RFC7285] 📚

ALTO abstract network topologies can be auto-generated from the physical topology of the underlying network 🧠 That generation would typically be based on policies and rules set by the operator. Both prefix and TE data are required: prefix data is needed to generate ALTO Network Maps, and TE (topology) data is needed to generate ALTO Cost Maps. Prefix data is carried and originated in BGP, while TE data is originated and carried in an IGP. The mechanism in this document gives an ALTO server a single interface to grab all the necessary prefixes and network topology data from the underlying network ✨ Quick note though: an ALTO server can use other mechanisms to get network data too, like peering with multiple IGP and BGP Speakers 🫶

Here's how an ALTO server can pull network topology info using this mechanism:

     +--------+
     | Client |<--+
     +--------+   |
                  |    ALTO    +--------+     Topology    +---------+
     +--------+   |  Protocol  |  ALTO  | Sync Mechanism  |   BGP   |
     | Client |<--+------------| Server |<----------------| Speaker |
     +--------+   |            |        |                 |         |
                  |            +--------+                 +---------+
     +--------+   |
     | Client |<--+
     +--------+

          Figure 3: ALTO Server Using Network Topology Information

3. BGP Speaker Roles for BGP-LS 💜

In Figure 1, the BGP Speakers are playing different roles in distributing information using BGP-LS 🎭 This section introduces the terms that explain those roles, and the rest of the document uses them all the way through 🌈

BGP-LS Producer: This refers to a BGP Speaker that originates link-state information into BGP 🍓 BGP Speakers R1, R2, ... Rn originate link-state information from their underlying link-state IGP protocols into BGP-LS. If R1 and R2 are in the same IGP flooding domain, they would normally originate the same link-state information into BGP-LS. R1 can also originate information from sources other than the IGP, like its local node information.

BGP-LS Consumer: This refers to a consumer application or process, and it is not a BGP Speaker 🙈 BGP Speakers RR1 and Rn are handing off the BGP-LS information they've collected to a consumer application. The BGP protocol implementation and the consumer application can live on the same node or on different nodes. This document only covers the BGP implementation 💅 The consumer application, and the design of the interface between BGP and that application, may be implementation specific and are outside the scope of this document. The communication of information MUST be unidirectional (that is, from a BGP Speaker to the BGP-LS Consumer application), and a BGP-LS Consumer MUST NOT be able to send information to a BGP Speaker for origination into BGP-LS. Not allowed, periodt 🚫

BGP-LS Propagator: This refers to a BGP Speaker that is performing BGP protocol processing on the link-state information 🦋 BGP Speaker RRm propagates the BGP-LS information between BGP Speaker Rn and BGP Speaker RR1. The BGP implementation on RRm is the one propagating BGP-LS information. It handles BGP-LS UPDATE messages and performs the BGP Decision Process as part of deciding what information gets propagated. Similarly, BGP Speaker RR1 receives BGP-LS information from R1, R2, and RRm, and propagates that information to the BGP-LS Consumer after performing the BGP Decision Process 👑

The above roles are not mutually exclusive 🌸 The same BGP Speaker can be the BGP-LS Producer for some link-state information, a BGP-LS Propagator for other link-state information, and also provide this information to a BGP-LS Consumer. Multitasking queen behavior ✨

The rest of this document refers to a role when it describes procedures specific to that role. When the role isn't specified, the procedure applies to all BGP Speakers 🫶

4. Advertising IGP Information into BGP-LS 🔥

Originating and propagating IGP link-state information via BGP needs to give a consistent and accurate view of the topology of the IGP domain 💖 BGP-LS provides an abstraction of the IGP specifics, and BGP-LS Consumers can be all kinds of applications.

The link-state information advertised in BGP-LS from the IGPs is derived from the IGP LSDB built using the OSPF Link-State Advertisements (LSAs) or the IS-IS Link-State Packets (LSPs). However, it is not a verbatim copy of the originating router's LSDB 🙅‍♀️ It doesn't include LSA/LSP sequence number information, since a single link-state object may be put together from information coming from multiple LSAs/LSPs. Also, not all of the information carried in LSAs/LSPs is required or suitable for advertisement via BGP-LS (for example, ASBR reachability in OSPF, OSPF virtual links, link-local-scoped information, and so on) 🧐 LSAs/LSPs that are purged or aged out are not included in the BGP-LS advertisement, even if they're still sitting in the LSDB (for example, for IGP flooding purposes). Information from LSAs/LSPs that is invalid or malformed, or that needs to be ignored per the respective IGP protocol specifications, is also left out 🗑️

The details of the interface between IGPs and BGP for advertising link-state information are outside the scope of this document 🌈 In some cases, information derived from IGP processing (for example, combining link-state objects from across multiple LSAs/LSPs, or leveraging reachability and two-way connectivity checks) is required for advertising link-state information into BGP-LS 🧠

The link-state information is carried in BGP UPDATE messages in two ways. First, as BGP NLRI carried within MP_REACH_NLRI and MP_UNREACH_NLRI attributes, which describes link, node, or prefix objects. Second, as a BGP path attribute (the BGP-LS Attribute), which carries properties of those link, node, or prefix objects, such as the link and prefix metric, auxiliary Router-IDs of nodes, and so on 💜

It's desirable to keep the dependencies on the protocol source of this attribute to a minimum, and to represent any content in an IGP-neutral way. That way, applications that want to learn about a link-state topology don't need to know any OSPF or IS-IS specifics 🦋

This section mainly describes the procedures for a BGP-LS Producer to originate link-state information into BGP-LS 🫧

5.1. TLV Format ✨

okay so bestie, the whole BGP-LS vibe is built on Type/Length/Value triplets 🎀 Both the Link-State NLRIs and the BGP-LS Attribute use the same TLV format, so once you get it, you get it everywhere 🫶

Figure 4 shows the layout 👇

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |              Type             |             Length            |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     //                        Value (variable)                     //
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                            Figure 4: TLV Format

The Length field tells you how long the Value part is, counted in octets. So a TLV with no Value at all just has a Length of zero 🙈 And no padding! The TLV is not padded to 4-octet alignment, so it just sits there at whatever length it is 💅

Now for the drama 🔥 Unknown and unsupported types MUST be preserved and propagated within both the NLRI and the BGP-LS Attribute. Like, you do not get to drop them. And the presence of unknown or unexpected TLVs MUST NOT result in the NLRI or the BGP-LS Attribute being considered malformed 😭 An unexpected TLV would be one that shows up alongside an update for a link-state object other than the one it's specified as associated with. Be nice, don't reject 🦋

Okay, now the ordering stuff, which is lowkey the most important part of this whole section 🧚 If you want to compare NLRIs that have unknown TLVs, all TLVs within the NLRI MUST be ordered in ascending order by TLV Type 💜 If there are multiple TLVs of the same type in one NLRI, then those same-type TLVs MUST come first in ascending order by the Length field, and then ascending order by the Value field 🌸

For the Value comparison, you treat the entire field as opaque binary data 🍓 It's compared lexicographically, so each byte is a symbol, and the symbols are ordered by their numerical value. ✨

Here's the big reason for all this strictness: NLRIs having TLVs that do not follow the above ordering rules MUST be considered as malformed by a BGP-LS Propagator. This canonical ordering is what makes sure that when multiple BGP-LS Producers send variant copies of the same NLRI, you don't end up with that confusing ambiguity 👑

Optional vs. mandatory: for both the NLRI and the BGP-LS Attribute, every TLV counts as optional, unless it's explicitly specified as mandatory or required under specific conditions 🎀

The BGP-LS Attribute is a little more chill 🌈 The TLVs within the BGP-LS Attribute SHOULD be ordered in ascending order by TLV type. But if they're unordered, that's still fine, because the BGP-LS Attribute with unordered TLVs MUST NOT be considered malformed 🫶

Last thing, and this one's a little tea ☕ When multiple BGP-LS Producers originate the same link-state information, they might end up with differences and inconsistencies because of which optional TLVs they include or leave out 😬 Different optional TLVs in the NLRI means you get multiple NLRIs for the same link-state object. Different optional TLVs in the BGP-LS Attribute may mean you only propagate partial information 💀

So the BGP-LS Consumer has to recognize and merge the duplicate information, or deal with the missing bits 🙈 The thing that helps most is deploying BGP-LS Producers that consistently originate the same set of optional TLVs. That's recommended to mitigate all of this, so it's a very strong vibe to aim for ✨💖

okay so the MP_REACH_NLRI and MP_UNREACH_NLRI attributes are BGP's little containers for carrying opaque info 📦 this spec defines three Link-State NLRI types, and each one describes either a node, a link, or a prefix 🦋

All non-VPN link, node, and prefix info SHALL be encoded using AFI 16388 / SAFI 71 💖 VPN link, node, and prefix info SHALL be encoded using AFI 16388 / SAFI 72 🎀

two BGP Speakers who wanna swap Link-State NLRI MUST use BGP Capabilities Advertisement first, so they can confirm they're both actually capable of processing it 🫶 this happens the way [RFC4760] says, using capability code 1 (multiprotocol BGP), with AFI 16388 / SAFI 71 for BGP-LS and AFI 16388 / SAFI 72 for BGP-LS-VPN 💅

new Link-State NLRI types might show up later 🌈 the Multiprotocol BGP (MP-BGP) capability [RFC4760] doesn't list the NLRI type values supported inside the address family, so a BGP Speaker can say "yep, I do BGP-LS" and still not know a particular Link-State NLRI type 😭 to let new types slide in smoothly without upgrading every BGP Speaker on the path (a route reflector, for example), this document deviates from the default handling behavior in Section 5.4 (paragraph 2) of [RFC7606] for the Link-State address family ✨ so the rule is: an implementation MUST handle unknown Link-State NLRI types as opaque objects, and it MUST preserve and propagate them 🔥

here's what the Link-State NLRI looks like 👀

   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
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |            NLRI Type          |     Total NLRI Length         |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                                                               |
  //                  Link-State NLRI (variable)                 //
  |                                                               |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

         Figure 5: Link-State AFI 16388 / SAFI 71 NLRI Format

   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
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |            NLRI Type          |     Total NLRI Length         |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                                                               |
  +                Route Distinguisher (8 octets)                 +
  |                                                               |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                                                               |
  //                  Link-State NLRI (variable)                 //
  |                                                               |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

       Figure 6: Link-State VPN AFI 16388 / SAFI 72 NLRI Format

the Total NLRI Length field is the cumulative length, in octets, of the rest of the NLRI 🍓 it doesn't count the NLRI Type field or itself 🙈 and for VPN stuff, it also counts the Route Distinguisher length 💜

               +======+===========================+
               | Type | NLRI Type                 |
               +======+===========================+
               |  1   | Node NLRI                 |
               +------+---------------------------+
               |  2   | Link NLRI                 |
               +------+---------------------------+
               |  3   | IPv4 Topology Prefix NLRI |
               +------+---------------------------+
               |  4   | IPv6 Topology Prefix NLRI |
               +------+---------------------------+

                       Table 1: NLRI Types

Route Distinguishers are defined and discussed in [RFC4364] 🧚

the Node NLRI (NLRI Type = 1) looks like this 🌸

   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
  +-+-+-+-+-+-+-+-+
  |  Protocol-ID  |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                           Identifier                          |
  +                           (8 octets)                          +
  |                                                               |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  //             Local Node Descriptors TLV (variable)           //
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                    Figure 7: The Node NLRI Format

and the Link NLRI (NLRI Type = 2) is next 🦋

   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
  +-+-+-+-+-+-+-+-+
  |  Protocol-ID  |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                           Identifier                          |
  +                           (8 octets)                          +
  |                                                               |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  //            Local Node Descriptors TLV (variable)            //
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  //            Remote Node Descriptors TLV (variable)           //
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  //               Link Descriptors TLVs (variable)              //
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                    Figure 8: The Link NLRI Format

the IPv4 and IPv6 Prefix NLRIs (NLRI Type = 3 and Type = 4) both use the same format 💅

   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
  +-+-+-+-+-+-+-+-+
  |  Protocol-ID  |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                           Identifier                          |
  +                           (8 octets)                          +
  |                                                               |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  //            Local Node Descriptors TLV (variable)            //
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  //             Prefix Descriptors TLVs (variable)              //
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

         Figure 9: The IPv4/IPv6 Topology Prefix NLRI Format

the Protocol-ID field can hold one of these values 👑

         +=============+==================================+
         | Protocol-ID | NLRI information source protocol |
         +=============+==================================+
         |      1      | IS-IS Level 1                    |
         +-------------+----------------------------------+
         |      2      | IS-IS Level 2                    |
         +-------------+----------------------------------+
         |      3      | OSPFv2                           |
         +-------------+----------------------------------+
         |      4      | Direct                           |
         +-------------+----------------------------------+
         |      5      | Static configuration             |
         +-------------+----------------------------------+
         |      6      | OSPFv3                           |
         +-------------+----------------------------------+

                   Table 2: Protocol Identifiers

okay now the important bit 🚨 the 'Direct' and 'Static configuration' protocol types SHOULD be used when BGP-LS is sourcing local information 🌈 for everything derived from other protocols, the matching Protocol-ID MUST be used 💀 if BGP-LS has direct access to interface info and wants to advertise a local link, then 'Direct' SHOULD be used 🫶 and for modeling virtual links, like the ones described in Section 6, 'Static configuration' SHOULD be used ✨

a router can run multiple OSPF or IS-IS protocol instances, which makes it a border router between multiple IGP domains 🏰 OSPF and IS-IS can also run multiple routing protocol instances over the same link 🔗 see [RFC8202] and [RFC6549] 📚 these instances define independent IGP routing domains 💖 the Identifier field carries an 8-octet BGP-LS Instance Identifier (Instance-ID) number, which is how you tell which IGP routing domain an NLRI belongs to 🎀 the NLRIs for link-state objects (nodes, links, or prefixes) from the same IGP routing instance should have the same BGP-LS Instance-ID 🦋 and NLRIs with different BGP-LS Instance-IDs are treated as coming from different IGP routing instances 🧚

to support multiple IGP instances, an implementation needs to support configuring unique BGP-LS Instance-IDs at the routing protocol instance level 🌸 the BGP-LS Instance-ID 0 is RECOMMENDED when there's only a single protocol instance in the network where BGP-LS is operational 🍓 the network operator MUST assign the same BGP-LS Instance-IDs on all BGP-LS Producers within a given IGP domain 🔥 unique BGP-LS Instance-IDs MUST be assigned to routing protocol instances operating in different IGP domains 👑 this lets the BGP-LS Consumer build an accurate, segregated multi-domain topology based on the BGP-LS Instance-ID 💅

now the spicy part, real talk 😬 when the semantics and recommendations above aren't followed, a BGP-LS Consumer may see more than one link-state object for the same node, link, or prefix (each with a different BGP-LS Instance-ID) once there are multiple BGP-LS Producers deployed 😭 that can also leave BGP-LS Consumers with an inaccurate network-wide topology 💀

each Node Descriptor, Link Descriptor, and Prefix Descriptor is made of one or more TLVs, as the following sections describe 🌈 these Descriptor TLVs apply to the Node, Link, and Prefix NLRI Types for the protocols listed in Table 2 ✨ documents that extend BGP-LS with new NLRI Types and/or protocols MUST specify the NLRI descriptors for them 🎀

when you add, remove, or modify a TLV/sub-TLV in a Link-State NLRI, the BGP-LS Producer MUST withdraw the old NLRI by including it in the MP_UNREACH_NLRI 🚫 skipping this can leave duplicate and inconsistent link-state objects hanging around in the BGP-LS table, and nobody wants that drama 🙈

5.2.1. Node Descriptors ✨

okay so every link needs to be anchored by a pair of Router-IDs, bestie 🦋 these are the ones the underlying IGP already uses: a 48-bit ISO System-ID for IS-IS and a 32-bit Router-ID for OSPFv2 and OSPFv3. an IGP can also have one or more extra auxiliary Router-IDs, mostly for Traffic Engineering stuff 🎀 like IS-IS can have one or more IPv4 and IPv6 TE Router-IDs [RFC5305] [RFC6119]. when those auxiliary TE Router-IDs (TLV 1028/1029) are configured, they MUST be included in the node attribute from Section 5.3.1 and they MAY be included in the link attribute from Section 5.3.2. the TE Router-IDs are lowkey iconic because they help a BGP-LS Consumer match up multiple link-state objects (say, in different IGP instances or areas/levels) to the same node in the network 💜

it's desirable that the Router-ID assignments inside the Node Descriptors are globally unique 💅 but real talk, some Router-ID spaces (like ISO) have no global registry at all, and worse, some Router-IDs were allocated using the private-IP allocation from [RFC1918] 😭 so BGP-LS uses the Autonomous System Number to tell them apart, as described in Section 5.2.1.1. 🌈

okay this part is the main problem we have to solve: identifying an IGP node globally 💖 (when we say "globally," we mean across the BGP-LS database that all the BGP-LS Speakers that talk to each other collect together ✨). it boils down to two requirements:

(A) The same node MUST NOT be represented by two keys (otherwise, one node will look like two nodes).

(B) Two different nodes MUST NOT be represented by the same key (otherwise, two nodes will look like one node).

so an "IGP domain" is basically the group of nodes (and by extension, links and prefixes) where every node has a unique IGP representation using the combo of OSPF Area-ID, Router-ID, Protocol-ID, Multi-Topology Identifier (MT-ID), and BGP-LS Instance-ID 🍓 the tricky bit is that BGP might get node/link/prefix info from multiple independent "IGP domains," so we have to tell them apart 🫶 and we can't assume there's always exactly one IGP domain per AS, ngl. during IGP transitions, two redundant IGPs can totally be running at the same time 👀

also, in deployments where BGP-LS is used to advertise topology from multiple ASes, the Autonomous System Number (ASN) is what tells topology info from different ASes apart 🎀

the BGP-LS Instance-ID in the Identifier field (described earlier), along with a set of sub-TLVs from Section 5.2.1.4, lets you build a flexible key for any node/link info so the global uniqueness of the NLRI is ensured 🔥 and since the BGP-LS Instance-ID is operator assigned, its allocation scheme can make sure each IGP domain is uniquely identified, even across a multi-AS network 👑

5.2.1.2. Local Node Descriptors 🌸

the Local Node Descriptors TLV holds Node Descriptors for the node anchoring the local end of the link. this one is MANDATORY in all three NLRI types (node, link, and prefix) 💅 the Type is 256, and the length is variable. the value has one or more Node Descriptor sub-TLVs from Section 5.2.1.4.

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |              Type             |             Length            |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                                                               |
     //              Node Descriptor Sub-TLVs (variable)            //
     |                                                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                Figure 10: Local Node Descriptors TLV Format

5.2.1.3. Remote Node Descriptors 🦋

the Remote Node Descriptors TLV holds Node Descriptors for the node anchoring the remote end of the link. this is MANDATORY for Link NLRIs 💖 the Type is 257, and the length is variable. the value has one or more Node Descriptor sub-TLVs from Section 5.2.1.4.

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |              Type             |             Length            |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                                                               |
     //              Node Descriptor Sub-TLVs (variable)            //
     |                                                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

               Figure 11: Remote Node Descriptors TLV Format

5.2.1.4. Node Descriptor Sub-TLVs 💜

the Node Descriptor sub-TLV code points and lengths are in this table, bestie 🧚

    +====================+================================+==========+
    | Sub-TLV Code Point | Description                    |   Length |
    +====================+================================+==========+
    |        512         | Autonomous System              |        4 |
    +--------------------+--------------------------------+----------+
    |        513         | BGP-LS Identifier (deprecated) |        4 |
    +--------------------+--------------------------------+----------+
    |        514         | OSPF Area-ID                   |        4 |
    +--------------------+--------------------------------+----------+
    |        515         | IGP Router-ID                  | Variable |
    +--------------------+--------------------------------+----------+

                    Table 3: Node Descriptor Sub-TLVs

here's how the sub-TLV values in Node Descriptor TLVs work 💅

Autonomous System: opaque value (32-bit AS Number) 🌈 this one is optional. the value SHOULD be set to the AS Number tied to the BGP process that originated the link-state info ✨ an implementation MAY give the BGP-LS Producer a config option to use a different value, like to avoid collisions when using private AS Numbers 🙈

BGP-LS Identifier: opaque value (32-bit ID) 🍓 this one is optional too, and this document has deprecated it (see Appendix A for the tea ☕). it MAY be advertised for compatibility with [RFC7752] implementations. the final paragraph of this section has more considerations and a recommended default value 💖

OSPF Area-ID: used to identify the 32-bit area that the info in the NLRI belongs to 🦋 this is MANDATORY when originating info from OSPF that's derived from area-scope LSAs 💜 it lets different NLRIs from the same router be told apart on a per-area basis 🎀 it is NOT used for NLRIs carrying info derived from AS-scope LSAs, since that info isn't tied to any specific area 🙅

IGP Router-ID: opaque value 🔥 this is MANDATORY when originating info from IS-IS, OSPF, 'Direct', or 'Static configuration' 💅 for an IS-IS non-pseudonode, it's a 6-octet ISO Node-ID (ISO System-ID) 🌸 for an IS-IS pseudonode (the one for a LAN), it's the 6-octet ISO Node-ID of the Designated Intermediate System (DIS) followed by a 1-octet, nonzero PSN identifier (7 octets total) 🧚 for an OSPFv2 or OSPFv3 non-pseudonode, it's the 4-octet Router-ID 👑 for an OSPFv2 pseudonode representing a LAN, it's the 4-octet Router-ID of the Designated Router (DR) followed by the 4-octet IPv4 address of the DR's interface to the LAN (8 octets total) 💖 and for an OSPFv3 pseudonode, it's the 4-octet Router-ID of the DR followed by the 4-octet interface identifier of the DR's interface to the LAN (8 octets total) ✨ the TLV size plus the protocol identifier lets the decoder figure out what kind of node it is 🫶 for 'Direct' or 'Static configuration', the value SHOULD be taken from an IPv4 or IPv6 address (like a loopback interface) configured on the node 🌈 and when the node is running an IGP protocol, an implementation MAY choose to use the IGP Router-ID for 'Direct' or 'Static configuration' 🦋

okay, the ordering rules are next, and they're super important 💅 there MUST be at most one instance of each sub-TLV type in any Node Descriptor 🌸 the sub-TLVs within a Node Descriptor MUST be arranged in ascending order by sub-TLV type 💜 this is needed to compare NLRIs, even when an implementation runs into an unknown sub-TLV 🧚 with stable sorting, an implementation can do a binary comparison of NLRIs, which allows incremental deployment of new key sub-TLVs 🔥

the BGP-LS Identifier was introduced by [RFC7752], and this document is deprecating its use 🥀 implementations SHOULD support advertising this sub-TLV for backward compatibility, in deployments where there are BGP-LS Producer implementations that conform to [RFC7752], so the NLRI encoding for link-state objects stays consistent 💖 the default value of 0 is RECOMMENDED when a BGP-LS Producer includes this sub-TLV while originating info into BGP-LS 🍓 implementations SHOULD provide an option to configure this value for backward compatibility reasons 🎀

quick reminder, bestie: segregating link-state objects of different IGP domains in BGP-LS is done with the BGP-LS Instance-ID carried in the Identifier field 👑✨

Okay bestie, time for Link Descriptors 🦋 The Link Descriptor field is a set of Type/Length/Value (TLV) triplets, and you can see the format of each one in Section 5.1. These TLVs are what pick out one specific link when there are multiple parallel links between the same pair of anchor routers. Iconic, right? 💅

Here's the tea: a link described by these TLVs is really a "half-link" 🌸 It's a one-way view of a logical link. To fully describe a single logical link, both anchor routers each advertise their own half-link, so you get two Link NLRIs for one point-to-point link. Two halves make a whole, bestie 🫶

A link between two nodes doesn't count as complete (or available) unless both of those Link NLRIs, one from each anchor node, are there describing it. This check is basically the same vibe as the "two-way connectivity check" that link-state IGPs already do 🙈

An implementation MAY suppress the advertisement of a Link NLRI for a half-link coming from a link-state IGP, unless the IGP has confirmed that the link shows up in the IS-IS LSP or the OSPF Router LSA from both nodes on that link. The IGP already runs this two-way connectivity check during its computation, so you can lean on that before passing any half-link info from the IGP into BGP-LS ✨ The result? Only the link-state IGP adjacencies that are actually established get reported via Link NLRIs. Clean! Also, for OSPF in particular, this check might be needed to get the right link identifiers of the remote node 🧚

The format and semantics of the Value fields in most Link Descriptor TLVs match the Value fields in IS-IS Extended IS Reachability sub-TLVs, which are defined in [RFC5305], [RFC5307], and [RFC6119]. Originally these Link Descriptor encodings were made for IS-IS, but the TLVs can carry data from either IS-IS or OSPF, so they're pretty versatile 🌈

The following TLVs are defined as Link Descriptors in the Link NLRI:

  +================+===================+============+=============+
  | TLV Code Point | Description       | IS-IS TLV/ | Reference   |
  |                |                   |  Sub-TLV   |             |
  +================+===================+============+=============+
  |      258       | Link Local/Remote |    22/4    | [RFC5307],  |
  |                | Identifiers       |            | Section 1.1 |
  +----------------+-------------------+------------+-------------+
  |      259       | IPv4 interface    |    22/6    | [RFC5305],  |
  |                | address           |            | Section 3.2 |
  +----------------+-------------------+------------+-------------+
  |      260       | IPv4 neighbor     |    22/8    | [RFC5305],  |
  |                | address           |            | Section 3.3 |
  +----------------+-------------------+------------+-------------+
  |      261       | IPv6 interface    |   22/12    | [RFC6119],  |
  |                | address           |            | Section 4.2 |
  +----------------+-------------------+------------+-------------+
  |      262       | IPv6 neighbor     |   22/13    | [RFC6119],  |
  |                | address           |            | Section 4.3 |
  +----------------+-------------------+------------+-------------+
  |      263       | Multi-Topology    |    ---     | Section     |
  |                | Identifier        |            | 5.2.2.1     |
  +----------------+-------------------+------------+-------------+

                     Table 4: Link Descriptor TLVs

The info about a link in the LSA/LSP that its local node originated decides which TLVs go in that link's Link Descriptor. Let's break it down 💖

  • If interface and neighbor addresses, either IPv4 or IPv6, are present, then the interface/neighbor address TLVs MUST be included, and the Link Local/Remote Identifiers TLV MUST NOT be included in the Link Descriptor. The Link Local/Remote Identifiers TLV MAY be included in the link attribute when it's available. Also, IPv4/IPv6 link-local addresses MUST NOT be carried in the IPv4/IPv6 interface/neighbor address TLVs (259/260/261/262) as descriptors of a link, since they're not considered unique. Not unique = not allowed, babe 🙅‍♀️
  • If interface and neighbor addresses are not present and the link local/remote identifiers are present, then the Link Local/Remote Identifiers TLV MUST be included in the Link Descriptor. The Link Local/Remote identifiers MUST be included in the Link Descriptor and in the case of links having only IPv6 link-local addressing on them.
  • The Multi-Topology Identifier TLV MUST be included as a Link Descriptor if the underlying IGP link object is associated with a non-default topology. Main character energy for non-default topologies 👑

The TLVs/sub-TLVs for the interface addresses and/or the local/remote identifiers may not always get signaled in the IGPs unless someone turns on their advertisement specifically. In that case, it's valid to advertise a BGP-LS Link NLRI without any of these identifiers. No stress 🫶

5.2.2.1. Multi-Topology Identifier

The Multi-Topology Identifier (MT-ID) TLV carries one or more IS-IS or OSPF Multi-Topology Identifiers for a link, node, or prefix. So it's the one-stop shop for MT-IDs 🌸

The semantics of the IS-IS MT-ID are defined in Sections 7.1 and 7.2 of [RFC5120]. The semantics of the OSPF MT-ID are defined in Section 3.7 of [RFC4915]. If the value in the MT-ID TLV is derived from OSPF, then the upper R bits of the MT-ID field MUST be set to 0, and only the values from 0 to 127 are valid for the MT-ID. Those upper bits really need to be zeroed out, no exceptions 🙈

Here's what the MT-ID TLV looks like 🦋

     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
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |              Type             |          Length=2*n           |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |R R R R|  Multi-Topology ID 1  |             ....             //
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    //             ....             |R R R R|  Multi-Topology ID n  |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

             Figure 12: Multi-Topology Identifier TLV Format

The Type is 263, the length is 2*n, and n is the number of MT-IDs carried in the TLV. Simple math, slay 💅

The MT-ID TLV MAY be included as a Link Descriptor, as a Prefix Descriptor, or in the BGP-LS Attribute of a Node NLRI. When it's included as a Link or Prefix Descriptor, only a single MT-ID TLV is allowed, and it has to contain the MT-ID of the topology where the link or prefix is reachable. Want to advertise multiple topologies for one Link or Prefix Descriptor? Then multiple NLRIs MUST be generated, and each NLRI has to contain a single unique MT-ID. Okay, that's a lot of rules, but they're all super clear 🎀 When it's used as a Link or Prefix Descriptor for IS-IS, the Bits R are reserved and MUST be set to 0 (as per Section 7.2 of [RFC5120]) when originated, and they get ignored on receipt. Ignore those bits, periodt ✨

In the BGP-LS Attribute of a Node NLRI, one MT-ID TLV containing the array of MT-IDs of all topologies where the node is reachable is allowed. When it's used in the Node Attribute TLV for IS-IS, the Bits R are set as per Section 7.1 of [RFC5120]. 🌈

5.2.3. Prefix Descriptors

The Prefix Descriptor field is a set of Type/Length/Value (TLV) triplets. Prefix Descriptor TLVs uniquely identify an IPv4 or IPv6 prefix originated by a node. These are the TLVs defined as Prefix Descriptors in the IPv4/IPv6 Prefix NLRI 🧚

  +================+===========================+==========+===========+
  | TLV Code Point | Description               |  Length  | Reference |
  +================+===========================+==========+===========+
  |      263       | Multi-Topology            | variable | Section   |
  |                | Identifier                |          | 5.2.2.1   |
  +----------------+---------------------------+----------+-----------+
  |      264       | OSPF Route Type           |    1     | Section   |
  |                |                           |          | 5.2.3.1   |
  +----------------+---------------------------+----------+-----------+
  |      265       | IP Reachability           | variable | Section   |
  |                | Information               |          | 5.2.3.2   |
  +----------------+---------------------------+----------+-----------+

                     Table 5: Prefix Descriptor TLVs

The Multi-Topology Identifier TLV MUST be included in the Prefix Descriptor if the underlying IGP prefix object is associated with a non-default topology. Same energy as the link side, bestie 👑

5.2.3.1. OSPF Route Type

The OSPF Route Type TLV is an optional TLV for Prefix NLRIs originated from OSPF. Its job is to identify the OSPF route type of the prefix 🦋 An OSPF prefix MAY be advertised in the OSPF domain with multiple route types, and the Route Type TLV is what lets you tell those advertisements apart. Iykyk 😭

The OSPF Route Type TLV MUST be included in the advertisement when the type is either signaled explicitly in the underlying LSA, or can be determined via another LSA for the same prefix when it's not signaled explicitly. An example of the second case is the OSPFv2 Extended Prefix Opaque LSA [RFC7684]. The route type advertised in the OSPFv2 Extended Prefix TLV (Section 2.1 of [RFC7684]) doesn't distinguish between Type 1 and 2 for AS external and Not-So-Stubby Area (NSSA) external routes. In that case, the route type to be used in the BGP-LS advertisement can be figured out by checking the OSPFv2 External or NSSA External LSA for the prefix. A similar check on the base OSPFv2 LSAs can determine the route type to use when the route type value 0 is carried in the OSPFv2 Extended Prefix TLV 💀

The format of the OSPF Route Type TLV is in the figure below ✨

     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
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |              Type             |             Length            |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |  Route Type   |
    +-+-+-+-+-+-+-+-+

                  Figure 13: OSPF Route Type TLV Format

The Type and Length fields of the TLV are defined in Table 5. The Route Type field follows the route types defined in the OSPF protocol, and it can be one of the following 🌸

  • Intra-Area (0x1)
  • Inter-Area (0x2)
  • External 1 (0x3)
  • External 2 (0x4)
  • NSSA 1 (0x5)
  • NSSA 2 (0x6)

5.2.3.2. IP Reachability Information ✨

okay bestie, the IP Reachability Information TLV is mandatory for the IPv4 & IPv6 Prefix NLRI types 🫶. It carries one IP address prefix (IPv4 or IPv6) that was originally advertised in the IGP topology. A router SHOULD advertise an IP Prefix NLRI for each of its BGP next hops 💖. Here's the layout:

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |              Type             |             Length            |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     | Prefix Length | IP Prefix (variable)                         //
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

             Figure 14: IP Reachability Information TLV Format

The Type and Length fields are defined in Table 5 🎀. The next two fields are where the reachability info for the address family actually lives. Prefix Length is the length of the prefix in bits. IP Prefix holds the address prefix, followed by the minimum trailing bits needed so the field ends on an octet boundary. Any trailing bits MUST be set to 0 🔥. So IP Prefix carries the most significant octets: 1 octet for prefix length 1 up to 8, 2 octets for 9 up to 16, 3 octets for 17 up to 24, 4 octets for 25 up to 32, and so on 🌈.


5.3. The BGP-LS Attribute ✨

The BGP-LS Attribute (assigned value 29 by IANA) is an optional, non-transitive BGP Attribute that carries link, node, and prefix parameters and attributes 💜. It's a set of Type/Length/Value (TLV) triplets, which we'll get into in the next section. This attribute SHOULD only be included with Link-State NLRIs. Using it for other address families is outside the scope of this document 🙈.

The Node Attribute TLVs, Link Attribute TLVs, and Prefix Attribute TLVs are sets of TLVs that may be encoded in the BGP-LS Attribute associated with a Node NLRI, Link NLRI, and Prefix NLRI respectively 🦋.

The BGP-LS Attribute can get pretty big 😭, depending on how much link-state info is tied to a single Link-State NLRI. The BGP specification [RFC4271] mandates a maximum BGP message size of 4096 octets. It is RECOMMENDED that implementations support the extended message size for BGP [RFC8654] so there's room for a larger BGP-LS Attribute. BGP-LS Producers MUST ensure that the TLVs included in the BGP-LS Attribute do not result in a BGP UPDATE message for a single Link-State NLRI that crosses the maximum limit for a BGP message 🚨.

An implementation MAY adopt mechanisms to avoid this problem, based on what the BGP-LS Consumer applications need. These mechanisms are beyond the scope of this specification 🧚. However, if an implementation chooses to mitigate the problem by excluding some TLVs from the BGP-LS Attribute, this exclusion SHOULD be done consistently by all BGP-LS Producers within a given BGP-LS domain. If TLVs are excluded inconsistently, the result would be a differing set of attributes of the link-state object being propagated to BGP-LS Consumers, based on the BGP Decision Process at BGP-LS Propagators 💀.

When a BGP-LS Propagator finds that it's exceeding the maximum BGP message size because of the addition or update of some other BGP Attribute (e.g., AS_PATH), it MUST consider the BGP-LS Attribute to be malformed. It should then apply the 'Attribute Discard' error-handling approach [RFC7606] and handle the propagation as described in Section 8.2.2 🍓. When a BGP-LS Propagator needs to perform 'Attribute Discard' to reduce the BGP UPDATE message size, as specified in Section 4 of [RFC8654], it MUST first discard the BGP-LS Attribute. This enables the detection and diagnosis of this error condition, as discussed in Section 8.2.2 🔍. It also brings a deployment consideration: consistent propagation of BGP-LS information with a BGP UPDATE message size larger than 4096 octets can only happen along a set of BGP Speakers that all support the contents of [RFC8654] 👑.

5.3.1. Node Attribute TLVs 💅

The following Node Attribute TLVs are defined for the BGP-LS Attribute associated with a Node NLRI 🌸:

    +================+================+==========+=============+
    | TLV Code Point | Description    |   Length | Reference   |
    +================+================+==========+=============+
    |      263       | Multi-Topology | variable | Section     |
    |                | Identifier     |          | 5.2.2.1     |
    +----------------+----------------+----------+-------------+
    |      1024      | Node Flag Bits |        1 | Section     |
    |                |                |          | 5.3.1.1     |
    +----------------+----------------+----------+-------------+
    |      1025      | Opaque Node    | variable | Section     |
    |                | Attribute      |          | 5.3.1.5     |
    +----------------+----------------+----------+-------------+
    |      1026      | Node Name      | variable | Section     |
    |                |                |          | 5.3.1.3     |
    +----------------+----------------+----------+-------------+
    |      1027      | IS-IS Area     | variable | Section     |
    |                | Identifier     |          | 5.3.1.2     |
    +----------------+----------------+----------+-------------+
    |      1028      | IPv4 Router-ID |        4 | [RFC5305],  |
    |                | of Local Node  |          | Section 4.3 |
    +----------------+----------------+----------+-------------+
    |      1029      | IPv6 Router-ID |       16 | [RFC6119],  |
    |                | of Local Node  |          | Section 4.1 |
    +----------------+----------------+----------+-------------+

                   Table 6: Node Attribute TLVs

5.3.1.1. Node Flag Bits TLV 🦄

The Node Flag Bits TLV carries a bitmask describing node attributes 🎀. The value is a 1-octet-length bit array of flags, where each bit represents a node-operational state or attribute ✨.

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |              Type             |             Length            |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |O|T|E|B|R|V|   |
     +-+-+-+-+-+-+-+-+

                    Figure 15: Node Flag Bits TLV Format

Here's what each bit means 💜:

                    +=====+==============+============+
                    | Bit | Description  | Reference  |
                    +=====+==============+============+
                    | 'O' | Overload Bit | [ISO10589] |
                    +-----+--------------+------------+
                    | 'A' | Attached Bit | [ISO10589] |
                    +-----+--------------+------------+
                    | 'E' | External Bit | [RFC2328]  |
                    +-----+--------------+------------+
                    | 'B' | ABR Bit      | [RFC2328]  |
                    +-----+--------------+------------+
                    | 'R' | Router Bit   | [RFC5340]  |
                    +-----+--------------+------------+
                    | 'V' | V6 Bit       | [RFC5340]  |
                    +-----+--------------+------------+

                    Table 7: Node Flag Bits Definitions

The bits that aren't defined MUST be set to 0 by the originator and MUST be ignored by the receiver 🙈.

5.3.1.2. IS-IS Area Identifier TLV 🧚

An IS-IS node can be part of only a single IS-IS area 🌈. But a node can have multiple synonymous area addresses, and each of those is carried in the IS-IS Area Identifier TLV. If there are multiple area addresses, multiple TLVs are used to encode them 🍓. The IS-IS Area Identifier TLV may be present in the BGP-LS Attribute only when it's advertised in the Link-State Node NLRI ✨.

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |              Type             |             Length            |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     //               IS-IS Area Identifier (variable)              //
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                Figure 16: IS-IS Area Identifier TLV Format

5.3.1.3. Node Name TLV 🌷

The Node Name TLV is optional 💖. Its encoding semantics were borrowed from [RFC5301]. The Value field identifies the symbolic name of the router node. That name can be the Fully Qualified Domain Name (FQDN) for the router, a substring of the FQDN (e.g., a hostname), or any string an operator wants to use for the router 🫶. Using the FQDN or a substring of it is strongly RECOMMENDED. The maximum length of the Node Name TLV is 255 octets 🔥.

The Value field is encoded in 7-bit ASCII 💅. If a user interface for configuring or displaying this field permits Unicode characters, then the user interface is responsible for applying the ToASCII and/or ToUnicode algorithm as described in [RFC5890], so the format is correct for transmission or display 🦋.

[RFC5301] describes an IS-IS-specific extension, and [RFC5642] describes an OSPF extension for advertising the node name, which may be encoded in the Node Name TLV 🌸.

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |              Type             |             Length            |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     //                     Node Name (variable)                    //
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                        Figure 17: Node Name Format

5.3.1.4. Local IPv4/IPv6 Router-ID TLVs 🌟

The local IPv4/IPv6 Router-ID TLVs describe auxiliary Router-IDs that the IGP might be using 🧚. Think TE and migration purposes, like correlating a Node-ID between different protocols 🍓. If there's more than one auxiliary Router-ID of a given type, each one gets encoded as its own separate TLV 💜.

5.3.1.5. Opaque Node Attribute TLV 🎀

okay so the Opaque Node Attribute TLV is basically an envelope 💌 that carries optional Node Attribute TLVs from a router without really looking inside them. The originating router is expected to use it for info that's specific to the protocol named in the NLRI header's Protocol-ID field, or for new protocol extensions to that protocol, when there's no protocol-neutral way to say it in the BGP Link-State NLRI. 🦋

Its main job is to bridge the gap between a new IGP link-state attribute existing and its protocol-neutral BGP-LS extension actually getting written down (document lag is real, bestie 😭). Once the protocol-neutral extensions are defined, BGP-LS implementations may still want to send the info in both the Opaque Attribute TLV and the new TLV definition, so deployment and transition can happen gradually. ✨

For OSPF, this TLV MUST NOT be used to advertise TLVs other than those in the OSPF Router Information (RI) LSA [RFC7770]. Hard boundary, no exceptions, we don't do that here 🙅‍♀️

   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
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |              Type             |             Length            |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  //               Opaque Node Attributes (variable)             //
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Figure 18: Opaque Node Attribute Format

The Type is as specified in Table 6. The length is variable. 🌸

okay, Link Attribute TLVs are the TLVs that can be encoded in the BGP-LS Attribute with a Link NLRI. Each 'Link Attribute' is a Type/Length/Value (TLV) triplet, formatted as defined in Section 5.1. 💖 Some of them have Value fields whose format and meaning match the IS-IS Extended IS Reachability sub-TLVs from [RFC5305] and [RFC5307], and the rest are defined right here in this document. Even though the encodings were originally made for IS-IS, these TLVs can carry data that came from either IS-IS or OSPF. Not gonna lie, that's kinda iconic 👑

These are the Link Attribute TLVs defined for the BGP-LS Attribute associated with a Link NLRI:

   +================+=================+============+=============+
   | TLV Code Point | Description     | IS-IS TLV/ | Reference   |
   |                |                 |  Sub-TLV   |             |
   +================+=================+============+=============+
   |      1028      | IPv4 Router-ID  |  134/---   | [RFC5305],  |
   |                | of Local Node   |            | Section 4.3 |
   +----------------+-----------------+------------+-------------+
   |      1029      | IPv6 Router-ID  |  140/---   | [RFC6119],  |
   |                | of Local Node   |            | Section 4.1 |
   +----------------+-----------------+------------+-------------+
   |      1030      | IPv4 Router-ID  |  134/---   | [RFC5305],  |
   |                | of Remote Node  |            | Section 4.3 |
   +----------------+-----------------+------------+-------------+
   |      1031      | IPv6 Router-ID  |  140/---   | [RFC6119],  |
   |                | of Remote Node  |            | Section 4.1 |
   +----------------+-----------------+------------+-------------+
   |      1088      | Administrative  |    22/3    | [RFC5305],  |
   |                | group (color)   |            | Section 3.1 |
   +----------------+-----------------+------------+-------------+
   |      1089      | Maximum link    |    22/9    | [RFC5305],  |
   |                | bandwidth       |            | Section 3.4 |
   +----------------+-----------------+------------+-------------+
   |      1090      | Max. reservable |   22/10    | [RFC5305],  |
   |                | link bandwidth  |            | Section 3.5 |
   +----------------+-----------------+------------+-------------+
   |      1091      | Unreserved      |   22/11    | [RFC5305],  |
   |                | bandwidth       |            | Section 3.6 |
   +----------------+-----------------+------------+-------------+
   |      1092      | TE Default      |   22/18    | Section     |
   |                | Metric          |            | 5.3.2.3     |
   +----------------+-----------------+------------+-------------+
   |      1093      | Link Protection |   22/20    | [RFC5307],  |
   |                | Type            |            | Section 1.2 |
   +----------------+-----------------+------------+-------------+
   |      1094      | MPLS Protocol   |    ---     | Section     |
   |                | Mask            |            | 5.3.2.2     |
   +----------------+-----------------+------------+-------------+
   |      1095      | IGP Metric      |    ---     | Section     |
   |                |                 |            | 5.3.2.4     |
   +----------------+-----------------+------------+-------------+
   |      1096      | Shared Risk     |    ---     | Section     |
   |                | Link Group      |            | 5.3.2.5     |
   +----------------+-----------------+------------+-------------+
   |      1097      | Opaque Link     |    ---     | Section     |
   |                | Attribute       |            | 5.3.2.6     |
   +----------------+-----------------+------------+-------------+
   |      1098      | Link Name       |    ---     | Section     |
   |                |                 |            | 5.3.2.7     |
   +----------------+-----------------+------------+-------------+

Table 8: Link Attribute TLVs

5.3.2.1. IPv4/IPv6 Router-ID TLVs 🧚

The local/remote IPv4/IPv6 Router-ID TLVs describe auxiliary Router-IDs the IGP might be using, e.g., for TE purposes. The vibe is: all auxiliary Router-IDs of both the local and the remote node MUST be included in the link attribute of each Link NLRI, no skipping! 🙅‍♀️ If there's more than one auxiliary Router-ID of a given type, you just use multiple TLVs to encode them. ✨

5.3.2.2. MPLS Protocol Mask TLV 💜

The MPLS Protocol Mask TLV carries a bitmask saying which MPLS signaling protocols are enabled. Its length is 1. The value is a bit array of 8 flags, and each bit stands for one MPLS Protocol capability. 🌈

Generating this TLV is only valid for, and SHOULD only be used with, originators that have local link insight. Think Protocol-IDs 'Static configuration' or 'Direct' as per Table 2. The MPLS Protocol Mask TLV MUST NOT be included in NLRIs with the other Protocol-IDs listed in Table 2. Be careful, bestie 🙈

   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
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |              Type             |             Length            |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |L|R|  Reserved |
  +-+-+-+-+-+-+-+-+

Figure 19: MPLS Protocol Mask TLV

Here are the bits that are defined. The reserved bits MUST be set to zero and SHOULD be ignored on receipt, so don't sweat them 💅

  +=====+=============================================+===========+
  | Bit | Description                                 | Reference |
  +=====+=============================================+===========+
  | 'L' | Label Distribution Protocol (LDP)           | [RFC5036] |
  +-----+---------------------------------------------+-----------+
  | 'R' | Extension to RSVP for LSP Tunnels (RSVP-TE) | [RFC3209] |
  +-----+---------------------------------------------+-----------+

Table 9: MPLS Protocol Mask TLV Codes

The bits that are not defined MUST be set to 0 by the originator and MUST be ignored by the receiver. Simple rule, keep it clean 🫶

5.3.2.3. TE Default Metric TLV 🍓

The TE Default Metric TLV carries the Traffic Engineering metric for this link. Its length is fixed at 4 octets. If a source protocol uses a metric width of fewer than 32 bits, then the high-order bits of this field MUST be padded with zero. Padding goes on the left, periodt 💖

   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
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |              Type             |             Length            |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                    TE Default Link Metric                     |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Figure 20: TE Default Metric TLV Format

5.3.2.4. IGP Metric TLV 🦋

The IGP Metric TLV carries the metric for this link. Its length depends on the metric width of the underlying protocol. IS-IS small metrics are 6 bits in size but are encoded in a 1-octet field, so the two most significant bits of that field MUST be set to 0 by the originator and MUST be ignored by the receiver. OSPF link metrics have a length of 2 octets. IS-IS wide metrics have a length of 3 octets. Okay, the math is giving precision 🧮✨

   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
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |              Type             |             Length            |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  //      IGP Link Metric (variable length)      //
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Figure 21: IGP Metric TLV Format

The Shared Risk Link Group (SRLG) TLV carries the Shared Risk Link Group information (see Section 2.3 ("Shared Risk Link Group Information") of [RFC4202]). It's a data structure made of a variable list of SRLG values, where each element in the list has 4 octets, as shown in Figure 22. The length of this TLV is 4 * (number of SRLG values). Math checks out 🔥

   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
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |              Type             |             Length            |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                  Shared Risk Link Group Value                 |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  //                         ............                        //
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                  Shared Risk Link Group Value                 |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Figure 22: Shared Risk Link Group TLV Format

The SRLG TLV for OSPF-TE is defined in [RFC4203]. In IS-IS, the SRLG information is carried in two different TLVs: the GMPLS-SRLG TLV (for IPv4) (Type 138) defined in [RFC5307], and the IPv6 SRLG TLV (Type 139) defined in [RFC6119]. Both IPv4 and IPv6 SRLG information is carried in a single TLV. Yes, the plot thickens, and we'll keep going next time 👀💜

Okay bestie, the Opaque Link Attribute TLV is basically an envelope 💌 It carries optional Link Attribute TLVs that a router advertises, and it passes them along without opening them up. An originating router shall use this TLV for info that's specific to the protocol named in the NLRI header Protocol-ID field, or for new protocol extensions to that protocol, as long as there's no protocol-neutral way to represent it in the BGP Link-State NLRI. The main reason it exists is to bridge the gap between a new IGP link-state attribute showing up and its "protocol-neutral" BGP-LS extension actually being defined. 🌉 Once those protocol-neutral extensions exist, implementations might still need to send the info both in the Opaque Attribute TLV and in the new TLV for smoother rollout and transition ✨

For OSPFv2, this TLV MUST NOT be used for anything beyond what's carried in the OSPFv2 Extended Link Opaque LSA [RFC7684] 🙅‍♀️ For OSPFv3, this TLV MUST NOT be used to advertise TLVs other than those in the OSPFv3 E-Router-LSA or E-Link-LSA [RFC8362] 💅

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |              Type             |             Length            |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     //                Opaque Link Attributes (variable)            //
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                Figure 23: Opaque Link Attribute TLV Format

The Link Name TLV is optional 🫶 Its Value field holds the symbolic name of the router link. That name can be the FQDN for the link, a substring of the FQDN, or any string an operator wants to use for the link. Using the FQDN or a substring of it is strongly RECOMMENDED 💜 The maximum length of the Link Name TLV is 255 octets 📏

The Value field is encoded in 7-bit ASCII 🔤 If a user interface that configures or displays this field allows Unicode characters, then that user interface is responsible for applying the ToASCII and/or ToUnicode algorithm described in [RFC5890] so the format is right for transmission or display 🌈

How a router derives and injects link names is outside the scope of this document 🙈

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |              Type             |             Length            |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     //                     Link Name (variable)                    //
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                      Figure 24: Link Name TLV Format

5.3.3. Prefix Attribute TLVs 🦋

Prefixes are learned from the IGP topology (IS-IS or OSPF), along with a bunch of IGP attributes like metric, route tags, and so on. Those attributes get advertised in the BGP-LS Attribute with Prefix NLRI types 3 and 4 🧚

These are the Prefix Attribute TLVs defined for the BGP-LS Attribute associated with a Prefix NLRI 👑

  +================+=================+==========+=================+
  | TLV Code Point | Description     |   Length | Reference       |
  +================+=================+==========+=================+
  |      1152      | IGP Flags       |        1 | Section 5.3.3.1 |
  +----------------+-----------------+----------+-----------------+
  |      1153      | IGP Route Tag   |      4*n | [RFC5130]       |
  +----------------+-----------------+----------+-----------------+
  |      1154      | IGP Extended    |      8*n | [RFC5130]       |
  |                | Route Tag       |          |                 |
  +----------------+-----------------+----------+-----------------+
  |      1155      | Prefix Metric   |        4 | [RFC5305]       |
  +----------------+-----------------+----------+-----------------+
  |      1156      | OSPF Forwarding |        4 | [RFC2328]       |
  |                | Address         |          |                 |
  +----------------+-----------------+----------+-----------------+
  |      1157      | Opaque Prefix   | variable | Section 5.3.3.6 |
  |                | Attribute       |          |                 |
  +----------------+-----------------+----------+-----------------+

                      Table 10: Prefix Attribute TLVs

5.3.3.1. IGP Flags TLV ✨

The IGP Flags TLV holds one octet of IS-IS and OSPF flags and bits that were originally assigned to the prefix. Here's how it's laid out 💖

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |              Type             |             Length            |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |D|N|L|P|       |
     +-+-+-+-+-+-+-+-+

                       Figure 25: IGP Flag TLV Format

The Value field contains bits defined in the table below 🍓

              +=====+===========================+===========+
              | Bit | Description               | Reference |
              +=====+===========================+===========+
              | 'D' | IS-IS Up/Down Bit         | [RFC5305] |
              +-----+---------------------------+-----------+
              | 'N' | OSPF "no unicast" Bit     | [RFC5340] |
              +-----+---------------------------+-----------+
              | 'L' | OSPF "local address" Bit  | [RFC5340] |
              +-----+---------------------------+-----------+
              | 'P' | OSPF "propagate NSSA" Bit | [RFC5340] |
              +-----+---------------------------+-----------+

                    Table 11: IGP Flag Bits Definitions

Any bits that aren't defined MUST be set to 0 by the originator, and MUST be ignored by the receiver 🙅‍♀️

5.3.3.2. IGP Route Tag TLV 🎀

The IGP Route Tag TLV carries the original IGP Tags (IS-IS [RFC5130] or OSPF) of the prefix. It's encoded like this 🧁

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |              Type             |             Length            |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     //                    Route Tags (one or more)                 //
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                    Figure 26: IGP Route Tag TLV Format

The length is a multiple of 4 🔢

The Value field contains one or more Route Tags, exactly as they were learned in the IGP topology 💜

5.3.3.3. IGP Extended Route Tag TLV 🌈

The IGP Extended Route Tag TLV carries the IS-IS Extended Route Tags of the prefix [RFC5130]. Here's the format 👀

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |              Type             |             Length            |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     //                Extended Route Tag (one or more)             //
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                Figure 27: IGP Extended Route Tag TLV Format

The length is a multiple of 8 🧮

The Extended Route Tag field contains one or more Extended Route Tags, as learned in the IGP topology 🦋

5.3.3.4. Prefix Metric TLV 💅

The Prefix Metric TLV is an optional attribute and can only appear once 🌸 When it's there, it carries the metric of the prefix as known in the IGP topology, as described in Section 4 of [RFC5305]. That means it represents the reachability cost to the prefix 💸 If it's not present, the prefix is advertised without any reachability 😭

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |              Type             |             Length            |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                            Metric                             |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                    Figure 28: Prefix Metric TLV Format

The length is 4 ✨

5.3.3.5. OSPF Forwarding Address TLV 🧚

The OSPF Forwarding Address TLV [RFC2328] [RFC5340] carries the OSPF forwarding address as it was known in the original OSPF advertisement. The forwarding address can be either IPv4 or IPv6 🌐

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |              Type             |             Length            |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     //                Forwarding Address (variable)                //
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

               Figure 29: OSPF Forwarding Address TLV Format

The length is 4 for an IPv4 forwarding address and 16 for an IPv6 forwarding address 🔥

5.3.3.6. Opaque Prefix Attribute TLV 👑

The Opaque Prefix Attribute TLV is an envelope that transparently carries optional Prefix Attribute TLVs advertised by a router 💌 An originating router shall use this TLV for encoding info specific to the protocol named in the NLRI header Protocol-ID field, or it shall use new protocol extensions for that protocol, as long as there's no protocol-neutral representation in the BGP Link-State NLRI. Its primary job is to bridge the document lag between a new IGP link-state attribute and its protocol-neutral BGP-LS extension being defined 🌉 Once those protocol-neutral BGP-LS extensions exist, implementations may still need to advertise the info both in the Opaque Attribute TLV and in the new TLV definition for incremental deployment and transition 🫶

For OSPFv2, this TLV MUST NOT be used to advertise information carried using TLVs other than those in the OSPFv2 Extended Prefix Opaque LSA [RFC7684] 🙅‍♀️ For OSPFv3, this TLV MUST NOT be used to advertise TLVs other than those in the OSPFv3 E-Inter-Area-Prefix-LSA, E-Intra-Area-Prefix-LSA, E-AS-External-LSA, and E-NSSA-LSA [RFC8362] 💀

The format of the TLV is 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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |              Type             |             Length            |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     //              Opaque Prefix Attributes  (variable)           //
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

               Figure 30: Opaque Prefix Attribute TLV Format

The Type is as specified in Table 10 🧸 The length is variable 🌷

5.4. Private Use 🔐

okay so vendor private use TLVs are supported using the code point range reserved as indicated in Section 7 💅 For these TLVs in the NLRI or BGP-LS Attribute, the format described in Section 5.1 is to be used, and a 4-octet field MUST be included as the first field in the value to carry the Enterprise Code. For a private use NLRI type, a 4-octet field MUST be included as the first field in the NLRI, immediately following the Total NLRI Length field of the Link-State NLRI format as described in Section 5.2, to carry the Enterprise Code [ENTNUM]. this is how vendor-specific extensions get to exist without stepping on each other's toes ✨

Multiple instances of private-use TLVs MAY appear in the BGP-LS Attribute 🦋

5.5. BGP Next-Hop Information 🌸

BGP link-state info for both IPv4 and IPv6 networks can ride over either an IPv4 BGP session or an IPv6 BGP session 🛣️ If an IPv4 BGP session is used, then the next hop in the MP_REACH_NLRI SHOULD be an IPv4 address. Similarly, if an IPv6 BGP session is used, then the next hop in the MP_REACH_NLRI SHOULD be an IPv6 address. Usually, the next hop will be set to the local endpoint address of the BGP session. The next-hop address MUST be encoded as described in [RFC4760]. The Length field of the next-hop address will specify the next-hop address family. If the next-hop length is 4, then the next hop is an IPv4 address; if the next-hop length is 16, then it is a global IPv6 address; and if the next-hop length is 32, then there is one global IPv6 address followed by an IPv6 link-local address. The IPv6 link-local address should be used as described in [RFC2545]. For VPN Subsequent Address Family Identifier (SAFI), as per custom, an 8-byte Route Distinguisher set to all zero is prepended to the next hop 🫶

The BGP Next-Hop is used by each BGP-LS Speaker to validate the NLRI it receives. In case identical NLRIs are sourced by multiple BGP-LS Producers, the BGP Next-Hop is used to tiebreak as per the standard BGP path decision process. This specification doesn't mandate any rule regarding the rewrite of the BGP Next-Hop 💅

The main source of TE information is the IGP, which is not active on inter-AS links. In some cases, the IGP may have information of inter-AS links [RFC5392] [RFC9346]. In other cases, an implementation SHOULD provide a means to inject inter-AS links into BGP-LS. The exact mechanism used to advertise the inter-AS links is outside the scope of this document 🌈

In an OSPF [RFC2328] [RFC5340] network, OSPF virtual links serve to connect physically separate components of the backbone to establish/maintain continuity of the backbone area. While OSPF virtual links are modeled as point-to-point, unnumbered links in the OSPF topology, their characteristics and purpose are different from other types of links in the OSPF topology. They are advertised using a distinct "virtual link" type in OSPF LSAs. The mechanism for the advertisement of OSPF virtual links via BGP-LS is outside the scope of this document.

In an OSPF network, sham links [RFC4577] [RFC6565] are used to provide intra-area connectivity between VPN Routing and Forwarding (VRF) instances on Provider Edge (PE) routers over the VPN provider's network. These links are advertised in OSPF as point-to-point, unnumbered links and represent connectivity over a service provider network using encapsulation mechanisms like MPLS. As such, the mechanism for the advertisement of OSPF sham links follows the same procedures as other point-to-point, unnumbered links as described previously in this document ✨

5.8. OSPFv2 Type 4 Summary-LSA & OSPFv3 Inter-Area-Router-LSA 💜

OSPFv2 [RFC2328] defines the type 4 summary-LSA and OSPFv3 [RFC5340] defines the inter-area-router-LSA for an Area Border Router (ABR) to advertise reachability to an AS Border Router (ASBR) that is external to the area yet internal to the AS. The nature of information advertised by OSPF using this type of LSA does not map to either a node, a link, or a prefix as discussed in this document. Therefore, the mechanism for the advertisement of the information carried by these LSAs is outside the scope of this document 🤷‍♀️

5.9. Handling of Unreachable IGP Nodes 🙈

Consider an OSPF network as shown in Figure 31, where R2 and R3 are the BGP-LS Producers and also the OSPF Area Border Routers (ABRs). The link between R2 and R3 is in area 0, while the other links are in area 1 as indicated by the a0 and a1 references respectively against the links.

A BGP-LS Consumer talks to BGP route reflector RR0, which is a BGP-LS Propagator that is aggregating the BGP-LS feed from BGP-LS Producers R2 and R3. Here, R2 and R3 provide a redundant topology feed via BGP-LS to RR0. Normally, RR0 would receive two identical copies of all the Link-State NLRIs from both R2 and R3 and it would pick one of them (say R2) based on the standard BGP Decision Process.

                     BGP-LS Consumer
                            ^
                            |
                           RR0
                    (BGP Route Reflector)
                         /      \
                        /        \
                 a1    /   a0     \    a1
            R1 ------ R2 -------- R3 ------ R4
        a1  |                               |  a1
            |                               |
            R5 ---------------------------- R6
                           a1

          Figure 31: Incorrect Reporting Due to BGP Path Selection

Consider a scenario where the link between R5 and R6 is lost (thereby partitioning the area 1), and consider its impact on the OSPF LSDB at R2 and R3 🧐

Now, R5 will remove the link R5-R6 from its Router LSA, and this updated LSA is available at R2. R2 also has a stale copy of R6's Router LSA that still has the link R6-R5 in it. Based on this view in its LSDB, R2 will advertise only the half-link R6-R5 that it derives from R6's stale Router LSA.

At the same time, R6 has removed the link R6-R5 from its Router LSA, and this updated LSA is available at R3. Similarly, R3 also has a stale copy of R5's Router LSA having the link R5-R6 in it. Based on its LSDB, R3 will advertise only the half-link R5-R6 that it derives from R5's stale Router LSA.

Now, the BGP-LS Consumer receives both the Link NLRIs corresponding to the half-links from R2 and R3 via RR0. When viewed together, it would not detect or realize that area 1 is partitioned. Also, if R2 continues to report Node and Prefix NLRIs corresponding to the stale copy of R4's and R6's Router LSAs, then RR0 could prefer them over the valid Node and Prefix NLRIs for R4 and R6 that it is receiving from R3 depending on RR0's BGP Decision Process. This would result in the BGP-LS Consumer getting stale and inaccurate topology information. This problem scenario is avoided if R2 were to not advertise the link-state information corresponding to R4 and R6 and if R3 were to not advertise similarly for R1 and R5. this is the kind of stale-data drama that really can mess up a whole topology view 😭

A BGP-LS Producer SHOULD withdraw all link-state objects advertised by it in BGP when the node that originated its corresponding LSPs/LSAs is determined to have become unreachable in the IGP. An implementation MAY continue to advertise link-state objects corresponding to unreachable nodes in a deployment use case where the BGP-LS Consumer is interested in receiving a topology feed corresponding to a complete IGP LSDB view. In such deployments, it is expected that the problem described above is mitigated by the BGP-LS Consumer via appropriate handling of such a topology feed in addition to the use of either a direct BGP peering with the BGP-LS Producer nodes or mechanisms such as those described in [RFC7911] when using RRs. Details of these mechanisms are outside the scope of this document.

If the BGP-LS Producer does withdraw link-state objects associated with an IGP node based on the failure of reachability check for that node, then it MUST re-advertise those link-state objects after that node becomes reachable again in the IGP domain 🔁

5.10. Router-ID Anchoring Example: ISO Pseudonode 🍓

The encoding of a broadcast LAN in IS-IS provides a good example of how Router-IDs are encoded. Consider Figure 32. This represents a broadcast LAN between a pair of routers. The "real" (non-pseudonode) routers have both an IPv4 Router-ID and an IS-IS Node-ID. The pseudonode does not have an IPv4 Router-ID. Node1 is the DIS for the LAN. Two unidirectional links, (Node1, Pseudonode1) and (Pseudonode1, Node2), are being generated.

The Link NLRI of (Node1, Pseudonode1) is encoded as follows. The IGP Router-ID TLV of the local Node Descriptor is 6 octets long and contains the ISO-ID of Node1, 1920.0000.2001. The IGP Router-ID TLV of the remote Node Descriptor is 7 octets long and contains the ISO-ID of Pseudonode1, 1920.0000.2001.02. The BGP-LS Attribute of this link contains one local IPv4 Router-ID TLV (TLV type 1028) containing 192.0.2.1, the IPv4 Router-ID of Node1.

The Link NLRI of (Pseudonode1, Node2) is encoded as follows. The IGP Router-ID TLV of the local Node Descriptor is 7 octets long and contains the ISO-ID of Pseudonode1, 1920.0000.2001.02. The IGP Router-ID TLV of the remote Node Descriptor is 6 octets long and contains the ISO-ID of Node2, 1920.0000.2002. The BGP-LS Attribute of this link contains one remote IPv4 Router-ID TLV (TLV type 1030) containing 192.0.2.2, the IPv4 Router-ID of Node2 🧠

     +-----------------+    +-----------------+    +-----------------+
     |      Node1      |    |   Pseudonode1   |    |      Node2      |
     |1920.0000.2001.00|--->|1920.0000.2001.02|--->|1920.0000.2002.00|
     |     192.0.2.1   |    |                 |    |     192.0.2.2   |
     +-----------------+    +-----------------+    +-----------------+

                        Figure 32: IS-IS Pseudonodes

5.11. Router-ID Anchoring Example: OSPF Pseudonode 🦋

okay bestie, the way OSPF encodes a broadcast LAN is literally the best example of how Router-IDs and local Interface IPs get tucked into the encoding 😭🫶 Check out Figure 33! It shows a broadcast LAN sitting between a pair of routers. The "real" (non-pseudonode) routers each have an IPv4 Router-ID and an Area Identifier. The pseudonode has an IPv4 Router-ID, an IPv4 Interface Address (for disambiguation), and an OSPF Area 💅

Node1 is the DR for the LAN, so its local IP address 198.51.100.1 gets used as both the Router-ID and the Interface IP for the pseudonode keys 🔑 Two unidirectional links, (Node1, Pseudonode1) and (Pseudonode1, Node2), are being generated ✨

The Link NLRI of (Node1, Pseudonode1) is encoded like this:

  • Local Node Descriptor
    • TLV #515: IGP Router-ID: 192.0.2.1
    • TLV #514: OSPF Area-ID: ID:0.0.0.0
  • Remote Node Descriptor
    • TLV #515: IGP Router-ID: 192.0.2.1:198.51.100.1
    • TLV #514: OSPF Area-ID: ID:0.0.0.0

And the Link NLRI of (Pseudonode1, Node2) is encoded like this:

  • Local Node Descriptor
    • TLV #515: IGP Router-ID: 192.0.2.1:198.51.100.1
    • TLV #514: OSPF Area-ID: ID:0.0.0.0
  • Remote Node Descriptor
    • TLV #515: IGP Router-ID: 192.0.2.2
    • TLV #514: OSPF Area-ID: ID:0.0.0.0
        198.51.100.1/24             198.51.100.2/24
   +-------------+    +-------------+    +-------------+
   |   Node1     |    | Pseudonode1 |    |    Node2    |
   |  192.0.2.1  |--->|  192.0.2.1  |--->|  192.0.2.2  |
   |             |    |198.51.100.1 |    |             |
   |   Area 0    |    |   Area 0    |    |    Area 0   |
   +-------------+    +-------------+    +-------------+

                        Figure 33: OSPF Pseudonodes

The LAN subnet 198.51.100.0/24 is not included in the Router LSA of Node1 or Node2. 🙈 The Network LSA for this LAN, advertised by the DR Node1, carries the subnet mask for the LAN along with the DR address. A Prefix NLRI for the LAN subnet is advertised with Pseudonode1 used as the local node, using the DR address and the subnet mask from the Network LSA 🌸

5.12. Router-ID Anchoring Example: OSPFv2 to IS-IS Migration 🎀

Graceful migration from one IGP to another needs both protocols running in sync during the migration period 💜 That kind of coordination means you have to identify a given physical link in both IGPs. The IPv4 Router-ID is the "glue" that does this. It shows up in the Node Descriptors of the OSPF Link NLRI and in the link attribute of the IS-IS Link NLRI 🧚

Picture a point-to-point link between two routers, A and B, that were OSPFv2-only routers at first and then had IS-IS enabled on them. Node A has an IPv4 Router-ID and an ISO-ID. Node B has an IPv4 Router-ID, an IPv6 Router-ID, and an ISO-ID 👑 Each protocol generates one Link NLRI for the link (A, B), and both get carried by BGP-LS.

The OSPFv2 Link NLRI for the link is encoded with the IPv4 Router-ID of nodes A and B in the local and remote Node Descriptors, respectively. The IS-IS Link NLRI for the link is encoded with the ISO-ID of nodes A and B in the local and remote Node Descriptors, respectively. On top of that, the BGP-LS Attribute of the IS-IS Link NLRI contains TLV type 1028 holding the IPv4 Router-ID of node A, TLV type 1030 holding the IPv4 Router-ID of node B, and TLV type 1031 holding the IPv6 Router-ID of node B 💖

So by using the IPv4 Router-ID, the link (A, B) can be identified in both the IS-IS and OSPF protocols 🌈✨


Distribution of all links available on the global Internet is certainly possible, but it is not desirable from a scaling and privacy point of view 🙈 That's why an implementation may support a link to path aggregation 🍓 Instead of advertising every specific link in a domain, an ASBR may advertise an "aggregate link" between a non-adjacent pair of nodes. The "aggregate link" represents the aggregated set of link properties between that pair of non-adjacent nodes.

The actual methods to compute the path properties (bandwidth, metric, etc.) are outside the scope of this document. Whether to advertise all specific links or aggregated links is an operator's policy choice. To show the different levels of exposure, here are the following deployment examples 💅

Check out Figure 34! Both AS1 and AS2 operators want to protect their inter-AS {R1, R3} and {R2, R4} links using RSVP - Fast Reroute (RSVP-FRR) LSPs. If R1 wants to compute its link-protection LSP to R3, it needs to "see" an alternate path to R3. So the AS2 operator exposes its topology 👀 All BGP-TE-enabled routers in AS1 "see" the full topology of AS2, which means they can compute a backup path. Note that the computing router decides whether the direct link between {R3, R4} or the {R4, R5, R3} path is used 🫶

          AS1   :   AS2
                :
           R1-------R3
            |   :   | \
            |   :   |  R5
            |   :   | /
           R2-------R4
                :
                :

                       Figure 34: No Link Aggregation

6.2. Example: ASBR to ASBR Path Aggregation 🌸

The brief difference between the "no-link aggregation" example and this one is that no specific link gets exposed 🙈 Check out Figure 35! The only link that AS2 advertises is an "aggregate" link between R3 and R4. That's enough to tell AS1 there's a backup path, but the actual links being used stay hidden from the topology 🔥

          AS1   :   AS2
                :
           R1-------R3
            |   :   |
            |   :   |
            |   :   |
           R2-------R4
                :
                :

                      Figure 35: ASBR Link Aggregation

6.3. Example: Multi-AS Path Aggregation 👑

Service providers in control of multiple ASes may even decide not to expose their internal inter-AS links 💜 Check out Figure 36! AS3 is modeled as a single node that connects to the border routers of the aggregated domain 🧚

          AS1   :   AS2   :   AS3
                :         :
           R1-------R3-----
            |   :         : \
            |   :         :   vR0
            |   :         : /
           R2-------R4-----
                :         :
                :         :

                      Figure 36: Multi-AS Aggregation

7. IANA Considerations 📋

As this document obsoletes [RFC7752] and [RFC9029], IANA has updated all registration information that references those documents to instead reference this document 🫶

IANA has assigned address family number 16388 (BGP-LS) in the "Address Family Numbers" registry 🎀

IANA has assigned SAFI values 71 (BGP-LS) and 72 (BGP-LS-VPN) in the "SAFI Values" registry under the "Subsequent Address Family Identifiers (SAFI) Parameters" registry group 💖

IANA has assigned value 29 (BGP-LS Attribute) in the "BGP Path Attributes" registry under the "Border Gateway Protocol (BGP) Parameters" registry group 🌈

IANA has created a "Border Gateway Protocol - Link-State (BGP-LS) Parameters" registry group at https://www.iana.org/assignments/bgp-ls-parameters ✨

This section also incorporates all the changes to the allocation procedures for the BGP-LS IANA registry group, as well as the guidelines for designated experts, that were introduced by [RFC9029] 💅

7.1. BGP-LS Registries 🧚

All of the registries listed in the following subsections are specific to BGP-LS and are accessible under this registry 🦋

7.1.1. BGP-LS NLRI Types Registry 🍓

The "BGP-LS NLRI Types" registry has been set up for assignment of the two-octet-sized code points for BGP-LS NLRI types 🔑 It's populated with the values shown below:

       +=============+===========================+===========+
       |     Type    | NLRI Type                 | Reference |
       +=============+===========================+===========+
       |      0      | Reserved                  |  RFC 9552 |
       +-------------+---------------------------+-----------+
       |      1      | Node NLRI                 |  RFC 9552 |
       +-------------+---------------------------+-----------+
       |      2      | Link NLRI                 |  RFC 9552 |
       +-------------+---------------------------+-----------+
       |      3      | IPv4 Topology Prefix NLRI |  RFC 9552 |
       +-------------+---------------------------+-----------+
       |      4      | IPv6 Topology Prefix NLRI |  RFC 9552 |
       +-------------+---------------------------+-----------+
       | 65000-65535 | Private Use               |  RFC 9552 |
       +-------------+---------------------------+-----------+

                     Table 12: BGP-LS NLRI Types

A range is reserved for Private Use [RFC8126] 🌸 All other allocations within the registry are to be made using the "Expert Review" policy [RFC8126], which requires documentation of the proposed use of the allocated value and approval by the designated expert assigned by the IESG 🫶

7.1.2. BGP-LS Protocol-IDs Registry 💜

The "BGP-LS Protocol-IDs" registry has been set up for assignment of the one-octet-sized code points for BGP-LS Protocol-IDs 🌈 It's populated with the values shown below:

   +=============+==================================+===========+
   | Protocol-ID | NLRI information source protocol | Reference |
   +=============+==================================+===========+
   |      0      | Reserved                         |  RFC 9552 |
   +-------------+----------------------------------+-----------+
   |      1      | IS-IS Level 1                    |  RFC 9552 |
   +-------------+----------------------------------+-----------+
   |      2      | IS-IS Level 2                    |  RFC 9552 |
   +-------------+----------------------------------+-----------+
   |      3      | OSPFv2                           |  RFC 9552 |
   +-------------+----------------------------------+-----------+
   |      4      | Direct                           |  RFC 9552 |
   +-------------+----------------------------------+-----------+
   |      5      | Static configuration             |  RFC 9552 |
   +-------------+----------------------------------+-----------+
   |      6      | OSPFv3                           |  RFC 9552 |
   +-------------+----------------------------------+-----------+
   |   200-255   | Private Use                      |  RFC 9552 |
   +-------------+----------------------------------+-----------+

                  Table 13: BGP-LS Protocol-IDs

A range is reserved for Private Use [RFC8126] 🦋 All other allocations within the registry are to be made using the "Expert Review" policy [RFC8126], which requires documentation of the proposed use of the allocated value and approval by the designated expert assigned by the IESG ✨

7.1.3. BGP-LS Well-Known Instance-IDs Registry 🥀

The "BGP-LS Well-Known Instance-IDs" registry that was set up via [RFC7752] is no longer required 💀 IANA has marked this registry obsolete and changed its registration procedure to "registry closed" 🙈

7.1.4. BGP-LS Node Flags Registry 🦋

okay so the "BGP-LS Node Flags" registry got created for the one-octet flags field of the Node Flag Bits TLV (1024) 🎀 and it's pre-filled with these initial values, no cap, they're giving main character energy:

                +=====+======================+===========+
                | Bit | Description          | Reference |
                +=====+======================+===========+
                |  0  | Overload Bit (O-bit) |  RFC 9552 |
                +-----+----------------------+-----------+
                |  1  | Attached Bit (A-bit) |  RFC 9552 |
                +-----+----------------------+-----------+
                |  2  | External Bit (E-bit) |  RFC 9552 |
                +-----+----------------------+-----------+
                |  3  | ABR Bit (B-bit)      |  RFC 9552 |
                +-----+----------------------+-----------+
                |  4  | Router Bit (R-bit)   |  RFC 9552 |
                +-----+----------------------+-----------+
                |  5  | V6 Bit (V-bit)       |  RFC 9552 |
                +-----+----------------------+-----------+
                | 6-7 | Unassigned           |           |
                +-----+----------------------+-----------+

                       Table 14: BGP-LS Node Flags

New allocations in this registry go through the "Expert Review" policy [RFC8126] 🔍. That means you have to document how you plan to use the value, and the designated expert assigned by the IESG has to approve it 💅.

7.1.5. BGP-LS MPLS Protocol Mask Registry 🌸

the "BGP-LS MPLS Protocol Mask" registry is also new 🎉. It covers the one-octet flags field of the MPLS Protocol Mask TLV (1094), and it starts out like this:

      +=====+===========================================+===========+
      | Bit | Description                               | Reference |
      +=====+===========================================+===========+
      |  0  | Label Distribution Protocol (L-bit)       |  RFC 9552 |
      +-----+-------------------------------------------+-----------+
      |  1  | Extension to RSVP for LSP Tunnels (R-bit) |  RFC 9552 |
      +-----+-------------------------------------------+-----------+
      | 2-7 | Unassigned                                |           |
      +-----+-------------------------------------------+-----------+

                    Table 15: BGP-LS MPLS Protocol Mask

Same deal as before: new allocations use the "Expert Review" policy [RFC8126], so you need documentation of the proposed use plus approval from the designated expert assigned by the IESG 🫶.

7.1.6. BGP-LS IGP Prefix Flags Registry ✨

the "BGP-LS IGP Prefix Flags" registry covers the one-octet flags field of the IGP Flags TLV (1152) 🧚. Here's how it starts:

          +=====+===================================+===========+
          | Bit | Description                       | Reference |
          +=====+===================================+===========+
          |  0  | IS-IS Up/Down Bit (D-bit)         |  RFC 9552 |
          +-----+-----------------------------------+-----------+
          |  1  | OSPF "no unicast" Bit (N-bit)     |  RFC 9552 |
          +-----+-----------------------------------+-----------+
          |  2  | OSPF "local address" Bit (L-bit)  |  RFC 9552 |
          +-----+-----------------------------------+-----------+
          |  3  | OSPF "propagate NSSA" Bit (P-bit) |  RFC 9552 |
          +-----+-----------------------------------+-----------+
          | 4-7 | Unassigned                        |           |
          +-----+-----------------------------------+-----------+

                     Table 16: BGP-LS IGP Prefix Flags

Allocations here go through the "Expert Review" policy [RFC8126] too 🌈. You document the proposed use, and the designated expert assigned by the IESG approves it 👑.

7.1.7. BGP-LS TLVs Registry 💜

this one was originally created via [RFC7752] 📜. Per this document, IANA renamed it to "BGP-LS NLRI and Attribute TLVs" and removed the column for "IS-IS TLV/Sub-TLV" 🙈. The registration procedures look like this:

            +================+================================+
            | TLV Code Point | Registration Process           |
            +================+================================+
            |     0-255      | Reserved (not to be allocated) |
            +----------------+--------------------------------+
            |   256-64999    | Expert Review                  |
            +----------------+--------------------------------+
            |  65000-65535   | Private Use                    |
            +----------------+--------------------------------+

                 Table 17: BGP-LS TLVs Registration Process

A range is reserved for Private Use [RFC8126] 🔒. Everything else in the registry, outside that reserved range, goes through the "Expert Review" policy [RFC8126], meaning documentation of the proposed use and approval by the designated expert assigned by the IESG 🫶.

The registry was pre-populated with the values shown in Table 18. The reference for each allocation now points to this document and to the section where that TLV is specified ✨.

7.2. Guidance for Designated Experts 🔍

okay bestie, so whenever a designated expert reviews something here, they're expected to check that the purpose and use of the requested code points are clear 🧐. These are the rules for the registries in this document:

  1. Application for a code point allocation may be made to the designated experts at any time and MUST be accompanied by technical documentation explaining the use of the code point. Such documentation SHOULD be presented in the form of an Internet-Draft but MAY arrive in any form that can be reviewed and exchanged among reviewers.
  2. The designated experts SHOULD only consider requests that arise from Internet-Drafts that have already been accepted as working group documents or that are planned for progression as AD-Sponsored documents in the absence of a suitably chartered working group.
  3. In the case of working group documents, the designated experts MUST check with the working group chairs that there is a consensus within the working group to allocate at this time. In the case of AD-Sponsored documents, the designated experts MUST check with the AD for approval to allocate at this time.
  4. If the document is not adopted by the IDR Working Group (or its successor), the designated expert MUST notify the IDR mailing list (or its successor) of the request and MUST provide access to the document. The designated expert MUST allow two weeks for any response. Any comments received MUST be considered by the designated expert as part of the subsequent step.
  5. The designated experts MUST then review the assignment requests on their technical merit. The designated experts MAY raise issues related to the allocation request with the authors and on the IDR (or successor) mailing list for further consideration before the assignments are made.
  6. The designated expert MUST ensure that any request for a code point does not conflict with work that is active or already published within the IETF.
  7. Once the designated experts have approved, IANA will update the registry by marking the allocated code points with a reference to the associated document.
  8. In the event that the document is a working group document or is AD-Sponsored and fails to progress to publication as an RFC, the working group chairs or AD SHOULD contact IANA to coordinate about marking the code points as deprecated. A deprecated code point is not marked as allocated for use and is not available for allocation in a future document. The WG chairs may inform IANA that a deprecated code point can be completely deallocated (i.e., made available for new allocations) at any time after it has been deprecated if there is a shortage of unallocated code points in the registry.

8. Manageability Considerations 🧚

This section is structured as recommended in [RFC5706] 🌸.

8.1. Operational Considerations 🛠️

8.1.1. Operations 💅

okay so existing BGP operational procedures apply, and no new operational procedures are defined in this document 🙌. The NLRI information in this document carries purely application-level data that has no immediate impact on the forwarding state BGP computes 🤓. That means churn in reachability information hits differently than regular BGP updates, which have to change the forwarding state for an entire router 😭.

Distribution of the BGP-LS NLRIs SHOULD be handled by dedicated route reflectors in most deployments, since that gives you isolation and fault containment between different BGP address families 🫧. If dedicated route reflectors aren't available, alternate mechanisms like separating BGP instances or using separate BGP sessions (for example, different addresses for peering) SHOULD be used for Link-State information distribution 🦋.

It is RECOMMENDED that operators deploying BGP-LS enable two or more BGP-LS Producers in each IGP flooding domain, so there's redundancy in originating link-state information into BGP-LS 💖. It is also RECOMMENDED that operators make sure their BGP peering designs have redundancy in the BGP update propagation paths (for example, using at least a pair of route reflectors), and that BGP-LS Consumers receive topology information from at least two BGP-LS Speakers 🎀.

In a multi-domain IGP network, correct provisioning of the BGP-LS Instance-IDs on the BGP-LS Producers is required for consistent reporting of the multi-domain link-state topology 🌐. Refer to Section 5.2 for more details 📖.

8.1.2. Installation and Initial Setup ⭐

the configuration parameters defined in Section 8.2.3 SHOULD be initialized to these default values 🍓:

  • The Link-State NLRI capability is turned off for all neighbors.
  • The maximum rate at which Link-State NLRIs will be advertised/withdrawn from neighbors is set to 200 updates per second.

8.1.3. Migration Path 🦋

the proposed extension only gets activated between BGP peers after capability negotiation 🤝. The extensions can also be turned on or off on an individual peer basis (see Section 8.2.3), so the rollout can be gradual across the network 🌈.

8.1.4. Requirements for Other Protocols and Functional Components 🫶

the protocol extension defined in this document does not put new requirements on other protocols or functional components 🙅‍♀️.

8.1.5. Impact on Network Operation 💀

the frequency of Link-State NLRI updates could interfere with regular BGP prefix distribution 😬. A network operator should use a dedicated route reflector infrastructure to distribute Link-State NLRIs, as discussed in Section 8.1.1 🧹.

Distribution of Link-State NLRIs SHOULD be limited to a single admin domain, which can consist of multiple areas within an AS or multiple ASes 🏰.

8.1.6. Verifying Correct Operation 🔎

existing BGP procedures apply 💁‍♀️. On top of that, an implementation SHOULD allow an operator to:

  • List neighbors with whom the speaker is exchanging Link-State NLRIs.

8.2. Management Considerations 💜

8.2.1. Management Information 💖

okay so the IDR Working Group has been documenting, and is still documenting, parts of the Management Information Base and YANG models for managing and monitoring BGP Speakers and the sessions between them 🧚 the current thinking is that a BGP session running BGP-LS is not substantially different from any other BGP session, so it can be managed using the same data models ✨ no cap, that's iconic 🎀

8.2.2. Fault Management 🦋

okay this section is all about the fault management actions from [RFC7606] that get applied when we handle BGP UPDATE messages for BGP-LS 💅

A Link-State NLRI MUST NOT be considered malformed or invalid based on the inclusion or exclusion of TLVs, or on the contents of the TLV fields (i.e., semantic errors), as described in Sections 5.1 and 5.2. 🫶

A BGP-LS Speaker MUST perform the following syntactic validation of the Link-State NLRI to determine if it is malformed. 🔍

  • The sum of all TLV lengths found in the BGP MP_REACH_NLRI attribute corresponds to the BGP MP_REACH_NLRI length. 🌸
  • The sum of all TLV lengths found in the BGP MP_UNREACH_NLRI attribute corresponds to the BGP MP_UNREACH_NLRI length. 🌸
  • The sum of all TLV lengths found in a Link-State NLRI corresponds to the Total NLRI Length field of all its descriptors. 🌸
  • The length of the TLVs and, when the TLV is recognized, the length of its sub-TLVs in the NLRI are valid. 🌸
  • The syntactic correctness of the NLRI fields has been verified as per [RFC7606]. 🌸
  • The rule regarding the ordering of TLVs has been followed as described in Section 5.1. 🌸
  • For NLRIs carrying either a Local or Remote Node Descriptor TLV, there is not more than one instance of a sub-TLV present. 🌸

when the error that gets found lets the router skip the malformed NLRI(s) and keep processing the rest of the BGP UPDATE message (e.g., when the TLV ordering rule is violated), then it MUST handle those malformed NLRIs as 'NLRI discard' (i.e., processing similar to what is described in Section 5.4 of [RFC7606]) 💀 in other cases, where the error in the NLRI encoding means the router can't process the BGP UPDATE message at all (e.g., length-related encoding errors), then the router SHOULD handle those malformed NLRIs as 'AFI/SAFI disable' when other AFI/SAFI besides BGP-LS are being advertised over the same session 🙈 alternately, the router MUST perform a 'session reset' when the session is only being used for BGP-LS or if the 'AFI/SAFI disable' action is not possible 😭

A BGP-LS Attribute MUST NOT be considered malformed or invalid based on the inclusion or exclusion of TLVs, or on the contents of the TLV fields (i.e., semantic errors), as described in Sections 5.1 and 5.3. 🫶

A BGP-LS Speaker MUST perform the following syntactic validation of the BGP-LS Attribute to determine if it is malformed. 🔍

  • The sum of all TLV lengths found in the BGP-LS Attribute corresponds to the BGP-LS Attribute length. 🌸
  • The syntactic correctness of the Attributes (including the BGP-LS Attribute) has been verified as per [RFC7606]. 🌸
  • The length of each TLV and, when the TLV is recognized, the length of its sub-TLVs in the BGP-LS Attribute are valid. 🌸

when the error that gets found lets the router skip the malformed BGP-LS Attribute and keep processing the rest of the BGP UPDATE message (e.g., when the BGP-LS Attribute length and the total Path Attribute Length are correct but some TLV/sub-TLV length within the BGP-LS Attribute is invalid), then it MUST handle that malformed BGP-LS Attribute as 'Attribute Discard' 🦄 in other cases, where the error in the BGP-LS Attribute encoding means the UPDATE message can't be processed, the handling is the same as described above for the malformed NLRI ✨

note that 'Attribute Discard' wipes out all the TLVs in the BGP-LS Attribute, not just one specific malformed TLV 👑 removing only the bad TLVs could make a BGP-LS Consumer think that specific information was deleted or just isn't available, which would be a total plot twist nobody wants 😱

when a BGP Speaker gets an UPDATE message with Link-State NLRI(s) in the MP_REACH_NLRI but without the BGP-LS Attribute, it's most likely a sign that a BGP Speaker before it already did the 'Attribute Discard' handling 🕵️‍♀️ an implementation SHOULD preserve and propagate those Link-State NLRIs, unless local policy says no, in that UPDATE message 💜 that way the BGP-LS Consumers can notice the link-state information for that object is missing and won't assume it was deleted or withdrawn 🙌 it also makes it possible for a network operator to trace back to the BGP-LS Propagator that detected the fault with the BGP-LS Attribute 🔥

an implementation SHOULD log a message for any errors found during syntax validation so people can analyze them later 📝

a BGP-LS Propagator, even when it has a coexisting BGP-LS Consumer on the same node, should not perform semantic validation of the Link-State NLRI or the BGP-LS Attribute to decide whether it's malformed or invalid 🙅‍♀️ some kinds of semantic validation that a BGP-LS Propagator should NOT do are listed below (and this isn't meant to be a complete list, bestie):

  • presence of a mandatory TLV
  • the length of a fixed-length TLV is correct, or the length of a variable-length TLV is valid or permissible
  • the values of TLV fields are valid or permissible
  • the inclusion and use of TLVs/sub-TLVs with specific Link-State NLRI types is valid

each TLV may indicate its valid and permissible values and their semantics, and those can only be used by a BGP-LS Consumer for its semantic validation 🧠 however, how errors get handled may be specific to the particular application and is outside the scope of this document 🎀

8.2.3. Configuration Management 🌈

an implementation SHOULD let the operator specify the neighbors that Link-State NLRIs will be advertised to, and the neighbors Link-State NLRIs will be accepted from 💌

an implementation SHOULD let the operator specify the maximum rate at which Link-State NLRIs will be advertised/withdrawn from neighbors ⏱️

an implementation SHOULD let the operator specify the maximum number of Link-State NLRIs stored in a router's Routing Information Base (RIB) 📚

an implementation SHOULD let the operator create abstracted topologies that get advertised to neighbors, and create different abstractions for different neighbors 🪞

an implementation MUST let the operator configure an 8-octet BGP-LS Instance-ID 🔢 refer to Section 5.2 for guidance to the operator on configuring the BGP-LS Instance-ID 🧚

an implementation SHOULD let the operator configure the Autonomous System Number (ASN) and BGP-LS identifiers (refer to Section 5.2.1.4) 🦋

an implementation SHOULD let the operator configure a 4096-byte size limit for a BGP-LS UPDATE message on a BGP-LS Producer, or allow larger values when they know that all BGP-LS Speakers support the extended message size [RFC8654] 🫧

8.2.4. Accounting Management 🍓

Not Applicable. 🙃

8.2.5. Performance Management 🌸

an implementation SHOULD provide the following statistics 📊

  • Total number of Link-State NLRI updates sent/received
  • Number of Link-State NLRI updates sent/received, per neighbor
  • Number of errored received Link-State NLRI updates, per neighbor
  • Total number of locally originated Link-State NLRIs

these statistics should be recorded as absolute counts since the system or session start time 🕰️ an implementation MAY also enhance this information by recording peak per-second counts in each case ⚡

8.2.6. Security Management 🔐

an operator MUST define an import policy to limit inbound updates as follows 🚧

  • Drop all updates from peers that are only serving BGP-LS Consumers.

an implementation MUST have the means to limit inbound updates 🛡️ this one is giving serious gatekeeper energy, periodt 💅

9. TLV/Sub-TLV Code Points Summary ✨

okay bestie, this is the cheat sheet 🗂️💖 it's the one global table listing every TLV and sub-TLV defined in this document. when you need to find a code point fast, come here first 🫶

    +================+=========================+===================+
    | TLV Code Point | Description             | Reference Section |
    +================+=========================+===================+
    |      256       | Local Node Descriptors  | Section 5.2.1.2   |
    +----------------+-------------------------+-------------------+
    |      257       | Remote Node Descriptors | Section 5.2.1.3   |
    +----------------+-------------------------+-------------------+
    |      258       | Link Local/Remote       | Section 5.2.2     |
    |                | Identifiers             |                   |
    +----------------+-------------------------+-------------------+
    |      259       | IPv4 interface address  | Section 5.2.2     |
    +----------------+-------------------------+-------------------+
    |      260       | IPv4 neighbor address   | Section 5.2.2     |
    +----------------+-------------------------+-------------------+
    |      261       | IPv6 interface address  | Section 5.2.2     |
    +----------------+-------------------------+-------------------+
    |      262       | IPv6 neighbor address   | Section 5.2.2     |
    +----------------+-------------------------+-------------------+
    |      263       | Multi-Topology          | Section 5.2.2.1   |
    |                | Identifier              |                   |
    +----------------+-------------------------+-------------------+
    |      264       | OSPF Route Type         | Section 5.2.3.1   |
    +----------------+-------------------------+-------------------+
    |      265       | IP Reachability         | Section 5.2.3.2   |
    |                | Information             |                   |
    +----------------+-------------------------+-------------------+
    |      512       | Autonomous System       | Section 5.2.1.4   |
    +----------------+-------------------------+-------------------+
    |      513       | BGP-LS Identifier       | Section 5.2.1.4   |
    |                | (deprecated)            |                   |
    +----------------+-------------------------+-------------------+
    |      514       | OSPF Area-ID            | Section 5.2.1.4   |
    +----------------+-------------------------+-------------------+
    |      515       | IGP Router-ID           | Section 5.2.1.4   |
    +----------------+-------------------------+-------------------+
    |      1024      | Node Flag Bits          | Section 5.3.1.1   |
    +----------------+-------------------------+-------------------+
    |      1025      | Opaque Node Attribute   | Section 5.3.1.5   |
    +----------------+-------------------------+-------------------+
    |      1026      | Node Name               | Section 5.3.1.3   |
    +----------------+-------------------------+-------------------+
    |      1027      | IS-IS Area Identifier   | Section 5.3.1.2   |
    +----------------+-------------------------+-------------------+
    |      1028      | IPv4 Router-ID of Local | Sections 5.3.1.4  |
    |                | Node                    | and 5.3.2.1       |
    +----------------+-------------------------+-------------------+
    |      1029      | IPv6 Router-ID of Local | Sections 5.3.1.4  |
    |                | Node                    | and 5.3.2.1       |
    +----------------+-------------------------+-------------------+
    |      1030      | IPv4 Router-ID of       | Section 5.3.2.1   |
    |                | Remote Node             |                   |
    +----------------+-------------------------+-------------------+
    |      1031      | IPv6 Router-ID of       | Section 5.3.2.1   |
    |                | Remote Node             |                   |
    +----------------+-------------------------+-------------------+
    |      1088      | Administrative group    | Section 5.3.2     |
    |                | (color)                 |                   |
    +----------------+-------------------------+-------------------+
    |      1089      | Maximum link bandwidth  | Section 5.3.2     |
    +----------------+-------------------------+-------------------+
    |      1090      | Max. reservable link    | Section 5.3.2     |
    |                | bandwidth               |                   |
    +----------------+-------------------------+-------------------+
    |      1091      | Unreserved bandwidth    | Section 5.3.2     |
    +----------------+-------------------------+-------------------+
    |      1092      | TE Default Metric       | Section 5.3.2.3   |
    +----------------+-------------------------+-------------------+
    |      1093      | Link Protection Type    | Section 5.3.2     |
    +----------------+-------------------------+-------------------+
    |      1094      | MPLS Protocol Mask      | Section 5.3.2.2   |
    +----------------+-------------------------+-------------------+
    |      1095      | IGP Metric              | Section 5.3.2.4   |
    +----------------+-------------------------+-------------------+
    |      1096      | Shared Risk Link Group  | Section 5.3.2.5   |
    +----------------+-------------------------+-------------------+
    |      1097      | Opaque Link Attribute   | Section 5.3.2.6   |
    +----------------+-------------------------+-------------------+
    |      1098      | Link Name               | Section 5.3.2.7   |
    +----------------+-------------------------+-------------------+
    |      1152      | IGP Flags               | Section 5.3.3.1   |
    +----------------+-------------------------+-------------------+
    |      1153      | IGP Route Tag           | Section 5.3.3.2   |
    +----------------+-------------------------+-------------------+
    |      1154      | IGP Extended Route Tag  | Section 5.3.3.3   |
    +----------------+-------------------------+-------------------+
    |      1155      | Prefix Metric           | Section 5.3.3.4   |
    +----------------+-------------------------+-------------------+
    |      1156      | OSPF Forwarding Address | Section 5.3.3.5   |
    +----------------+-------------------------+-------------------+
    |      1157      | Opaque Prefix Attribute | Section 5.3.3.6   |
    +----------------+-------------------------+-------------------+

Table 18: Summary Table of TLV/Sub-TLV Code Points 📋🎀

10. Security Considerations 🔐💀

okay this part is seriously important, bestie 😭🫶 so listen up.

procedures and protocol extensions defined in this document do not affect the BGP security model 🛡️ for the full scoop on BGP security, go read the Security Considerations section of [RFC4271] ✨. you should also check out [RFC4272] and [RFC6952] for analysis of security issues for BGP 🧐💜

the operator should make sure that a BGP-LS Speaker does not accept UPDATE messages from a peer that only provides information to a BGP-LS Consumer 🚫 they can do this by using the policy configuration options discussed in Sections 8.2.3 and 8.2.6 ⚙️ generally, the operator is aware of the BGP-LS Speaker's role and link-state peerings 👑 so the operator can protect the BGP-LS Speaker from peers sending updates that may represent erroneous information, feedback loops, or false input 🙅‍♀️✨

an error or tampering with the link-state information that gets originated into BGP-LS and propagated through the network for use by BGP-LS Consumer applications can result in those applications malfunctioning 💀😭 some examples of these risks are: origination of incorrect information that is not present or consistent with the IGP LSDB at the BGP-LS Producer, incorrect ordering of TLVs in the NLRI, or inconsistent origination from multiple BGP-LS Producers, plus updates to either the NLRI or BGP-LS Attribute during propagation (including discarding due to errors) 🌪️ these are not new risks from a BGP protocol perspective ✅ however, with BGP-LS, the impact lands on the consumer applications instead of on BGP routing functionalities 🎯

also, it may be considered that exporting the link-state and TE information described in this document is a risk to the confidentiality of mission-critical or commercially sensitive information about the network 🕵️‍♀️🔒 BGP peerings are not automatic and require configuration, so it is the responsibility of the network operator to make sure that only trusted BGP Speakers are configured to receive such information 🫡 similar security considerations also come up on the interface between BGP Speakers and BGP-LS Consumers, but discussing those is outside the scope of this document 🙈💖

11. References 📚🌈

11.1. Normative References 📚

okay bestie, these are the receipts 🧾 the normative list is the reading the spec leans on hardest, so here they are, every single one ✨

[ENTNUM]   IANA, "Private Enterprise Numbers (PENs)",
           <https://www.iana.org/assignments/enterprise-numbers/>.

[ISO10589] ISO, "Information technology - Telecommunications and
           information exchange between systems - Intermediate System
           to Intermediate System intra-domain routeing information
           exchange protocol for use in conjunction with the protocol
           for providing the connectionless-mode network service (ISO
           8473)", ISO/IEC 10589:2002, November 2002.

[RFC2119]  Bradner, S., "Key words for use in RFCs to Indicate
           Requirement Levels", BCP 14, RFC 2119,
           DOI 10.17487/RFC2119, March 1997,
           <https://www.rfc-editor.org/info/rfc2119>.

[RFC2328]  Moy, J., "OSPF Version 2", STD 54, RFC 2328,
           DOI 10.17487/RFC2328, April 1998,
           <https://www.rfc-editor.org/info/rfc2328>.

[RFC2545]  Marques, P. and F. Dupont, "Use of BGP-4 Multiprotocol
           Extensions for IPv6 Inter-Domain Routing", RFC 2545,
           DOI 10.17487/RFC2545, March 1999,
           <https://www.rfc-editor.org/info/rfc2545>.

[RFC3209]  Awduche, D., Berger, L., Gan, D., Li, T., Srinivasan, V.,
           and G. Swallow, "RSVP-TE: Extensions to RSVP for LSP
           Tunnels", RFC 3209, DOI 10.17487/RFC3209, December 2001,
           <https://www.rfc-editor.org/info/rfc3209>.

[RFC4202]  Kompella, K., Ed. and Y. Rekhter, Ed., "Routing Extensions
           in Support of Generalized Multi-Protocol Label Switching
           (GMPLS)", RFC 4202, DOI 10.17487/RFC4202, October 2005,
           <https://www.rfc-editor.org/info/rfc4202>.

[RFC4203]  Kompella, K., Ed. and Y. Rekhter, Ed., "OSPF Extensions in
           Support of Generalized Multi-Protocol Label Switching
           (GMPLS)", RFC 4203, DOI 10.17487/RFC4203, October 2005,
           <https://www.rfc-editor.org/info/rfc4203>.

[RFC4271]  Rekhter, Y., Ed., Li, T., Ed., and S. Hares, Ed., "A
           Border Gateway Protocol 4 (BGP-4)", RFC 4271,
           DOI 10.17487/RFC4271, January 2006,
           <https://www.rfc-editor.org/info/rfc4271>.

[RFC4577]  Rosen, E., Psenak, P., and P. Pillay-Esnault, "OSPF as the
           Provider/Customer Edge Protocol for BGP/MPLS IP Virtual
           Private Networks (VPNs)", RFC 4577, DOI 10.17487/RFC4577,
           June 2006, <https://www.rfc-editor.org/info/rfc4577>.

[RFC4760]  Bates, T., Chandra, R., Katz, D., and Y. Rekhter,
           "Multiprotocol Extensions for BGP-4", RFC 4760,
           DOI 10.17487/RFC4760, January 2007,
           <https://www.rfc-editor.org/info/rfc4760>.

[RFC4915]  Psenak, P., Mirtorabi, S., Roy, A., Nguyen, L., and P.
           Pillay-Esnault, "Multi-Topology (MT) Routing in OSPF",
           RFC 4915, DOI 10.17487/RFC4915, June 2007,
           <https://www.rfc-editor.org/info/rfc4915>.

[RFC5036]  Andersson, L., Ed., Minei, I., Ed., and B. Thomas, Ed.,
           "LDP Specification", RFC 5036, DOI 10.17487/RFC5036,
           October 2007, <https://www.rfc-editor.org/info/rfc5036>.

[RFC5120]  Przygienda, T., Shen, N., and N. Sheth, "M-ISIS: Multi
           Topology (MT) Routing in Intermediate System to
           Intermediate Systems (IS-ISs)", RFC 5120,
           DOI 10.17487/RFC5120, February 2008,
           <https://www.rfc-editor.org/info/rfc5120>.

[RFC5130]  Previdi, S., Shand, M., Ed., and C. Martin, "A Policy
           Control Mechanism in IS-IS Using Administrative Tags",
           RFC 5130, DOI 10.17487/RFC5130, February 2008,
           <https://www.rfc-editor.org/info/rfc5130>.

[RFC5301]  McPherson, D. and N. Shen, "Dynamic Hostname Exchange
           Mechanism for IS-IS", RFC 5301, DOI 10.17487/RFC5301,
           October 2008, <https://www.rfc-editor.org/info/rfc5301>.

[RFC5305]  Li, T. and H. Smit, "IS-IS Extensions for Traffic
           Engineering", RFC 5305, DOI 10.17487/RFC5305, October
           2008, <https://www.rfc-editor.org/info/rfc5305>.

[RFC5307]  Kompella, K., Ed. and Y. Rekhter, Ed., "IS-IS Extensions
           in Support of Generalized Multi-Protocol Label Switching
           (GMPLS)", RFC 5307, DOI 10.17487/RFC5307, October 2008,
           <https://www.rfc-editor.org/info/rfc5307>.

[RFC5340]  Coltun, R., Ferguson, D., Moy, J., and A. Lindem, "OSPF
           for IPv6", RFC 5340, DOI 10.17487/RFC5340, July 2008,
           <https://www.rfc-editor.org/info/rfc5340>.

[RFC5642]  Venkata, S., Harwani, S., Pignataro, C., and D. McPherson,
           "Dynamic Hostname Exchange Mechanism for OSPF", RFC 5642,
           DOI 10.17487/RFC5642, August 2009,
           <https://www.rfc-editor.org/info/rfc5642>.

[RFC5890]  Klensin, J., "Internationalized Domain Names for
           Applications (IDNA): Definitions and Document Framework",
           RFC 5890, DOI 10.17487/RFC5890, August 2010,
           <https://www.rfc-editor.org/info/rfc5890>.

[RFC6119]  Harrison, J., Berger, J., and M. Bartlett, "IPv6 Traffic
           Engineering in IS-IS", RFC 6119, DOI 10.17487/RFC6119,
           February 2011, <https://www.rfc-editor.org/info/rfc6119>.

[RFC6565]  Pillay-Esnault, P., Moyer, P., Doyle, J., Ertekin, E., and
           M. Lundberg, "OSPFv3 as a Provider Edge to Customer Edge
           (PE-CE) Routing Protocol", RFC 6565, DOI 10.17487/RFC6565,
           June 2012, <https://www.rfc-editor.org/info/rfc6565>.

[RFC7606]  Chen, E., Ed., Scudder, J., Ed., Mohapatra, P., and K.
           Patel, "Revised Error Handling for BGP UPDATE Messages",
           RFC 7606, DOI 10.17487/RFC7606, August 2015,
           <https://www.rfc-editor.org/info/rfc7606>.

[RFC7684]  Psenak, P., Gredler, H., Shakir, R., Henderickx, W.,
           Tantsura, J., and A. Lindem, "OSPFv2 Prefix/Link Attribute
           Advertisement", RFC 7684, DOI 10.17487/RFC7684, November
           2015, <https://www.rfc-editor.org/info/rfc7684>.

[RFC7770]  Lindem, A., Ed., Shen, N., Vasseur, JP., Aggarwal, R., and
           S. Shaffer, "Extensions to OSPF for Advertising Optional
           Router Capabilities", RFC 7770, DOI 10.17487/RFC7770,
           February 2016, <https://www.rfc-editor.org/info/rfc7770>.

[RFC8126]  Cotton, M., Leiba, B., and T. Narten, "Guidelines for
           Writing an IANA Considerations Section in RFCs", BCP 26,
           RFC 8126, DOI 10.17487/RFC8126, June 2017,
           <https://www.rfc-editor.org/info/rfc8126>.

[RFC8174]  Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
           2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
           May 2017, <https://www.rfc-editor.org/info/rfc8174>.

[RFC8362]  Lindem, A., Roy, A., Goethals, D., Reddy Vallem, V., and
           F. Baker, "OSPFv3 Link State Advertisement (LSA)
           Extensibility", RFC 8362, DOI 10.17487/RFC8362, April
           2018, <https://www.rfc-editor.org/info/rfc8362>.

[RFC8654]  Bush, R., Patel, K., and D. Ward, "Extended Message
           Support for BGP", RFC 8654, DOI 10.17487/RFC8654, October
           2019, <https://www.rfc-editor.org/info/rfc8654>.

11.2. Informative References 🧠

and now the informative ones 💜 these are the extra context reads, the background stuff that helps you understand the vibe without being the rulebook itself 🌸

[RFC1918]  Rekhter, Y., Moskowitz, B., Karrenberg, D., de Groot, G.
           J., and E. Lear, "Address Allocation for Private
           Internets", BCP 5, RFC 1918, DOI 10.17487/RFC1918,
           February 1996, <https://www.rfc-editor.org/info/rfc1918>.

[RFC4272]  Murphy, S., "BGP Security Vulnerabilities Analysis",
           RFC 4272, DOI 10.17487/RFC4272, January 2006,
           <https://www.rfc-editor.org/info/rfc4272>.

[RFC4364]  Rosen, E. and Y. Rekhter, "BGP/MPLS IP Virtual Private
           Networks (VPNs)", RFC 4364, DOI 10.17487/RFC4364, February
           2006, <https://www.rfc-editor.org/info/rfc4364>.

[RFC4655]  Farrel, A., Vasseur, J.-P., and J. Ash, "A Path
           Computation Element (PCE)-Based Architecture", RFC 4655,
           DOI 10.17487/RFC4655, August 2006,
           <https://www.rfc-editor.org/info/rfc4655>.

[RFC5152]  Vasseur, JP., Ed., Ayyangar, A., Ed., and R. Zhang, "A
           Per-Domain Path Computation Method for Establishing Inter-
           Domain Traffic Engineering (TE) Label Switched Paths
           (LSPs)", RFC 5152, DOI 10.17487/RFC5152, February 2008,
           <https://www.rfc-editor.org/info/rfc5152>.

[RFC5392]  Chen, M., Zhang, R., and X. Duan, "OSPF Extensions in
           Support of Inter-Autonomous System (AS) MPLS and GMPLS
           Traffic Engineering", RFC 5392, DOI 10.17487/RFC5392,
           January 2009, <https://www.rfc-editor.org/info/rfc5392>.

[RFC5693]  Seedorf, J. and E. Burger, "Application-Layer Traffic
           Optimization (ALTO) Problem Statement", RFC 5693,
           DOI 10.17487/RFC5693, October 2009,
           <https://www.rfc-editor.org/info/rfc5693>.

[RFC5706]  Harrington, D., "Guidelines for Considering Operations and
           Management of New Protocols and Protocol Extensions",
           RFC 5706, DOI 10.17487/RFC5706, November 2009,
           <https://www.rfc-editor.org/info/rfc5706>.

[RFC6549]  Lindem, A., Roy, A., and S. Mirtorabi, "OSPFv2 Multi-
           Instance Extensions", RFC 6549, DOI 10.17487/RFC6549,
           March 2012, <https://www.rfc-editor.org/info/rfc6549>.

[RFC6952]  Jethanandani, M., Patel, K., and L. Zheng, "Analysis of
           BGP, LDP, PCEP, and MSDP Issues According to the Keying
           and Authentication for Routing Protocols (KARP) Design
           Guide", RFC 6952, DOI 10.17487/RFC6952, May 2013,
           <https://www.rfc-editor.org/info/rfc6952>.

[RFC7285]  Alimi, R., Ed., Penno, R., Ed., Yang, Y., Ed., Kiesel, S.,
           Previdi, S., Roome, W., Shalunov, S., and R. Woundy,
           "Application-Layer Traffic Optimization (ALTO) Protocol",
           RFC 7285, DOI 10.17487/RFC7285, September 2014,
           <https://www.rfc-editor.org/info/rfc7285>.

[RFC7752]  Gredler, H., Ed., Medved, J., Previdi, S., Farrel, A., and
           S. Ray, "North-Bound Distribution of Link-State and
           Traffic Engineering (TE) Information Using BGP", RFC 7752,
           DOI 10.17487/RFC7752, March 2016,
           <https://www.rfc-editor.org/info/rfc7752>.

[RFC7911]  Walton, D., Retana, A., Chen, E., and J. Scudder,
           "Advertisement of Multiple Paths in BGP", RFC 7911,
           DOI 10.17487/RFC7911, July 2016,
           <https://www.rfc-editor.org/info/rfc7911>.

[RFC8202]  Ginsberg, L., Previdi, S., and W. Henderickx, "IS-IS
           Multi-Instance", RFC 8202, DOI 10.17487/RFC8202, June
           2017, <https://www.rfc-editor.org/info/rfc8202>.

[RFC9029]  Farrel, A., "Updates to the Allocation Policy for the
           Border Gateway Protocol - Link State (BGP-LS) Parameters
           Registries", RFC 9029, DOI 10.17487/RFC9029, June 2021,
           <https://www.rfc-editor.org/info/rfc9029>.

[RFC9346]  Chen, M., Ginsberg, L., Previdi, S., and D. Xiaodong, "IS-
           IS Extensions in Support of Inter-Autonomous System (AS)
           MPLS and GMPLS Traffic Engineering", RFC 9346,
           DOI 10.17487/RFC9346, February 2023,
           <https://www.rfc-editor.org/info/rfc9346>.

Appendix A. Changes from RFC 7752 ✨

okay so this section is the big recap of everything that changed from [RFC7752]! 🦋 It lists the high-level changes and points you to the sections where each one lives, so you can jump right to the good stuff 💅

  1. Updated Figure 1 in Section 1 and added Section 3 to show the different roles a BGP implementation can play when it's passing along link-state information 🌸
  2. Clarified the bits about advertising link-state information from IGPs into BGP-LS in Section 4 🧚
  3. In Section 5.1, clarified TLV handling that applies to both the NLRI and BGP-LS Attribute parts, plus the stuff that only applies to the NLRI portion. An implementation might have missed the bit about handling an unknown TLV, and so, following the [RFC7606] guidelines, it might throw away the unknown NLRI types 😭. This is now crystal clear in Section 5.2. Also, TLVs in the BGP-LS Attribute that aren't ordered are NOT to be treated as malformed 🎀
  4. Clarified the mandatory and optional TLVs in both the NLRI and BGP-LS Attribute portions all through the document 💖
  5. In Section 5.3, explained how to handle a large BGP-LS Attribute as the BGP-LS information grows, along with how to deal with the errors that can come from it 🔥
  6. Clarified that this document describes the NLRI descriptor TLVs for the protocols and NLRI types specified here, and that future BGP-LS extensions must describe the same for any other protocols and NLRI types they introduce ⭐
  7. In Section 5.2, cleaned up the use of the Identifier field in the Link-State NLRI. It used to be defined in a confusing way, referring only to multi-instance IGP on a single link, but it can also be used for multiple IGP protocol instances on a router 🙈. The IANA registry is accordingly being removed 🥀
  8. The BGP-LS Identifier TLV in the Node Descriptors has been deprecated 💀. [RFC7752] didn't specify its use very well, and implementers got pretty confused about whether it identifies IGP domains or whether they should use the Identifier field carrying the BGP-LS Instance-ID when running multiple IGP instances 😵‍💫. The original idea was that, together with the ASN, it would uniquely identify the BGP-LS domain, and the combination of ASN and BGP-LS ID would be globally unique. But the BGP-LS Instance-ID carried in the Identifier field in the fixed part of the NLRI already does a similar job, so including the BGP-LS Identifier TLV isn't necessary anymore 🧠. If it was advertised, every BGP-LS Speaker within an IGP flooding-set (the set of IGP nodes within which an LSP/LSA is flooded) had to use the same (ASN, BGP-LS ID) tuple. And if an IGP domain was made up of multiple flooding-sets, then every BGP-LS Speaker within the IGP domain had to use the same (ASN, BGP-LS ID) tuple 👑
  9. Clarified that the Area-ID TLV is mandatory in the Node Descriptor when originating information from OSPF, EXCEPT when sourcing information from AS-scope LSAs, where this TLV doesn't apply 🌈. Also clarified the IS-IS area and area addresses 🍓
  10. Moved the MT-ID TLV from the Node Descriptor section to the Link Descriptor section, since it isn't a Node Descriptor sub-TLV 🦋. Fixed the ambiguity in the encoding of OSPF MT-ID in this TLV ✨. Updated the IS-IS specification reference section and described how the applicability of the R flags differs when the MT-ID TLV is used as the Link Descriptor TLV versus the Prefix Attribute TLV 💅. The MT-ID TLV use is now elevated to SHOULD when it's enabled in the underlying IGP 🫶
  11. Clarified that IPv6 link-local addresses are NOT advertised in the Link Descriptor TLVs. Instead, the local/remote identifiers are used, but only for links that have IPv6 link-local addresses alone 🌸
  12. Updated the usage of the OSPF Route Type TLV so it's mandatory for OSPF prefixes in Section 5.2.3.1 🎀. This matters because it's needed to separate intra-area prefixes used to reach a node (like a loopback) from other kinds of inter-area and external prefixes 🧚
  13. Clarified the specific OSPFv2 and OSPFv3 protocol TLV space to be used in the Node, Link, and Prefix Opaque Attribute TLVs 💖
  14. Clarified that the length of the Node Flag Bits and IGP Flags TLVs is one octet 🔥
  15. Updated the Node Name TLV in Section 5.3.1.3 to match the OSPF specification ⭐
  16. Clarified the size of the IS-IS Narrow Metric advertisement via the IGP Metric TLV, and how the unused bits are handled 🙈
  17. Clarified the advertisement of the prefix corresponding to the LAN segment in an OSPF network in Section 5.11 🥀
  18. Clarified the advertisement of, and support for, OSPF-specific concepts like virtual links, sham links, and Type 4 LSAs in Sections 5.7 and 5.8 💀
  19. Introduced the Private Use TLV code point space and specified its encoding in Section 5.4 😵‍💫
  20. In Section 5.9, introduced where the issues related to consistency of reporting IGP link-state are covered, along with their solutions 🧠
  21. Added a recommendation to isolate BGP-LS sessions from other BGP route exchanges, so errors and faults in BGP-LS don't affect normal BGP routing 👑
  22. Updated the Fault Management section with detailed rules based on the role of the BGP Speaker in the BGP-LS information propagation flow 🌈
  23. Changed the management of BGP-LS IANA registries from "Specification Required" to "Expert Review", along with updated guidelines for designated experts. Specifically, this includes the changes introduced via [RFC9029] that are obsoleted by this document 🍓
  24. Added BGP-LS IANA registries with an "Expert Review" policy for the flag fields of various TLVs, which had been missed before 🦋. Renamed the BGP-LS TLV registry and removed the "IS-IS TLV/Sub-TLV" column from it ✨

Acknowledgements 🫶

This document update to the BGP-LS specification [RFC7752] is the result of feedback and input from the discussions in the IDR Working Group 💜. It also includes certain details and clarifications based on implementation and deployment experience with BGP-LS 🌸

Cengiz Alaettinoglu and Parag Amritkar brought forward the need to clarify the advertisement of a LAN subnet for OSPF 🎀

We would like to thank Balaji Rajagopalan, Srihari Sangli, Shraddha Hegde, Andrew Stone, Jeff Tantsura, Acee Lindem, Les Ginsberg, Jie Dong, Aijun Wang, Nandan Saha, Joel Halpern, and Gyan Mishra for their review and feedback on this document 🧚. Thanks to Tom Petch for his review and comments on the IANA Considerations section 💖. We would also like to thank Jeffrey Haas for his detailed shepherd review and input for improving the document 🔥

The detailed AD review by Alvaro Retana and his suggestions have helped improve this document significantly ⭐

We would like to thank Robert Varga for his significant contribution to [RFC7752] 🙈

We would like to thank Nischal Sheth, Alia Atlas, David Ward, Derek Yeung, Murtuza Lightwala, John Scudder, Kaliraj Vairavakkalai, Les Ginsberg, Liem Nguyen, Manish Bhardwaj, Matt Miller, Mike Shand, Peter Psenak, Rex Fernando, Richard Woundy, Steven Luong, Tamas Mondal, Waqas Alam, Vipin Kumar, Naiming Shen, Carlos Pignataro, Balaji Rajagopalan, Yakov Rekhter, Alvaro Retana, Barry Leiba, and Ben Campbell for their comments on [RFC7752] 🥀


Contributors 🌈

The following people contributed significant text to [RFC7752] and this document. They should be considered coauthors 👑

  • Hannes Gredler
    • Rtbrick
    • Email: hannes@rtbrick.com
  • Jan Medved
    • Cisco Systems Inc.
    • United States of America
    • Email: jmedved@cisco.com
  • Stefano Previdi
    • Huawei Technologies
    • Italy
    • Email: stefano@previdi.net
  • Adrian Farrel
    • Old Dog Consulting
    • Email: adrian@olddog.co.uk
  • Saikat Ray
    • Individual
    • United States of America
    • Email: raysaikat@gmail.com

Author's Address 💅

  • Ketan Talaulikar (editor)
    • Cisco Systems
    • India
    • Email: ketant.ietf@gmail.com

That's the whole spec, bestie!! 🌈✨🎀 Every last detail is in there, so you're officially ready to implement BGP-LS 💜🦋

📦 where this page comes from