From 92543b7a989281f4427aaf041776f7e5b396835f Mon Sep 17 00:00:00 2001 From: Randy Bush Date: Tue, 16 Apr 2019 09:04:18 -0700 Subject: [PATCH] a pass to make it cleaner and more consistent --- draft-ietf-lsvr-l3dl.xml | 264 ++++++++++++++++++++------------------- 1 file changed, 138 insertions(+), 126 deletions(-) diff --git a/draft-ietf-lsvr-l3dl.xml b/draft-ietf-lsvr-l3dl.xml index 977dc22..64aacda 100644 --- a/draft-ietf-lsvr-l3dl.xml +++ b/draft-ietf-lsvr-l3dl.xml @@ -60,7 +60,7 @@ protocols need IP neighbor discovery, logical link encapsulation data, and Layer 2 liveness. The Layer 3 Discovery and Liveness protocol provides discovery of the neighbor on a logical link, - exchanges supported encapsulations (IPv4, IPv6, ...) with them, + exchanges supported encapsulations (IPv4, IPv6, ...) with neighbors, discovers encapsulation addresses (Layer 3 / MPLS identifiers), and provides layer 2 liveness checking. The interface data are pushed directly to a BGP API (for LSVR), obviating the need for centralized @@ -97,7 +97,8 @@ environments. But BGP-SPF and similar higher level device-spanning protocols, e.g. , need logical link state and addressing data from the network to build the - routing topology. + routing topology. They also need prompt reaction to (logical) link + failure. Layer 3 Discovery and Liveness (L3DL) provides brutally simple mechanisms for devices to @@ -106,8 +107,8 @@ Run Layer 2 keep-alive messages for session continuity, Discover each other's unique IDs (ASN, RouterID, ...), Discover mutually supported encapsulations, e.g. IP/MPLS, - Discover Layer 3 and/or MPLS addressing of interfaces of the - encapsulations, + Discover Layer 3 IP and/or MPLS addressing of interfaces of the + encapsulations, Enable layer 3 link liveness such as BFD, and finally Present these data, using a very restricted profile of a BGP-LS API, to BGP-SPF which computes the @@ -123,8 +124,8 @@
Even though it concentrates on the inter-device layer, this - document relies heavily on routing terminology. The following are - some possibly confusing terms: + document relies heavily on routing terminology. The following + attempts to clarify the use of some possibly confusing terms: Autonomous System Number Address Family Indicator and Subsequent Address Family Indicator (AFI/SAFI). I.e. classes of - addresses such as IPv4, IPv6, MPLS, ... + layer 2.5 and 3 addresses such as IPv4, IPv6, MPLS, ... An Ethernet Layer 2 packet. - A logical connection between two logical ports - on two devices. E.g. two VLANs between the same two ports are two - links. + A logical connection between + two logical ports on two devices. E.g. two VLANs between the same + two ports are two links. Logical Link Endpoint Identifier, the unique identifier of one end of a logical link, see . @@ -166,7 +167,7 @@ current routing domain, see updated by . An established, via OPEN PDUs, session - between two L3DL capable devices, + between two L3DL capable link end-points, Shortest Path First, an algorithm for finding the shortest paths between nodes in a graph; AKA Dijkstra's algorithm. @@ -182,7 +183,7 @@
- L3DL assumes a datacenter scale and topology, but can + L3DL assumes a Clos type datacenter scale and topology, but can accommodate richer topologies which contain potential cycles. While L3DL is designed for the MDC, there are no inherent @@ -196,7 +197,7 @@ The number of addresses of the Encapsulations on a link may be fairly large given a TOR with more than 20 servers, each server - possibly having on the order of a hundred micro services resulting + possibly having on the order of a hundred micro-services resulting in an inordinate number of addresses. And security will further add to the length of PDUs. PDUs with lengths over 10,000 octets are likely or quite possible. @@ -244,12 +245,12 @@ There are two protocols, the inter-device per-link layer 3 - discovery and the interface to the upper level BGP-like protocol: + discovery and the interface to the upper level BGP-like API: Inter-device PDUs are used to exchange device and logical link - identities and layer 2.5 and 3 identifiers (not payloads), - e.g. device IDs, port identities, VLAN IDs, Encapsulations, and IP + identities and layer 2.5 and 3 identifiers (not payloads), e.g. + device IDs, port identities, VLAN IDs, Encapsulations, and IP addresses. A Link Layer to BGP API presents these data up the stack to @@ -269,9 +270,12 @@
L3DL discovers neighbors on logical links and establishes - sessions between the two ends of all discovered logical links. A - logical link is described by a pair of Logical Link Endpoint - Identifiers, LLEIs. + sessions between the two ends of all consenting discovered logical + links. A logical link is described by a pair of Logical Link + Endpoint Identifiers, LLEIs. + + An L3DL deployment will choose and define an LLEI which suits + their needs, simple or complex. Two extremes are as follows: A simplistic view of a link between two devices is two ports, identified by unique MAC addresses, carrying a layer 3 protocol @@ -302,12 +306,12 @@ ifIndex is the SNMP identifier of the (sub-)interface, see . + target="RFC1213"/>. This uniquely identifies the port. System MAC is an identifier unique in the entore operational - space. Routers and switches have internal system MACs. If none - exists on a device, the local L3DL configuration SHOULD assign one - by configuration. + space. Routers and switches have internal system MACs which can be + used. If none exists on a device, the local L3DL configuration + SHOULD create and assign a unique one by configuration. The VLAN ID is the 802.1Q identifier of the virtual link's VLAN if a VLAN is configured, otherwise zero. @@ -348,7 +352,7 @@
-| HELLO | Link Peer discovery +| HELLO | Logical Link Peer discovery |---------------------------->| | HELLO | Mandatory |<----------------------------| @@ -432,9 +436,7 @@ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Version |L|Datagram Num.| Datagram Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -| Sec Type | Sec Length | ~ -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ~ -~ Sec Data ~ +| Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
@@ -445,12 +447,13 @@ Version number of the protocol, currently 0. Values other than 0 are treated as errors. - A bit that set to 1 if this Datagram is the last - Datagram of the PDU. For a PDU which fits in only one Datagram, - it is set to one. + A bit that set to one if this Datagram is the + last Datagram of the PDU. For a PDU which fits in only one + Datagram, it is set to one. 0..127, a monotonically increasing - value, modulo 128, see . + value, modulo 128, see . Note that this + does not limit an L3DL PDU to 128 frames. Total number of octets in the Datagram including all payloads and fields. @@ -458,8 +461,8 @@ A 32 bit hash over the Datagram to detect bit flips, see . - -
+
+
@@ -533,8 +536,9 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n)
The basic L3DL application layer PDU is a typical TLV (Type - Length Value) PDU. It may be broken into multiple Datagrams, see - + Length Value) PDU. It includes a signature to provide optional + integrity and authentication. It may be broken into multiple + Datagrams, see
- 0 1 2 - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -| Type = 0 | PDU Length = 3 | -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + 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 = 0 | Payload Length = 0 | Sig Type = 0 | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Signature Length = 0 | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
If more than one device responds, one adjacency is formed for each unique (source link address) response. L3DL treats each - adjacency as a separate link. + adjacency as a separate logical link. When a HELLO is received from a source link address with which there is no established L3DL adjacency, the receiver SHOULD respond with an OPEN PDU. The two devices establish an L3DL adjacency by exchanging OPEN PDUs. - HELLO PDUs can not be signed as keying material has yet to be - exchanged. + The Payload Length is zero as there is no payload. - The PDU Length is the octet count of the entire PDU, including - the Type and the Datagram Length field itself. + HELLO PDUs can not be signed as keying material has yet to be + exchanged. Hence the signature MUST always be null.
@@ -679,7 +684,7 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n) 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 = 1 | Payload Length | | +| Type = 1 | Payload Length | ~ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Nonce | ID Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -701,19 +706,19 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n) The Payload Length is the number of octets in all fields of the - PDU from the Type to the Authentication Data, excluding the Sig + PDU from the Nonce to the Authentication Data, excluding the Sig Type, the Signature Length, and the Signature. The Nonce enables detection of a duplicate OPEN PDU. It SHOULD - be either a random number or time of day. It is needed to prevent - session closure due to a repeated OPEN caused by a race or a dropped - or delayed ACK. + be either a random number or the time of day. It is needed to + prevent session closure due to a repeated OPEN caused by a race or a + dropped or delayed ACK. My ID is the sending LLEI, see . It can be an ASN with high order bits zero, a classic RouterID with high order bits zero, a catenation of the two, a 80-bit ISO System-ID, or any - other identifier unique to a single device in the topology. IDs are - big-endian. + other identifier unique to a single logical link endpoint in the + topology. IDs are big-endian. AttrCount is the number of attributes in the Attribute List. Attributes are single octets whose semantics are user-defined. @@ -738,12 +743,12 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n) L3DL session, an ERROR PDU is sent (Error Code 2), and HELLOs MUST be restarted. - The Signature fileds are described in and - serve as a proof of possession of the signing auth data by - sender. + The Signature fileds are described in and in + an asymmetric key environment serve as a proof of possession of the + signing auth data by the sender. - Once two devices know each other's LLEIs, and have ACKed each - other's OPEN PDUs, Layer 2 KEEPALIVEs (see Once two logical link endpoints know each other, and have ACKed + each other's OPEN PDUs, Layer 2 KEEPALIVEs (see ) MAY be started to ensure Layer 2 liveness and keep the session semantics alive. The timing and acceptable drop of KEEPALIVE PDUs are discussed in . @@ -755,22 +760,22 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n) SHOULD use exponential back-off, see . If a properly authenticated OPEN arrives with a new Nonce from an - LLEI with which the receiving device believes it already has an L3DL - session (OPENs have already been exchanged), the receiver MUST - assume that the sending LLEI or entire device has been reset. All - discovered encapsulation data SHOULD be withdrawn via the BGP-LS API - and the recipient MUST respond with a new OPEN. In this - circumstance encapsulations SHOULD NOT be kept because, while the - new OPEN is likely to be followed by new encapsulation PDUs of the - same data, the old session might have an encapsulation type not in - the new session. + LLEI with which the receiving logical link endpoint believes it + already has an L3DL session (OPENs have already been exchanged), the + receiver MUST assume that the sending LLEI or entire device has been + reset. All discovered encapsulation data SHOULD be withdrawn via + the BGP-LS API and the recipient MUST respond with a new OPEN. In + this circumstance encapsulations SHOULD NOT be kept because, while + the new OPEN is likely to be followed by new encapsulation PDUs of + the same data, the old session might have an encapsulation type not + in the new session.
The ACK PDU acknowledges receipt of a PDU and reports any error @@ -781,7 +786,7 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n) 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 = 3 | Payload Length = 8 | PDU Type | +| Type = 3 | Payload Length = 5 | PDU Type | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | EType | Error Code | Error Hint | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -848,7 +853,7 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n) Once the devices know each other's LLEIs, know each other's upper layer identities, have means to ensure link state, etc., the L3DL session is considered established, and the devices SHOULD exchange - their interface encapsulations, addresses, (and labels). + interface encapsulations, addresses, (and labels). The Encapsulation types the peers exchange may be IPv4 Announcement (), IPv6 Announcement ( - Further, to consider a link of a type to formally be established - so that it may be pushed up to upper layer protocols, the addressing - for the type must be compatible, e.g. on the same IPvX subnet. + Further, to consider a logical link of a type to formally be + established so that it may be pushed up to upper layer protocols, + the addressing for the type must be compatible, e.g. on the same + IPvX subnet.
@@ -881,7 +887,7 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n) protocol "Type:8,Payload Length:16,Count:8,...:8,Encapsulation List...:24,Sig Type:8,Signature Length:16,Signature ...:40" --> -
+
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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -894,7 +900,7 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n) ~ Signature ... ~ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -
+
The 16-bit Count is the number of Encapsulations in the Encapsulation list. @@ -927,7 +933,7 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n) Over time, multiple Encapsulation PDUs may be sent for an interface as configuration changes. - + If the length of an Encapsulation PDU exceeds the Datagram size limit on media, the PDU is broken into multiple Datagrams. See . @@ -948,8 +954,8 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n)
-
- +
+ 0 1 2 3 ... 7 +---------------+---------------+---------------+---------------+ | Primary | Loopback | Reserved ... | | @@ -971,7 +977,7 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n) The IPv4 Encapsulation describes a device's ability to exchange IPv4 packets on one or more subnets. It does so by stating the interface's addresses and the corresponding prefix lengths. - + @@ -992,8 +998,8 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n) ~ Signature ... ~ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -
- +
+ The 16-bit Count is the number of IPv4 Encapsulations.
@@ -1047,7 +1053,7 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n) -->
- + 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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -1075,7 +1081,7 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n) -->
- + 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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -1091,12 +1097,12 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n) +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ~ ~ Signature ... ~ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - +
The 16-bit Count is the number of MPLSv6 Encapsulations. -
+
@@ -1109,7 +1115,7 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n) -->
- + 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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -1141,30 +1147,32 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n)
- L3DL devices MUST beacon occasional Layer 2 KEEPALIVE PDUs to + L3DL devices SHOULD beacon frequent Layer 2 KEEPALIVE PDUs to ensure session continuity. They SHOULD be beaconed at a configured frequency. One per - second is the default. Layer 3 liveness, such as BFD, will likely - be more aggressive. + second is the default. Layer 3 liveness, such as BFD, may be more + aggressive. If a KEEPALIVE is not received from a peer with which a receiver - has an open session for a configurable time (default one minute), + has an open session for a configurable time (default 30 seconds), the session SHOULD BE presumed closed. The devices MAY keep configuration state until a new session is established and new Encapsulation PDUs are received.
- 0 1 2 - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -| Type = 2 | Length = 3 | -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + 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 = 2 | Payload Length = 0 | Sig Type = 0 | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Signature Length = 0 | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
@@ -1173,7 +1181,7 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n)
@@ -1181,7 +1189,7 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n) 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 = 255 | Length | ... | +| Type = 255 | Payload Length | ... | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Enterprise Number | Ent Type | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -1225,8 +1233,8 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n) Thus far, a one-hop point-to-point logical link discovery protocol has been defined. - The nodes know the unique LLEIs and Encapsulations on each link - interface. + The devices know their unique LLEIs and know the unique peer + LLEIs and Encapsulations on each logical link interface. Full topology discovery is not appropriate at the L3DL layer, so Dijkstra à la IS-IS etc. is assumed to be done by higher level @@ -1282,30 +1290,34 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n)
+ A device with multiple Layer 2 interfaces, traditionally called a switch, may be used to forward frames and therefore packets from - multiple devices to one interface, I, on an L3DL speaking device. - Interface I could discover a peer J across the switch. Later, a - prospective peer K could come up across the switch. If I was not - still sending and listening for HELLOs, the potential peering with - K could not be discovered. Therefore, interfaces MUST continue to - send HELLOs as long as they are turned up. + multiple devices to one logical interface (LLEI), I, on an L3DL + speaking device. Interface I could discover a peer J across the + switch. Later, a prospective peer K could come up across the + switch. If I was not still sending and listening for HELLOs, the + potential peering with K could not be discovered. Therefore, + interfaces MUST continue to send HELLOs as long as they are turned + up.
Both HELLO and KEEPALIVE are periodic. KEEPALIVE might be - eliminated in favor of keeping only HELLOs. But currently - KEEPALIVE is unicast, and thus less noisy on the network, - especially if HELLO is configured to transit layer-2-only - switches. + eliminated in favor of keeping only HELLOs. But KEEPALIVEs are + unicast, and thus less noisy on the network, especially if HELLO + is configured to transit layer-2-only switches, see .
@@ -1330,8 +1342,8 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n)
- An implementation SHOULD provide the ability to configure an - interface as L3DL speaking or not. + An implementation SHOULD provide the ability to configure a + logical interface as L3DL speaking or not. An implementation SHOULD provide the ability to configure whether HELLOs on an L3DL enabled interface send Nearest Bridge or Nearest @@ -1354,8 +1366,8 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n) The protocol as it is MUST NOT be used outside a datacenter or similarly closed environment due to lack of formal definition of the - authentication and authorisation mechanism. These are works in - process. + authentication and authorisation mechanism. Sufficient mechanisms + may be descrived in separate documents. Many MDC operators have a strange belief that physical walls and firewalls provide sufficient security. This is not credible. All @@ -1411,11 +1423,11 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n) be the following:
- Bit Bit Name - ---- ------------------- - 0 Null - 1 TOFU - Trust On First Use - 2-255 Reserved + Number Name + ------ ------------------- + 0 Null + 1 TOFU - Trust On First Use + 2-255 Reserved