FRRouting / frr

The FRRouting Protocol Suite
https://frrouting.org/
Other
3.32k stars 1.25k forks source link

Segment Routing : unable to configure segment-list with segment type E (RFC9256 : NAI prefix and local iface) #16185

Open wso37 opened 4 months ago

wso37 commented 4 months ago

Description

The daemon pathd can not retrieve adjacency SID based on a remote node-SID (prefix) and a local unnumbered interface.

segment-list definition with nai adjacency works fine if the interface are configured with in point-to-point with the peers address.

          ┌─────────┐             
          │  sr-01  │             
          └─┬─────┬─┘             
   eth3.131 │     │ eth3.132      
            │     │               
    VLAN 131│     │VLAN 132       
            │     │               
            │     │               
   eth1.131 │     │ eth1.132      
          ┌─┴─────┴─┐             
          │  sr-02  │             
          └─────────┘             

sr-01 : interface eth3.131 ip address 10.1.0.1 peer 10.1.0.3/32

segment-routing traffic-eng mpls-te on mpls-te import isis segment-list sl-01 index 10 nai adjacency 10.1.0.1 10.1.0.3 exit policy color 1 endpoint 0.0.0.0 binding-sid 25000 candidate-path preference 10 name cp-01 explicit segment-list sl-01 exit exit exit


sr-03 : interface eth1.131 ip address 10.1.0.3 peer 10.1.0.1/32


However I want to configure adjacency without specifying the peer address in the point-to-point interface and by using prefix and local iface index.


sr-01 : interface eth3.131 ip address 10.1.0.1/32

segment-routing traffic-eng mpls-te on mpls-te import isis segment-list sl-01 index 10 nai prefix 3.3.3.3/32 iface 7 exit


sr-03 : interface eth1.131 ip address 10.1.0.3/32

Version

Tested with the following version and architecture :
 - Alpine Linux 3.20, ARM64, FRR 10.0 & FRR 9.1
 - Debian 12.5, AMD64, FRR 10.0 

Copyright 1996-2005 Kunihiro Ishiguro, et al.
configured with:
    '--prefix=/usr' '--localstatedir=/run/frr' '--sbindir=/usr/lib/frr' '--sysconfdir=/etc/frr' '--libdir=/usr/lib/frr' '--with-moduledir=/usr/lib/frr/modules' '--disable-dependency-tracking' '--enable-rpki' '--with-libpam' '--enable-doc' '--enable-doc-html' '--enable-snmp' '--enable-fpm' '--disable-protobuf' '--disable-zeromq' '--enable-ospfapi' '--enable-bgp-vnc' '--enable-multipath=256' '--enable-user=frr' '--enable-group=frr' '--enable-vty-group=frrvty' '--enable-configfile-mask=0640' '--enable-logfile-mask=0640' 'CC=gcc' 'CXX=g++' 'PYTHON=python3'

How to reproduce

          ┌─────────┐             
          │  sr-01  │             
          └─┬─────┬─┘             
   eth3.131 │     │ eth3.132      
            │     │               
    VLAN 131│     │VLAN 132       
            │     │               
            │     │               
   eth1.131 │     │ eth1.132      
          ┌─┴─────┴─┐             
          │  sr-02  │             
          └─────────┘             

sr-01 configuration

Current configuration: ! frr version 10.0 frr defaults traditional hostname sr-01 log file /tmp/frr.log hostname FRR-01 service integrated-vtysh-config ! debug isis sr-events debug isis te-events debug isis events debug pathd mpls-te debug pathd policy ! interface eth3.131 ip address 10.1.0.1/32 ip router isis sr isis network point-to-point mpls enable link-params exit-link-params exit ! interface eth3.132 ip address 10.2.0.1/32 ip router isis sr isis network point-to-point mpls enable link-params exit-link-params exit ! interface lo ip address 1.1.1.1/32 ip router isis sr isis passive mpls enable exit ! router isis sr is-type level-2-only net 49.0000.0000.0001.00 mpls-te on mpls-te router-address 1.1.1.1 mpls-te export segment-routing on segment-routing node-msd 8 segment-routing prefix 1.1.1.1/32 index 1 no-php-flag exit ! segment-routing traffic-eng mpls-te on mpls-te import isis segment-list sl-01 index 10 nai prefix 3.3.3.3/32 iface 7 exit policy color 1 endpoint 0.0.0.0 binding-sid 25000 candidate-path preference 10 name cp-01 explicit segment-list sl-01 exit exit exit ! end

sr-03 configuration

Current configuration: ! frr version 10.0 frr defaults traditional hostname sr-03 hostname FRR-03 service integrated-vtysh-config ! interface eth1.131 ip address 10.1.0.3/32 ip router isis sr isis network point-to-point mpls enable link-params exit-link-params exit ! interface eth1.132 ip address 10.2.0.3/32 ip router isis sr isis network point-to-point mpls enable link-params exit-link-params exit ! interface eth2 shutdown exit ! interface eth3 shutdown exit ! interface lo ip address 3.3.3.3/32 ip router isis sr isis passive mpls enable exit ! router isis sr is-type level-2-only net 49.0000.0000.0003.00 mpls-te on mpls-te router-address 3.3.3.3 mpls-te export segment-routing on segment-routing node-msd 8 segment-routing prefix 3.3.3.3/32 index 3 no-php-flag exit ! segment-routing traffic-eng mpls-te on mpls-te import isis exit exit ! end

Expected behavior

Success of the TED query type E to retrieve the adjacency SID.

Actual behavior

Below the ERROR in the log file of pathd:

PATH: [J6ABG-ASJFH] segment_list_has_prefix: [rcv ted] CLI NOT FOUND Continue query_type_e PREFIX (3.3.3.3/32) IFACE (7) sid:(-1)! PATH: [MWDWH-347ZK] Segment list name (10) index (sl-01) PATH: [GGA79-HSVDR] srte_ted_do_query_type_e: PATHD-TED: SL: ERROR query E : ted-sid (-1) PATH: [M3PYG-1S2M8] policy: SR-TE(0.0.0.0, 1): best candidate changed from cp-01 to none

Additional context

          ┌─────────┐             
          │  sr-01  │             
          └─┬─────┬─┘             
   eth3.131 │     │ eth3.132      
            │     │               
    VLAN 131│     │VLAN 132       
            │     │               
            │     │               
   eth1.131 │     │ eth1.132      
          ┌─┴─────┴─┐             
          │  sr-02  │             
          └─────────┘             

####################################

FRR-01# show isis mpls-te database detail Area sr:

    Traffic Engineering Database: ISIS (key: 1)

Vertex (1): sr-01 Router Id: 1.1.1.1 Origin: ISIS_L2 Status: Sync Segment Routing Capabilities: SRGB: [16000/23999] SRLB: [15000/15999] Algo: SPF S-SPF MSD: 8 Outgoing Edges: 2 To: sr-03(3.3.3.3) Local: 10.1.0.1 Remote: 10.1.0.3 To: sr-03(3.3.3.3) Local: 10.2.0.1 Remote: 10.2.0.3 Incoming Edges: 0 Subnets: 3 Prefix: 1.1.1.1/32 Prefix: 10.1.0.1/32 Prefix: 10.2.0.1/32

Vertex (3): sr-03 Router Id: 3.3.3.3 Origin: ISIS_L2 Status: Sync Segment Routing Capabilities: SRGB: [16000/23999] SRLB: [15000/15999] Algo: SPF S-SPF MSD: 8 Outgoing Edges: 0 Incoming Edges: 2 From: sr-01(1.1.1.1) Local: 10.1.0.1 Remote: 10.1.0.3 From: sr-01(1.1.1.1) Local: 10.2.0.1 Remote: 10.2.0.3 Subnets: 3 Prefix: 3.3.3.3/32 Prefix: 10.1.0.3/32 Prefix: 10.2.0.3/32

Edge (10.1.0.1): 10.1.0.1 Adv. Vertex: 0000.0000.0001 Metric: 10 Status: Sync Origin: ISIS_L2 Local IPv4 address: 10.1.0.1 Remote IPv4 address: 10.1.0.3 Maximum Bandwidth: 1.25e+06 (Bytes/s) Maximum Reservable Bandwidth: 1.25e+06 (Bytes/s) Unreserved Bandwidth per Class Type

    [2]: 1.25e+06 (Bytes/sec)       [3]: 1.25e+06 (Bytes/s)
    [4]: 1.25e+06 (Bytes/sec)       [5]: 1.25e+06 (Bytes/s)
    [6]: 1.25e+06 (Bytes/sec)       [7]: 1.25e+06 (Bytes/s)
IPv4 Adjacency-SID: 15000   Flags: 0x30     Weight: 0x0

Edge (10.2.0.1): 10.2.0.1 Adv. Vertex: 0000.0000.0001 Metric: 10 Status: Sync Origin: ISIS_L2 Local IPv4 address: 10.2.0.1 Remote IPv4 address: 10.2.0.3 Maximum Bandwidth: 1.25e+06 (Bytes/s) Maximum Reservable Bandwidth: 1.25e+06 (Bytes/s) Unreserved Bandwidth per Class Type

    [2]: 1.25e+06 (Bytes/sec)       [3]: 1.25e+06 (Bytes/s)
    [4]: 1.25e+06 (Bytes/sec)       [5]: 1.25e+06 (Bytes/s)
    [6]: 1.25e+06 (Bytes/sec)       [7]: 1.25e+06 (Bytes/s)
IPv4 Adjacency-SID: 15001   Flags: 0x30     Weight: 0x0

Subnet: 1.1.1.1/32 Adv. Vertex: 0000.0000.0001 Metric: 10 Status: Sync Origin: ISIS_L2 SID: 1 Algorithm: 0 Flags: 0x60

Subnet: 3.3.3.3/32 Adv. Vertex: 0000.0000.0003 Metric: 10 Status: Sync Origin: ISIS_L2 SID: 3 Algorithm: 0 Flags: 0x60

Subnet: 10.1.0.1/32 Adv. Vertex: 0000.0000.0001 Metric: 10 Status: Sync Origin: ISIS_L2

Subnet: 10.1.0.3/32 Adv. Vertex: 0000.0000.0003 Metric: 10 Status: Sync Origin: ISIS_L2

Subnet: 10.2.0.1/32 Adv. Vertex: 0000.0000.0001 Metric: 10 Status: Sync Origin: ISIS_L2

Subnet: 10.2.0.3/32 Adv. Vertex: 0000.0000.0003 Metric: 10 Status: Sync Origin: ISIS_L2

    Total: 2 Vertices, 2 Edges, 6 Subnets

#######################################

FRR-03# show isis mpls-te database detail Area sr:

    Traffic Engineering Database: ISIS (key: 1)

Vertex (1): sr-01 Router Id: 1.1.1.1 Origin: ISIS_L2 Status: Sync Segment Routing Capabilities: SRGB: [16000/23999] SRLB: [15000/15999] Algo: SPF S-SPF MSD: 8 Outgoing Edges: 2 To: sr-03(3.3.3.3) Local: 10.1.0.1 Remote: 10.1.0.3 To: sr-03(3.3.3.3) Local: 10.2.0.1 Remote: 10.2.0.3 Incoming Edges: 0 Subnets: 3 Prefix: 1.1.1.1/32 Prefix: 10.1.0.1/32 Prefix: 10.2.0.1/32

Vertex (3): sr-03 Router Id: 3.3.3.3 Origin: ISIS_L2 Status: Sync Segment Routing Capabilities: SRGB: [16000/23999] SRLB: [15000/15999] Algo: SPF S-SPF MSD: 8 Outgoing Edges: 0 Incoming Edges: 2 From: sr-01(1.1.1.1) Local: 10.1.0.1 Remote: 10.1.0.3 From: sr-01(1.1.1.1) Local: 10.2.0.1 Remote: 10.2.0.3 Subnets: 3 Prefix: 3.3.3.3/32 Prefix: 10.1.0.3/32 Prefix: 10.2.0.3/32

Edge (10.1.0.1): 10.1.0.1 Adv. Vertex: 0000.0000.0001 Metric: 10 Status: Sync Origin: ISIS_L2 Local IPv4 address: 10.1.0.1 Remote IPv4 address: 10.1.0.3 Maximum Bandwidth: 1.25e+06 (Bytes/s) Maximum Reservable Bandwidth: 1.25e+06 (Bytes/s) Unreserved Bandwidth per Class Type

    [2]: 1.25e+06 (Bytes/sec)       [3]: 1.25e+06 (Bytes/s)
    [4]: 1.25e+06 (Bytes/sec)       [5]: 1.25e+06 (Bytes/s)
    [6]: 1.25e+06 (Bytes/sec)       [7]: 1.25e+06 (Bytes/s)
IPv4 Adjacency-SID: 15000   Flags: 0x30     Weight: 0x0

Edge (10.2.0.1): 10.2.0.1 Adv. Vertex: 0000.0000.0001 Metric: 10 Status: Sync Origin: ISIS_L2 Local IPv4 address: 10.2.0.1 Remote IPv4 address: 10.2.0.3 Maximum Bandwidth: 1.25e+06 (Bytes/s) Maximum Reservable Bandwidth: 1.25e+06 (Bytes/s) Unreserved Bandwidth per Class Type

    [2]: 1.25e+06 (Bytes/sec)       [3]: 1.25e+06 (Bytes/s)
    [4]: 1.25e+06 (Bytes/sec)       [5]: 1.25e+06 (Bytes/s)
    [6]: 1.25e+06 (Bytes/sec)       [7]: 1.25e+06 (Bytes/s)
IPv4 Adjacency-SID: 15001   Flags: 0x30     Weight: 0x0

Subnet: 1.1.1.1/32 Adv. Vertex: 0000.0000.0001 Metric: 10 Status: Sync Origin: ISIS_L2 SID: 1 Algorithm: 0 Flags: 0x60

Subnet: 3.3.3.3/32 Adv. Vertex: 0000.0000.0003 Metric: 10 Status: Sync Origin: ISIS_L2 SID: 3 Algorithm: 0 Flags: 0x60

Subnet: 10.1.0.1/32 Adv. Vertex: 0000.0000.0001 Metric: 10 Status: Sync Origin: ISIS_L2

Subnet: 10.1.0.3/32 Adv. Vertex: 0000.0000.0003 Metric: 10 Status: Sync Origin: ISIS_L2

Subnet: 10.2.0.1/32 Adv. Vertex: 0000.0000.0001 Metric: 10 Status: Sync Origin: ISIS_L2

Subnet: 10.2.0.3/32 Adv. Vertex: 0000.0000.0003 Metric: 10 Status: Sync Origin: ISIS_L2

    Total: 2 Vertices, 2 Edges, 6 Subnets

#################################################################

FRR-01# sh mpls table Inbound Label Type Nexthop Outbound Label

15000 SR (IS-IS) 10.1.0.3 implicit-null
15001 SR (IS-IS) 10.2.0.3 implicit-null
16001 SR (IS-IS) lo -
16003 SR (IS-IS) 10.2.0.3 16003
16003 SR (IS-IS) 10.1.0.3 16003

FRR-03# show mpls table Inbound Label Type Nexthop Outbound Label

15000 SR (IS-IS) 10.1.0.1 implicit-null
15001 SR (IS-IS) 10.2.0.1 implicit-null
16001 SR (IS-IS) 10.2.0.1 16001
16001 SR (IS-IS) 10.1.0.1 16001
16003 SR (IS-IS) lo -

FRR-01# show interface eth3.131 Interface eth3.131 is up, line protocol is up Link ups: 1 last: 2024/06/07 14:45:47.74 Link downs: 0 last: (never) vrf: default index 7 metric 0 mtu 1500 speed 0 txqlen 1000 flags: <UP,BROADCAST,RUNNING,MULTICAST> MPLS enabled Type: Ethernet HWaddr: 52:54:00:5c:90:61 inet 10.1.0.1/32 unnumbered inet6 fe80::5054:ff:fe5c:9061/64 Interface Type Vlan Interface Slave Type None VLAN Id 131 protodown: off Parent interface: eth3 Traffic Engineering Link Parameters: Maximum Bandwidth 1.25e+06 (Byte/s) Maximum Reservable Bandwidth 1.25e+06 (Byte/s) Unreserved Bandwidth per Class Type in Byte/s:

  [2]: 1.25e+06 (Bytes/sec),        [3]: 1.25e+06 (Bytes/sec)
  [4]: 1.25e+06 (Bytes/sec),        [5]: 1.25e+06 (Bytes/sec)
  [6]: 1.25e+06 (Bytes/sec),        [7]: 1.25e+06 (Bytes/sec)

Checklist

odd22 commented 4 months ago

Right now, TE code (for both IS-IS and OSPF) supports only P2P with IP address interface. In fact, when building the TE topology, we need to link Nodes (Vertex) through the Links (Edge). For that purpose, we need a unique identifier for the interface. Right now, IPv4, IPv6 and Link Local/Link Remote ID are supported. So, Unnumbered interface could be supported if we could exchange these Link Local / Link Remote ID. This need some code evolution and enhancement.

wso37 commented 4 months ago

Thank you for your answer.

I want to say an interface with a /32 IP address. (I said unnumbered because /32 interface appears as unnumbered in FRR).

If I well understand, the configuration below described in the documentation https://docs.frrouting.org/en/latest/pathd.html is not possible :

segment-routing traffic-eng mpls-te on mpls-te import ospfv2 segment-list SL1 index 10 nai prefix 10.1.2.1/32 iface 1 index 20 nai adjacency 10.1.20.1 10.1.20.2

Thank you,

Wso

odd22 commented 3 months ago

Hi,

/32 IP address is not considered an unnumbered address from the Traffic Engineering Database point of view. Thus, pathd should deal with such /32 IP address set on interface. But, not sure that the Is-IS adjacency fire up in this case. Personally, I'm using /31 IP address for link between routers and it is working fine.

Second, in the example you raised, the /32 IP address is here the Loopback IP address that designated the destination router. Not the one of an interface. Thus, this /32 IP address is associated to a prefix SID which is different from an adjacency SID. Prefix SID are only advertised if the interface is of type loopback. Not for standard interface for which only adjacency SID are advertised.