a pass to make it cleaner and more consistent

This commit is contained in:
Randy Bush 2019-04-16 09:04:18 -07:00
parent ee01fba1ea
commit 92543b7a98

View file

@ -60,7 +60,7 @@
protocols need IP neighbor discovery, logical link encapsulation protocols need IP neighbor discovery, logical link encapsulation
data, and Layer 2 liveness. The Layer 3 Discovery and Liveness data, and Layer 2 liveness. The Layer 3 Discovery and Liveness
protocol provides discovery of the neighbor on a logical link, 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 discovers encapsulation addresses (Layer 3 / MPLS identifiers), and
provides layer 2 liveness checking. The interface data are pushed provides layer 2 liveness checking. The interface data are pushed
directly to a BGP API (for LSVR), obviating the need for centralized 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 environments. But BGP-SPF and similar higher level device-spanning
protocols, e.g. <xref target="I-D.malhotra-bess-evpn-lsoe"/>, need protocols, e.g. <xref target="I-D.malhotra-bess-evpn-lsoe"/>, need
logical link state and addressing data from the network to build the logical link state and addressing data from the network to build the
routing topology.</t> routing topology. They also need prompt reaction to (logical) link
failure.</t>
<t>Layer 3 Discovery and Liveness (L3DL) provides brutally simple <t>Layer 3 Discovery and Liveness (L3DL) provides brutally simple
mechanisms for devices to <list style="symbols"> mechanisms for devices to <list style="symbols">
@ -106,8 +107,8 @@
<t>Run Layer 2 keep-alive messages for session continuity,</t> <t>Run Layer 2 keep-alive messages for session continuity,</t>
<t>Discover each other's unique IDs (ASN, RouterID, ...),</t> <t>Discover each other's unique IDs (ASN, RouterID, ...),</t>
<t>Discover mutually supported encapsulations, e.g. IP/MPLS,</t> <t>Discover mutually supported encapsulations, e.g. IP/MPLS,</t>
<t>Discover Layer 3 and/or MPLS addressing of interfaces of the <t>Discover Layer 3 IP and/or MPLS addressing of interfaces of the
encapsulations,</t> encapsulations,</t>
<t>Enable layer 3 link liveness such as BFD, and finally</t> <t>Enable layer 3 link liveness such as BFD, and finally</t>
<t>Present these data, using a very restricted profile of a BGP-LS <t>Present these data, using a very restricted profile of a BGP-LS
<xref target="RFC7752"/> API, to BGP-SPF which computes the <xref target="RFC7752"/> API, to BGP-SPF which computes the
@ -123,8 +124,8 @@
<section anchor="terminology" title="Terminology"> <section anchor="terminology" title="Terminology">
<t>Even though it concentrates on the inter-device layer, this <t>Even though it concentrates on the inter-device layer, this
document relies heavily on routing terminology. The following are document relies heavily on routing terminology. The following
some possibly confusing terms: attempts to clarify the use of some possibly confusing terms:
<list hangIndent="11" style="hanging"> <list hangIndent="11" style="hanging">
<?rfc subcompact="yes"?> <?rfc subcompact="yes"?>
<t hangText="ASN:">Autonomous System Number <xref <t hangText="ASN:">Autonomous System Number <xref
@ -143,11 +144,11 @@
frame. A full L3DL PDU may be packaged in multiple Datagrams.</t> frame. A full L3DL PDU may be packaged in multiple Datagrams.</t>
<t hangText="Encapsulation:">Address Family Indicator and <t hangText="Encapsulation:">Address Family Indicator and
Subsequent Address Family Indicator (AFI/SAFI). I.e. classes of Subsequent Address Family Indicator (AFI/SAFI). I.e. classes of
addresses such as IPv4, IPv6, MPLS, ...</t> layer 2.5 and 3 addresses such as IPv4, IPv6, MPLS, ...</t>
<t hangText="Frame:">An Ethernet Layer 2 packet.</t> <t hangText="Frame:">An Ethernet Layer 2 packet.</t>
<t hangText="Link:">A logical connection between two logical ports <t hangText="Link or Logical Link:">A logical connection between
on two devices. E.g. two VLANs between the same two ports are two two logical ports on two devices. E.g. two VLANs between the same
links.</t> two ports are two links.</t>
<t hangText="LLEI:">Logical Link Endpoint Identifier, the unique <t hangText="LLEI:">Logical Link Endpoint Identifier, the unique
identifier of one end of a logical link, see <xref identifier of one end of a logical link, see <xref
target="llei"/>.</t> target="llei"/>.</t>
@ -166,7 +167,7 @@
current routing domain, see <xref target="RFC4271"/> updated by current routing domain, see <xref target="RFC4271"/> updated by
<xref target="RFC6286"/>.</t> <xref target="RFC6286"/>.</t>
<t hangText="Session:">An established, via OPEN PDUs, session <t hangText="Session:">An established, via OPEN PDUs, session
between two L3DL capable devices,</t> between two L3DL capable link end-points,</t>
<t hangText="SPF:">Shortest Path First, an algorithm for finding <t hangText="SPF:">Shortest Path First, an algorithm for finding
the shortest paths between nodes in a graph; AKA Dijkstra's the shortest paths between nodes in a graph; AKA Dijkstra's
algorithm.</t> algorithm.</t>
@ -182,7 +183,7 @@
<section anchor="background" title="Background"> <section anchor="background" title="Background">
<t>L3DL assumes a datacenter scale and topology, but can <t>L3DL assumes a Clos type datacenter scale and topology, but can
accommodate richer topologies which contain potential cycles.</t> accommodate richer topologies which contain potential cycles.</t>
<t>While L3DL is designed for the MDC, there are no inherent <t>While L3DL is designed for the MDC, there are no inherent
@ -196,7 +197,7 @@
<t>The number of addresses of the Encapsulations on a link may be <t>The number of addresses of the Encapsulations on a link may be
fairly large given a TOR with more than 20 servers, each server 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 in an inordinate number of addresses. And security will further add
to the length of PDUs. PDUs with lengths over 10,000 octets are to the length of PDUs. PDUs with lengths over 10,000 octets are
likely or quite possible.</t> likely or quite possible.</t>
@ -244,12 +245,12 @@
</figure> </figure>
<t>There are two protocols, the inter-device per-link layer 3 <t>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:
<list style="symbols"> <list style="symbols">
<t>Inter-device PDUs are used to exchange device and logical link <t>Inter-device PDUs are used to exchange device and logical link
identities and layer 2.5 and 3 identifiers (not payloads), identities and layer 2.5 and 3 identifiers (not payloads), e.g.
e.g. device IDs, port identities, VLAN IDs, Encapsulations, and IP device IDs, port identities, VLAN IDs, Encapsulations, and IP
addresses.</t> addresses.</t>
<t>A Link Layer to BGP API presents these data up the stack to <t>A Link Layer to BGP API presents these data up the stack to
@ -269,9 +270,12 @@
<section anchor="llei" title="Logical Link Endpoint Identifier"> <section anchor="llei" title="Logical Link Endpoint Identifier">
<t>L3DL discovers neighbors on logical links and establishes <t>L3DL discovers neighbors on logical links and establishes
sessions between the two ends of all discovered logical links. A sessions between the two ends of all consenting discovered logical
logical link is described by a pair of Logical Link Endpoint links. A logical link is described by a pair of Logical Link
Identifiers, LLEIs.</t> Endpoint Identifiers, LLEIs.</t>
<t>An L3DL deployment will choose and define an LLEI which suits
their needs, simple or complex. Two extremes are as follows:</t>
<t>A simplistic view of a link between two devices is two ports, <t>A simplistic view of a link between two devices is two ports,
identified by unique MAC addresses, carrying a layer 3 protocol identified by unique MAC addresses, carrying a layer 3 protocol
@ -302,12 +306,12 @@
</figure> </figure>
<t>ifIndex is the SNMP identifier of the (sub-)interface, see <xref <t>ifIndex is the SNMP identifier of the (sub-)interface, see <xref
target="RFC1213"/>.</t> target="RFC1213"/>. This uniquely identifies the port.</t>
<t>System MAC is an identifier unique in the entore operational <t>System MAC is an identifier unique in the entore operational
space. Routers and switches have internal system MACs. If none space. Routers and switches have internal system MACs which can be
exists on a device, the local L3DL configuration SHOULD assign one used. If none exists on a device, the local L3DL configuration
by configuration.</t> SHOULD create and assign a unique one by configuration.</t>
<t>The VLAN ID is the 802.1Q identifier of the virtual link's VLAN <t>The VLAN ID is the 802.1Q identifier of the virtual link's VLAN
if a VLAN is configured, otherwise zero.</t> if a VLAN is configured, otherwise zero.</t>
@ -348,7 +352,7 @@
<figure> <figure>
<artwork> <artwork>
| HELLO | Link Peer discovery | HELLO | Logical Link Peer discovery
|----------------------------&gt;| |----------------------------&gt;|
| HELLO | Mandatory | HELLO | Mandatory
|&lt;----------------------------| |&lt;----------------------------|
@ -432,9 +436,7 @@
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Version |L|Datagram Num.| Datagram Length | | Version |L|Datagram Num.| Datagram Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sec Type | Sec Length | ~ | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ~
~ Sec Data ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</artwork> </artwork>
</figure> </figure>
@ -445,12 +447,13 @@
<t hangText="Version:">Version number of the protocol, currently <t hangText="Version:">Version number of the protocol, currently
0. Values other than 0 are treated as errors.</t> 0. Values other than 0 are treated as errors.</t>
<t hangText="L:">A bit that set to 1 if this Datagram is the last <t hangText="L:">A bit that set to one if this Datagram is the
Datagram of the PDU. For a PDU which fits in only one Datagram, last Datagram of the PDU. For a PDU which fits in only one
it is set to one.</t> Datagram, it is set to one.</t>
<t hangText="Datagram Number:">0..127, a monotonically increasing <t hangText="Datagram Number:">0..127, a monotonically increasing
value, modulo 128, see <xref target="RFC1982"/>.</t> value, modulo 128, see <xref target="RFC1982"/>. Note that this
does not limit an L3DL PDU to 128 frames.</t>
<t hangText="Datagram Length:">Total number of octets in the <t hangText="Datagram Length:">Total number of octets in the
Datagram including all payloads and fields.</t> Datagram including all payloads and fields.</t>
@ -458,8 +461,8 @@
<t hangText="Checksum:">A 32 bit hash over the Datagram to detect <t hangText="Checksum:">A 32 bit hash over the Datagram to detect
bit flips, see <xref target="checksum"/>.</t> bit flips, see <xref target="checksum"/>.</t>
</list></t> </list></t>
</section> </section>
<section anchor="checksum" title="The Checksum"> <section anchor="checksum" title="The Checksum">
@ -533,8 +536,9 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n)
<section anchor="tlv" title="TLV PDUs"> <section anchor="tlv" title="TLV PDUs">
<t>The basic L3DL application layer PDU is a typical TLV (Type <t>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
<xref target="transport"/> </t> integrity and authentication. It may be broken into multiple
Datagrams, see <xref target="transport"/> </t>
<!-- <!--
protocol "Type:8,Payload Length:16,Payload ...:40,Sig Type:8,Signature Length:16,Signature:40" protocol "Type:8,Payload Length:16,Payload ...:40,Sig Type:8,Signature Length:16,Signature:40"
@ -579,23 +583,23 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n)
Payload field.</t> Payload field.</t>
<t hangText="Payload:">The application layer content of the L3DL <t hangText="Payload:">The application layer content of the L3DL
PDU beyond the type.</t> PDU.</t>
<t hangText="Sec Type:">The type of the Signature. Types 0 and 1 <t hangText="Sec Type:">The type of the Signature. Type 0, a null
are defined in this document.</t> signature, is defined in this document.</t>
<t>Sig Type 0 indicates a null Signature. For very short PDUs, <t>Sig Type 0 indicates a null Signature. For very short PDUs,
the underlying Datagram cheksums may be sufficient for integrity, the underlying Datagram cheksums may be sufficient for integrity,
if not for authentication.</t> if not for authentication.</t>
<t>Sig Type 1 is TO BE SPECIFIED.</t> <t>Sig Type 1 is specified in a companion document [ref
later].</t>
<t>Other Sig Types may be defined in other documents.</t> <t>Other Sig Types may be defined in other documents.</t>
<t hangText="Signature Length:">The length of the Signature, <t hangText="Signature Length:">The length of the Signature,
possibly including padding, in octets. If Sig Type is 0, possibly including padding, in octets. If Sig Type is 0,
Signature Length must be 0. If Sec Type is 1 Sig Length must be Signature Length must be 0.</t>
TO BE SPECIFIED.</t>
<t hangText="Signature:">The result of running the signature <t hangText="Signature:">The result of running the signature
algorithm specified in Sig Type over all octets of the PDU except algorithm specified in Sig Type over all octets of the PDU except
@ -625,7 +629,7 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n)
<?rfc subcompact="no"?></list></t> <?rfc subcompact="no"?></list></t>
<t>All other L3DL PDUs are encapsulated in unicast Ethernet frames, <t>All other L3DL PDUs are encapsulated in unicast Ethernet frames,
as the peer's destination link address is known after the HELLO as the peer's destination MAC address is known after the HELLO
exchange.</t> exchange.</t>
<t>When an interface is turned up on a device, it SHOULD issue a <t>When an interface is turned up on a device, it SHOULD issue a
@ -633,33 +637,34 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n)
default of 60 seconds.</t> default of 60 seconds.</t>
<!-- <!--
protocol "Type = 0:8,PDU Length = 3:16" protocol "Type = 0:8,Payload Length = 0:16,Sig Type = 0:8,Signature Length = 0:16"
--> -->
<figure> <figure>
<artwork> <artwork>
0 1 2 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 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 | PDU Length = 3 | | Type = 0 | Payload Length = 0 | Sig Type = 0 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Signature Length = 0 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</artwork> </artwork>
</figure> </figure>
<t>If more than one device responds, one adjacency is formed for <t>If more than one device responds, one adjacency is formed for
each unique (source link address) response. L3DL treats each each unique (source link address) response. L3DL treats each
adjacency as a separate link.</t> adjacency as a separate logical link.</t>
<t>When a HELLO is received from a source link address with which <t>When a HELLO is received from a source link address with which
there is no established L3DL adjacency, the receiver SHOULD respond there is no established L3DL adjacency, the receiver SHOULD respond
with an OPEN PDU. The two devices establish an L3DL adjacency by with an OPEN PDU. The two devices establish an L3DL adjacency by
exchanging OPEN PDUs.</t> exchanging OPEN PDUs.</t>
<t>HELLO PDUs can not be signed as keying material has yet to be <t>The Payload Length is zero as there is no payload.</t>
exchanged.</t>
<t>The PDU Length is the octet count of the entire PDU, including <t>HELLO PDUs can not be signed as keying material has yet to be
the Type and the Datagram Length field itself.</t> exchanged. Hence the signature MUST always be null.</t>
</section> </section>
@ -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
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 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 | | Nonce | ID Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
@ -701,19 +706,19 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n)
</figure> </figure>
<t>The Payload Length is the number of octets in all fields of the <t>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.</t> Type, the Signature Length, and the Signature.</t>
<t>The Nonce enables detection of a duplicate OPEN PDU. It SHOULD <t>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 be either a random number or the time of day. It is needed to
session closure due to a repeated OPEN caused by a race or a dropped prevent session closure due to a repeated OPEN caused by a race or a
or delayed ACK.</t> dropped or delayed ACK.</t>
<t>My ID is the sending LLEI, see <xref target="llei"/>. It can be <t>My ID is the sending LLEI, see <xref target="llei"/>. It can be
an ASN with high order bits zero, a classic RouterID with high order 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 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 other identifier unique to a single logical link endpoint in the
big-endian.</t> topology. IDs are big-endian.</t>
<t>AttrCount is the number of attributes in the Attribute List. <t>AttrCount is the number of attributes in the Attribute List.
Attributes are single octets whose semantics are user-defined.</t> Attributes are single octets whose semantics are user-defined.</t>
@ -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 L3DL session, an ERROR PDU is sent (Error Code 2), and HELLOs MUST
be restarted.</t> be restarted.</t>
<t>The Signature fileds are described in <xref target="tlv"/> and <t>The Signature fileds are described in <xref target="tlv"/> and in
serve as a proof of possession of the signing auth data by an asymmetric key environment serve as a proof of possession of the
sender.</t> signing auth data by the sender.</t>
<t>Once two devices know each other's LLEIs, and have ACKed each <t>Once two logical link endpoints know each other, and have ACKed
other's OPEN PDUs, Layer 2 KEEPALIVEs (see <xref each other's OPEN PDUs, Layer 2 KEEPALIVEs (see <xref
target="keepalive"/>) MAY be started to ensure Layer 2 liveness and target="keepalive"/>) MAY be started to ensure Layer 2 liveness and
keep the session semantics alive. The timing and acceptable drop of keep the session semantics alive. The timing and acceptable drop of
KEEPALIVE PDUs are discussed in <xref target="keepalive"/>.</t> KEEPALIVE PDUs are discussed in <xref target="keepalive"/>.</t>
@ -755,22 +760,22 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n)
SHOULD use exponential back-off, see <xref target="RFC1122"/>.</t> SHOULD use exponential back-off, see <xref target="RFC1122"/>.</t>
<t>If a properly authenticated OPEN arrives with a new Nonce from an <t>If a properly authenticated OPEN arrives with a new Nonce from an
LLEI with which the receiving device believes it already has an L3DL LLEI with which the receiving logical link endpoint believes it
session (OPENs have already been exchanged), the receiver MUST already has an L3DL session (OPENs have already been exchanged), the
assume that the sending LLEI or entire device has been reset. All receiver MUST assume that the sending LLEI or entire device has been
discovered encapsulation data SHOULD be withdrawn via the BGP-LS API reset. All discovered encapsulation data SHOULD be withdrawn via
and the recipient MUST respond with a new OPEN. In this the BGP-LS API and the recipient MUST respond with a new OPEN. In
circumstance encapsulations SHOULD NOT be kept because, while the this circumstance encapsulations SHOULD NOT be kept because, while
new OPEN is likely to be followed by new encapsulation PDUs of the the new OPEN is likely to be followed by new encapsulation PDUs of
same data, the old session might have an encapsulation type not in the same data, the old session might have an encapsulation type not
the new session.</t> in the new session.</t>
</section> </section>
<section anchor="ack" title="ACK"> <section anchor="ack" title="ACK">
<!-- <!--
protocol "Type = 3:8,Payload Length = 8:16,PDU Type:8,EType:4,Error Code:12,Error Hint:16,Sig Type:8,Signature Length:16,Signature ...:40" protocol "Type = 3:8,Payload Length = 5:16,PDU Type:8,EType:4,Error Code:12,Error Hint:16,Sig Type:8,Signature Length:16,Signature ...:40"
--> -->
<t>The ACK PDU acknowledges receipt of a PDU and reports any error <t>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
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 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 | | EType | Error Code | Error Hint |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
@ -848,7 +853,7 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n)
<t>Once the devices know each other's LLEIs, know each other's upper <t>Once the devices know each other's LLEIs, know each other's upper
layer identities, have means to ensure link state, etc., the L3DL layer identities, have means to ensure link state, etc., the L3DL
session is considered established, and the devices SHOULD exchange session is considered established, and the devices SHOULD exchange
their interface encapsulations, addresses, (and labels).</t> interface encapsulations, addresses, (and labels).</t>
<t>The Encapsulation types the peers exchange may be IPv4 <t>The Encapsulation types the peers exchange may be IPv4
Announcement (<xref target="ipv4"/>), IPv6 Announcement (<xref Announcement (<xref target="ipv4"/>), IPv6 Announcement (<xref
@ -869,9 +874,10 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n)
addresses or encapsulations, this error might log and continue, addresses or encapsulations, this error might log and continue,
letting an upper layer topology builder deal with what works.</t> letting an upper layer topology builder deal with what works.</t>
<t>Further, to consider a link of a type to formally be established <t>Further, to consider a logical link of a type to formally be
so that it may be pushed up to upper layer protocols, the addressing established so that it may be pushed up to upper layer protocols,
for the type must be compatible, e.g. on the same IPvX subnet.</t> the addressing for the type must be compatible, e.g. on the same
IPvX subnet.</t>
<section anchor="encaps" title="The Encapsulation PDU Skeleton"> <section anchor="encaps" title="The Encapsulation PDU Skeleton">
@ -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" protocol "Type:8,Payload Length:16,Count:8,...:8,Encapsulation List...:24,Sig Type:8,Signature Length:16,Signature ...:40"
--> -->
<figure> <figure>
<artwork> <artwork>
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 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 ... ~ ~ Signature ... ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</artwork> </artwork>
</figure> </figure>
<t>The 16-bit Count is the number of Encapsulations in the <t>The 16-bit Count is the number of Encapsulations in the
Encapsulation list.</t> Encapsulation list.</t>
@ -927,7 +933,7 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n)
<t>Over time, multiple Encapsulation PDUs may be sent for an <t>Over time, multiple Encapsulation PDUs may be sent for an
interface as configuration changes.</t> interface as configuration changes.</t>
<t>If the length of an Encapsulation PDU exceeds the Datagram size <t>If the length of an Encapsulation PDU exceeds the Datagram size
limit on media, the PDU is broken into multiple Datagrams. limit on media, the PDU is broken into multiple Datagrams.
See <xref target="tlv"/>.</t> See <xref target="tlv"/>.</t>
@ -948,8 +954,8 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n)
<section anchor="primloop" title="Prim/Loop Flags"> <section anchor="primloop" title="Prim/Loop Flags">
<figure> <figure>
<artwork> <artwork>
0 1 2 3 ... 7 0 1 2 3 ... 7
+---------------+---------------+---------------+---------------+ +---------------+---------------+---------------+---------------+
| Primary | Loopback | Reserved ... | | | Primary | Loopback | Reserved ... | |
@ -971,7 +977,7 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n)
<t>The IPv4 Encapsulation describes a device's ability to exchange <t>The IPv4 Encapsulation describes a device's ability to exchange
IPv4 packets on one or more subnets. It does so by stating the IPv4 packets on one or more subnets. It does so by stating the
interface's addresses and the corresponding prefix lengths.</t> interface's addresses and the corresponding prefix lengths.</t>
<!-- <!--
protocol "Type = 4:8,Payload Length:16,Count:8,...:8,PrimLoop Flags:8,IPv4 Address:16,...:16,PrefixLen:8,more ...:8,Sig Type:8,Signature Length:16,Signature ...:40" protocol "Type = 4:8,Payload Length:16,Count:8,...:8,PrimLoop Flags:8,IPv4 Address:16,...:16,PrefixLen:8,more ...:8,Sig Type:8,Signature Length:16,Signature ...:40"
--> -->
@ -992,8 +998,8 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n)
~ Signature ... ~ ~ Signature ... ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</artwork> </artwork>
</figure> </figure>
<t>The 16-bit Count is the number of IPv4 Encapsulations.</t> <t>The 16-bit Count is the number of IPv4 Encapsulations.</t>
</section> </section>
@ -1047,7 +1053,7 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n)
--> -->
<figure> <figure>
<artwork> <artwork>
0 1 2 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 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)
--> -->
<figure> <figure>
<artwork> <artwork>
0 1 2 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 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 ... ~ ~ Signature ... ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</artwork> </artwork>
</figure> </figure>
<t>The 16-bit Count is the number of MPLSv6 Encapsulations.</t> <t>The 16-bit Count is the number of MPLSv6 Encapsulations.</t>
</section> </section>
<section anchor="mpls6" title="MPLS IPv6 Encapsulation"> <section anchor="mpls6" title="MPLS IPv6 Encapsulation">
@ -1109,7 +1115,7 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n)
--> -->
<figure> <figure>
<artwork> <artwork>
0 1 2 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 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)
<section anchor="keepalive" title="KEEPALIVE - Layer 2 Liveness"> <section anchor="keepalive" title="KEEPALIVE - Layer 2 Liveness">
<t>L3DL devices MUST beacon occasional Layer 2 KEEPALIVE PDUs to <t>L3DL devices SHOULD beacon frequent Layer 2 KEEPALIVE PDUs to
ensure session continuity.</t> ensure session continuity.</t>
<t>They SHOULD be beaconed at a configured frequency. One per <t>They SHOULD be beaconed at a configured frequency. One per
second is the default. Layer 3 liveness, such as BFD, will likely second is the default. Layer 3 liveness, such as BFD, may be more
be more aggressive.</t> aggressive.</t>
<t>If a KEEPALIVE is not received from a peer with which a receiver <t>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 the session SHOULD BE presumed closed. The devices MAY keep
configuration state until a new session is established and new configuration state until a new session is established and new
Encapsulation PDUs are received.</t> Encapsulation PDUs are received.</t>
<!-- <!--
protocol "Type = 2:8,Length = 3:16" protocol "Type = 2:8,Payload Length = 0:16,Sig Type = 0:8,Signature Length = 0:16"
--> -->
<figure> <figure>
<artwork> <artwork>
0 1 2 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 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 | Length = 3 | | Type = 2 | Payload Length = 0 | Sig Type = 0 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Signature Length = 0 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</artwork> </artwork>
</figure> </figure>
@ -1173,7 +1181,7 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n)
<section anchor="vendor" title="VENDOR - Vendor Extensions"> <section anchor="vendor" title="VENDOR - Vendor Extensions">
<!-- <!--
protocol "Type = 255:8,Length:16,...:8,Enterprise Number:24,Ent Type:8,Enterprise Data ...:32,Sig Type:8,Signature Length:16,Signature ...:40" protocol "Type = 255:8,Payload Length:16,...:8,Enterprise Number:24,Ent Type:8,Enterprise Data ...:32,Sig Type:8,Signature Length:16,Signature ...:40"
--> -->
<figure> <figure>
@ -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
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 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 | | Enterprise Number | Ent Type |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
@ -1225,8 +1233,8 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n)
<t>Thus far, a one-hop point-to-point logical link discovery <t>Thus far, a one-hop point-to-point logical link discovery
protocol has been defined.</t> protocol has been defined.</t>
<t>The nodes know the unique LLEIs and Encapsulations on each link <t>The devices know their unique LLEIs and know the unique peer
interface.</t> LLEIs and Encapsulations on each logical link interface.</t>
<t>Full topology discovery is not appropriate at the L3DL layer, so <t>Full topology discovery is not appropriate at the L3DL layer, so
Dijkstra à la IS-IS etc. is assumed to be done by higher level 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)
<section anchor="dhello" title="HELLO Discussion"> <section anchor="dhello" title="HELLO Discussion">
<!--
<t>There is the question of whether to allow an intermediate <t>There is the question of whether to allow an intermediate
switch to be transparent to discovery. We consider that an switch to be transparent to discovery. We consider that an
interface on a device is a Layer 2 or a Layer 3 interface. In interface on a device is a Layer 2 or a Layer 3 interface. In
theory it could be a Layer 3 interface with no encapsulation or theory it could be a Layer 3 interface with no encapsulation or
Layer 3 addressing currently configured.</t> Layer 3 addressing currently configured.</t>
-->
<t>A device with multiple Layer 2 interfaces, traditionally called <t>A device with multiple Layer 2 interfaces, traditionally called
a switch, may be used to forward frames and therefore packets from a switch, may be used to forward frames and therefore packets from
multiple devices to one interface, I, on an L3DL speaking device. multiple devices to one logical interface (LLEI), I, on an L3DL
Interface I could discover a peer J across the switch. Later, a speaking device. Interface I could discover a peer J across the
prospective peer K could come up across the switch. If I was not switch. Later, a prospective peer K could come up across the
still sending and listening for HELLOs, the potential peering with switch. If I was not still sending and listening for HELLOs, the
K could not be discovered. Therefore, interfaces MUST continue to potential peering with K could not be discovered. Therefore,
send HELLOs as long as they are turned up.</t> interfaces MUST continue to send HELLOs as long as they are turned
up.</t>
</section> </section>
<section anchor="dkeepalive" title="HELLO versus KEEPALIVE"> <section anchor="dkeepalive" title="HELLO versus KEEPALIVE">
<t>Both HELLO and KEEPALIVE are periodic. KEEPALIVE might be <t>Both HELLO and KEEPALIVE are periodic. KEEPALIVE might be
eliminated in favor of keeping only HELLOs. But currently eliminated in favor of keeping only HELLOs. But KEEPALIVEs are
KEEPALIVE is unicast, and thus less noisy on the network, unicast, and thus less noisy on the network, especially if HELLO
especially if HELLO is configured to transit layer-2-only is configured to transit layer-2-only switches, see <xref
switches.</t> target="dhello"/>.</t>
</section> </section>
@ -1330,8 +1342,8 @@ uint32_t sbox_checksum_32(const uint8_t *b, const size_t n)
<section anchor="impl" title="Implementation Considerations"> <section anchor="impl" title="Implementation Considerations">
<t>An implementation SHOULD provide the ability to configure an <t>An implementation SHOULD provide the ability to configure a
interface as L3DL speaking or not.</t> logical interface as L3DL speaking or not.</t>
<t>An implementation SHOULD provide the ability to configure whether <t>An implementation SHOULD provide the ability to configure whether
HELLOs on an L3DL enabled interface send Nearest Bridge or Nearest 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)
<t>The protocol as it is MUST NOT be used outside a datacenter or <t>The protocol as it is MUST NOT be used outside a datacenter or
similarly closed environment due to lack of formal definition of the similarly closed environment due to lack of formal definition of the
authentication and authorisation mechanism. These are works in authentication and authorisation mechanism. Sufficient mechanisms
process.</t> may be descrived in separate documents.</t>
<t>Many MDC operators have a strange belief that physical walls and <t>Many MDC operators have a strange belief that physical walls and
firewalls provide sufficient security. This is not credible. All 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:</t> be the following:</t>
<figure> <figure>
<artwork> <artwork>
Bit Bit Name Number Name
---- ------------------- ------ -------------------
0 Null 0 Null
1 TOFU - Trust On First Use 1 TOFU - Trust On First Use
2-255 Reserved 2-255 Reserved
</artwork> </artwork>
</figure> </figure>