(plugin-evpn-multihoming)= # EVPN Multihoming (EVPN Ethernet Segment) This plugin allows for simple EVPN Ethernet Segment configuration, also know as EVPN Multihoming. For now, the plugin supports: * ES definition on LAG or "physical" interfaces (depending on platform support) * Only `all-active` multihoming * Manual or Auto-Generated (based on LACP) Ethernet Segment Identifier ## Supported Platforms The plugin includes Jinja2 templates for the following platforms: | Operating system | ES on LAG (ESI-LAG) | ES on other interfaces | Auto ESI | | ------------------- | :--: | :--: | :--: | | Arista EOS | ✅ | ✅ | ✅ | | Cumulus NVUE | ✅ | ❌ | ❌ | | vJunos Switch | ✅ | ✅ | ✅ | ## Using the Plugin (auto mode) * Add `plugin: [ evpn.multihoming ]` to the lab topology. * Include the **evpn.es** attribute in the device interface netlab will generate, for each *Ethernet Segment*, ESI value (*Ethernet Segment ID*) and LACP System ID (for *ESI-LAG*). **NOTE**: Ethernet Segments ID will be generated starting from an integer value, which will be used as the first 5 most significant bytes (excluding the initial `0x00`). This is to: * be able to generate a 6-bytes LACP System ID starting with `0x02`. * be able to generate unique *ES-Import* target for each auto generated ESI value. ## Using the Plugin (manual mode) It is also possible to manually define ESI values for your *Ethernet Segments*. In that case: * Add `plugin: [ evpn.multihoming ]` to the lab topology. * Define a set of *ethernet segments* on the topology top-level * Include the **evpn.es** attribute in the device interface **NOTE**: EVPN Multihoming, for ESI-LAG, requires that all LAG interfaces belonging to the same *ethernet segment* share the same (unique) LACP System ID. This can be achieved using the `lag.lacp_system_id` attribute - which can accept a "real" mac address value or an integer (*1-65535*) value: in that case it will generate a mac value in the format `02:xx:yy:xx:yy:00` (i.e., `1` will become `02:00:01:00:01:00`). ### Supported attributes The plugin adds the following attributes defined at topology level: * **evpn.ethernet_segments** (dict) -- Key is the **ethernet segment** name. Each item is a *dict* with the following attributes: * **id** (esi_id, mandatory) -- ESI in format `00:XX:XX:XX:XX:XX:XX:XX:XX:XX` (only Type-0 ESI is supported for now) * **auto** (bool) -- Use ESI auto generation based on LACP System ID. If both `id` and `auto` are specified, explicit `id` takes over. Interface level attributes: * **evpn.es** (str) -- ethernet segment name (can be defined on `evpn.ethernet_segments`). ## Example (auto mode) ``` plugin: [ 'evpn.multihoming' ] bgp.as: 65000 groups: _auto_create: true switches: members: [ s1, s2 ] module: [ vlan, vxlan, ospf, bgp, evpn, lag ] probes: members: [ x1 ] module: [ lag, vlan ] device: eos hosts: members: [ h1, h2, h3 ] device: linux provider: clab vlans: red: mode: bridge links: [ h1-x1, h2-s1, h3-s2 ] links: # EVPN/VXLAN Switch to Switch Link - s1: s2: mtu: 1600 # ESI-LAG - lag: members: - s1: evpn.es: seg_1 x1: - s2: evpn.es: seg_1 x1: vlan.access: red ``` ## Example (manual mode) ``` plugin: [ 'evpn.multihoming' ] bgp.as: 65000 evpn.ethernet_segments: seg_1.id: 00:11:22:33:44:55:66:77:88:99 groups: _auto_create: true switches: members: [ s1, s2 ] module: [ vlan, vxlan, ospf, bgp, evpn, lag ] probes: members: [ x1 ] module: [ lag, vlan ] device: eos hosts: members: [ h1, h2, h3 ] device: linux provider: clab vlans: red: mode: bridge links: [ h1-x1, h2-s1, h3-s2 ] links: # EVPN/VXLAN Switch to Switch Link - s1: s2: mtu: 1600 # ESI-LAG - lag: members: - s1: lag.lacp_system_id: 1 evpn.es: seg_1 x1: - s2: lag.lacp_system_id: 1 evpn.es: seg_1 x1: vlan.access: red ```