Seamless MPLS path with SRTE and BGP-LU

We have many ways to build lsps nowadays: rsvp, ldp, srte.

As you know, with lsps, every router does some sort of magic with multiple pop/push/swap operations. That way it is possible, in a certain sense, to stick together multiple lsps and build end to end seamless mpls paths.

Here, I am going to provide an example of this.

Let’s consider this topology:

We have a SRTE colorless LSP to 1.1.1.100 on R3.
Then, on R7, we have another LSP (it might be RSVP, LDP; in this case it is L-OSPF) to R3.

R5 is acting as RR and we have the following sessions:

  • R1-R5: inet unicast
  • R3-R5: LU
  • R7-R5: inet unicast + LU

On R3 I have this:

set protocols bgp group rr4 type internal
set protocols bgp group rr4 local-address 3.3.3.3
set protocols bgp group rr4 family inet labeled-unicast rib inet.3
set protocols bgp group rr4 export exp-bgp-rr
set protocols bgp group rr4 neighbor 5.5.5.5

set policy-options policy-statement exp-bgp-rr term inet3 from protocol spring-te
set policy-options policy-statement exp-bgp-rr term inet3 from route-filter 1.1.1.100/32 exact
set policy-options policy-statement exp-bgp-rr term inet3 then accept
set policy-options policy-statement exp-bgp-rr then reject

set protocols source-packet-routing source-routing-path r1-bkp to 1.1.1.1
set protocols source-packet-routing source-routing-path r1-bkp binding-sid 1000111
set protocols source-packet-routing source-routing-path r1-bkp install 1.1.1.100
set protocols source-packet-routing source-routing-path r1-bkp primary r1-bkp-sl
#segment list definition ommitted (not important here)

What we do is to define the colorless lsp which is placed into inet.3. That route is advertised via BGP-LU to RR (LU configured to use inet.3 as primary reference table).

Route is advertised:

root@r3# run show route advertising-protocol bgp 5.5.5.5 extensive

inet.3: 7 destinations, 8 routes (7 active, 0 holddown, 0 hidden)
* 1.1.1.100/32 (1 entry, 1 announced)
 BGP group rr4 type Internal
     Route Label: 81
     Nexthop: Self
     Flags: Nexthop Change
     MED: 1
     Localpref: 100
     AS path: [100] I
     Entropy label capable, ELCv3

Route is advertised with label 81. Please notice, the binding sid (1000111) used when defining the SRTE lsp is not used by BGP-LU that, instead, allocates another label.

Locally, label 81 is used to send traffic to the lsp:

root@r3# run show route label 81

mpls.0: 29 destinations, 29 routes (29 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both

81                 *[VPN/170] 00:11:20, metric2 0
                    >  to 192.168.23.0 via ge-0/0/1.0, Swap 79, Push 27(top)

[edit]
root@r3# run show route 1.1.1.100

inet.3: 7 destinations, 8 routes (7 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both

1.1.1.100/32       *[SPRING-TE/15] 02:49:23, metric 1, metric2 16777215
                    >  to 192.168.23.0 via ge-0/0/1.0, Push 79, Push 27(top)

On R7, I have bgp configured to receive the route and place it into inet.3:

root@r7# show protocols bgp| display set
set protocols bgp group rr4 type internal
set protocols bgp group rr4 local-address 7.7.7.7
set protocols bgp group rr4 family inet labeled-unicast rib inet.3
set protocols bgp group rr4 neighbor 5.5.5.5

[edit]
root@r7# run show route receive-protocol bgp 5.5.5.5 extensive table inet.3

inet.3: 7 destinations, 7 routes (7 active, 0 holddown, 0 hidden)
* 1.1.1.100/32 (1 entry, 1 announced)
     Accepted
     Route Label: 81
     Nexthop: 3.3.3.3
     MED: 1
     Localpref: 100
     AS path: I  (Originator)
     Cluster list:  0.0.0.100
     Originator ID: 3.3.3.3
     Entropy label capable, ELCv3, next hop field matches route next hop

[edit]
root@r7# run show route 1.1.1.100

inet.3: 7 destinations, 7 routes (7 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both

1.1.1.100/32       *[BGP/170] 00:12:00, MED 1, localpref 100, from 5.5.5.5
                      AS path: I, validation-state: unverified
                    >  to 192.168.57.0 via ge-0/0/0.0, Push 81, Push 1003(top)
                       to 192.168.67.0 via ge-0/0/1.0, Push 81, Push 1003(top)

[edit]
root@r7# run show route 1.1.1.100 extensive | match protocol
                Protocol next hop: 3.3.3.3
                        Protocol next hop: 3.3.3.3 Metric: 2 ResolvState: Resolved

[edit]
root@r7# run show route 3.3.3.3 table inet.3

inet.3: 7 destinations, 7 routes (7 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both

3.3.3.3/32         *[L-OSPF/10/5] 3w5d 00:03:17, metric 2
                    >  to 192.168.57.0 via ge-0/0/0.0, Push 1003
                       to 192.168.67.0 via ge-0/0/1.0, Push 1003

R7 now has a route towards 1.1.1.100:

  • 2 labels stack
  • bottom label is the BGP-LU label
  • top label is the transport label towards the node that advertised the route (R3, PNH 3.3.3.3)

Now, we have a mpls path from R7 up to R1 to reach 1.1.1.100.

Next, we enable iBGP inet unicast on R1, RR and R7.

On R7 we simply need to add:

set protocols bgp group rr4 family inet unicast

On R1:

set protocols bgp group rr4 type internal
set protocols bgp group rr4 local-address 1.1.1.1
set protocols bgp group rr4 family inet unicast
set protocols bgp group rr4 export exp-bgp-rr
set protocols bgp group rr4 neighbor 5.5.5.5

set policy-options policy-statement exp-bgp-rr term stc from tag 60
set policy-options policy-statement exp-bgp-rr term stc then next-hop 1.1.1.100
set policy-options policy-statement exp-bgp-rr term stc then accept
set policy-options policy-statement exp-bgp-rr then reject

set routing-options static route 60.1.2.0/24 discard
set routing-options static route 60.1.2.0/24 tag 60

RR config is:

set protocols bgp group rr4 type internal
set protocols bgp group rr4 local-address 5.5.5.5
set protocols bgp group rr4 family inet labeled-unicast rib inet.3
set protocols bgp group rr4 family inet unicast
set protocols bgp group rr4 cluster 0.0.0.100
set protocols bgp group rr4 neighbor 3.3.3.3
set protocols bgp group rr4 neighbor 7.7.7.7
set protocols bgp group rr4 neighbor 1.1.1.1

Please notice, it is fundamental to have “rib inet.3” for LU family so to have both LU and inet unicast enabled at the same time.

R1 advertises a route with NH 1.1.1.100 to RR:

root@r1# run show route advertising-protocol bgp 5.5.5.5 extensive

inet.0: 24 destinations, 24 routes (24 active, 0 holddown, 0 hidden)
* 60.1.2.0/24 (1 entry, 1 announced)
 BGP group rr4 type Internal
     Nexthop: 1.1.1.100
     Flags: Nexthop Change
     Localpref: 100
     AS path: [100] I

R7 imports that route into inet.0 and uses the lsp to 1.1.1.100 to resolve it:

root@r7# run show route receive-protocol bgp 5.5.5.5 extensive

inet.0: 35 destinations, 35 routes (35 active, 0 holddown, 0 hidden)
* 60.1.2.0/24 (1 entry, 1 announced)
     Accepted
     Nexthop: 1.1.1.100
     Localpref: 100
     AS path: I  (Originator)
     Cluster list:  0.0.0.100
     Originator ID: 1.1.1.1

inet.3: 7 destinations, 7 routes (7 active, 0 holddown, 0 hidden)

* 1.1.1.100/32 (1 entry, 1 announced)
     Accepted
     Route Label: 81
     Nexthop: 3.3.3.3
     MED: 1
     Localpref: 100
     AS path: I  (Originator)
     Cluster list:  0.0.0.100
     Originator ID: 3.3.3.3
     Entropy label capable, ELCv3, next hop field matches route next hop

iso.0: 1 destinations, 1 routes (1 active, 0 holddown, 0 hidden)

mpls.0: 20 destinations, 20 routes (20 active, 0 holddown, 0 hidden)

inet6.0: 1 destinations, 1 routes (1 active, 0 holddown, 0 hidden)

[edit]
root@r7# run show route table inet.0 60.1.2.0/24

inet.0: 35 destinations, 35 routes (35 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both

60.1.2.0/24        *[BGP/170] 00:19:09, localpref 100, from 5.5.5.5
                      AS path: I, validation-state: unverified
                       to 192.168.57.0 via ge-0/0/0.0, Push 81, Push 1003(top)
                    >  to 192.168.67.0 via ge-0/0/1.0, Push 81, Push 1003(top)

End to End IP reachability leveraging our seamless mpls path combining SRTE + BGP-LU + L-OSPF!

Ciao
IoSonoUmberto

Leave a comment