RIFT: Routing in Fat Trees
draft-ietf-rift-rift-21
Document | Type | Active Internet-Draft (rift WG) | |
---|---|---|---|
Authors | Tony Przygienda , Jordan Head , Alankar Sharma , Pascal Thubert , Bruno Rijsman , Dmitry Afanasiev | ||
Last updated | 2024-04-01 | ||
Replaces | draft-przygienda-rift | ||
RFC stream | Internet Engineering Task Force (IETF) | ||
Intended RFC status | Proposed Standard | ||
Formats | |||
Reviews |
RTGDIR Early review
(of
-06)
by Russ White
Has issues
SECDIR Early review
(of
-04)
by Scott Kelly
Has issues
INTDIR Telechat Review due 2024-04-25
Incomplete
|
||
Additional resources | Mailing list discussion | ||
Stream | WG state | Submitted to IESG for Publication | |
Associated WG milestones |
|
||
Document shepherd | Zheng Zhang | ||
Shepherd write-up | Show Last changed 2024-03-06 | ||
IESG | IESG state | IESG Evaluation | |
Action Holder |
Jim Guichard
24
|
||
Consensus boilerplate | Yes | ||
Telechat date |
On agenda of 2024-05-02 IESG telechat
Needs 7 more YES or NO OBJECTION positions to pass. |
||
Responsible AD | Jim Guichard | ||
Send notices to | Zheng Zhang <zhang.zheng@zte.com.cn>, aretana.ietf@gmail.com | ||
IANA | IANA review state | Version Changed - Review Needed |
draft-ietf-rift-rift-21
<https://ieeexplore.ieee.org/document/5741898/>. [RFC0826] Plummer, D., "An Ethernet Address Resolution Protocol: Or Converting Network Protocol Addresses to 48.bit Ethernet Address for Transmission on Ethernet Hardware", STD 37, RFC 826, DOI 10.17487/RFC0826, November 1982, <https://www.rfc-editor.org/info/rfc826>. [RFC1982] Elz, R. and R. Bush, "Serial Number Arithmetic", RFC 1982, DOI 10.17487/RFC1982, August 1996, <https://www.rfc-editor.org/info/rfc1982>. [RFC2131] Droms, R., "Dynamic Host Configuration Protocol", RFC 2131, DOI 10.17487/RFC2131, March 1997, <https://www.rfc-editor.org/info/rfc2131>. Przygienda, et al. Expires 3 October 2024 [Page 172] Internet-Draft RIFT April 2024 [RFC2474] Nichols, K., Blake, S., Baker, F., and D. Black, "Definition of the Differentiated Services Field (DS Field) in the IPv4 and IPv6 Headers", RFC 2474, DOI 10.17487/RFC2474, December 1998, <https://www.rfc-editor.org/info/rfc2474>. [RFC4086] Eastlake 3rd, D., Schiller, J., and S. Crocker, "Randomness Requirements for Security", BCP 106, RFC 4086, DOI 10.17487/RFC4086, June 2005, <https://www.rfc-editor.org/info/rfc4086>. [RFC4861] Narten, T., Nordmark, E., Simpson, W., and H. Soliman, "Neighbor Discovery for IP version 6 (IPv6)", RFC 4861, DOI 10.17487/RFC4861, September 2007, <https://www.rfc-editor.org/info/rfc4861>. [RFC4862] Thomson, S., Narten, T., and T. Jinmei, "IPv6 Stateless Address Autoconfiguration", RFC 4862, DOI 10.17487/RFC4862, September 2007, <https://www.rfc-editor.org/info/rfc4862>. [RFC5837] Atlas, A., Ed., Bonica, R., Ed., Pignataro, C., Ed., Shen, N., and JR. Rivers, "Extending ICMP for Interface and Next-Hop Identification", RFC 5837, DOI 10.17487/RFC5837, April 2010, <https://www.rfc-editor.org/info/rfc5837>. [RFC5880] Katz, D. and D. Ward, "Bidirectional Forwarding Detection (BFD)", RFC 5880, DOI 10.17487/RFC5880, June 2010, <https://www.rfc-editor.org/info/rfc5880>. [RFC6550] Winter, T., Ed., Thubert, P., Ed., Brandt, A., Hui, J., Kelsey, R., Levis, P., Pister, K., Struik, R., Vasseur, JP., and R. Alexander, "RPL: IPv6 Routing Protocol for Low-Power and Lossy Networks", RFC 6550, DOI 10.17487/RFC6550, March 2012, <https://www.rfc-editor.org/info/rfc6550>. [RFC8415] Mrugalski, T., Siodelski, M., Volz, B., Yourtchenko, A., Richardson, M., Jiang, S., Lemon, T., and T. Winters, "Dynamic Host Configuration Protocol for IPv6 (DHCPv6)", RFC 8415, DOI 10.17487/RFC8415, November 2018, <https://www.rfc-editor.org/info/rfc8415>. [VAHDAT08] Al-Fares, M., Loukissas, A., and A. Vahdat, "A Scalable, Commodity Data Center Network Architecture", SIGCOMM , 2008. Przygienda, et al. Expires 3 October 2024 [Page 173] Internet-Draft RIFT April 2024 [VFR] Giotsas, V. and S. Zhou, "Valley-free violation in Internet routing - Analysis based on BGP Community data", 2012 IEEE International Conference on Communications (ICC) , 2012. Appendix A. Sequence Number Binary Arithmetic Assuming straight two complement's subtractions on the bit-width of the sequence numbers, the corresponding >: and =: relations are defined as: U_1, U_2 are 12-bits aligned unsigned version number D_f is ( U_1 - U_2 ) interpreted as two complement signed 12-bits D_b is ( U_2 - U_1 ) interpreted as two complement signed 12-bits U_1 >: U_2 IIF D_f > 0 *and* D_b < 0 U_1 =: U_2 IIF D_f = 0 The >: relationship is anti-symmetric but not transitive. Observe that this leaves >: of the numbers having maximum two complement distance, e.g. ( 0 and 0x800 ) undefined in the 12-bits case since D_f and D_b are both -0x7ff. A simple example of the relationship in case of 3-bit arithmetic follows as table indicating D_f/D_b values and then the relationship of U_1 to U_2: U2 / U1 0 1 2 3 4 5 6 7 0 +/+ +/- +/- +/- -/- -/+ -/+ -/+ 1 -/+ +/+ +/- +/- +/- -/- -/+ -/+ 2 -/+ -/+ +/+ +/- +/- +/- -/- -/+ 3 -/+ -/+ -/+ +/+ +/- +/- +/- -/- 4 -/- -/+ -/+ -/+ +/+ +/- +/- +/- 5 +/- -/- -/+ -/+ -/+ +/+ +/- +/- 6 +/- +/- -/- -/+ -/+ -/+ +/+ +/- 7 +/- +/- +/- -/- -/+ -/+ -/+ +/+ U2 / U1 0 1 2 3 4 5 6 7 0 = > > > ? < < < 1 < = > > > ? < < 2 < < = > > > ? < 3 < < < = > > > ? 4 ? < < < = > > > 5 > ? < < < = > > 6 > > ? < < < = > 7 > > > ? < < < = Przygienda, et al. Expires 3 October 2024 [Page 174] Internet-Draft RIFT April 2024 Appendix B. Information Elements Schema This section introduces the schema for information elements. The IDL is Thrift [thrift]. On schema changes that 1. change field numbers *or* 2. add new *required* fields *or* 3. remove any fields *or* 4. change lists into sets, unions into structures *or* 5. change multiplicity of fields *or* 6. changes type or name of any field *or* 7. change data types of the type of any field *or* 8. adds, changes or removes a default value of any *existing* field *or* 9. removes or changes any defined constant or constant value *or* 10. changes any enumeration type except extending `common.TIETypeType` (use of enumeration types is generally discouraged) *or* 11. adds new TIE type to _TIETypeType_ with flooding scope different from prefix TIE flooding scope major version of the schema MUST increase. All other changes MUST increase minor version within the same major. Introducing an optional field does not cause a major version increase even if the fields inside the structure are optional with defaults. All signed integer as forced by Thrift [thrift] support must be cast for internal purposes to equivalent unsigned values without discarding the signedness bit. An implementation SHOULD try to avoid using the signedness bit when generating values. The schema is normative. Przygienda, et al. Expires 3 October 2024 [Page 175] Internet-Draft RIFT April 2024 B.1. Backwards-Compatible Extension of Schema The set of rules in Appendix B guarantees that every decoder can process serialized content generated by a higher minor version of the schema and with that the protocol can progress without a 'flag-day'. Contrary to that, content serialized using a major version X is *not* expected to be decodable by any implementation using decoder for a model with a major version lower than X. Schema negotiation and translation within RIFT is outside the scope of this document. Additionally, based on the propagated minor version in encoded content and added optional node capabilities new TIE types or even de-facto mandatory fields can be introduced without progressing the major version albeit only nodes supporting such new extensions would decode them. Given the model is encoded at the source and never re- encoded flooding through nodes not understanding any new extensions will preserve the corresponding fields. However, it is important to understand that a higher minor version of a schema does *not* guarantee that capabilities introduced in lower minors of the same major are supported. The _node_capabilities_ field is used to indicate which capabilities are supported. Specifically, the schema SHOULD add elements to _NodeCapabilities_ field future capabilities to indicate whether it will support interpretation of schema extensions on the same major revision if they are present. Such fields MUST be optional and have an implicit or explicit false default value. If a future capability changes route selection or generates conditions that cause packet loss if some nodes are not supporting it then a major version increment will be however unavoidable. _NodeCapabilities_ shown in LIE MUST match the capabilities shown in the Node TIEs, otherwise the behavior is unspecified. A node detecting the mismatch SHOULD generate a notification. Alternately or additionally, new optional fields can be introduced into e.g. _NodeTIEElement_ if a special field is chosen to indicate via its presence that an optional feature is enabled (since capability to support a feature does not necessarily mean that the feature is actually configured and operational). To support new TIE types without increasing the major version enumeration _TIEElement_ can be extended with new optional elements for new `common.TIETypeType` values as long the scope of the new TIE matches the prefix TIE scope. In case it is necessary to understand whether all nodes can parse the new TIE type a node capability MUST be added in _NodeCapabilities_ to prevent a non-homogenous network. Przygienda, et al. Expires 3 October 2024 [Page 176] Internet-Draft RIFT April 2024 B.2. common.thrift /** Thrift file with common definitions for RIFT */ namespace py common /** @note MUST be interpreted in implementation as unsigned 64 bits. */ typedef i64 SystemIDType typedef i32 IPv4Address typedef i32 MTUSizeType /** @note MUST be interpreted in implementation as unsigned rolling over number */ typedef i64 SeqNrType /** @note MUST be interpreted in implementation as unsigned */ typedef i32 LifeTimeInSecType /** @note MUST be interpreted in implementation as unsigned */ typedef i8 LevelType typedef i16 PacketNumberType /** @note MUST be interpreted in implementation as unsigned */ typedef i32 PodType /** @note MUST be interpreted in implementation as unsigned. /** this has to be long enough to accomodate prefix */ typedef binary IPv6Address /** @note MUST be interpreted in implementation as unsigned */ typedef i16 UDPPortType /** @note MUST be interpreted in implementation as unsigned */ typedef i32 TIENrType /** @note MUST be interpreted in implementation as unsigned This is carried in the security envelope and must hence fit into 8 bits. */ typedef i8 VersionType /** @note MUST be interpreted in implementation as unsigned */ typedef i16 MinorVersionType /** @note MUST be interpreted in implementation as unsigned */ typedef i32 MetricType /** @note MUST be interpreted in implementation as unsigned and unstructured */ typedef i64 RouteTagType /** @note MUST be interpreted in implementation as unstructured label value */ typedef i32 LabelType /** @note MUST be interpreted in implementation as unsigned */ typedef i32 BandwithInMegaBitsType /** @note Key Value Key ID type */ typedef i32 KeyIDType Przygienda, et al. Expires 3 October 2024 [Page 177] Internet-Draft RIFT April 2024 /** node local, unique identification for a link (interface/tunnel * etc. Basically anything RIFT runs on). This is kept * at 32 bits so it aligns with BFD [RFC5880] discriminator size. */ typedef i32 LinkIDType /** @note MUST be interpreted in implementation as unsigned, especially since we have the /128 IPv6 case. */ typedef i8 PrefixLenType /** timestamp in seconds since the epoch */ typedef i64 TimestampInSecsType /** security nonce. @note MUST be interpreted in implementation as rolling over unsigned value */ typedef i16 NonceType /** LIE FSM holdtime type */ typedef i16 TimeIntervalInSecType /** Transaction ID type for prefix mobility as specified by RFC6550, value MUST be interpreted in implementation as unsigned */ typedef i8 PrefixTransactionIDType /** Timestamp per IEEE 802.1AS, all values MUST be interpreted in implementation as unsigned. */ struct IEEE802_1ASTimeStampType { 1: required i64 AS_sec; 2: optional i32 AS_nsec; } /** generic counter type */ typedef i64 CounterType /** Platform Interface Index type, i.e. index of interface on hardware, can be used e.g. with RFC5837 */ typedef i32 PlatformInterfaceIndex /** Flags indicating node configuration in case of ZTP. */ enum HierarchyIndications { /** forces level to `leaf_level` and enables according procedures */ leaf_only = 0, /** forces level to `leaf_level` and enables according procedures */ leaf_only_and_leaf_2_leaf_procedures = 1, /** forces level to `top_of_fabric` and enables according procedures */ top_of_fabric = 2, } const PacketNumberType undefined_packet_number = 0 /** used when node is configured as top of fabric in ZTP.*/ const LevelType top_of_fabric_level = 24 /** default bandwidth on a link */ const BandwithInMegaBitsType default_bandwidth = 100 Przygienda, et al. Expires 3 October 2024 [Page 178] Internet-Draft RIFT April 2024 /** fixed leaf level when ZTP is not used */ const LevelType leaf_level = 0 const LevelType default_level = leaf_level const PodType default_pod = 0 const LinkIDType undefined_linkid = 0 /** invalid key for key value */ const KeyIDType invalid_key_value_key = 0 /** default distance used */ const MetricType default_distance = 1 /** any distance larger than this will be considered infinity */ const MetricType infinite_distance = 0x7FFFFFFF /** represents invalid distance */ const MetricType invalid_distance = 0 const bool overload_default = false const bool flood_reduction_default = true /** default LIE FSM LIE TX internval time */ const TimeIntervalInSecType default_lie_tx_interval = 1 /** default LIE FSM holddown time */ const TimeIntervalInSecType default_lie_holdtime = 3 /** multipler for default_lie_holdtime to hold down multiple neighbors */ const i8 multiple_neighbors_lie_holdtime_multipler = 4 /** default ZTP FSM holddown time */ const TimeIntervalInSecType default_ztp_holdtime = 1 /** by default LIE levels are ZTP offers */ const bool default_not_a_ztp_offer = false /** by default everyone is repeating flooding */ const bool default_you_are_flood_repeater = true /** 0 is illegal for SystemID */ const SystemIDType IllegalSystemID = 0 /** empty set of nodes */ const set<SystemIDType> empty_set_of_nodeids = {} /** default lifetime of TIE is one week */ const LifeTimeInSecType default_lifetime = 604800 /** default lifetime when TIEs are purged is 5 minutes */ const LifeTimeInSecType purge_lifetime = 300 /** optional round down interval when TIEs are sent with security hashes to prevent excessive computation. **/ const LifeTimeInSecType rounddown_lifetime_interval = 60 /** any `TieHeader` that has a smaller lifetime difference than this constant is equal (if other fields equal). */ const LifeTimeInSecType lifetime_diff2ignore = 400 /** default UDP port to run LIEs on */ const UDPPortType default_lie_udp_port = 914 /** default UDP port to receive TIEs on, that can be peer specific */ const UDPPortType default_tie_udp_flood_port = 915 Przygienda, et al. Expires 3 October 2024 [Page 179] Internet-Draft RIFT April 2024 /** default MTU link size to use */ const MTUSizeType default_mtu_size = 1400 /** default link being BFD capable */ const bool bfd_default = true /** type used to target nodes with key value */ typedef i64 KeyValueTargetType /** default target for key value are all nodes. */ const KeyValueTargetType keyvaluetarget_default = 0 /** value for _all leaves_ addressing. Represented by all bits set. */ const KeyValueTargetType keyvaluetarget_all_south_leaves = -1 /** undefined nonce, equivalent to missing nonce */ const NonceType undefined_nonce = 0; /** outer security Key ID, MUST be interpreted as in implementation as unsigned */ typedef i8 OuterSecurityKeyID /** security Key ID, MUST be interpreted as in implementation as unsigned */ typedef i32 TIESecurityKeyID /** undefined key */ const TIESecurityKeyID undefined_securitykey_id = 0; /** Maximum delta (negative or positive) that a mirrored nonce can deviate from local value to be considered valid. */ const i16 maximum_valid_nonce_delta = 5; const TimeIntervalInSecType nonce_regeneration_interval = 300; /** Direction of TIEs. */ enum TieDirectionType { Illegal = 0, South = 1, North = 2, DirectionMaxValue = 3, } /** Address family type. */ enum AddressFamilyType { Illegal = 0, AddressFamilyMinValue = 1, IPv4 = 2, IPv6 = 3, AddressFamilyMaxValue = 4, } /** IPv4 prefix type. */ struct IPv4PrefixType { 1: required IPv4Address address; Przygienda, et al. Expires 3 October 2024 [Page 180] Internet-Draft RIFT April 2024 2: required PrefixLenType prefixlen; } /** IPv6 prefix type. */ struct IPv6PrefixType { 1: required IPv6Address address; 2: required PrefixLenType prefixlen; } /** IP address type. */ union IPAddressType { /** Content is IPv4 */ 1: optional IPv4Address ipv4address; /** Content is IPv6 */ 2: optional IPv6Address ipv6address; } /** Prefix advertisement. @note: for interface addresses the protocol can propagate the address part beyond the subnet mask and on reachability computation that has to be normalized. The non-significant bits can be used for operational purposes. */ union IPPrefixType { 1: optional IPv4PrefixType ipv4prefix; 2: optional IPv6PrefixType ipv6prefix; } /** Sequence of a prefix in case of move. */ struct PrefixSequenceType { 1: required IEEE802_1ASTimeStampType timestamp; /** Transaction ID set by client in e.g. in 6LoWPAN. */ 2: optional PrefixTransactionIDType transactionid; } /** Type of TIE. */ enum TIETypeType { Illegal = 0, TIETypeMinValue = 1, /** first legal value */ NodeTIEType = 2, PrefixTIEType = 3, PositiveDisaggregationPrefixTIEType = 4, NegativeDisaggregationPrefixTIEType = 5, Przygienda, et al. Expires 3 October 2024 [Page 181] Internet-Draft RIFT April 2024 PGPrefixTIEType = 6, KeyValueTIEType = 7, ExternalPrefixTIEType = 8, PositiveExternalDisaggregationPrefixTIEType = 9, TIETypeMaxValue = 10, } /** RIFT route types. @note: The only purpose of those values is to introduce an ordering whereas an implementation can choose internally any other values as long the ordering is preserved */ enum RouteType { Illegal = 0, RouteTypeMinValue = 1, /** First legal value. */ /** Discard routes are most preferred */ Discard = 2, /** Local prefixes are directly attached prefixes on the * system such as e.g. interface routes. */ LocalPrefix = 3, /** Advertised in S-TIEs */ SouthPGPPrefix = 4, /** Advertised in N-TIEs */ NorthPGPPrefix = 5, /** Advertised in N-TIEs */ NorthPrefix = 6, /** Externally imported north */ NorthExternalPrefix = 7, /** Advertised in S-TIEs, either normal prefix or positive disaggregation */ SouthPrefix = 8, /** Externally imported south */ SouthExternalPrefix = 9, /** Negative, transitive prefixes are least preferred */ NegativeSouthPrefix = 10, RouteTypeMaxValue = 11, } enum KVTypes { Experimental = 1, WellKnown = 2, OUI = 3, } Przygienda, et al. Expires 3 October 2024 [Page 182] Internet-Draft RIFT April 2024 B.3. encoding.thrift /** Thrift file for packet encodings for RIFT */ include "common.thrift" namespace py encoding /** Represents protocol encoding schema major version */ const common.VersionType protocol_major_version = 8 /** Represents protocol encoding schema minor version */ const common.MinorVersionType protocol_minor_version = 0 /** Common RIFT packet header. */ struct PacketHeader { /** Major version of protocol. */ 1: required common.VersionType major_version = protocol_major_version; /** Minor version of protocol. */ 2: required common.MinorVersionType minor_version = protocol_minor_version; /** Node sending the packet, in case of LIE/TIRE/TIDE also the originator of it. */ 3: required common.SystemIDType sender; /** Level of the node sending the packet, required on everything except LIEs. Lack of presence on LIEs indicates UNDEFINED_LEVEL and is used in ZTP procedures. */ 4: optional common.LevelType level; } /** Prefix community. */ struct Community { /** Higher order bits */ 1: required i32 top; /** Lower order bits */ 2: required i32 bottom; } /** Neighbor structure. */ struct Neighbor { /** System ID of the originator. */ 1: required common.SystemIDType originator; /** ID of remote side of the link. */ 2: required common.LinkIDType remote_id; } Przygienda, et al. Expires 3 October 2024 [Page 183] Internet-Draft RIFT April 2024 /** Capabilities the node supports. */ struct NodeCapabilities { /** Must advertise supported minor version dialect that way. */ 1: required common.MinorVersionType protocol_minor_version = protocol_minor_version; /** indicates that node supports flood reduction. */ 2: optional bool flood_reduction = common.flood_reduction_default; /** indicates place in hierarchy, i.e. top-of-fabric or leaf only (in ZTP) or support for leaf-2-leaf procedures. */ 3: optional common.HierarchyIndications hierarchy_indications; } /** Link capabilities. */ struct LinkCapabilities { /** Indicates that the link is supporting BFD. */ 1: optional bool bfd = common.bfd_default; /** Indicates whether the interface will support IPv4 forwarding. */ 2: optional bool ipv4_forwarding_capable = true; } /** RIFT LIE Packet. @note: this node's level is already included on the packet header */ struct LIEPacket { /** Node or adjacency name. */ 1: optional string name; /** Local link ID. */ 2: required common.LinkIDType local_id; /** UDP port to which we can receive flooded TIEs. */ 3: required common.UDPPortType flood_port = common.default_tie_udp_flood_port; /** Layer 3 MTU, used to discover mismatch. */ 4: optional common.MTUSizeType link_mtu_size = common.default_mtu_size; /** Local link bandwidth on the interface. */ 5: optional common.BandwithInMegaBitsType link_bandwidth = common.default_bandwidth; /** Reflects the neighbor once received to provide 3-way connectivity. */ 6: optional Neighbor neighbor; /** Node's PoD. */ Przygienda, et al. Expires 3 October 2024 [Page 184] Internet-Draft RIFT April 2024 7: optional common.PodType pod = common.default_pod; /** Node capabilities supported. */ 10: required NodeCapabilities node_capabilities; /** Capabilities of this link. */ 11: optional LinkCapabilities link_capabilities; /** Required holdtime of the adjacency, i.e. for how long a period should adjacency be kept up without valid LIE reception. */ 12: required common.TimeIntervalInSecType holdtime = common.default_lie_holdtime; /** Optional, unsolicited, downstream assigned locally significant label value for the adjacency. */ 13: optional common.LabelType label; /** Indicates that the level on the LIE must not be used to derive a ZTP level by the receiving node. */ 21: optional bool not_a_ztp_offer = common.default_not_a_ztp_offer; /** Indicates to northbound neighbor that it should be reflooding TIEs received from this node to achieve flood reduction and balancing for northbound flooding. */ 22: optional bool you_are_flood_repeater = common.default_you_are_flood_repeater; /** Indicates to neighbor to flood node TIEs only and slow down all other TIEs. Ignored when received from southbound neighbor. */ 23: optional bool you_are_sending_too_quickly = false; /** Instance name in case multiple RIFT instances running on same interface. */ 24: optional string instance_name; /** It provides the optional ID of the Fabric configured. This MUST match the information advertised on the node element. */ 35: optional common.FabricIDType fabric_id = common.default_fabric_id; } /** LinkID pair describes one of parallel links between two nodes. */ struct LinkIDPair { /** Node-wide unique value for the local link. */ 1: required common.LinkIDType local_id; /** Received remote link ID for this link. */ 2: required common.LinkIDType remote_id; /** Describes the local interface index of the link. */ 10: optional common.PlatformInterfaceIndex platform_interface_index; /** Describes the local interface name. */ 11: optional string platform_interface_name; /** Indicates whether the link is secured, i.e. protected by outer key, absence of this element means no indication, Przygienda, et al. Expires 3 October 2024 [Page 185] Internet-Draft RIFT April 2024 undefined outer key means not secured. */ 12: optional common.OuterSecurityKeyID trusted_outer_security_key; /** Indicates whether the link is protected by established BFD session. */ 13: optional bool bfd_up; /** Optional indication which address families are up on the interface */ 14: optional set<common.AddressFamilyType> address_families; } /** Unique ID of a TIE. */ struct TIEID { /** direction of TIE */ 1: required common.TieDirectionType direction; /** indicates originator of the TIE */ 2: required common.SystemIDType originator; /** type of the tie */ 3: required common.TIETypeType tietype; /** number of the tie */ 4: required common.TIENrType tie_nr; } /** Header of a TIE. */ struct TIEHeader { /** ID of the tie. */ 2: required TIEID tieid; /** Sequence number of the tie. */ 3: required common.SeqNrType seq_nr; /** Absolute timestamp when the TIE was generated. */ 10: optional common.IEEE802_1ASTimeStampType origination_time; /** Original lifetime when the TIE was generated. */ 12: optional common.LifeTimeInSecType origination_lifetime; } /** Header of a TIE as described in TIRE/TIDE. */ struct TIEHeaderWithLifeTime { 1: required TIEHeader header; /** Remaining lifetime. */ 2: required common.LifeTimeInSecType remaining_lifetime; } /** TIDE with *sorted* TIE headers. */ struct TIDEPacket { /** First TIE header in the tide packet. */ Przygienda, et al. Expires 3 October 2024 [Page 186] Internet-Draft RIFT April 2024 1: required TIEID start_range; /** Last TIE header in the tide packet. */ 2: required TIEID end_range; /** _Sorted_ list of headers. */ 3: required list<TIEHeaderWithLifeTime> headers; } /** TIRE packet */ struct TIREPacket { 1: required set<TIEHeaderWithLifeTime> headers; } /** neighbor of a node */ struct NodeNeighborsTIEElement { /** level of neighbor */ 1: required common.LevelType level; /** Cost to neighbor. Ignore anything larger than `infinite_distance` and `invalid_distance` */ 3: optional common.MetricType cost = common.default_distance; /** can carry description of multiple parallel links in a TIE */ 4: optional set<LinkIDPair> link_ids; /** total bandwith to neighbor as sum of all parallel links */ 5: optional common.BandwithInMegaBitsType bandwidth = common.default_bandwidth; } /** Indication flags of the node. */ struct NodeFlags { /** Indicates that node is in overload, do not transit traffic through it. */ 1: optional bool overload = common.overload_default; } /** Description of a node. */ struct NodeTIEElement { /** Level of the node. */ 1: required common.LevelType level; /** Node's neighbors. Multiple node TIEs can carry disjoint sets of neighbors. */ 2: required map<common.SystemIDType, NodeNeighborsTIEElement> neighbors; /** Capabilities of the node. */ 3: required NodeCapabilities capabilities; /** Flags of the node. */ 4: optional NodeFlags flags; /** Optional node name for easier operations. */ Przygienda, et al. Expires 3 October 2024 [Page 187] Internet-Draft RIFT April 2024 5: optional string name; /** PoD to which the node belongs. */ 6: optional common.PodType pod; /** optional startup time of the node */ 7: optional common.TimestampInSecsType startup_time; /** If any local links are miscabled, this indication is flooded. */ 10: optional set<common.LinkIDType> miscabled_links; /** ToFs in the same plane. Only carried by ToF. Multiple Node TIEs can carry disjoint sets of ToFs which MUST be joined to form a single set. */ 12: optional set<common.SystemIDType> same_plane_tofs; /** It provides the optional ID of the Fabric configured */ 20: optional common.FabricIDType fabric_id = common.default_fabric_id; } /** Attributes of a prefix. */ struct PrefixAttributes { /** Distance of the prefix. */ 2: required common.MetricType metric = common.default_distance; /** Generic unordered set of route tags, can be redistributed to other protocols or use within the context of real time analytics. */ 3: optional set<common.RouteTagType> tags; /** Monotonic clock for mobile addresses. */ 4: optional common.PrefixSequenceType monotonic_clock; /** Indicates if the prefix is a node loopback. */ 6: optional bool loopback = false; /** Indicates that the prefix is directly attached. */ 7: optional bool directly_attached = true; /** link to which the address belongs to. */ 10: optional common.LinkIDType from_link; /** Optional, per prefix significant label. */ 12: optional common.LabelType label; } /** TIE carrying prefixes */ struct PrefixTIEElement { /** Prefixes with the associated attributes. */ 1: required map<common.IPPrefixType, PrefixAttributes> prefixes; } Przygienda, et al. Expires 3 October 2024 [Page 188] Internet-Draft RIFT April 2024 /** Defines the targeted nodes and the value carried. */ struct KeyValueTIEElementContent { 1: optional common.KeyValueTargetType targets = common.keyvaluetarget_default; 2: optional binary value; } /** Generic key value pairs. */ struct KeyValueTIEElement { 1: required map<common.KeyIDType, KeyValueTIEElementContent> keyvalues; } /** Single element in a TIE. */ union TIEElement { /** Used in case of enum common.TIETypeType.NodeTIEType. */ 1: optional NodeTIEElement node; /** Used in case of enum common.TIETypeType.PrefixTIEType. */ 2: optional PrefixTIEElement prefixes; /** Positive prefixes (always southbound). */ 3: optional PrefixTIEElement positive_disaggregation_prefixes; /** Transitive, negative prefixes (always southbound) */ 5: optional PrefixTIEElement negative_disaggregation_prefixes; /** Externally reimported prefixes. */ 6: optional PrefixTIEElement external_prefixes; /** Positive external disaggregated prefixes (always southbound). */ 7: optional PrefixTIEElement positive_external_disaggregation_prefixes; /** Key-Value store elements. */ 9: optional KeyValueTIEElement keyvalues; } /** TIE packet */ struct TIEPacket { 1: required TIEHeader header; 2: required TIEElement element; } /** Content of a RIFT packet. */ union PacketContent { 1: optional LIEPacket lie; 2: optional TIDEPacket tide; 3: optional TIREPacket tire; 4: optional TIEPacket tie; } /** RIFT packet structure. */ struct ProtocolPacket { 1: required PacketHeader header; 2: required PacketContent content; Przygienda, et al. Expires 3 October 2024 [Page 189] Internet-Draft RIFT April 2024 } Authors' Addresses Tony Przygienda (editor) Juniper Networks 1137 Innovation Way Sunnyvale, CA 94089 United States of America Email: prz@juniper.net Jordan Head (editor) Juniper Networks 1137 Innovation Way Sunnyvale, CA 94089 United States of America Email: jhead@juniper.net Alankar Sharma Hudson River Trading United States of America Email: as3957@gmail.com Pascal Thubert Individual France Email: pascal.thubert@gmail.com Bruno Rijsman Individual Email: brunorijsman@gmail.com Dmitry Afanasiev Yandex Email: fl0w@yandex-team.ru Przygienda, et al. Expires 3 October 2024 [Page 190]