Hi all

Sorry for insisting in this subject but I haven't had any luck so far finding out where the traffic is lost/dropped in the PE. I prefer to insist a bit and learn a couple of things on the way.

Thanks
tomas

On Sat, Feb 27, 2021 at 7:47 PM Tomás Morales <tomas.morales@gmail.com> wrote:
Hi all

I am trying Yakov blog below to test L3VPN using FRR7.5 and the last PE is not capable to de-encapsulate the labelled traffic and send it to the CE.

This is the diagram in my lab:

https://github.com/thomarite/linux-mpls-testing/blob/master/lab4-l3vpn/diagram/linux-mpls-lab4-v0.png

For example CE1 (vrf_cust1 - 192.168.11.102/24) tries to ping CE3 (vrf_cust1 - 192.168.23.102/24)

P1 is receiving the traffic with double labels as expected from PE1:

19:28:46.075164 MPLS (label 17, exp 0, ttl 63) (label 80, exp 0, [S], ttl 63) IP 192.168.11.102 > 192.168.23.102: ICMP echo request, id 2296, seq 10, length 64
19:28:47.099199 MPLS (label 17, exp 0, ttl 63) (label 80, exp 0, [S], ttl 63) IP 192.168.11.102 > 192.168.23.102: ICMP echo request, id 2296, seq 11, length 64

PE2 is receiving the traffic on ens8 with just one label after P1 doing PHP:

19:28:46.074437 MPLS (label 80, exp 0, [S], ttl 63) IP 192.168.11.102 > 192.168.23.102: ICMP echo request, id 2296, seq 10, length 64
19:28:47.098555 MPLS (label 80, exp 0, [S], ttl 63) IP 192.168.11.102 > 192.168.23.102: ICMP echo request, id 2296, seq 11, length 64

But then PE2 is not sending anything to CE3. I can't see anything in either end. I have checked iptables in my host just in case but I think PE2 is not sending anything.

From PE2, all routing seems correct:

PE2# show mpls table
 Inbound Label  Type  Nexthop         Outbound Label  
 -----------------------------------------------------
 16             LDP   192.168.77.102  16              
 17             LDP   192.168.77.102  implicit-null  
 18             LDP   192.168.77.102  implicit-null  
 80             BGP   vrf_cust1       -              
 81             BGP   vrf_cust2       -              

PE2#
PE2# show bgp summary

IPv4 Unicast Summary:
BGP router identifier 172.20.5.2, local AS number 65010 vrf-id 0
BGP table version 0
RIB entries 0, using 0 bytes of memory
Peers 1, using 21 KiB of memory

Neighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt
172.20.5.1      4      65010       101       108        0    0    0 01:35:41            0        0

Total number of neighbors 1

IPv4 VPN Summary:
BGP router identifier 172.20.5.2, local AS number 65010 vrf-id 0
BGP table version 0
RIB entries 7, using 1344 bytes of memory
Peers 1, using 21 KiB of memory

Neighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt
172.20.5.1      4      65010       101       108        0    0    0 01:35:41            2        2

Total number of neighbors 1
PE2#
PE2# show ip route vrf vrf_cust1
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
       F - PBR, f - OpenFabric,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup

VRF vrf_cust1:
B>  192.168.11.0/24 [200/0] via 172.20.5.1 (vrf default) (recursive), label 80, weight 1, 01:35:40
  *                           via 192.168.77.102, ens8 (vrf default), label 16/80, weight 1, 01:35:40
C>* 192.168.23.0/24 is directly connected, ens6, 01:38:19
PE2#
PE2#
PE2# show isis neighbor
Area ISIS:
  System Id           Interface   L  State        Holdtime SNPA
  P1                  ens8        2  Up            28       2020.2020.2020
PE2# 

vagrant@PE2:~$ ip route
default via 192.168.121.1 dev ens5 proto dhcp src 192.168.121.31 metric 1024
172.20.5.1  encap mpls  16 via 192.168.77.102 dev ens8 proto isis metric 20
172.20.5.5 via 192.168.77.102 dev ens8 proto isis metric 20
192.168.66.0/24 via 192.168.77.102 dev ens8 proto isis metric 20
192.168.77.0/24 dev ens8 proto kernel scope link src 192.168.77.101
192.168.121.0/24 dev ens5 proto kernel scope link src 192.168.121.31
192.168.121.1 dev ens5 proto dhcp scope link src 192.168.121.31 metric 1024
vagrant@PE2:~$
vagrant@PE2:~$ ip -4 a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 172.20.5.2/32 scope global lo
       valid_lft forever preferred_lft forever
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 192.168.121.31/24 brd 192.168.121.255 scope global dynamic ens5
       valid_lft 2524sec preferred_lft 2524sec
3: ens6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master vrf_cust1 state UP group default qlen 1000
    inet 192.168.23.101/24 brd 192.168.23.255 scope global ens6
       valid_lft forever preferred_lft forever
4: ens7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master vrf_cust2 state UP group default qlen 1000
    inet 192.168.24.101/24 brd 192.168.24.255 scope global ens7
       valid_lft forever preferred_lft forever
5: ens8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 192.168.77.101/24 brd 192.168.77.255 scope global ens8
       valid_lft forever preferred_lft forever
vagrant@PE2:~$
vagrant@PE2:~$ ip -M route
16 as to 16 via inet 192.168.77.102 dev ens8 proto ldp
17 via inet 192.168.77.102 dev ens8 proto ldp
18 via inet 192.168.77.102 dev ens8 proto ldp
vagrant@PE2:~$
vagrant@PE2:~$ ip route show table 10
blackhole default
192.168.11.0/24  encap mpls  16/80 via 192.168.77.102 dev ens8 proto bgp metric 20
broadcast 192.168.23.0 dev ens6 proto kernel scope link src 192.168.23.101
192.168.23.0/24 dev ens6 proto kernel scope link src 192.168.23.101
local 192.168.23.101 dev ens6 proto kernel scope host src 192.168.23.101
broadcast 192.168.23.255 dev ens6 proto kernel scope link src 192.168.23.101
vagrant@PE2:~$
 vagrant@PE2:~$ ip vrf      
Name              Table
-----------------------
vrf_cust1           10
vrf_cust2           20
vagrant@PE2:~$


This is PE2 FRR config:

PE2# show running-config
Building configuration...

Current configuration:
!
frr version 7.5
frr defaults traditional
hostname PE2
service integrated-vtysh-config
!
interface ens8
 ip router isis ISIS
 isis circuit-type level-2-only
 isis network point-to-point
!
interface lo
 ip router isis ISIS
 isis passive
!
router bgp 65010
 neighbor 172.20.5.1 remote-as 65010
 neighbor 172.20.5.1 update-source 172.20.5.2
 !
 address-family ipv4 vpn
  neighbor 172.20.5.1 activate
 exit-address-family
!
router bgp 65010 vrf vrf_cust1
 !
 address-family ipv4 unicast
  redistribute connected
  label vpn export auto
  rd vpn export 65010:10
  rt vpn both 1:1
  export vpn
  import vpn
 exit-address-family
!
router bgp 65010 vrf vrf_cust2
 !
 address-family ipv4 unicast
  redistribute connected
  label vpn export auto
  rd vpn export 65010:20
  rt vpn both 2:2
  export vpn
  import vpn
 exit-address-family
!
mpls ldp
 router-id 172.20.5.2
 !
 address-family ipv4
  discovery transport-address 172.20.5.2
  !
  interface ens8
  !
 exit-address-family
 !
!
router isis ISIS
 net 49.0001.1720.2000.5002.00
!
line vty
!
end
PE2#


This is PE2 sysctl mpls config:

root@PE2:/home/vagrant# sysctl -a | grep mpls
net.mpls.conf.ens5.input = 0
net.mpls.conf.ens6.input = 0
net.mpls.conf.ens7.input = 0
net.mpls.conf.ens8.input = 1
net.mpls.conf.lo.input = 0
net.mpls.conf.vrf_cust1.input = 0
net.mpls.conf.vrf_cust2.input = 0
net.mpls.default_ttl = 255
net.mpls.ip_ttl_propagate = 1
net.mpls.platform_labels = 100000
root@PE2:/home/vagrant#
 


This is PE1:

PE1#
PE1# show bgp summary

IPv4 Unicast Summary:
BGP router identifier 172.20.5.1, local AS number 65010 vrf-id 0
BGP table version 0
RIB entries 0, using 0 bytes of memory
Peers 1, using 21 KiB of memory

Neighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt
172.20.5.2      4      65010       111       105        0    0    0 01:39:14            0        0

Total number of neighbors 1

IPv4 VPN Summary:
BGP router identifier 172.20.5.1, local AS number 65010 vrf-id 0
BGP table version 0
RIB entries 11, using 2112 bytes of memory
Peers 1, using 21 KiB of memory

Neighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt
172.20.5.2      4      65010       111       105        0    0    0 01:39:14            2        2

Total number of neighbors 1
PE1#
PE1#
PE1# show mpls table
 Inbound Label  Type  Nexthop         Outbound Label  
 -----------------------------------------------------
 16             LDP   192.168.66.102  implicit-null  
 17             LDP   192.168.66.102  implicit-null  
 18             LDP   192.168.66.102  17              
 80             BGP   vrf_cust1       -              
 81             BGP   vrf_cust2       -              

PE1#
PE1# show ip route vrf
all        default    vrf_cust1  vrf_cust2  
PE1# show ip route vrf vrf_cust1
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
       F - PBR, f - OpenFabric,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup

VRF vrf_cust1:
C>* 192.168.11.0/24 is directly connected, ens6, 01:44:51
B>  192.168.23.0/24 [200/0] via 172.20.5.2 (vrf default) (recursive), label 80, weight 1, 01:39:18
  *                           via 192.168.66.102, ens8 (vrf default), label 17/80, weight 1, 01:39:18
PE1#
 PE1# show isis neighbor
Area ISIS:
  System Id           Interface   L  State        Holdtime SNPA
  P1                  ens8        2  Up            30       2020.2020.2020
PE1#
PE1#
 

If I try to ping CE3 to CE1, I see exactly the same behaviour in PE1.

Any idea what I am missing?

Thanks
tomas

On Mon, Nov 23, 2020 at 12:00 PM <frog-request@lists.frrouting.org> wrote:
>
>
> Date: Mon, 23 Nov 2020 10:27:44 +0000
> From: "Yakov Sh." <yman@protonmail.ch>
> To: Olivier CALVANO <o.calvano@gmail.com>
> Cc: "frog@lists.frrouting.org" <frog@lists.frrouting.org>
> Subject: Re: [FROG] FRRouting and MPLS
> Message-ID:
>         <TaX1p13MyS4pDJfNgZ_qra4Lqq-QppV4Gc_JkTUmi9s41lOR7krEd9PBvr1kfX52s03BEhaxOxsaeb_KiIeKoe0QVUUnx-zRhDI72rDSwrM=@protonmail.ch>
>
> Content-Type: text/plain; charset="utf-8"
>
> Hi!
> I had not much experience with FRR in production, but I gave it a try some time ago in a lab and was able to build L3VPN service on VMs with kernel VRF support. You can see details in my blog post - http://dvjourney.yman.site/2018/10/26/l3vpn-on-linux/
> For L2VPN, as stated in docs, only OpenBSD supports VPWS/VPLS at the moment. http://docs.frrouting.org/en/latest/overview.html#feature-matrix
>
> Yakov Sh.
> telegram: @darkyman
>
> ‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
> On Monday, November 23, 2020 12:15 PM, Olivier CALVANO <o.calvano@gmail.com> wrote:
>
> > Hello,
> >
> > I have just installed FRR for the first time on a Linux CentOS 8 distribution. I am therefore just starting out.
> >
> > I am gradually reading the forums but there is a lot of information. FRR manages without worries the BGP and the ISIS which I use regularly on my cisco routers.
> >
> > I am now trying to find out if FRR can integrate more deeply into my network, particularly at the MPLS level. as I understood it is in the Kernel that this is done and not in FRR, but is there a way to integrate VRF IP VPN? and the creation of a VLAN type subinterface directly in FRR?
> >
> > Then last question: Is there an implementation of the Cisco EoMPLS equivalent in FRR? (xconnect encapsultation mpls)
> >
> > thank you
> > Olivier
>