Arista EOS MPLS P/PE-router Behavior
Something didn’t feel right as I tried to check whether the IPv4 ECMP I observed in the latest version of Arista cEOS containers works with my MPLS/anycast scenario. The forwarding tables seemed OK, but I wasn’t getting MPLS labels in the ICMP replies (see RFC 4950 for details), even though I know Arista EOS can generate them.
I decided to go down that rabbit hole and built the simplest possible BGP-free core (the addition of BGP will become evident in a few seconds) to investigate PE/P-router behavior:

Lab topology
After starting the lab (lab topology in case you want to reproduce the behavior), I started checking the usual data structures:
- LDP bindings seemed OK. However, like Junos, but unlike Cisco IOS, Arista EOS creates bindings only for the /32 IPv4 prefixes.
LDP bindings on PE1 running Arista EOS
pe1#show mpls ldp bindings
10.0.0.1/32
Local binding: Label: imp-null
Remote binding: Peer ID: 10.0.0.3:0, Label: 100000
10.0.0.2/32
Local binding: Label: 116386
Remote binding: Peer ID: 10.0.0.3:0, Label: 100002
10.0.0.3/32
Local binding: Label: 116384
Remote binding: Peer ID: 10.0.0.3:0, Label: imp-null
10.0.0.4/32
Local binding: Label: 116385
Remote binding: Peer ID: 10.0.0.3:0, Label: 100001
- Based on the LDP bindings, the LFIB looked OK:
LFIB on PE1 running Arista EOS
pe1#show mpls route
[...]
116384 A[1]
via M, 10.1.0.1, pop
EgressACL: apply
directly connected, Ethernet2
ca:f0:00:03:00:01, vlan 1007
116385 A[1]
via M, 10.1.0.1, swap 100001
EgressACL: apply
directly connected, Ethernet2
ca:f0:00:03:00:01, vlan 1007
116386 A[1]
via M, 10.1.0.1, swap 100002
EgressACL: apply
directly connected, Ethernet2
ca:f0:00:03:00:01, vlan 1007
- The root cause turned out to be the forwarding table. Contrary to Cisco IOS, which uses MPLS encapsulation for all prefixes with known LDP bindings from downstream routers, Arista EOS performs MPLS encapsulation for BGP destinations, but not for IGP destinations:
Forwarding table on PE1 running Arista EOS
pe1#show ip route | begin Gateway
Gateway of last resort is not set
C 10.0.0.1/32
directly connected, Loopback0
I L2 10.0.0.2/32 [115/40]
via 10.1.0.1, Ethernet2
I L2 10.0.0.3/32 [115/20]
via 10.1.0.1, Ethernet2
I L2 10.0.0.4/32 [115/30]
via 10.1.0.1, Ethernet2
C 10.1.0.0/30
directly connected, Ethernet2
I L2 10.1.0.4/30 [115/20]
via 10.1.0.1, Ethernet2
I L2 10.1.0.8/30 [115/30]
via 10.1.0.1, Ethernet2
C 172.16.0.0/24
directly connected, Ethernet1
B I 172.16.1.0/24 [200/0]
via 10.0.0.2/32, LDP tunnel index 3
via 10.1.0.1, Ethernet2, label 100002
You might have noticed a few other weird details in the printouts:
- The vlan 1007 in the LFIB printout is the internal VLAN used for the layer-3 interface between PE1 and P1:
Internal VLAN usage on PE1 running Arista EOS
pe1#show vlan internal usage
1006 Ethernet1
1007 Ethernet2
- The LDP-assigned labels for the same prefix vary wildly between different devices. For example, PE1 assigns 116385 to 10.0.0.4/32, while its peer (running the same software and with the same settings) assigns 100001. The culprits are the default allocation ranges assigned by Arista EOS – LDP gets the lowest labels unless you configured BGP before it. Changing the label ranges with the mpls label range command doesn’t help either, as BGP and LDP use the same dynamic allocation pool.
Arista EOS MPLS label ranges on PE1 (BGP + LDP)
pe1#show mpls label ranges
Start End Size Usage
------------------------------------------------
0 15 16 reserved
16 99999 99984 static mpls
100000 116383 16384 bgp (dynamic)
116384 132767 16384 ldp (dynamic)
132768 362143 229376 free (dynamic)
362144 899999 537856 unassigned
900000 965535 65536 bgp-sr
900000 965535 65536 isis-sr
900000 965535 65536 ospf-sr
965536 1031071 65536 srlb
1031072 1032095 1024 l2evpn shared ethernet-segment
1032096 1036287 4192 unassigned
1036288 1048575 12288 l2evpn
Arista EOS MPLS label ranges on PE1 (LDP only)
p1#show mpls label ranges
Start End Size Usage
------------------------------------------------
0 15 16 reserved
16 99999 99984 static mpls
100000 116383 16384 ldp (dynamic)
116384 362143 245760 free (dynamic)
362144 899999 537856 unassigned
900000 965535 65536 bgp-sr
900000 965535 65536 isis-sr
900000 965535 65536 ospf-sr
965536 1031071 65536 srlb
1031072 1032095 1024 l2evpn shared ethernet-segment
1032096 1036287 4192 unassigned
1036288 1048575 12288 l2evpn