Internet-Draft RIFT Auto-EVPN October 2021
Head, et al. Expires 25 April 2022 [Page]
Workgroup:
RIFT
Internet-Draft:
draft-ietf-rift-auto-evpn-01
Published:
Intended Status:
Standards Track
Expires:
Authors:
J. Head, Ed.
Juniper Networks
T. Przygienda
Juniper Networks
W. Lin
Juniper Networks

RIFT Auto-EVPN

Abstract

This document specifies procedures that allow an EVPN overlay to be fully and automatically provisioned when using RIFT as underlay by leveraging RIFT's no-touch ZTP architecture.

Status of This Memo

This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.

Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.

Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."

This Internet-Draft will expire on 25 April 2022.

Table of Contents

1. Introduction

RIFT is a protocol that focuses heavily on operational simplicity. [RIFT] natively supports Zero Touch Provisioning (ZTP) functionality that allows each node in an underlay network to automatically derive its place in the topology and configure itself accordingly when properly cabled. RIFT can also disseminate Key-Value information contained in Key-Value Topology Information Elements (KV-TIEs) [RIFT-KV]. These KV-TIEs can contain any information and therefore be used for any purpose. Leveraging RIFT to provision EVPN overlays without any need for configuration and leveraging KV capabilities to easily validate correct operation of such overlay without a single point of failure would provide significant benefit to operators in terms of simplicity and robustness of such a solution.

1.1. Requirements Language

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 [RFC2119].

2. Design Considerations

EVPN supports various service models, this document defines a method for the VLAN-Aware service model defined in [RFC7432]. Other service models may be considered in future revisions of this document.

Each model has its own set of requirements for deployment. For example, a functional BGP overlay is necessary to exchange EVPN NLRI regardless of the service model. Furthermore, the requirements are made up of individual variables, such as each node's loopback address and AS number for the BGP session. Some of these variables may be coordinated across each node in a network, but are ultimately locally significant (e.g. route distinguishers). Similarly, calculation of some variables will be local only to each device. RIFT contains currently enough topology information in each node to calculate all those necessary variables automatically.

Once the EVPN overlay is configured and becomes operational, RIFT Key-Value TIEs can be used to distribute state information to allow for validation of basic operational correctness without the need for further tooling.

3. System ID

The 64-bit RIFT System ID that uniquely identifies a node as defined in RIFT [RIFT].

4. Fabric ID

RIFT operates on variants of Clos substrate which are commonly called an IP Fabric. Since EVPN VLANs can be either contained within one fabric or span them, Auto-EVPN introduces the concept of a Fabric ID into RIFT.

This section describes an optional extension to LIE packet schema in the form of a 16-bit Fabric ID that identifies a nodes membership within a particular fabric. Auto-EVPN capable nodes MUST support this extension but MAY not advertise it when not participating in Auto-EVPN. A non-present Fabric ID and value of 0 is reserved as ANY_FABRIC and MUST NOT be used for any other purpose.

Fabric ID MUST be considered in existing adjacency FSM rules so nodes that support Auto-EVPN can interoperate with nodes that do not. The LIE validation is extended with following clause and if it is not met, miscabling should be declared:

(if fabric_id is not advertised by either node OR
 if fabric_id is identical on both nodes)
    AND
(if auto_evpn_version is not advertised by either node OR
 if auto_evpn_version is identical on both nodes)

The appendix (Appendix A) details necessary changes to the RIFT LIE and Node-TIE thrift schema.

5. Auto-EVPN Device Roles

Auto-EVPN requires that each node understand its given role within the scope of the EVPN implementation so each node derives the necessary variables and provides the necessary overlay configuration. For example, a leaf node performing VXLAN gateway functions does not need to derive its own Cluster ID or learn one from the route reflector that it peers with.

5.1. All Participating Nodes

Not all nodes have to participate in Auto-EVPN, however if a node does assume an Auto-EVPN role, it MUST derive the following variables:

  • IPv6 Loopback Address
    Unique IPv6 loopback address used in BGP sessions.
    Router ID
    The BGP Router ID.
    Autonomous System Number
    The ASN for IBGP sessions.
    Cluster ID
    The Cluster ID for Top-of-Fabric IBGP route reflection.

5.2. ToF Nodes as Route Reflectors

This section defines an Auto-EVPN role whereby some Top-of-Fabric nodes act as EVPN route reflectors. It is expected that route reflectors would establish IBGP sessions with leaf nodes in the same fabric. The typical route reflector requirements do not change, however determining which specific values to use requires further consideration.

ToF nodes performing route reflector functionality MUST derive the following variables:

  • IPv6 RR Loopback Address
    The source address for IBGP sessions with leaf nodes in case ToF won election for one of the route reflectors in the fabric.
    IPv6 RR Acceptable Prefix Range
    Range of addresses acceptable by the route reflector to form a IBGP session. This range covers ALL possible IPv6 Loopback Addresses derived by other Auto EVPN nodes in the current fabric and other Auto-EVPN RRs addresses.
    Cluster ID
    The Cluster ID for Top-of-Fabric IBGP route reflection.

5.2.1. Data Center Interconnect Gateway Functions

Implementations that require connectivity beyond the EVPN/VXLAN boundary can leverage Data Center Interconnect Gateway functionality. This requires additional considerations to ensure the appropriate reachability is present.

First - new VRFs and accompanying variable derivation is required, this is decribed below.

Second - additional route reflector election considerations in order to ensure that route reflectors with DCI gateway functionality are preferred. This is described later in the document in Section 6.3.2.

If DCI functionality is desired, the Top-of-Fabric nodes MUST be capable of routing toward the correct leaf node when it receives traffic from an external destination. Therefore, it MUST be capable of deriving the following types of variables:

  • Route Distinguisher
    The route distinguisher corresponding to a IP-VRF's IP prefix routes that MUST uniquely identify each node.
    Route Target
    The route target that corresponds to an IP-VRF's IP prefix routes.
    VNI
    The VNI that corresponds to the Type-5 IP prefix routes within an IP-VRF.

5.3. Leaf Nodes

Leaf nodes derive their role from realizing they are at the bottom of the fabric, i.e. not having any southbound adjacencies. Alternately, a node can assume a leaf node if it has only southbound adjacencies to nodes with explicit LEAF_LEVEL to allow for scenarios where RIFT leaves do NOT participate in Auto-EVPN.

Leaf nodes MUST derive the following variables:

  • IPv6 RR Loopback Addresses
    Addresses of the RRs present in the fabric. Those addresses are used to build BGP sessions to the RR.
    EVIs
    Leaf node derives all the necessary variables to instantiate EVIs with layer-2 and optionally layer-3 functionality.

If a leaf node is required to perform layer-2 VXLAN gateway functions, it MUST be capable of deriving the following types of variables:

  • Route Distinguisher
    The route distinguisher corresponding to a MAC-VRF that uniquely identifies each node.
    Route Target
    The route target that corresponds to a MAC-VRF.
    MAC VRF Name
    This is an optional variable to provide a common MAC VRF name across all leaves.
    Set of VLANs
    Those are VLANs provisioned either within the fabric or allowing to stretch across fabrics.

For each VLAN derived in an EVI the following variables MUST be derived:

  • VLAN
    The VLAN ID.
    Name
    This is an optional variable to provide a common VLAN name across all leaves.
    VNI
    The VNI that corresponds to the VLAN ID. This will contribute to the EVPN Type-2 route.
    IRB
    Optional variables of the IRB for the VLAN if the leaf performs layer-3 gateway function.

6. Auto-EVPN Variable Derivation

As previously mentioned, not all nodes are required to derive all variables in a given network (e.g. a transit spine node may not need to derive any or participate in Auto-EVPN). Additionally, all derived variables are derived from RIFT's FSM or ZTP mechanism so no additional flooding beside RIFT flooding is necessary for the functionality.

It is also important to mention that all variable derivation is in some way based on combinations of System ID, MAC-VRF ID, Fabric ID, EVI and VLAN and MUST comply precisely with calculation methods specified in the Auto-EVPN Variable Derivation section to allow interoperability between different implementations. All foundational code elements are also mentioned there.

6.1. Auto-EVPN Version

This section describes extensions to both the RIFT LIE packet and Node-TIE schemas in the form of a 16-bit value that identifies the Auto-EVPN Version. Auto-EVPN capable nodes MUST support this extension, but MAY choose not to advertise it in LIEs and Node-TIEs when Auto-EVPN is not being utilized.

The appendix (Appendix A) details necessary changes to the RIFT LIE and Node-TIE thrift schema.

6.2. MAC-VRF ID

This section describes a variable MAC-VRF ID that uniquely identifies an instance of EVPN instance (EVI) and is used in variable derivation procedures. Each EVPN EVI MUST be associated with a unique MAC-VRF ID, this document does not specify a method for making that association or ensuring that they are coordinated properly across fabric(s).

6.3. Loopback Address

First and foremost, RIFT does not advertise anything more specific than the fabric default route in the southbound direction by default. However, Auto-EVPN nodes MUST advertise specific loopback addresses southbound to all other Auto-EVPN nodes so to establish MP-BGP reachability correctly in all scenarios.

Auto-EVPN nodes MUST derive a ULA-scoped IPv6 loopback address to be used as both the IBGP source address, as well as the VTEP source when VXLAN gateways are required. Calculation is done using the 6-bytes of reserved ULA space, the 2-byte Fabric ID, and the node's 8-byte System ID. Derivation of the System ID varies slightly depending upon the node's location/role in the fabric and will be described in subsequent sections.

6.3.1. Leaf Nodes as Gateways

Calculation is done using the 6-bytes of reserved ULA space, the 2-byte Fabric ID, and the node's 8-byte System ID.

In order for leaf nodes to derive IPv6 loopback addresses, algorithms shown in both auto_evpn_fidsidv6loopback (Figure 28) and auto_evpn_v6prefixfidsid2loopback (Figure 13) are required.

IPv4 addresses MAY be supported, but it should be noted that they have a higher likelihood of collision. The appendix contains the required auto_evpn_fidsid2v4loopback (Figure 27) algorithm to support IPv4 loopback derivation.

6.3.2. ToF Nodes as Route Reflectors

ToF nodes acting as route reflectors MUST derive their loopback address according to the specific section describing the algorithm. Calculation is done using the 6-bytes of reserved ULA space, the 2-byte Fabric ID, and the 8-byte System ID of each elected route reflector.

In order for the ToF nodes to derive IPv6 loopbacks, the algorithms shown in both auto_evpn_fidsidv6loopback (Figure 28) and auto_evpn_fidrrpref2rrloopback (Figure 14) are required.

In order for the ToF derive the necessary prefix range to facilitate peering requests from any leaf, the algorithm shown in "auto_evpn_fid2fabric_prefixes" (Figure 12) is required.

A topology MUST elect at least 1 Top-of-Fabric node as an IBGP route reflector, but SHOULD elect 3. The election method varies depending upon whether the fabric is comprised of a single plane or multiple planes or if DCI gateway functionality is desired.

6.3.2.1. Single Plane Route Reflector Election Procedures

Each ToF performs the election independently based on system IDs of other ToFs in the fabric obtained via southbound reflection. The route reflector election procedures are defined as follows:

  1. ToF node with the highest System ID.
  2. ToF node with the lowest System ID.
  3. ToF node with the 2nd highest System ID.
  4. etc.

This ordering is necessary to prevent a single node with either the highest or lowest System ID from triggering changes to route reflector loopback addresses as it would result in all BGP sessions dropping.

For example, if two nodes, ToF01 and ToF02 with System IDs 002c6af5a281c000 and 002c6bf5788fc000 respectively, ToF02 would be elected due to it having the highest System ID of the ToFs (002c6bf5788fc000). If a ToF determines that it is elected as route reflector, it uses the knowledge of its position in the list to derive route reflector IPv6 loopback address.

The algorithm shown in "auto_evpn_sids2rrs" (Figure 10) is required to accomplish this.

6.3.2.1.1. DCI-GW Variations

It is beneficial for ToF-RRs requiring DCI-GW functions to be preferred over ToF-RRs that do not. As such, the "default_acting_auto_evpn_dci_when_tof" flag described in Appendix A.1 MUST be factored into election procedures mentioned in the previous section. Essentially, ToFs flagged as requiring DCI-GW functions, will be sorted separately from those that do not. That is to say, that ToFs requiring DCI-GW functions will always be preferred as RRs.

For example, if a fabric contains 4 ToF nodes where 2 require DCI-GW functions and the other 2 do not, the election will take place as follows:

  1. ToF node (DCI) with the highest System ID.
  2. ToF node (DCI) with the lowest System ID.
  3. ToF node (non-DCI) with the 2nd highest System ID.
  4. etc.
6.3.2.2. Multiplane Route Reflector Election Procedures

As mentioned in the main RIFT [RIFT] specification, when an implementation uses multiplane fabrics, inter-ToF rings are recommended in order to facilitate northbound flooding between ToFs in different planes.

If a multiplane implementation is using Auto-EVPN, those inter-Tof rings are REQUIRED to ensure that DCI/RR election works as intended.

Each ToF performs the election independently based on system IDs of other ToFs in the other fabrics obtained from northbound flooding across the inter-ToF rings. The highest System ID from each plane will be considered the Plane ID, which is then factored into the election as follows:

  1. The ToF node with the highest Plane ID, DCI bit, System ID
  2. The ToF node with the lowest Plane ID, DCI bit, System ID
  3. The ToF node with the 2nd highest Plane ID, DCI bit, System ID
  4. etc.

This algorithm allows DCI/RRs to be split across planes for improved redundancy.

6.4. Autonomous System Number

Nodes in each fabric MUST derive a private autonomous system number based on its Fabric ID so that it is unique across the fabric.

The algorithm shown in auto_evpn_fid2private_AS (Figure 29) is required to derive the private ASN.

6.5. Router ID

Nodes MUST drive a Router ID that is based on both its System ID and Fabric ID so that it is unique to both.

The algorithm shown in auto_evpn_sidfid2bgpid (Figure 15) is required to derive the BGP Router ID.

6.6. Cluster ID

Route reflector nodes in each fabric MUST derive a cluster ID that is based on its Fabric ID so that it is unique across the fabric.

The algorithm shown in auto_evpn_fid2clusterid (Figure 30) is required to derive the BGP Cluster ID.

6.7. Route Target

Nodes hosting EVPN EVIs MUST derive a route target extended community based on the MAC-VRF ID for each EVI so that it is unique across the network. Route targets MUST be of type 0 as per RFC4360.

For example, if given a MAC-VRF ID of 1, the derived route target would be "target:1"

The algorithm shown in auto_evpn_evi2rt (Figure 16) is required to derive the Route Target community.

6.8. Route Distinguisher

Nodes hosting EVPN EVIs MUST derive a type-0 route distinguisher based on its System ID and Fabric ID so that it is unique per node within a fabric.

The algorithm shown in auto_evpn_sidfid2rd (Figure 22) is required to derive the Route Distinguisher.

6.9. EVPN MAC-VRF Services

It's obvious that applications utilizing Auto-EVPN overlay services may require a variety of layer-2 and/or layer-3 traffic considerations. Variables supporting these services are also derived based on some combination of MAC-VRF ID, Fabric ID, and other constant values. Integrated Routing and Bridging (IRB) gateway address derivation also leverages a set of constant RANDOMSEEDS (Figure 9) values that MUST be used to provide additional entropy.

In order to ensure that VLAN ID's don't collide, a single deployment SHOULD NOT exceed 6 fabrics with 7 EVIs where each EVI terminates 30 VLANs. The algorithms shown in auto_evpn_fidevivlansvlans2desc (Figure 20) and auto_evpn_vlan_description_table (Figure 19) are required to derive VLANs accordingly. An implementation MAY exceed this, but MUST indicate methods to ensure collision-free derivation and describe which VLANs are stretched across fabrics.

Lastly, Table 3 shows example derivation results for the previously mentioned scaling figures.

6.9.1. Untagged Traffic in Multiple Fabrics

This section defines methods to derive unique VLAN, VNI, MAC, and gateway address values for deployments where untagged traffic is stretched across multiple fabrics.

6.9.1.1. VLAN

Untagged traffic stretched across multiple fabrics MUST derive VLAN tags based on MAC-VRF ID in conjunction with a constant value.

6.9.1.2. VNI

Untagged traffic stretched across multiple fabrics MUST derive VNIs based on MAC-VRF ID in conjunction with a constant value. These VNIs MUST correspond to EVPN Type-2 routes.

The algorithm shown in auto_evpn_fidevivid2vni (Figure 18) is required to derive VNIs for Type-2 EVPN routes.

6.9.1.3. MAC Address

The MAC address MUST be a unicast address and also MUST be identical for any IRB gateways that belong to an individual bridge-domain across fabrics. The last 5-bytes MUST be a hash of the MAC-VRF ID and a constant value that is calculated using the previously mentioned random seed values.

The algorithm shown in auto_evpn_fidevividsid2mac (Figure 26) is required to derive MAC addresses.

6.9.1.4. IPv6 IRB Gateway Address

The derived IPv6 gateway address MUST be from a ULA-scoped range that will account for the first 6-bytes. The next 5-bytes MUST be the last bytes of the derived MAC address. Finally, the remaining 7-bytes MUST be ::0001.

The algorithm shown in auto_evpn_fidevividsid2v6subnet (Figure 25) is required to derive the IPv6 gateway address.

6.9.1.5. IPv4 IRB Gateway Address

The derived IPv4 gateway address MUST be from a RFC1918 range, which accounts for the first octet. The next octet MUST a hash of the MAC-VRF ID and a constant value of 1 that is calculated using the previously mentioned random seed values. Finally, the remaining 2 octets MUST be 0 and 1 respectively.

The algorithm shown in auto_evpn_v4prefixfidevividsid2v4subnet (Figure 23) is required to derive the IPv4 gateway address. It should be noted that there is a higher likelihood of address collisions when deriving IPv4 addresses.

6.9.2. Tagged Traffic in Multiple Fabrics

This section defines methods to derive unique VLAN, VNI, MAC, and gateway address values for deployments where tagged traffic is stretched across multiple fabrics.

6.9.2.1. VLAN

Tagged traffic stretched across multiple fabrics MUST derive VLAN tags based on MAC-VRF ID in conjunction with a constant value.

6.9.2.2. VNI

Tagged traffic stretched across multiple fabrics MUST derive VNIs based on MAC-VRF ID in conjunction with a constant value. These VNIs MUST correspond to EVPN Type-2 routes.

The algorithm shown in auto_evpn_fidevivid2vni (Figure 18) is required to derive VNIs for Type-2 EVPN routes.

6.9.2.3. MAC Address

The MAC address MUST be a unicast address and also MUST be identical for any IRB gateways that belong to an individual bridge-domain across fabrics. The last 5-bytes MUST be a hash of the MAC-VRF ID and a constant value that is calculated using the previously mentioned random seed values.

The algorithm shown in auto_evpn_fidevividsid2mac (Figure 26) is required to derive MAC addresses.

6.9.2.4. IPv6 IRB Gateway Address

The derived IPv6 gateway address MUST be from a ULA-scoped range that will account for the first 6-bytes. The next 5-bytes MUST be the last bytes of the derived MAC address. Finally, the remaining 7-bytes MUST be ::0001.

The algorithm shown in auto_evpn_fidevividsid2v6subnet (Figure 25) is required to derive the IPv6 gateway address.

6.9.2.5. IPv4 IRB Gateway Address

The derived IPv4 gateway address MUST be from a RFC1918 range, which accounts for the first octet. The next octet MUST a hash of the MAC-VRF ID and a constant value of 16 that is calculated using the previously mentioned random seed values. Finally, the remaining 2 octets MUST be 0 and 1 respectively.

The algorithm shown in auto_evpn_v4prefixfidevividsid2v4subnet (Figure 23) is required to derive the IPv4 gateway address. It should be noted that there is a higher likelihood of address collisions when deriving IPv4 addresses.

6.9.3. Tagged Traffic in a Single Fabric

This section defines a method to derive unique VLAN, VNI, MAC, and gateway address values for deployments where untagged traffic is contained within a single fabric.

6.9.3.1. VLAN

Tagged traffic contained to a single fabric MUST derive VLAN tags based on MAC-VRF ID and Fabric ID in conjunction with a constant value.

6.9.3.2. VNI

Tagged traffic contained to a single fabric MUST derive VNIs based on MAC-VRF ID and Fabric ID in conjunction with a constant value. These VNIs MUST correspond to EVPN Type-2 routes.

The algorithm shown in auto_evpn_fidevivid2vni (Figure 18) is required to derive VNIs for Type-2 EVPN routes.

6.9.3.3. MAC Address

The MAC address MUST be a unicast address and also MUST be identical for any IRB gateways that belong to an individual bridge-domain across fabrics. The last 5-bytes MUST be a hash of the MAC-VRF ID and a constant value that is calculated using the previously mentioned random seed values.

The algorithm shown in auto_evpn_fidevividsid2mac (Figure 26) is required to derive MAC addresses.

6.9.3.4. IPv6 IRB Gateway Address

The derived IPv6 gateway address MUST be from a ULA-scoped range, which accounts for the first 6-bytes. The next 5-bytes MUST be the last bytes of the derived MAC address. Finally, the remaining 7-bytes MUST be ::0001.

The algorithm shown in auto_evpn_fidevividsid2v6subnet (Figure 25) is required to derive the IPv6 gateway address.

6.9.3.5. IPv4 IRB Gateway Address

The derived IPv4 gateway address MUST be from a RFC1918 range, which accounts for the first octet. The next octet MUST a hash of the MAC-VRF ID and a constant value of 17 that is calculated using the previously mentioned random seed values. Finally, the remaining 2 octets MUST be 0 and 1 respectively.

The algorithm shown in auto_evpn_v4prefixfidevividsid2v4subnet (Figure 23) is required to derive the IPv4 gateway address. It should be noted that there is a higher likelihood of address collisions when deriving IPv4 addresses.

6.9.4. Traffic Routed to External Destinations

6.9.4.1. Route Distinguisher

Nodes hosting IP Prefix routes MUST derive a type-0 route distinguisher based on its System ID and Fabric ID so that it is unique per IP-VRF and per node.

The algorithm shown in auto_evpn_sidfid2rd (Figure 22) is required to derive the Route Target.

6.9.4.2. Route Target

Nodes hosting IP prefix routes MUST derive a route target extended community based on the MAC-VRF ID for each IP-VRF so that it is unique across the network. Route targets MUST be of type 0.

The algorithm shown in auto_evpn_evi2rt (Figure 16) is required to derive the Route Target community.

7. Operational Considerations

To fully realize the benefits of Auto-EVPN, it may help to describe the high-level methodology. Simply put, RIFT automatically provisions the underlay and Auto-EVPN provisions the overlay. The goal of this section is to draw clear lines between general fabric concepts, RIFT, and Auto-EVPN and how they fit into current network designs and practices.

This section also describes an set of optional Key-Value TIEs that leverages the variables that have already been derived to provide further operational enhancement to the operator.

7.1. RIFT Underlay and Auto-EVPN Overlay

                      +----------------+    +----------------+
                      | Superspine-01  |    | Superspine-02  |
                      | Top-of-Fabric  |    | Top-of-Fabric  |
                      | RR/DCI Gateway |    | RR/DCI Gateway |
                      +-+--+------+--+-+    +-+--+------+--+-+
                        |  |      |  |        |  |      |  |
  +---------------------+  |      |  |        |  |      |  |
  |                        |      |  |        |  |      |  +---------------------+
  |            +-----------)------)--)--------+  |      |                        |
  |            |           |      |  |   +-------+      |                        |
  |            |           |      |  |   |              |                        |
  |            |           |      |  +---)--------------)-----------+            |
  |            |           |      |      |              |           |            |
  |            |        +--+      +------)----+         +--+        |            |
  |            |        |                |    |            |        |            |
  |            |        |            +---+    |            |        |            |
  |            |        |            |        |            |        |            |
+-+------------+-+    +-+------------+-+    +-+------------+-+    +-+------------+-+
| Spine-1-1      |    | Spine-1-2      |    | Spine-2-1      |    | Spine-2-2      |
| Top-of-PoD     |    | Top-of-PoD     |    | Top-of-PoD     |    | Top-of-PoD     |
| N/A            |    | N/A            |    | N/A            |    | N/A            |
+--+----------+--+    +--+----------+--+    +--+----------+--+    +--+----------+--+
   |          |          |          |          |          |          |          |
   |          +----------)---+      |          |          +----------)---+      |
   |                     |   |      |          |                     |   |      |
   |          +----------+   |      |          |          +----------+   |      |
   |          |              |      |          |          |              |      |
+--+----------+--+    +------+------+--+    +--+----------+--+    +------+------+--+
| Leaf-1-1       |    | Leaf-1-2       |    | Leaf-2-1       |    | Leaf-2-2       |
| Leaf           +----+ Leaf           |    | Leaf           |    | Leaf           |
| Leaf Gateway   |    | Leaf Gateway   |    | Leaf Gateway   |    | Leaf Gateway   |
+--+-------------+    +--------------+-+    +----------------+    +--------------+-+
   |                                 |                                           |
   |               ESI               |                                           |
   | (00:00:00:00:00:00:00:00:11:01) |                                           |
   |          +----------------------+                                           |
   |          |                                                                  |
+--+----------+--+                                                +--------------+-+
| Server-1-1     |                                                | Server-2-2     |
+----------------+                                                +----------------+

  +-------------- PoD-1 -------------+        +-------------- PoD-2 -------------+
Figure 1: Auto-EVPN Example Topology

Figure 1 illustrates a typical 5-stage Clos IP fabric. Each node is labelled in such a way that conveys the following:

  1. The nodes placement within the generic IP fabric.
  2. The nodes role within the RIFT IP underlay.
  3. The nodes role within the Auto-EVPN overlay.

Table 1 should also help further align these concepts.

Table 1: Role Associations
Fabric Placement RIFT Role Auto-EVPN Role
Superspine Top-of-Fabric Route Reflector and/or DCI Gateway
Spine Spine or Top-of-PoD N/A
Leaf Leaf Leaf Gateway

It's also important to remember that Auto-EVPN simply takes existing EVPN overlay deployment scenarios and simplifies the provisioning. Figure 2 further illustrates the resulting EVPN overlay topology.

                      +----------------+    +----------------+
                      | Superspine-01  |    | Superspine-02  |
                      | RR1            |    | RR2            |
                      |                |    |                |
                      +-+--+---------+-+    +-+--+---------+-+
                        |  |         |        |  |         |
  +---------------------+  |         |        |  |         |
  |                        |         |        |  |         +---------------------+
  |            +-----------)---------)--------+  |                               |
  |            |           |         |   +-------+                               |
  |            |           |         |   |                                       |
  |            |           |         +---)--------------------------+            |
  |            |           |             |                          |            |
  |            |        +--+             |                          |            |
  |            |        |                |                          |            |
  |            |        |            +---+                          |            |
  |            |        |            |                              |            |
+-+------------+-+    +-+------------+-+                          +-+------------+-+
| Leaf-1-1       |    | Leaf-1-2       |                          | Leaf-2-2       |
| Leaf Gateway   |    | Leaf Gateway   |                          | Leaf Gateway   |
|                |    |                |                          |                |
+--+-------------+    +--------------+-+                          +--------------+-+
   |                                 |                                           |
   |               ESI               |                                           |
   | (00:00:00:00:00:00:00:00:11:01) |                                           |
   |          +----------------------+                                           |
   |          |                                                                  |
+--+----------+--+                                                +--------------+-+
| Server-1-1     |                                                | Server-2-2     |
+----------------+                                                +----------------+

  +-------------- PoD-1 -------------+        +-------------- PoD-2 -------------+
Figure 2: Auto-EVPN Overlay Topology

7.2. Auto-EVPN Analytics

Leaf nodes MAY optionally advertise analytics information about the Auto-EVPN fabric to ToF nodes using RIFT Key-Value TIEs. This may be advantageous in that overlay validation and troubleshooting activities can be performed on the ToF nodes.

This section requests suggested values from the RIFT Well-Known Key-Type Registry and describes their use for Auto-EVPN.

Table 2: Requested RIFT Key Registry Values
Name Value Description
Auto-EVPN Analytics MAC-VRF 3 Analytics describing a MAC-VRF on a particular node within a fabric.
Auto-EVPN Analytics Global 4 Analytics describing an Auto-EVPN node within a fabric.

The normative Thrift schema can be found in the appendix (Appendix A.4).

7.2.1. Auto-EVPN Global Analytics Key Type

This Key Type describes node level information within the context of the Auto-EVPN fabric. The System ID of the advertising leaf node MUST be used to differentiate the node among other nodes in the fabric.

The Auto-EVPN Global Key Type MUST be advertised with the RIFT Fabric ID encoded into the 3rd and 4th bytes of the Key Identifier.

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Well-Known  |             Auto-EVPN (Global)                 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     (Auto-EVPN Role,                                          |
|      Established BGP Peer Count,                              |
|      Total BGP Peer Count,)                                   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 3: Auto-EVPN Global Key-Value TIE

where:

  • Auto-EVPN Role:

    The value indicating the node's Auto-EVPN role within the fabric.

    0:
    Illegal value, MUST NOT be used.
    1:
    Auto-EVPN Leaf Gateway
    2:
    Auto-EVPN Top-of-Fabric Gateway
    Established BGP Session Count:
    A 16-bit integer indicating the number of BGP sessions in the Established state.
    Total BGP Peer Count:
    A 16-bit integer indicating the total number of possible BGP sessions on the local node, regardless of state.

7.2.2. Auto-EVPN MAC-VRF Key Type

This Key-Value structure contains information about a specific MAC-VRF within the Auto-EVPN fabric.

The Auto-EVPN MAC-VRF Key Type MUST be advertised with the Auto-EVPN MAC-VRF ID encoded into the 3rd and 4th bytes of the Key Identifier.

All values advertised in a MAC-VRF Key-Value TIE MUST represent only state of the local node.

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Well-Known  |             Auto-EVPN (MAC-VRF)                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     (Operational CE Interface Count,                          |
|      Total CE Interface Count,                                |
|      Operational IRB Interface Count,                         |
|      Total IRB Interface Count,                               |
|      EVPN Type-2 MAC Route Count,                             |
|      EVPN Type-2 MAC/IP Route Count,                          |
|      Configured VLAN Count,                                   |
|      MAC-VRF Name,                                            |
|      MAC-VRF Description,)                                    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 4: Auto-EVPN MAC-VRF Key-Value TIE

where:

  • Operational Customer Edge Interface Count:
    A 16-bit integer indicating the number of CE interfaces associated with the MAC-VRF where both administrative and operational status are "up".
    Total Customer Edge Interface Count:
    A 16-bit integer indicating the total number of CE interfaces associated with the MAC-VRF regardless of interface status.
    Operational IRB Interface Count:
    A 16-bit integer indicating the number of IRB interfaces associated with the MAC-VRF where both administrative and operational status are "up".
    Total IRB Interface Count:
    A 16-bit integer indicating the total number of IRB interfaces associated with the MAC-VRF regardless of interface status.
    EVPN Type-2 MAC Route Count:
    A 32-bit integer indicating the total number of EVPN Type-2 MAC routes.
    EVPN Type-2 MAC/IP Route Count:
    A 32-bit integer indicating the total number of EVPN Type-2 MAC/IP routes.
    VLAN Count:
    A 16-bit integer indicating the total number configured VLANs.
    MAC-VRF Name:
    A string used to indicate the name of the MAC-VRF on the node.
    MAC-VRF Description:
    A string used to describe the MAC-VRF on the node, similar to that of an interface description.

8. Acknowledgements

The authors would like to thank Olivier Vandezande, Matthew Jones, and Michal Styszynski for their contributions.

9. Security Considerations

This document introduces no new security concerns to RIFT or other specifications referenced in this document.

10. References

10.1. Normative References

[RFC2119]
Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, , <https://www.rfc-editor.org/info/rfc2119>.
[RFC7432]
Sajassi, A., Aggarwal, R., Bitar, N., Isaac, A., Uttaro, J., Drake, J., and W. Henderickx, "BGP MPLS-Based Ethernet VPN", , <https://www.rfc-editor.org/info/rfc7432>.
[RIFT]
Przygienda, T., Sharma, A., Thubert, P., Rijsman, B., and D. Afanasiev, "RIFT: Routing in Fat Trees", Work in Progress, draft-ietf-rift-rift-13, .
[RIFT-KV]
Head, J. and T. Przygienda, "RIFT Keys Structure and Well-Known Registry in Key Value TIE", Work in Progress, draft-head-rift-kv-registry-01, .

Appendix A. Thrift Models

This section contains the normative Thrift models required to support Auto-EVPN. Per the main RIFT [RIFT] specification, all signed values MUST be interpreted as unsigned values.

A.1. common.thrift

This section specifies changes to main RIFT encoding.thrift model.

...
/** EVPN Fabric ID */
typedef  i16    FabricIDType
const    bool   default_acting_auto_evpn_dci_when_tof         = false

enum AutoEVPNModel {
    ERB_VLAN_BUNDLE,
}

const AutoEVPNModel default_autoevpn_model = AutoEVPNModel.ERB_VLAN_BUNDLE
...
Figure 5: RIFT Common Schema for Auto-EVPN

A.2. encoding.thrift

This section specifies changes to main RIFT encoding.thrift model.

struct LIEPacket {
...
    /** provides the optional ID of the configured auto-evpn fabric. */
    35: optional common.FabricIDType       fabric_id;
    /** provides optional version of EVPN ZTP as 256 * MAJOR + MINOR */
    36: optional i16                       auto_evpn_version;
...
}

struct NodeTIEElement {
...
/** It provides the optional ID of the Fabric configured */
    21: optional common.FabricIDType             fabric_id;
    /** It provides optional version of EVPN ZTP as 256 * MAJOR + MINOR */
    22: optional i16                             auto_evpn_version;
    /** ToFs in the same plane. Only carried by ToF. Multiple node TIEs can carry disjoint sets of ToFs.
        Used in complex multi-plane elections. */
    24: optional set<common.SystemIDType>        same_plane_tofs,
    /** provides optionally the EVPN model supported */
    25: optional common.AutoEVPNModel            auto_evpn_model = common.AutoEVPNModel.ERB_VLAN_BUNDLE,
...
}
Figure 6: RIFT Encoding Schema for Auto-EVPN

A.3. common_evpn.thrift

This section contains the normative Auto-EVPN Thrift schema.

/**
    Thrift file for common AUTO EVPN definitions for RIFT

    Copyright (c) Juniper Networks, Inc., 2016-
    All rights reserved.
*/

namespace py common_evpn
namespace rs models

include "common.thrift"
include "encoding.thrift"
include "statistics.thrift"

const common.FabricIDType   default_fabric_id     = 1
const i8                    default_evis          = 3
const i8                    default_vlans_per_evi = 7

typedef i32       RouterIDType
typedef i32       ASType
typedef i32       ClusterIDType

struct EVPNAnyRole {
    1: required   common.IPv6Address                    v6_loopback,
    2: required   common.IPv6Address                    type5_v6_loopback,
    3: required   common.IPv4Address                    type5_v4_loopback,
    4: required   RouterIDType                          bgp_router_id,
    5: required   ASType                                autonomous_system,
    6: required   ClusterIDType                         cluster_id,
    /** prefixes to be redistributed north */
    7: required   set<common.IPPrefixType>              redistribute_north,
    /** prefixes to be redistributed south */
    8: required   set<common.IPPrefixType>              redistribute_south,
    /** group name for evpn auto overlay */
    9: required   string                                bgp_group_name,
    /** fabric prefixes to be advertised in rift instead of default */
   10: required   set<common.IPPrefixType>              fabric_prefixes,
    /** v6 loopback prefix range, used e.g. to clean up config  */
   20: required   common.IPv6PrefixType                 v6_loopback_range,
   21: required   common.IPv6PrefixType                 rr_loopback_range,
   22: required   common.IPv6PrefixType                 type5_loopback_range,
   23: required   common.IPv4PrefixType                 type5_v4_loopback_range,
    /** v6 addresses of all possible RR loopbacks in this config. Can be used for e.g. cleanup */
   24: required   set<common.IPv6PrefixType>            possible_elected_rrs,
}

struct PartialEVPNEVI {
    // route target per RFC4360
    1: required   CommunityType                         rt_target,
    2: required   RTDistinguisherType                   rt_distinguisher,
    3: required   RTDistinguisherType                   rt_type5_distinguisher,
    5: required   string                                mac_vrf_name,
    6: required   VNIType                               type5_vni,
}

struct EVPNRRRole {
    2: required   common.IPv6Address                    v6_rr_addr_loopback,
    3: required   common.IPv6PrefixType                 v6_peers_allowed_range,
    4: required   map<MACVRFNumberType, PartialEVPNEVI> evis,
}

typedef i64         RTDistinguisherType
typedef i64         RTTargetType
typedef i16         MACVRFNumberType

typedef i16         VLANIDType
typedef binary      MACType

typedef i16         UnitType

struct IRBType {
    1: required   string                                name,
    2: required   UnitType                              unit,
    /// constant
    3: required   MACType                               mac,
    /// contains address of the gateway as well
    4: optional   common.IPv6PrefixType                 v6_subnet,
    /// contains address of the gateway as well
    5: optional   common.IPv4PrefixType                 v4_prefix,
}

typedef i32      VNIType

struct VLANType {
    1: optional   VLANIDType                            id,
    2: required   string                                name,
    3: optional   IRBType                               irb,
    5: optional   bool                                  stretched = false,
    6: optional   bool                                  is_native = false,
}

struct CEInterfaceType {
    2: optional   common.IEEE802_1ASTimeStampType       moved_to_ce,
    // we may not be able to obtain it in case of internal errors
    3: optional   string                                platform_interface_name,
}

typedef i64       CommunityType

struct EVPNEVI {
    // route target per RFC4360
    1: required   CommunityType                         rt_target,
    2: required   RTDistinguisherType                   rt_distinguisher,
    3: required   RTDistinguisherType                   rt_type5_distinguisher,
    4: required   string                                mac_vrf_name,
    // fabric unique 24 bits VNI on non-stretch, otherwise unique across fabrics
    5: required   map<VNIType, VLANType>                vlans,
    6: required   VNIType                               type5_vni,
}

struct EVPNLeafRole {
    1: required   set<common.IPv6Address>               rrs,
    2: required   map<MACVRFNumberType, EVPNEVI>        evis,
    3: optional   map<common.LinkIDType,
                      CEInterfaceType>                  ce_interfaces,

    5: optional   binary                                leaf_unique_lacp_system_id,
    6: optional   binary                                fabric_unique_lacp_system_id,
}

/// structure to indicate EVPN roles assumed and their variables for
/// external platform to configure itself accordingly. Presence of
/// according structure indicates that the role is assumed.
struct EVPNRoles {
    1: required  EVPNAnyRole                            generic,
    2: optional  EVPNRRRole                             route_reflector,
    3: optional  EVPNLeafRole                           leaf,
}

const common.TimeIntervalInSecType          default_leaf_delay = 120
const common.TimeIntervalInSecType          default_interface_ce_delay = 180
/// default delay before AUTOEVPN FSM starts to compute anything
const common.TimeIntervalInSecType          default_AUTOEVPN_startup_delay = 60
Figure 7: Auto-EVPN Common Thrift Schema

A.4. auto_evpn_kv.thrift

This section contains the normative Auto-EVPN Analytics Thrift schema.

include "common.thrift"

namespace py auto_evpn_kv
namespace rs models

/** We don't need the full role structure, only an indication of the node's basic role */
enum AutoEVPNRole {
    ILLEGAL            = 0,
    auto_evpn_leaf_erb = 1,
    auto_evpn_tof_gw   = 2,
}

enum   KVTypes {
    OUI       = 1,
    WellKnown = 2,
}

const i8            AutoEVPNWellKnownKeyType  = 1
typedef i32         AutoEVPNKeyIdentifier
typedef i16         AutoEVPNCounterType
typedef i32         AutoEVPNLongCounterType

const i8            GlobalAutoEVPNTelemetryKV = 4
const i8            AutoEVPNTelemetryKV       = 3

/** Per the according RIFT draft the key comes from the well known space.
    Part of the key is used as Fabric-ID.

    1st     byte  MUST be = "Well-Known"
    2nd     byte  MUST be = "Global Auto-EVPN Telemetry KV",
    3rd/4th bytes MUST be = FabricIDType
*/
struct AutoEVPNTelemetryGlobalKV {
    /** Only values that the ToF cannot derive itself should be flooded. */
    1: required   set<AutoEVPNRole>            auto_evpn_roles,

    /** Established BGP peer count (for Auto-EVPN)
    2: optional   AutoEVPNCounterType          established_bgp_peer_count,

    /** Total BGP peer count (for Auto-EVPN)
    3: optional   AutoEVPNCounterType          total_bgp_peer_count,
}

/** Per the according RIFT draft the key comes from the well known space.
    Part of the key is used as MAC-VRF number.

    1st     byte  MUST be = "Well-Known"
    2nd     byte  MUST be = indicates "Auto-EVPN Telemetry KV",
    3rd/4th bytes MUST be = MACVRFNumberType
*/
struct AutoEVPNTelemetryMACVRFKV {
    /** Active CE interface count (up/up)
    1: optional   AutoEVPNCounterType          active_ce_interfaces,

    /** Total CE interface count
    2: optional   AutoEVPNCounterType          total_ce_interfaces,

    /** Active IRB interface count (up/up)
    3: optional   AutoEVPNCounterType          active_irb_interfaces,

    /** Total IRB interface count
    4: optional   AutoEVPNCounterType          total_irb_interfaces,

    /** Local EVPN Type-2 MAC route count
    5: optional  AutoEVPNLongCounterType       local_evpn_type2_mac_routes,

    /** Local EVPN Type-2 MAC/IP route count
    6: optional  AutoEVPNLongCounterType       local_evpn_type2_mac_ip_routes,

    /** number of configured VLANs */
    7: optional  i16                           configured_vlans,

    /** optional human readable name */
    8: optional  string                        name,

    /** optional human readable string describing the MAC-VRF */
    9: optional  string                        description,
}
Figure 8: Auto-EVPN Key-Value Thrift Schema

Appendix B. Auto-EVPN Variable Derivation

B.1. Variable Derivation Functions

This section contains the normative derivation procedures required to support Auto-EVPN.

/// indicates how many RRs we're computing in AUTO EVPN
pub const MAX_AUTO_EVPN_RRS: usize = 3;
/// indicates the fabric has no ID, used in computations to omit effects of fabric ID
pub const NO_FABRIC_ID: FabricIDType = 0;
/// invalid MACVRF number, MACVRFs start from 1
pub const NO_MACVRF: MACVRFNumberType = 0;

/// unique v6 prefix for all nodes starts with this
pub fn auto_evpn_v6pref(fid: FabricIDType) -> String {
    format!("FD00:{:04X}:A1", fid)
}
/// how many bytes in a v6pref for different purposes
pub const AUTO_EVPN_V6PREFLEN: usize = 8 * 5;
/// unique v6 prefix for route reflector purposes starts like this
pub fn auto_evpn_v6rrpref(fid: FabricIDType) -> String {
    format!("FD00:{:04X}:A2", fid)
}
/// unique v6 prefix for type-5 purposes starts like this
pub fn auto_evpn_v6t5pref(fid: FabricIDType) -> String {
    format!("FD00:{:04X}:A3", fid)
}
/// unique v6 prefix for IRB prefix purposes
pub fn auto_evpn_v6irbpref(fid: FabricIDType) -> String {
    format!("FD00:{:04X}:A4", fid)
}
/// 2 bytes of prefix, then fabric ID, then another byte
pub const AUTO_EVPN_V6_FABPREFIXLEN: usize = 16 + 16 + 8;
/// unique v4 prefix for IRB purposes
pub const AUTO_EVPN_V4IRBPREF: &str = "10";

/// per RFC magic
const RT_TARGET_HIGH: CommunityType = 0;
const RT_TARGET_LOW: CommunityType = 0;

/// first available VLAN number
pub const FIRST_VLAN: UnsignedVLANIDType = 1;
// maximum vlan number one less than maximum to use as bitmask
pub const MAX_VLAN: UnsignedVLANIDType = 4095;
/// constant VLAN shift
pub const FIRST_VLAN_SHIFT: UnsignedVLANIDType = 32;
/// NATIVE VLAN number
pub const NATIVE_VLAN: UnsignedVLANIDType = 1;

/// abstract description of VLAN properties for a derived VLAN
pub struct VLANDescription {
    pub vlan_id: UnsignedVLANIDType,
    pub name: String,
    /// can this VLAN be stretched across multiple fabrics
    pub stretchable: bool,
    pub native: bool,
}

/// maximum number of VLANs per MACVRF
pub const MAX_VLANS_PER_EVI: usize = 30;

/// maximum number of EVIs
pub const MAX_EVIS: MACVRFNumberType = 7;

pub type VLANStretchableType = bool;
pub type VLANNativeType = bool;

pub type UnsignedVNIType = u32;
pub type UnsignedFabricIDType = u16;

pub type UnsignedUnitType = u16;
pub type UnsignedVLANIDType = u16;

pub type UnsignedRTDistinguisherType = u64;

pub const EXTRATYPE5_RD_DISTINGUISHER: u32 = 0xffff_ffff;

/// high bits of type 5 VNI
const TYPE5VNIHIGH: UnsignedVNIType = 0x0080_0000;
/// bitmask for type 2 VNI
const TYPE2VNIMASK: UnsignedVNIType = 0x00ff_ffff ^ TYPE5VNIHIGH;

/// random seeds used in several algorithms to increase entropy
pub const RANDOMSEEDS: [u64; 4] = [
    27008318799u64,
    67438371571,
    37087353685,
    88675895388,
];
Figure 9: auto_evpn_const_structs_type
/// function sorts vector of (is_dci, systemID) first,
/// splits of the DCIs from the non-DCIs and sorts them
/// followed by a shuffle taking largest/smallest/2nd largest/2nd smallest.
/// Ultimately both are merged which prefers the DCIs while
/// still making sure that the election is stable with a system ID joining
/// as smallest/largest.
pub(crate) fn auto_evpn_sids2rrs(v: Vec<(bool, UnsignedSystemID)>)
    -> Vec<UnsignedSystemID> {
    let (dcis, nondcis): (Vec<(bool, UnsignedSystemID)>, Vec<(bool, UnsignedSystemID)>) =
        v.into_iter().partition(|(dci, _)| *dci);

    vec![dcis, nondcis]
        .into_iter()
        .flat_map(|mut v| {
            v.par_sort();
            if v.len() > 2 {
                let mut s = v.split_off(v.len() / 2);
                s.reverse();
                interleave(v.into_iter(), s.into_iter())
                    .collect::<Vec<_>>()
                    .into_iter()
            } else {
                v.into_iter()
            }
        })
        .map(|(_, sid)| sid)
        .collect()
}
Figure 10: auto_evpn_sids2rrs
pub(crate) fn auto_evpn_v62octets(a: Ipv6Addr) -> Vec<u8> {
    a.octets().iter().cloned().collect()
}
Figure 11: auto_evpn_v62octets
/// fabric prefixes derived instead of advertising default on the fabric to allow
/// for default route on ToF or leaves
pub fn auto_evpn_fid2fabric_prefixes(fid: FabricIDType) -> Result<Vec<IPPrefixType>, ServiceErrorType> {
    vec![
        (auto_evpn_fidsidv6loopback(fid, ILLEGAL_SYSTEM_I_D as _), AUTO_EVPN_V6PREFLEN),
        (auto_evpn_fidrrpref2rrloopback(fid, ILLEGAL_SYSTEM_I_D as _), AUTO_EVPN_V6PREFLEN),
    ]
        .into_iter()
        .map(|(p, _)|
            match p {
                Ok(_) => Ok(
                    IPPrefixType::Ipv6prefix(
                        IPv6PrefixType {
                            address: auto_evpn_v62octets(p?),
                            prefixlen: AUTO_EVPN_V6PREFLEN as _,
                        })),
                Err(e) => Err(e),
            }
        )
        .collect::<Result<Vec<_>, _>>()
}
Figure 12: auto_evpn_fid2fabric_prefixes
/// local address with encoded fabric ID and system ID for collision free identifiers. Basis
/// for several different prefixes.
pub fn auto_evpn_v6prefixfidsid2loopback(v6pref: &str, fid: FabricIDType,
                                         sid: UnsignedSystemID) -> Result<Ipv6Addr, ServiceErrorType> {
    assert!(fid != 0);
    let a = format!("{}00::{}",
                    v6pref,
                    sid.to_ne_bytes()
                        .iter()
                        .chunks(2)
                        .into_iter()
                        .map(|chunk|
                            chunk.fold(0u16, |v, n| (v << 8) | *n as u16))
                        .map(|v| format!("{:04X}", v))
                        .collect::<Vec<_>>()
                        .into_iter()
                        .join(":")
    );

    Ipv6Addr::from_str(&a)
        .map_err(|_| ServiceErrorType::INTERNALRIFTERROR)
}
Figure 13: auto_evpn_v6prefixfidsid2loopback
/// auto evpn V6 loopback for RRs
pub fn auto_evpn_fidrrpref2rrloopback(fid: FabricIDType,
                                      preference: u8) -> Result<Ipv6Addr, ServiceErrorType> {
    auto_evpn_v6prefixfidsid2loopback(&auto_evpn_v6rrpref(fid), fid, (1 + preference) as _)
}
Figure 14: auto_evpn_fidrrpref2rrloopback
/// auto evpn BGP router ID
pub fn auto_evpn_sidfid2bgpid(fid: FabricIDType, sid: UnsignedSystemID) -> u32 {
    assert!(fid != 0);
    let hs: u32 = ((sid & 0xffff_ffff_0000_0000) >> 32) as _;
    let mut ls: u32 = (sid & 0xffff_ffff) as _;
    ls = ls.rotate_right(7) ^ (fid as u32).rotate_right(13);
    max(1, hs ^ ls) // never a 0
}
Figure 15: auto_evpn_sidfid2bgpid
/// route target bytes are type0/0 and then add EVI
pub fn auto_evpn_evi2rt(evi: MACVRFNumberType) -> CommunityType {
    let wideevi = (evi + 1) as CommunityType;

    (RT_TARGET_HIGH << (64 - 8)) | (RT_TARGET_LOW << 64 - 16) |
        ((wideevi) << 17) |
        ((wideevi))
}
Figure 16: auto_evpn_evi2rt
/// type-5 VNI for an EVI
pub fn auto_evpn_fidevi2type5vni(fid: FabricIDType, evi: MACVRFNumberType) -> UnsignedVNIType {
    TYPE5VNIHIGH | auto_evpn_fidevivid2vni(fid, evi, 0, false)
}
Figure 17: auto_evpn_fidevi2type5vni
/// type-2 VNI for a specific VLAN
pub fn auto_evpn_fidevivid2vni(fid: FabricIDType, evi: MACVRFNumberType, vlanid: VLANIDType, stretchable: bool) -> UnsignedVNIType {
    let rfid = if stretchable {
        NO_FABRIC_ID as _
    } else {
        fid as UnsignedVNIType
    };

    let revi = evi as UnsignedVNIType;
    let rvlan = vlanid as UnsignedVNIType;
// mask out high bits, VNI is only 24 bits
    TYPE2VNIMASK &
        (
            rfid.rotate_left(16) ^
                revi.rotate_left(12) ^
                rvlan
        )
}
Figure 18: auto_evpn_fidevivid2vni
/// maximum VLANs per EVI supported by auto evpn when deriving
pub fn auto_evpn_vlan_description_table<'a>(vlans: usize)
                                            -> Result<&'a [(UnsignedVLANIDType, VLANStretchableType, VLANNativeType)], ServiceErrorType> {
    // up to 15 vlans can be activated
    const VLANSARRAY: [(UnsignedVLANIDType, bool, bool); MAX_VLANS_PER_EVI] = [
        (NATIVE_VLAN, true, true, ),
        (FIRST_VLAN_SHIFT, true, false, ),
        (FIRST_VLAN_SHIFT + 1, true, false, ),
        (FIRST_VLAN_SHIFT + 2, true, false, ),
        (FIRST_VLAN_SHIFT + 3, true, false, ),
        (FIRST_VLAN_SHIFT + 4, true, false, ),
        (FIRST_VLAN_SHIFT + 5, true, false, ),
        (FIRST_VLAN_SHIFT + 6, true, false, ),
        (FIRST_VLAN_SHIFT + 7, true, false, ),
        (FIRST_VLAN_SHIFT + 8, false, false, ),
        (FIRST_VLAN_SHIFT + 9, false, false, ),
        (FIRST_VLAN_SHIFT +10, false, false, ),
        (FIRST_VLAN_SHIFT +11, false, false, ),
        (FIRST_VLAN_SHIFT +12, false, false, ),
        (FIRST_VLAN_SHIFT +13, false, false, ),
        (FIRST_VLAN_SHIFT +14, false, false, ),
        (FIRST_VLAN_SHIFT +15, false, false, ),
        (FIRST_VLAN_SHIFT +16, false, false, ),
        (FIRST_VLAN_SHIFT +17, false, false, ),
        (FIRST_VLAN_SHIFT +18, false, false, ),
        (FIRST_VLAN_SHIFT +19, false, false, ),
        (FIRST_VLAN_SHIFT +20, false, false, ),
        (FIRST_VLAN_SHIFT +21, false, false, ),
        (FIRST_VLAN_SHIFT +22, false, false, ),
        (FIRST_VLAN_SHIFT +23, false, false, ),
        (FIRST_VLAN_SHIFT +24, false, false, ),
        (FIRST_VLAN_SHIFT +25, false, false, ),
        (FIRST_VLAN_SHIFT +26, false, false, ),
        (FIRST_VLAN_SHIFT +27, false, false, ),
        (FIRST_VLAN_SHIFT +28, false, false, ),
    ];

    if vlans > VLANSARRAY.len() {
        return Err(ServiceErrorType::INVALIDPARAMETERVALUE)
    }

    Ok(&VLANSARRAY[..vlans])
}
Figure 19: auto_evpn_vlan_description_table
/// delivers the vlan description that can be used to generate vlans for a
/// specific fabric ID and a MACVRF number
pub fn auto_evpn_fidevivlansvlans2desc(fid: UnsignedFabricIDType, macvrf: MACVRFNumberType,
                                       vlans: usize) -> Vec<VLANDescription> {

    assert!(NO_MACVRF != macvrf);

    // abstract description of derived VLANs
    let vlan_table = auto_evpn_vlan_description_table(vlans)
        .expect("vlan table in AUTO EVPN incorrect");

    let vlanshift = vlan_table
        .iter()
        .map(|(vl, _, _)| *vl as usize)
        .max()
        .expect("vlan table in AUTO EVPN incorrect")
        .checked_next_power_of_two()
        .expect("vlan table in AUTO EVPN incorrect");

    assert!(vlan_table.len() < FIRST_VLAN_SHIFT as _);

    vlan_table
        .iter()
        .map(move |(vid, stretch, native_)| {
            let stretchedfid = if !stretch {
                fid
            } else {
                NO_FABRIC_ID as _
            };

            let mut vlan_id = *vid ^ stretchedfid
                .rotate_left(max(16, vlanshift as u32 + 9)) as UnsignedVLANIDType;
            // leave space for VLANs in the encoding
            vlan_id ^= macvrf.rotate_left(vlanshift as _) as UnsignedVLANIDType;

            vlan_id %= MAX_VLAN;
            vlan_id = max(1, vlan_id);

            VLANDescription {
                vlan_id: vlan_id as _,
                name: format!("V{}", vlan_id),
                stretchable: *stretch,
                native: *native_,
            }
        })
        .collect()
}
Figure 20: auto_evpn_fidevivlansvlans2desc
/// IRB interface number.
/// fid/evi combination shifted up to not interfere with the VLAN-ID
/// and then add the VLAN-ID
pub fn auto_evpn_fidevivid2irb(fid: FabricIDType, evi: MACVRFNumberType, vid: VLANIDType) -> UnsignedUnitType {

    assert!(NO_MACVRF != evi);

    let mut v = (fid as UnsignedUnitType ^ evi.rotate_left(4) as UnsignedUnitType);
    let mut v = v.rotate_left(2);

    v = 1 + v.wrapping_add(vid as UnsignedVLANIDType) % MAX_VLAN;
    v % (UnsignedUnitType::MAX - 1)
}
Figure 21: auto_evpn_fidevivid2irb
/// route distinguisher derivation
pub fn auto_evpn_sidfid2rd(sid: UnsignedSystemID, fid: UnsignedFabricIDType, extra: u32) -> UnsignedRTDistinguisherType {
    // generate type 0 route distinguisher, first 2 bytes 0 and then 6 bytes
    assert!(fid != NO_FABRIC_ID as _);
    // shift the 2 bytes we loose
    let convsid = sid as UnsignedRTDistinguisherType;
    let hs = ((sid & 0xffff_0000_0000_0000) >> 32) as UnsignedRTDistinguisherType;
    let mut ls: UnsignedRTDistinguisherType = convsid & 0x0000_ffff_ffff_ffff;
    ls ^= hs;
    ls ^= (fid as UnsignedRTDistinguisherType).rotate_left(16);
    ls ^= extra as UnsignedRTDistinguisherType;
    ls
}
Figure 22: auto_evpn_sidfid2rd
/// v4 subnet derivation
pub fn auto_evpn_v4prefixfidevividsid2v4subnet(v4pref: &str, fid: FabricIDType,
                                               evi: MACVRFNumberType, vid: VLANIDType,
                                               sid: UnsignedSystemID) -> Result<IPv4PrefixType, ServiceErrorType> {

    assert!(NO_MACVRF != evi);

    // fid can be 0 for stretched v4subnets
    let mut sub = evi.to_ne_bytes().iter()
        .fold((RANDOMSEEDS[0] & 0xff) as u8, |r, e| r.rotate_left(1) ^ e.rotate_right(1));
    sub ^= fid.to_ne_bytes().iter()
        .fold((RANDOMSEEDS[1] & 0xff) as u8, |r, e| r.rotate_left(2) ^ e.rotate_right(1));
    sub ^= vid.to_ne_bytes().iter()
        .fold((RANDOMSEEDS[2] & 0xff) as u8, |r, e| r.rotate_left(3) ^ e.rotate_right(1));

    let subnet = sub % 254; // make sure we don't show multicast subnet

    let _host = sid.to_ne_bytes().iter()
        .fold(0u16, |r, e| r.rotate_left(3) ^ e.rotate_right(3) as u16);

    let a = format!("{}.{}.{}.{}",
                    v4pref,
                    subnet,
                    0,
                    1,
    );

    Ok(
        IPv4PrefixType {
            address: Ipv4Addr::from_str(&a)
                .map_err(|_| {
                    ServiceErrorType::INTERNALRIFTERROR
                })?
                .octets()
                .iter()
                .fold(0u32, |v, nv| v << 8 | (*nv as u32)) as IPv4Address
            ,
            prefixlen: 16,
        }
    )
}
Figure 23: auto_evpn_v4prefixfidevividsid2v4subnet
/// generic v6 bytes derivation used for different purposes
pub fn auto_evpn_v6hash(fid: FabricIDType, evi: MACVRFNumberType, vid: VLANIDType, sid: UnsignedSystemID)
                        -> [u8; 8] {

    let mut sub = evi.to_ne_bytes().iter()
        .fold(RANDOMSEEDS[3], |r, e| r.rotate_left(6) ^ e.rotate_right(4) as u64);
    sub ^= fid.to_ne_bytes().iter()
        .fold(RANDOMSEEDS[0], |r, e| r.rotate_left(6) ^ e.rotate_right(4) as u64);
    sub ^= vid as u64;
    sub ^= sid;

    sub.to_ne_bytes()
}
Figure 24: auto_evpn_v6hash
/// v6 subnet derivation
pub fn auto_evpn_fidevividsid2v6subnet(fid: FabricIDType, evi: MACVRFNumberType,
                                       vid: VLANIDType,
                                       sid: UnsignedSystemID) -> Result<IPv6PrefixType, ServiceErrorType> {

    assert!(NO_MACVRF != evi);

    let sb = auto_evpn_v6hash(fid, evi, vid, sid);

    let a = format!("{}:{:02X}{:02X}:{:02X}{:02X}:{:02X}{:02X}::1",
                    auto_evpn_v6irbpref(fid),
                    sb[3] ^ sb[0],
                    sb[4] ^ sb[1],
                    sb[6],
                    sb[7],
                    sb[5],
                    sb[2],
    );

    Ok(IPv6PrefixType {
        address: Ipv6Addr::from_str(
            &a)
            .map_err(|_| {
                ServiceErrorType::INTERNALRIFTERROR
            })?
            .octets()
            .to_vec(),
        prefixlen: 64,
    })
}
Figure 25: auto_evpn_fidevividsid2v6subnet
/// MAC address derivation for IRB
pub fn auto_evpn_fidevividsid2mac(fid: FabricIDType, evi: MACVRFNumberType,
                                  vid: VLANIDType, sid: UnsignedSystemID) -> Vec<u8> {

    let sb = auto_evpn_v6hash(fid, evi, vid, sid);

    vec![0x02,
         sb[3] ^ sb[0],
         sb[4] ^ sb[1],
         sb[6],
         sb[7],
         sb[5] ^ sb[2],
    ]
}
Figure 26: auto_evpn_fidevividsid2mac
/// v4 loopback address derivation for every node in auto-evpn, returns address and
/// subnet mask length
pub fn auto_evpn_fidsid2v4loopback(fid: FabricIDType, sid: UnsignedSystemID) -> (IPv4Address, u8) {
    let mut derived = sid.to_ne_bytes().iter()
        .fold(0 as IPv4Address, |p, e| (p << 4) ^ (*e as IPv4Address));
    derived ^= fid as IPv4Address;
    // use the byte we loose for entropy
    derived ^= derived >> 24;
    // and sanitize for loopback range, we nuke 9 bits out
    derived &= 0x007f_ffff;

    let m = ((127 as IPv4Address) << 24) | derived;
    (m as _, 9)
}
Figure 27: auto_evpn_fidsid2v4loopback
/// V6 loopback derivation for every node in auto-evpn
pub fn auto_evpn_fidsidv6loopback(fid: FabricIDType,
                                  sid: UnsignedSystemID) -> Result<Ipv6Addr, ServiceErrorType> {
    auto_evpn_v6prefixfidsid2loopback(&auto_evpn_v6pref(fid), fid, sid)
}
Figure 28: auto_evpn_fidsidv6loopback
#[allow(non_snake_case)]
pub fn auto_evpn_fid2private_AS(fid: FabricIDType) -> u32 {
    assert!(fid != NO_FABRIC_ID);
    // range 4200000000-4294967294
    const DIFF: u32 = 4_294_967_294 - 4_200_000_000;
    64496 + ((fid as u32) << 3) % DIFF
}
Figure 29: auto_evpn_fid2private_AS
pub fn auto_evpn_fid2clusterid(fid: FabricIDType) -> u32 {
    auto_evpn_fid2private_AS(fid)
}
Figure 30: auto_evpn_fid2clusterid

B.2. Variable Derivation Results

This section contains functional variable derviation results that can be used as a confirmation that an implementation conforms to procedures in this document.

Table 3: Example Derivation Results
Fabric ID MAC-VRF ID VLAN ID Stretched VNI IRB
1 1 1 Y 4097 70
1 1 33 Y 4129 102
1 1 32 Y 4128 101
1 1 35 Y 4131 104
1 1 34 Y 4130 103
1 1 37 Y 4133 106
1 1 36 Y 4132 105
1 1 39 Y 4135 108
1 1 38 Y 4134 107
1 1 553 N 70185 622
1 1 552 N 70184 621
1 1 555 N 70187 624
1 1 554 N 70186 623
1 1 557 N 70189 626
1 1 556 N 70188 625
1 1 559 N 70191 628
1 1 558 N 70190 627
1 1 561 N 70193 630
1 1 560 N 70192 629
1 1 563 N 70195 632
1 1 562 N 70194 631
1 1 565 N 70197 634
1 1 564 N 70196 633
1 1 567 N 70199 636
1 1 566 N 70198 635
1 1 569 N 70201 638
1 1 568 N 70200 637
1 1 571 N 70203 640
1 1 570 N 70202 639
1 1 573 N 70205 642
1 2 3 Y 8195 136
1 2 34 Y 8226 167
1 2 35 Y 8227 168
1 2 32 Y 8224 165
1 2 33 Y 8225 166
1 2 38 Y 8230 171
1 2 39 Y 8231 172
1 2 36 Y 8228 169
1 2 37 Y 8229 170
1 2 554 N 74282 687
1 2 555 N 74283 688
1 2 552 N 74280 685
1 2 553 N 74281 686
1 2 558 N 74286 691
1 2 559 N 74287 692
1 2 556 N 74284 689
1 2 557 N 74285 690
1 2 562 N 74290 695
1 2 563 N 74291 696
1 2 560 N 74288 693
1 2 561 N 74289 694
1 2 566 N 74294 699
1 2 567 N 74295 700
1 2 564 N 74292 697
1 2 565 N 74293 698
1 2 570 N 74298 703
1 2 571 N 74299 704
1 2 568 N 74296 701
1 2 569 N 74297 702
1 2 574 N 74302 707
1 3 2 Y 12290 199
1 3 35 Y 12323 232
1 3 34 Y 12322 231
1 3 33 Y 12321 230
1 3 32 Y 12320 229
1 3 39 Y 12327 236
1 3 38 Y 12326 235
1 3 37 Y 12325 234
1 3 36 Y 12324 233
1 3 555 N 78379 752
1 3 554 N 78378 751
1 3 553 N 78377 750
1 3 552 N 78376 749
1 3 559 N 78383 756
1 3 558 N 78382 755
1 3 557 N 78381 754
1 3 556 N 78380 753
1 3 563 N 78387 760
1 3 562 N 78386 759
1 3 561 N 78385 758
1 3 560 N 78384 757
1 3 567 N 78391 764
1 3 566 N 78390 763
1 3 565 N 78389 762
1 3 564 N 78388 761
1 3 571 N 78395 768
1 3 570 N 78394 767
1 3 569 N 78393 766
1 3 568 N 78392 765
1 3 575 N 78399 772
1 4 5 Y 16389 266
1 4 36 Y 16420 297
1 4 37 Y 16421 298
1 4 38 Y 16422 299
1 4 39 Y 16423 300
1 4 32 Y 16416 293
1 4 33 Y 16417 294
1 4 34 Y 16418 295
1 4 35 Y 16419 296
1 4 556 N 82476 817
1 4 557 N 82477 818
1 4 558 N 82478 819
1 4 559 N 82479 820
1 4 552 N 82472 813
1 4 553 N 82473 814
1 4 554 N 82474 815
1 4 555 N 82475 816
1 4 564 N 82484 825
1 4 565 N 82485 826
1 4 566 N 82486 827
1 4 567 N 82487 828
1 4 560 N 82480 821
1 4 561 N 82481 822
1 4 562 N 82482 823
1 4 563 N 82483 824
1 4 572 N 82492 833
1 4 573 N 82493 834
1 4 574 N 82494 835
1 4 575 N 82495 836
1 4 568 N 82488 829
1 5 4 Y 20484 329
1 5 37 Y 20517 362
1 5 36 Y 20516 361
1 5 39 Y 20519 364
1 5 38 Y 20518 363
1 5 33 Y 20513 358
1 5 32 Y 20512 357
1 5 35 Y 20515 360
1 5 34 Y 20514 359
1 5 557 N 86573 882
1 5 556 N 86572 881
1 5 559 N 86575 884
1 5 558 N 86574 883
1 5 553 N 86569 878
1 5 552 N 86568 877
1 5 555 N 86571 880
1 5 554 N 86570 879
1 5 565 N 86581 890
1 5 564 N 86580 889
1 5 567 N 86583 892
1 5 566 N 86582 891
1 5 561 N 86577 886
1 5 560 N 86576 885
1 5 563 N 86579 888
1 5 562 N 86578 887
1 5 573 N 86589 898
1 5 572 N 86588 897
1 5 575 N 86591 900
1 5 574 N 86590 899
1 5 569 N 86585 894
1 6 7 Y 24583 396
1 6 38 Y 24614 427
1 6 39 Y 24615 428
1 6 36 Y 24612 425
1 6 37 Y 24613 426
1 6 34 Y 24610 423
1 6 35 Y 24611 424
1 6 32 Y 24608 421
1 6 33 Y 24609 422
1 6 558 N 90670 947
1 6 559 N 90671 948
1 6 556 N 90668 945
1 6 557 N 90669 946
1 6 554 N 90666 943
1 6 555 N 90667 944
1 6 552 N 90664 941
1 6 553 N 90665 942
1 6 566 N 90678 955
1 6 567 N 90679 956
1 6 564 N 90676 953
1 6 565 N 90677 954
1 6 562 N 90674 951
1 6 563 N 90675 952
1 6 560 N 90672 949
1 6 561 N 90673 950
1 6 574 N 90686 963
1 6 575 N 90687 964
1 6 572 N 90684 961
1 6 573 N 90685 962
1 6 570 N 90682 959
2 1 1 Y 4097 74
2 1 33 Y 4129 106
2 1 32 Y 4128 105
2 1 35 Y 4131 108
2 1 34 Y 4130 107
2 1 37 Y 4133 110
2 1 36 Y 4132 109
2 1 39 Y 4135 112
2 1 38 Y 4134 111
2 1 1065 N 136233 1138
2 1 1064 N 136232 1137
2 1 1067 N 136235 1140
2 1 1066 N 136234 1139
2 1 1069 N 136237 1142
2 1 1068 N 136236 1141
2 1 1071 N 136239 1144
2 1 1070 N 136238 1143
2 1 1073 N 136241 1146
2 1 1072 N 136240 1145
2 1 1075 N 136243 1148
2 1 1074 N 136242 1147
2 1 1077 N 136245 1150
2 1 1076 N 136244 1149
2 1 1079 N 136247 1152
2 1 1078 N 136246 1151
2 1 1081 N 136249 1154
2 1 1080 N 136248 1153
2 1 1083 N 136251 1156
2 1 1082 N 136250 1155
2 1 1085 N 136253 1158
2 2 3 Y 8195 140
2 2 34 Y 8226 171
2 2 35 Y 8227 172
2 2 32 Y 8224 169
2 2 33 Y 8225 170
2 2 38 Y 8230 175
2 2 39 Y 8231 176
2 2 36 Y 8228 173
2 2 37 Y 8229 174
2 2 1066 N 140330 1203
2 2 1067 N 140331 1204
2 2 1064 N 140328 1201
2 2 1065 N 140329 1202
2 2 1070 N 140334 1207
2 2 1071 N 140335 1208
2 2 1068 N 140332 1205
2 2 1069 N 140333 1206
2 2 1074 N 140338 1211
2 2 1075 N 140339 1212
2 2 1072 N 140336 1209
2 2 1073 N 140337 1210
2 2 1078 N 140342 1215
2 2 1079 N 140343 1216
2 2 1076 N 140340 1213
2 2 1077 N 140341 1214
2 2 1082 N 140346 1219
2 2 1083 N 140347 1220
2 2 1080 N 140344 1217
2 2 1081 N 140345 1218
2 2 1086 N 140350 1223
2 3 2 Y 12290 203
2 3 35 Y 12323 236
2 3 34 Y 12322 235
2 3 33 Y 12321 234
2 3 32 Y 12320 233
2 3 39 Y 12327 240
2 3 38 Y 12326 239
2 3 37 Y 12325 238
2 3 36 Y 12324 237
2 3 1067 N 144427 1268
2 3 1066 N 144426 1267
2 3 1065 N 144425 1266
2 3 1064 N 144424 1265
2 3 1071 N 144431 1272
2 3 1070 N 144430 1271
2 3 1069 N 144429 1270
2 3 1068 N 144428 1269
2 3 1075 N 144435 1276
2 3 1074 N 144434 1275
2 3 1073 N 144433 1274
2 3 1072 N 144432 1273
2 3 1079 N 144439 1280
2 3 1078 N 144438 1279
2 3 1077 N 144437 1278
2 3 1076 N 144436 1277
2 3 1083 N 144443 1284
2 3 1082 N 144442 1283
2 3 1081 N 144441 1282
2 3 1080 N 144440 1281
2 3 1087 N 144447 1288
2 4 5 Y 16389 270
2 4 36 Y 16420 301
2 4 37 Y 16421 302
2 4 38 Y 16422 303
2 4 39 Y 16423 304
2 4 32 Y 16416 297
2 4 33 Y 16417 298
2 4 34 Y 16418 299
2 4 35 Y 16419 300
2 4 1068 N 148524 1333
2 4 1069 N 148525 1334
2 4 1070 N 148526 1335
2 4 1071 N 148527 1336
2 4 1064 N 148520 1329
2 4 1065 N 148521 1330
2 4 1066 N 148522 1331
2 4 1067 N 148523 1332
2 4 1076 N 148532 1341
2 4 1077 N 148533 1342
2 4 1078 N 148534 1343
2 4 1079 N 148535 1344
2 4 1072 N 148528 1337
2 4 1073 N 148529 1338
2 4 1074 N 148530 1339
2 4 1075 N 148531 1340
2 4 1084 N 148540 1349
2 4 1085 N 148541 1350
2 4 1086 N 148542 1351
2 4 1087 N 148543 1352
2 4 1080 N 148536 1345
2 5 4 Y 20484 333
2 5 37 Y 20517 366
2 5 36 Y 20516 365
2 5 39 Y 20519 368
2 5 38 Y 20518 367
2 5 33 Y 20513 362
2 5 32 Y 20512 361
2 5 35 Y 20515 364
2 5 34 Y 20514 363
2 5 1069 N 152621 1398
2 5 1068 N 152620 1397
2 5 1071 N 152623 1400
2 5 1070 N 152622 1399
2 5 1065 N 152617 1394
2 5 1064 N 152616 1393
2 5 1067 N 152619 1396
2 5 1066 N 152618 1395
2 5 1077 N 152629 1406
2 5 1076 N 152628 1405
2 5 1079 N 152631 1408
2 5 1078 N 152630 1407
2 5 1073 N 152625 1402
2 5 1072 N 152624 1401
2 5 1075 N 152627 1404
2 5 1074 N 152626 1403
2 5 1085 N 152637 1414
2 5 1084 N 152636 1413
2 5 1087 N 152639 1416
2 5 1086 N 152638 1415
2 5 1081 N 152633 1410
2 6 7 Y 24583 400
2 6 38 Y 24614 431
2 6 39 Y 24615 432
2 6 36 Y 24612 429
2 6 37 Y 24613 430
2 6 34 Y 24610 427
2 6 35 Y 24611 428
2 6 32 Y 24608 425
2 6 33 Y 24609 426
2 6 1070 N 156718 1463
2 6 1071 N 156719 1464
2 6 1068 N 156716 1461
2 6 1069 N 156717 1462
2 6 1066 N 156714 1459
2 6 1067 N 156715 1460
2 6 1064 N 156712 1457
2 6 1065 N 156713 1458
2 6 1078 N 156726 1471
2 6 1079 N 156727 1472
2 6 1076 N 156724 1469
2 6 1077 N 156725 1470
2 6 1074 N 156722 1467
2 6 1075 N 156723 1468
2 6 1072 N 156720 1465
2 6 1073 N 156721 1466
2 6 1086 N 156734 1479
2 6 1087 N 156735 1480
2 6 1084 N 156732 1477
2 6 1085 N 156733 1478
2 6 1082 N 156730 1475
3 1 1 Y 4097 78
3 1 33 Y 4129 110
3 1 32 Y 4128 109
3 1 35 Y 4131 112
3 1 34 Y 4130 111
3 1 37 Y 4133 114
3 1 36 Y 4132 113
3 1 39 Y 4135 116
3 1 38 Y 4134 115
3 1 1577 N 202281 1654
3 1 1576 N 202280 1653
3 1 1579 N 202283 1656
3 1 1578 N 202282 1655
3 1 1581 N 202285 1658
3 1 1580 N 202284 1657
3 1 1583 N 202287 1660
3 1 1582 N 202286 1659
3 1 1585 N 202289 1662
3 1 1584 N 202288 1661
3 1 1587 N 202291 1664
3 1 1586 N 202290 1663
3 1 1589 N 202293 1666
3 1 1588 N 202292 1665
3 1 1591 N 202295 1668
3 1 1590 N 202294 1667
3 1 1593 N 202297 1670
3 1 1592 N 202296 1669
3 1 1595 N 202299 1672
3 1 1594 N 202298 1671
3 1 1597 N 202301 1674
3 2 3 Y 8195 144
3 2 34 Y 8226 175
3 2 35 Y 8227 176
3 2 32 Y 8224 173
3 2 33 Y 8225 174
3 2 38 Y 8230 179
3 2 39 Y 8231 180
3 2 36 Y 8228 177
3 2 37 Y 8229 178
3 2 1578 N 206378 1719
3 2 1579 N 206379 1720
3 2 1576 N 206376 1717
3 2 1577 N 206377 1718
3 2 1582 N 206382 1723
3 2 1583 N 206383 1724
3 2 1580 N 206380 1721
3 2 1581 N 206381 1722
3 2 1586 N 206386 1727
3 2 1587 N 206387 1728
3 2 1584 N 206384 1725
3 2 1585 N 206385 1726
3 2 1590 N 206390 1731
3 2 1591 N 206391 1732
3 2 1588 N 206388 1729
3 2 1589 N 206389 1730
3 2 1594 N 206394 1735
3 2 1595 N 206395 1736
3 2 1592 N 206392 1733
3 2 1593 N 206393 1734
3 2 1598 N 206398 1739
3 3 2 Y 12290 207
3 3 35 Y 12323 240
3 3 34 Y 12322 239
3 3 33 Y 12321 238
3 3 32 Y 12320 237
3 3 39 Y 12327 244
3 3 38 Y 12326 243
3 3 37 Y 12325 242
3 3 36 Y 12324 241
3 3 1579 N 210475 1784
3 3 1578 N 210474 1783
3 3 1577 N 210473 1782
3 3 1576 N 210472 1781
3 3 1583 N 210479 1788
3 3 1582 N 210478 1787
3 3 1581 N 210477 1786
3 3 1580 N 210476 1785
3 3 1587 N 210483 1792
3 3 1586 N 210482 1791
3 3 1585 N 210481 1790
3 3 1584 N 210480 1789
3 3 1591 N 210487 1796
3 3 1590 N 210486 1795
3 3 1589 N 210485 1794
3 3 1588 N 210484 1793
3 3 1595 N 210491 1800
3 3 1594 N 210490 1799
3 3 1593 N 210489 1798
3 3 1592 N 210488 1797
3 3 1599 N 210495 1804
3 4 5 Y 16389 274
3 4 36 Y 16420 305
3 4 37 Y 16421 306
3 4 38 Y 16422 307
3 4 39 Y 16423 308
3 4 32 Y 16416 301
3 4 33 Y 16417 302
3 4 34 Y 16418 303
3 4 35 Y 16419 304
3 4 1580 N 214572 1849
3 4 1581 N 214573 1850
3 4 1582 N 214574 1851
3 4 1583 N 214575 1852
3 4 1576 N 214568 1845
3 4 1577 N 214569 1846
3 4 1578 N 214570 1847
3 4 1579 N 214571 1848
3 4 1588 N 214580 1857
3 4 1589 N 214581 1858
3 4 1590 N 214582 1859
3 4 1591 N 214583 1860
3 4 1584 N 214576 1853
3 4 1585 N 214577 1854
3 4 1586 N 214578 1855
3 4 1587 N 214579 1856
3 4 1596 N 214588 1865
3 4 1597 N 214589 1866
3 4 1598 N 214590 1867
3 4 1599 N 214591 1868
3 4 1592 N 214584 1861
3 5 4 Y 20484 337
3 5 37 Y 20517 370
3 5 36 Y 20516 369
3 5 39 Y 20519 372
3 5 38 Y 20518 371
3 5 33 Y 20513 366
3 5 32 Y 20512 365
3 5 35 Y 20515 368
3 5 34 Y 20514 367
3 5 1581 N 218669 1914
3 5 1580 N 218668 1913
3 5 1583 N 218671 1916
3 5 1582 N 218670 1915
3 5 1577 N 218665 1910
3 5 1576 N 218664 1909
3 5 1579 N 218667 1912
3 5 1578 N 218666 1911
3 5 1589 N 218677 1922
3 5 1588 N 218676 1921
3 5 1591 N 218679 1924
3 5 1590 N 218678 1923
3 5 1585 N 218673 1918
3 5 1584 N 218672 1917
3 5 1587 N 218675 1920
3 5 1586 N 218674 1919
3 5 1597 N 218685 1930
3 5 1596 N 218684 1929
3 5 1599 N 218687 1932
3 5 1598 N 218686 1931
3 5 1593 N 218681 1926
3 6 7 Y 24583 404
3 6 38 Y 24614 435
3 6 39 Y 24615 436
3 6 36 Y 24612 433
3 6 37 Y 24613 434
3 6 34 Y 24610 431
3 6 35 Y 24611 432
3 6 32 Y 24608 429
3 6 33 Y 24609 430
3 6 1582 N 222766 1979
3 6 1583 N 222767 1980
3 6 1580 N 222764 1977
3 6 1581 N 222765 1978
3 6 1578 N 222762 1975
3 6 1579 N 222763 1976
3 6 1576 N 222760 1973
3 6 1577 N 222761 1974
3 6 1590 N 222774 1987
3 6 1591 N 222775 1988
3 6 1588 N 222772 1985
3 6 1589 N 222773 1986
3 6 1586 N 222770 1983
3 6 1587 N 222771 1984
3 6 1584 N 222768 1981
3 6 1585 N 222769 1982
3 6 1598 N 222782 1995
3 6 1599 N 222783 1996
3 6 1596 N 222780 1993
3 6 1597 N 222781 1994
3 6 1594 N 222778 1991
4 1 1 Y 4097 82
4 1 33 Y 4129 114
4 1 32 Y 4128 113
4 1 35 Y 4131 116
4 1 34 Y 4130 115
4 1 37 Y 4133 118
4 1 36 Y 4132 117
4 1 39 Y 4135 120
4 1 38 Y 4134 119
4 1 2089 N 268329 2170
4 1 2088 N 268328 2169
4 1 2091 N 268331 2172
4 1 2090 N 268330 2171
4 1 2093 N 268333 2174
4 1 2092 N 268332 2173
4 1 2095 N 268335 2176
4 1 2094 N 268334 2175
4 1 2097 N 268337 2178
4 1 2096 N 268336 2177
4 1 2099 N 268339 2180
4 1 2098 N 268338 2179
4 1 2101 N 268341 2182
4 1 2100 N 268340 2181
4 1 2103 N 268343 2184
4 1 2102 N 268342 2183
4 1 2105 N 268345 2186
4 1 2104 N 268344 2185
4 1 2107 N 268347 2188
4 1 2106 N 268346 2187
4 1 2109 N 268349 2190
4 2 3 Y 8195 148
4 2 34 Y 8226 179
4 2 35 Y 8227 180
4 2 32 Y 8224 177
4 2 33 Y 8225 178
4 2 38 Y 8230 183
4 2 39 Y 8231 184
4 2 36 Y 8228 181
4 2 37 Y 8229 182
4 2 2090 N 272426 2235
4 2 2091 N 272427 2236
4 2 2088 N 272424 2233
4 2 2089 N 272425 2234
4 2 2094 N 272430 2239
4 2 2095 N 272431 2240
4 2 2092 N 272428 2237
4 2 2093 N 272429 2238
4 2 2098 N 272434 2243
4 2 2099 N 272435 2244
4 2 2096 N 272432 2241
4 2 2097 N 272433 2242
4 2 2102 N 272438 2247
4 2 2103 N 272439 2248
4 2 2100 N 272436 2245
4 2 2101 N 272437 2246
4 2 2106 N 272442 2251
4 2 2107 N 272443 2252
4 2 2104 N 272440 2249
4 2 2105 N 272441 2250
4 2 2110 N 272446 2255
4 3 2 Y 12290 211
4 3 35 Y 12323 244
4 3 34 Y 12322 243
4 3 33 Y 12321 242
4 3 32 Y 12320 241
4 3 39 Y 12327 248
4 3 38 Y 12326 247
4 3 37 Y 12325 246
4 3 36 Y 12324 245
4 3 2091 N 276523 2300
4 3 2090 N 276522 2299
4 3 2089 N 276521 2298
4 3 2088 N 276520 2297
4 3 2095 N 276527 2304
4 3 2094 N 276526 2303
4 3 2093 N 276525 2302
4 3 2092 N 276524 2301
4 3 2099 N 276531 2308
4 3 2098 N 276530 2307
4 3 2097 N 276529 2306
4 3 2096 N 276528 2305
4 3 2103 N 276535 2312
4 3 2102 N 276534 2311
4 3 2101 N 276533 2310
4 3 2100 N 276532 2309
4 3 2107 N 276539 2316
4 3 2106 N 276538 2315
4 3 2105 N 276537 2314
4 3 2104 N 276536 2313
4 3 2111 N 276543 2320
4 4 5 Y 16389 278
4 4 36 Y 16420 309
4 4 37 Y 16421 310
4 4 38 Y 16422 311
4 4 39 Y 16423 312
4 4 32 Y 16416 305
4 4 33 Y 16417 306
4 4 34 Y 16418 307
4 4 35 Y 16419 308
4 4 2092 N 280620 2365
4 4 2093 N 280621 2366
4 4 2094 N 280622 2367
4 4 2095 N 280623 2368
4 4 2088 N 280616 2361
4 4 2089 N 280617 2362
4 4 2090 N 280618 2363
4 4 2091 N 280619 2364
4 4 2100 N 280628 2373
4 4 2101 N 280629 2374
4 4 2102 N 280630 2375
4 4 2103 N 280631 2376
4 4 2096 N 280624 2369
4 4 2097 N 280625 2370
4 4 2098 N 280626 2371
4 4 2099 N 280627 2372
4 4 2108 N 280636 2381
4 4 2109 N 280637 2382
4 4 2110 N 280638 2383
4 4 2111 N 280639 2384
4 4 2104 N 280632 2377
4 5 4 Y 20484 341
4 5 37 Y 20517 374
4 5 36 Y 20516 373
4 5 39 Y 20519 376
4 5 38 Y 20518 375
4 5 33 Y 20513 370
4 5 32 Y 20512 369
4 5 35 Y 20515 372
4 5 34 Y 20514 371
4 5 2093 N 284717 2430
4 5 2092 N 284716 2429
4 5 2095 N 284719 2432
4 5 2094 N 284718 2431
4 5 2089 N 284713 2426
4 5 2088 N 284712 2425
4 5 2091 N 284715 2428
4 5 2090 N 284714 2427
4 5 2101 N 284725 2438
4 5 2100 N 284724 2437
4 5 2103 N 284727 2440
4 5 2102 N 284726 2439
4 5 2097 N 284721 2434
4 5 2096 N 284720 2433
4 5 2099 N 284723 2436
4 5 2098 N 284722 2435
4 5 2109 N 284733 2446
4 5 2108 N 284732 2445
4 5 2111 N 284735 2448
4 5 2110 N 284734 2447
4 5 2105 N 284729 2442
4 6 7 Y 24583 408
4 6 38 Y 24614 439
4 6 39 Y 24615 440
4 6 36 Y 24612 437
4 6 37 Y 24613 438
4 6 34 Y 24610 435
4 6 35 Y 24611 436
4 6 32 Y 24608 433
4 6 33 Y 24609 434
4 6 2094 N 288814 2495
4 6 2095 N 288815 2496
4 6 2092 N 288812 2493
4 6 2093 N 288813 2494
4 6 2090 N 288810 2491
4 6 2091 N 288811 2492
4 6 2088 N 288808 2489
4 6 2089 N 288809 2490
4 6 2102 N 288822 2503
4 6 2103 N 288823 2504
4 6 2100 N 288820 2501
4 6 2101 N 288821 2502
4 6 2098 N 288818 2499
4 6 2099 N 288819 2500
4 6 2096 N 288816 2497
4 6 2097 N 288817 2498
4 6 2110 N 288830 2511
4 6 2111 N 288831 2512
4 6 2108 N 288828 2509
4 6 2109 N 288829 2510
4 6 2106 N 288826 2507
5 1 1 Y 4097 86
5 1 33 Y 4129 118
5 1 32 Y 4128 117
5 1 35 Y 4131 120
5 1 34 Y 4130 119
5 1 37 Y 4133 122
5 1 36 Y 4132 121
5 1 39 Y 4135 124
5 1 38 Y 4134 123
5 1 2601 N 334377 2686
5 1 2600 N 334376 2685
5 1 2603 N 334379 2688
5 1 2602 N 334378 2687
5 1 2605 N 334381 2690
5 1 2604 N 334380 2689
5 1 2607 N 334383 2692
5 1 2606 N 334382 2691
5 1 2609 N 334385 2694
5 1 2608 N 334384 2693
5 1 2611 N 334387 2696
5 1 2610 N 334386 2695
5 1 2613 N 334389 2698
5 1 2612 N 334388 2697
5 1 2615 N 334391 2700
5 1 2614 N 334390 2699
5 1 2617 N 334393 2702
5 1 2616 N 334392 2701
5 1 2619 N 334395 2704
5 1 2618 N 334394 2703
5 1 2621 N 334397 2706
5 2 3 Y 8195 152
5 2 34 Y 8226 183
5 2 35 Y 8227 184
5 2 32 Y 8224 181
5 2 33 Y 8225 182
5 2 38 Y 8230 187
5 2 39 Y 8231 188
5 2 36 Y 8228 185
5 2 37 Y 8229 186
5 2 2602 N 338474 2751
5 2 2603 N 338475 2752
5 2 2600 N 338472 2749
5 2 2601 N 338473 2750
5 2 2606 N 338478 2755
5 2 2607 N 338479 2756
5 2 2604 N 338476 2753
5 2 2605 N 338477 2754
5 2 2610 N 338482 2759
5 2 2611 N 338483 2760
5 2 2608 N 338480 2757
5 2 2609 N 338481 2758
5 2 2614 N 338486 2763
5 2 2615 N 338487 2764
5 2 2612 N 338484 2761
5 2 2613 N 338485 2762
5 2 2618 N 338490 2767
5 2 2619 N 338491 2768
5 2 2616 N 338488 2765
5 2 2617 N 338489 2766
5 2 2622 N 338494 2771
5 3 2 Y 12290 215
5 3 35 Y 12323 248
5 3 34 Y 12322 247
5 3 33 Y 12321 246
5 3 32 Y 12320 245
5 3 39 Y 12327 252
5 3 38 Y 12326 251
5 3 37 Y 12325 250
5 3 36 Y 12324 249
5 3 2603 N 342571 2816
5 3 2602 N 342570 2815
5 3 2601 N 342569 2814
5 3 2600 N 342568 2813
5 3 2607 N 342575 2820
5 3 2606 N 342574 2819
5 3 2605 N 342573 2818
5 3 2604 N 342572 2817
5 3 2611 N 342579 2824
5 3 2610 N 342578 2823
5 3 2609 N 342577 2822
5 3 2608 N 342576 2821
5 3 2615 N 342583 2828
5 3 2614 N 342582 2827
5 3 2613 N 342581 2826
5 3 2612 N 342580 2825
5 3 2619 N 342587 2832
5 3 2618 N 342586 2831
5 3 2617 N 342585 2830
5 3 2616 N 342584 2829
5 3 2623 N 342591 2836
5 4 5 Y 16389 282
5 4 36 Y 16420 313
5 4 37 Y 16421 314
5 4 38 Y 16422 315
5 4 39 Y 16423 316
5 4 32 Y 16416 309
5 4 33 Y 16417 310
5 4 34 Y 16418 311
5 4 35 Y 16419 312
5 4 2604 N 346668 2881
5 4 2605 N 346669 2882
5 4 2606 N 346670 2883
5 4 2607 N 346671 2884
5 4 2600 N 346664 2877
5 4 2601 N 346665 2878
5 4 2602 N 346666 2879
5 4 2603 N 346667 2880
5 4 2612 N 346676 2889
5 4 2613 N 346677 2890
5 4 2614 N 346678 2891
5 4 2615 N 346679 2892
5 4 2608 N 346672 2885
5 4 2609 N 346673 2886
5 4 2610 N 346674 2887
5 4 2611 N 346675 2888
5 4 2620 N 346684 2897
5 4 2621 N 346685 2898
5 4 2622 N 346686 2899
5 4 2623 N 346687 2900
5 4 2616 N 346680 2893
5 5 4 Y 20484 345
5 5 37 Y 20517 378
5 5 36 Y 20516 377
5 5 39 Y 20519 380
5 5 38 Y 20518 379
5 5 33 Y 20513 374
5 5 32 Y 20512 373
5 5 35 Y 20515 376
5 5 34 Y 20514 375
5 5 2605 N 350765 2946
5 5 2604 N 350764 2945
5 5 2607 N 350767 2948
5 5 2606 N 350766 2947
5 5 2601 N 350761 2942
5 5 2600 N 350760 2941
5 5 2603 N 350763 2944
5 5 2602 N 350762 2943
5 5 2613 N 350773 2954
5 5 2612 N 350772 2953
5 5 2615 N 350775 2956
5 5 2614 N 350774 2955
5 5 2609 N 350769 2950
5 5 2608 N 350768 2949
5 5 2611 N 350771 2952
5 5 2610 N 350770 2951
5 5 2621 N 350781 2962
5 5 2620 N 350780 2961
5 5 2623 N 350783 2964
5 5 2622 N 350782 2963
5 5 2617 N 350777 2958
5 6 7 Y 24583 412
5 6 38 Y 24614 443
5 6 39 Y 24615 444
5 6 36 Y 24612 441
5 6 37 Y 24613 442
5 6 34 Y 24610 439
5 6 35 Y 24611 440
5 6 32 Y 24608 437
5 6 33 Y 24609 438
5 6 2606 N 354862 3011
5 6 2607 N 354863 3012
5 6 2604 N 354860 3009
5 6 2605 N 354861 3010
5 6 2602 N 354858 3007
5 6 2603 N 354859 3008
5 6 2600 N 354856 3005
5 6 2601 N 354857 3006
5 6 2614 N 354870 3019
5 6 2615 N 354871 3020
5 6 2612 N 354868 3017
5 6 2613 N 354869 3018
5 6 2610 N 354866 3015
5 6 2611 N 354867 3016
5 6 2608 N 354864 3013
5 6 2609 N 354865 3014
5 6 2622 N 354878 3027
5 6 2623 N 354879 3028
5 6 2620 N 354876 3025
5 6 2621 N 354877 3026
5 6 2618 N 354874 3023
6 1 1 Y 4097 90
6 1 33 Y 4129 122
6 1 32 Y 4128 121
6 1 35 Y 4131 124
6 1 34 Y 4130 123
6 1 37 Y 4133 126
6 1 36 Y 4132 125
6 1 39 Y 4135 128
6 1 38 Y 4134 127
6 1 3113 N 400425 3202
6 1 3112 N 400424 3201
6 1 3115 N 400427 3204
6 1 3114 N 400426 3203
6 1 3117 N 400429 3206
6 1 3116 N 400428 3205
6 1 3119 N 400431 3208
6 1 3118 N 400430 3207
6 1 3121 N 400433 3210
6 1 3120 N 400432 3209
6 1 3123 N 400435 3212
6 1 3122 N 400434 3211
6 1 3125 N 400437 3214
6 1 3124 N 400436 3213
6 1 3127 N 400439 3216
6 1 3126 N 400438 3215
6 1 3129 N 400441 3218
6 1 3128 N 400440 3217
6 1 3131 N 400443 3220
6 1 3130 N 400442 3219
6 1 3133 N 400445 3222
6 2 3 Y 8195 156
6 2 34 Y 8226 187
6 2 35 Y 8227 188
6 2 32 Y 8224 185
6 2 33 Y 8225 186
6 2 38 Y 8230 191
6 2 39 Y 8231 192
6 2 36 Y 8228 189
6 2 37 Y 8229 190
6 2 3114 N 404522 3267
6 2 3115 N 404523 3268
6 2 3112 N 404520 3265
6 2 3113 N 404521 3266
6 2 3118 N 404526 3271
6 2 3119 N 404527 3272
6 2 3116 N 404524 3269
6 2 3117 N 404525 3270
6 2 3122 N 404530 3275
6 2 3123 N 404531 3276
6 2 3120 N 404528 3273
6 2 3121 N 404529 3274
6 2 3126 N 404534 3279
6 2 3127 N 404535 3280
6 2 3124 N 404532 3277
6 2 3125 N 404533 3278
6 2 3130 N 404538 3283
6 2 3131 N 404539 3284
6 2 3128 N 404536 3281
6 2 3129 N 404537 3282
6 2 3134 N 404542 3287
6 3 2 Y 12290 219
6 3 35 Y 12323 252
6 3 34 Y 12322 251
6 3 33 Y 12321 250
6 3 32 Y 12320 249
6 3 39 Y 12327 256
6 3 38 Y 12326 255
6 3 37 Y 12325 254
6 3 36 Y 12324 253
6 3 3115 N 408619 3332
6 3 3114 N 408618 3331
6 3 3113 N 408617 3330
6 3 3112 N 408616 3329
6 3 3119 N 408623 3336
6 3 3118 N 408622 3335
6 3 3117 N 408621 3334
6 3 3116 N 408620 3333
6 3 3123 N 408627 3340
6 3 3122 N 408626 3339
6 3 3121 N 408625 3338
6 3 3120 N 408624 3337
6 3 3127 N 408631 3344
6 3 3126 N 408630 3343
6 3 3125 N 408629 3342
6 3 3124 N 408628 3341
6 3 3131 N 408635 3348
6 3 3130 N 408634 3347
6 3 3129 N 408633 3346
6 3 3128 N 408632 3345
6 3 3135 N 408639 3352
6 4 5 Y 16389 286
6 4 36 Y 16420 317
6 4 37 Y 16421 318
6 4 38 Y 16422 319
6 4 39 Y 16423 320
6 4 32 Y 16416 313
6 4 33 Y 16417 314
6 4 34 Y 16418 315
6 4 35 Y 16419 316
6 4 3116 N 412716 3397
6 4 3117 N 412717 3398
6 4 3118 N 412718 3399
6 4 3119 N 412719 3400
6 4 3112 N 412712 3393
6 4 3113 N 412713 3394
6 4 3114 N 412714 3395
6 4 3115 N 412715 3396
6 4 3124 N 412724 3405
6 4 3125 N 412725 3406
6 4 3126 N 412726 3407
6 4 3127 N 412727 3408
6 4 3120 N 412720 3401
6 4 3121 N 412721 3402
6 4 3122 N 412722 3403
6 4 3123 N 412723 3404
6 4 3132 N 412732 3413
6 4 3133 N 412733 3414
6 4 3134 N 412734 3415
6 4 3135 N 412735 3416
6 4 3128 N 412728 3409
6 5 4 Y 20484 349
6 5 37 Y 20517 382
6 5 36 Y 20516 381
6 5 39 Y 20519 384
6 5 38 Y 20518 383
6 5 33 Y 20513 378
6 5 32 Y 20512 377
6 5 35 Y 20515 380
6 5 34 Y 20514 379
6 5 3117 N 416813 3462
6 5 3116 N 416812 3461
6 5 3119 N 416815 3464
6 5 3118 N 416814 3463
6 5 3113 N 416809 3458
6 5 3112 N 416808 3457
6 5 3115 N 416811 3460
6 5 3114 N 416810 3459
6 5 3125 N 416821 3470
6 5 3124 N 416820 3469
6 5 3127 N 416823 3472
6 5 3126 N 416822 3471
6 5 3121 N 416817 3466
6 5 3120 N 416816 3465
6 5 3123 N 416819 3468
6 5 3122 N 416818 3467
6 5 3133 N 416829 3478
6 5 3132 N 416828 3477
6 5 3135 N 416831 3480
6 5 3134 N 416830 3479
6 5 3129 N 416825 3474
6 6 7 Y 24583 416
6 6 38 Y 24614 447
6 6 39 Y 24615 448
6 6 36 Y 24612 445
6 6 37 Y 24613 446
6 6 34 Y 24610 443
6 6 35 Y 24611 444
6 6 32 Y 24608 441
6 6 33 Y 24609 442
6 6 3118 N 420910 3527
6 6 3119 N 420911 3528
6 6 3116 N 420908 3525
6 6 3117 N 420909 3526
6 6 3114 N 420906 3523
6 6 3115 N 420907 3524
6 6 3112 N 420904 3521
6 6 3113 N 420905 3522
6 6 3126 N 420918 3535
6 6 3127 N 420919 3536
6 6 3124 N 420916 3533
6 6 3125 N 420917 3534
6 6 3122 N 420914 3531
6 6 3123 N 420915 3532
6 6 3120 N 420912 3529
6 6 3121 N 420913 3530
6 6 3134 N 420926 3543
6 6 3135 N 420927 3544
6 6 3132 N 420924 3541
6 6 3133 N 420925 3542
6 6 3130 N 420922 3539

Authors' Addresses

Jordan Head (editor)
Juniper Networks
1137 Innovation Way
Sunnyvale, CA
United States of America
Tony Przygienda
Juniper Networks
1137 Innovation Way
Sunnyvale, CA
United States of America
Wen Lin
Juniper Networks
10 Technology Park Drive
Westford, MA
United States of America