public icon indicating copy to clipboard operation
public copied to clipboard

Flex-algo model for IGP

Open vivek-ilangovan opened this issue 3 years ago • 9 comments

Support for IGP Flexible algorithms (https://datatracker.ietf.org/doc/html/draft-ietf-lsr-flex-algo-18)

The change proposes model for following

  1. Definition of flexible algorithm
  2. Advertising of flexible algorithm definition in IS-IS or just participation of IS-IS node in flexible algorithm
  3. Advertisement of a prefix-segment associated with a flexible-algorithm in IS-IS

Flex-algorithm is keyed by a name. Attributes of flex-algorithms can be defined under /network-instances/network-instance/flex-algorithms

+--rw flex-algorithms
|  +--rw algorithm* [name]
|     +--rw name      -> ../config/name
|     +--rw config
|     |  +--rw name?                string
|     |  +--rw flex-algo-id         flex-algo-id
|     |  +--rw metric-type?         flex-algo-metric-type
|     |  +--rw calc-type?           flex-algo-calc-type
|     |  +--rw priority?            uint8
|     |  +--rw exclude-group*       bit-position
|     |  +--rw include-all-group*   bit-position
|     |  +--rw include-any-group*   bit-position
|     |  +--rw srlg-names*          -> ../../../../mpls/te-global-attributes/srlgs/srlg/name
|     |  +--rw srlg-values*         uint32
|     |  +--rw color?               uint32
|     +--ro state
|        +--ro name?                string
|        +--ro flex-algo-id         flex-algo-id
|        +--ro metric-type?         flex-algo-metric-type
|        +--ro calc-type?           flex-algo-calc-type
|        +--ro priority?            uint8
|        +--ro exclude-group*       bit-position
|        +--ro include-all-group*   bit-position
|        +--ro include-any-group*   bit-position
|        +--ro srlg-names*          -> ../../../../mpls/te-global-attributes/srlgs/srlg/name
|        +--ro srlg-values*         uint32
|        +--ro color?               uint32

Once the flex-algo attributes are defined, the IGPs can participate/advertise them by using the flex-algo-name. For example in case of IS-IS the path in the model will be /network-instances/network-instance/protocols/protocol/isis/global/segment-routing/config/fad-bindings

+--rw isis
|  +--rw global
...
|  |  +--rw segment-routing
|  |  |  +--rw config
|  |  |  |  +--rw enabled?        boolean
|  |  |  |  +--rw srgb?           -> ../../../../../../../segment-routing/srgbs/srgb/config/local-id
|  |  |  |  +--rw srlb?           -> ../../../../../../../segment-routing/srlbs/srlb/config/local-id
|  |  |  |  +--rw fad-bindings
|  |  |  |     +--rw fad-binding* [flex-algo-name]
|  |  |  |        +--rw flex-algo-name    -> /network-instances/network-instance/flex-algorithms/algorithm/name
|  |  |  |        +--rw isis-level?       oc-isis-types:level-type
|  |  |  |        +--rw advertised?       boolean
|  |  |  +--ro state
|  |  |     +--ro enabled?        boolean
|  |  |     +--ro srgb?           -> ../../../../../../../segment-routing/srgbs/srgb/config/local-id
|  |  |     +--ro srlb?           -> ../../../../../../../segment-routing/srlbs/srlb/config/local-id
|  |  |     +--ro fad-bindings
|  |  |        +--ro fad-binding* [flex-algo-name]
|  |  |           +--ro flex-algo-name    -> /network-instances/network-instance/flex-algorithms/algorithm/name
|  |  |           +--ro isis-level?       oc-isis-types:level-type
|  |  |           +--ro advertised?       boolean

IGPs can advertise prefix-segments with an associated flex-algo by using the flex-algo-name. flex-algo-prefix-sids container is added for associating prefix with a flex-algo segment. Currently only isis uses this container and the path is /network-instances/network-instance/protocols/protocol/isis/interfaces/interface/levels/level/afi-safi/af/segment-routing/flex-algo-prefix-sids

+--rw isis
|  +--rw global
...
|  +--rw interfaces
|     +--rw interface* [interface-id]
...
|        +--rw levels
|        |  +--rw level* [level-number]
|        |     +--rw level-number            -> ../config/level-number
...
 |        |     +--rw afi-safi
 |        |     |  +--rw af* [afi-name safi-name]
...
 |        |     |     +--rw segment-routing
 |        |     |        +--rw prefix-sids
 |        |     |        |  +--rw prefix-sid* [prefix]
 |        |     |        |     +--rw prefix    -> ../config/prefix
 |        |     |        |     +--rw config
 |        |     |        |     |  +--rw prefix?          inet:ip-prefix
 |        |     |        |     |  +--rw sid-id?          oc-srt:sr-sid-type
 |        |     |        |     |  +--rw label-options?   enumeration
 |        |     |        |     +--ro state
 |        |     |        |        +--ro prefix?          inet:ip-prefix
 |        |     |        |        +--ro sid-id?          oc-srt:sr-sid-type
 |        |     |        |        +--ro label-options?   enumeration
 |        |     |        +--rw flex-algo-prefix-sids
 |        |     |        |  +--rw flex-algo-prefix-sid* [prefix flex-algo-name]
 |        |     |        |     +--rw prefix            -> ../config/prefix
 |        |     |        |     +--rw flex-algo-name    -> ../config/flex-algo-name
 |        |     |        |     +--rw config
 |        |     |        |     |  +--rw prefix?           inet:ip-prefix
 |        |     |        |     |  +--rw flex-algo-name?   -> /network-instances/network-instance/flex-algorithms/algorithm/name
 |        |     |        |     |  +--rw sid-id?           oc-srt:sr-sid-type
 |        |     |        |     +--ro state
 |        |     |        |        +--ro prefix?           inet:ip-prefix
 |        |     |        |        +--ro flex-algo-name?   -> /network-instances/network-instance/flex-algorithms/algorithm/name
 |        |     |        |        +--ro sid-id?           oc-srt:sr-sid-type

This matches the config model used in eos: https://eos.arista.com/eos-4-27-0f/is-is-flexible-algorithm/ We can configure flex algo definition under router traffic-engineering. This will translate to the path /network-instances/network-instance/flex-algorithms in the yang model

router traffic-engineering
   flex-algo
      flex-algo 128 HFT
      priority 85
      color 47
      metric min-delay
      administrative-group include all 0,3,5 include any 2,4,6 exclude 7-15
      srlg exclude flag marea warf 101 680 880 17

The IS-IS can make use of this definition to either advertise it or it can just participate in the algorithm. This translates to the /network-instances/network-instance/protocols/protocol/isis/global/segment-routing/config/fad-bindings

router isis Amun
   ...
   segment-routing mpls
      flex-algo HFT level-1 advertised

IS-IS can advertise prefix-segments associated with a particular flex algorithm. In EOS, this can be configured under interface mode. This translates to this yang path: /network-instances/network-instance/protocols/protocol/isis/interfaces/interface/levels/level/afi-safi/af/segment-routing/flex-algo-prefix-sids

[no | default] node-segment (ipv4|ipv6) index <value> [flex-algo <name>]

Other vendors configuration model looks similar:

Cisco: https://www.cisco.com/c/en/us/td/docs/routers/asr9000/software/asr9k-r6-6/segment-routing/configuration/guide/b-segment-routing-cg-asr9000-66x/b-segment-routing-cg-asr9000-66x_chapter_01111.html

Junos: https://www.juniper.net/documentation/us/en/software/junos/is-is/topics/topic-map/infocus-isis-flex-algo-sr.html

Nokia: https://infocenter.nokia.com/public/7750SR217R1A/index.jsp?topic=%2Fcom.nokia.Segment_Routing_and_PCE_User_Guide_21.7.R1%2Fconfiguring_flexible_algorithms.html

vivek-ilangovan avatar Jan 04 '22 11:01 vivek-ilangovan

Compatibility Report for commit b7103831e5026f7ba74e29fb397297c215c21edb: ⛔ pyangbind@23a7a0d

OpenConfigBot avatar Jan 04 '22 11:01 OpenConfigBot

Somehow the goyang/ygot is failing and it does not seem to be because of this PR. I have no idea how to make it pass!

Sample failure log:

/go/bin/generator -output_file=/go/src/aft.openconfig-aft//oc.go -path=/workspace/release/models,/workspace/third_party/ietf -package_name=exampleoc -generate_fakeroot -fakeroot_name=device -compress_paths=true -shorten_enum_leaf_names -trim_enum_openconfig_prefix -typedef_enum_with_defmod -enum_suffix_for_simple_union_enums -exclude_modules=ietf-interfaces -generate_rename -generate_append -generate_getters -generate_leaf_getters -generate_delete -annotations -generate_simple_unions -list_builder_key_threshold=3 /workspace/release/models/network-instance/openconfig-network-instance.yang /workspace/release/models/aft/openconfig-aft-network-instance.yang

package aft.openconfig-aft: no Go files in /go/src/aft.openconfig-aft

vivek-ilangovan avatar Feb 03 '22 06:02 vivek-ilangovan

@vivek-ilangovan you should be able to correct the issue by merging your PR with the latest copy of the master branch. Note there are some conflicts to be resolved

dplore avatar Jun 18 '22 02:06 dplore

Thanks @dplore I have fetched new changes and resolved conflicts. The error messages were clear now and after some repeated trials all the checks are passing now

vivek-ilangovan avatar Jun 20 '22 13:06 vivek-ilangovan

I have some comments on the Flex-algo PR. The proposal as it is, use some assumptions and observations for improving the PR.

  • Important to realize is that flex-algo is dataplane agnostic and it can be sr-mpls and srv6. We should try to keep the OC agnostic too
  • Flex-algo uses Extended Admin Group instead of classic Admin Groups (different TLV type). I believe the OC model should try to follow standard
  • I like that a flex-algo definition is defined and abstracted outside the routing network instance, so that it can be used by multiple network instances
  • I think that in the flex-algo definition terminology should follow proposed IETF draft: include-all, include-any and exclude instead of the exclude-group, include-all-group and include-any-group
  • I think that we should refrain from specifying individual bit-positions under the Flex-algo-definition. We should configure “Extended Admin Groups” names at network instance level and associate each name with a specific EAG bit-position. That way we can use these EAG names to be assigned to interfaces and be used in the Flex-algo-definition
  • I do not see the point for having both a config for srlg-names and srlg-values. We should only have a single leaf-list by using srlg names. The srlg are long numbers and hence using names seems the most sensible
  • Why do we have the ‘color’ leaf under the FAD definition? This is a property that is not advertised by an IGP network instance. Defining a color is irrelevant for a Flex Algo definition, especially useless when SRv6 is used. It is a property that is most frequently used by applications using sr-mpls to associate a remote ip-address (for example a bgp next-hop) to a flex-algo derived sr-mpls tunnel. I strongly believe that we must not define a ‘color’ leaf and keep focussed upon those components in the flex-algo definition that are defined in the flex-algo specification
  • Under the flex-algo definition, it could be interesting to have a description leaf (string) to provide readable information on the purpose of the flex-algo definition
  • Should a leaf flags-tlv of type ‘boolean’ be added? When flex-algo is used only intra-domain there is no need for the flags-tlv and some older vendor OS’s did not support the flags-tlv causing havoc and non-compatible flex-algo implementations. With this Boolean we could control if a router is advertising the flags-tlv or not. Inside the flags-tlv there is the M-flag which could be used for consistent inter-area flex-algo operation, but may not be supported by all vendors, hence a Boolean to advertise flags-tlv is beneficial

Beyond the Flex-algo definition, we should define extensions in applications running on the router so that applications do the correct binding of a service to a corresponding sr-mpls flex algo tunnel. If for example for L3VPNs the bgp next-hop is reachable through sr-mpls and needs to be resolved using a particular flex-algo, then bgp must be made aware of this for the binding of the next-hop to the correct sr-mpls tunnel. Keep in mind that some vendors can only use the bgp color attribute for this purpose, while other vendors are less constraint. (Nokia for example, can match upon any of bgp attributes using legacy pre-existing bgp policies). I believe that the OC model should not constrain to only the bgp color attribute, especialy knowing that color is not even mentioned once in the flex-algo ietf draft specification. I think OC model should propose extensions in the policy yang with a new action ‘flex-algo <128..255>’ to steer the traffic into the correct flex-algo tunnels when sr-mpls is used. Note that for srv6 this is a non-existing problem as the srv6 locater used already provide a 1-to-1 relationship with a given flexible algorithm.

be well, Gunter Van de Velde

gvandeve avatar Jun 22 '22 10:06 gvandeve

@oscargdd from openconfig operators to review

dplore avatar Jun 29 '22 19:06 dplore

@gvandeve Thank you for nice suggestions and sorry for my delayed response.

I have some comments on the Flex-algo PR. The proposal as it is, use some assumptions and observations for improving the PR.

  • Important to realize is that flex-algo is dataplane agnostic and it can be sr-mpls and srv6. We should try to keep the OC agnostic too

Sure, I believe the current proposal does not differentiate between sr-mpls and srv6. Just wanted to confirm that there is no change asked here right?

  • Flex-algo uses Extended Admin Group instead of classic Admin Groups (different TLV type). I believe the OC model should try to follow standard

Agreed. Updated to leafref referencing the admin-group names as per your other suggestion.

  • I like that a flex-algo definition is defined and abstracted outside the routing network instance, so that it can be used by multiple network instances
  • I think that in the flex-algo definition terminology should follow proposed IETF draft: include-all, include-any and exclude instead of the exclude-group, include-all-group and include-any-group

Done

  • I think that we should refrain from specifying individual bit-positions under the Flex-algo-definition. We should configure “Extended Admin Groups” names at network instance level and associate each name with a specific EAG bit-position. That way we can use these EAG names to be assigned to interfaces and be used in the Flex-algo-definition

Yes, I have changed this to reference the configured extended admin group names.

  • I do not see the point for having both a config for srlg-names and srlg-values. We should only have a single leaf-list by using srlg names. The srlg are long numbers and hence using names seems the most sensible

Agreed. Removed srlg-values.

  • Why do we have the ‘color’ leaf under the FAD definition? This is a property that is not advertised by an IGP network instance. Defining a color is irrelevant for a Flex Algo definition, especially useless when SRv6 is used. It is a property that is most frequently used by applications using sr-mpls to associate a remote ip-address (for example a bgp next-hop) to a flex-algo derived sr-mpls tunnel. I strongly believe that we must not define a ‘color’ leaf and keep focussed upon those components in the flex-algo definition that are defined in the flex-algo specification

Agreed, most vendors associate color with a flex-algo differently and this may not be the best place to have the color configuration. Removed it now.

  • Under the flex-algo definition, it could be interesting to have a description leaf (string) to provide readable information on the purpose of the flex-algo definition

Yes, that will be nice. Added a 'flex-algo-description' leaf.

  • Should a leaf flags-tlv of type ‘boolean’ be added? When flex-algo is used only intra-domain there is no need for the flags-tlv and some older vendor OS’s did not support the flags-tlv causing havoc and non-compatible flex-algo implementations. With this Boolean we could control if a router is advertising the flags-tlv or not. Inside the flags-tlv there is the M-flag which could be used for consistent inter-area flex-algo operation, but may not be supported by all vendors, hence a Boolean to advertise flags-tlv is beneficial

Got it, I have added a 'prefix-metric-flag' option now. I thought in case if more flags are added to flags-tlv we can control each flag separately using different booleans instead of one boolean for complete flags-tlv

Beyond the Flex-algo definition, we should define extensions in applications running on the router so that applications do the correct binding of a service to a corresponding sr-mpls flex algo tunnel. If for example for L3VPNs the bgp next-hop is reachable through sr-mpls and needs to be resolved using a particular flex-algo, then bgp must be made aware of this for the binding of the next-hop to the correct sr-mpls tunnel. Keep in mind that some vendors can only use the bgp color attribute for this purpose, while other vendors are less constraint. (Nokia for example, can match upon any of bgp attributes using legacy pre-existing bgp policies). I believe that the OC model should not constrain to only the bgp color attribute, especialy knowing that color is not even mentioned once in the flex-algo ietf draft specification. I think OC model should propose extensions in the policy yang with a new action ‘flex-algo <128..255>’ to steer the traffic into the correct flex-algo tunnels when sr-mpls is used. Note that for srv6 this is a non-existing problem as the srv6 locater used already provide a 1-to-1 relationship with a given flexible algorithm.

Sure, I guess the model for applications to bind to a flex-algo can come in later if that is ok?

Thanks, -Vivek

vivek-ilangovan avatar Jul 08 '22 10:07 vivek-ilangovan

Hi Vivek,

Thanks to consider my feedback. Please find delayed feedback caused by my PTO.

I have some comments on the Flex-algo PR. The proposal as it is, use some assumptions and observations for improving the PR.

  • Important to realize is that flex-algo is dataplane agnostic and it can be sr-mpls and srv6. We should try to keep the OC agnostic too

Sure, I believe the current proposal does not differentiate between sr-mpls and srv6. Just wanted to confirm that there is no change asked here right?

It was indeed a general comment, as too often by accident only sr-mpls dataplane is considered, while srv6 does exist and flex-algo is opaque on the dataplane used. It may be tempting to use dataplane aware terminology while proposing the OC model.

  • Flex-algo uses Extended Admin Group instead of classic Admin Groups (different TLV type). I believe the OC model should try to follow standard

Agreed. Updated to leafref referencing the admin-group names as per your other suggestion.

Thank you

  • I like that a flex-algo definition is defined and abstracted outside the routing network instance, so that it can be used by multiple network instances
  • I think that in the flex-algo definition terminology should follow proposed IETF draft: include-all, include-any and exclude instead of the exclude-group, include-all-group and include-any-group

Done

Thank you

  • I think that we should refrain from specifying individual bit-positions under the Flex-algo-definition. We should configure “Extended Admin Groups” names at network instance level and associate each name with a specific EAG bit-position. That way we can use these EAG names to be assigned to interfaces and be used in the Flex-algo-definition

Yes, I have changed this to reference the configured extended admin group names.

Thanks you

  • I do not see the point for having both a config for srlg-names and srlg-values. We should only have a single leaf-list by using srlg names. The srlg are long numbers and hence using names seems the most sensible

Agreed. Removed srlg-values.

Thank you

  • Why do we have the ‘color’ leaf under the FAD definition? This is a property that is not advertised by an IGP network instance. Defining a color is irrelevant for a Flex Algo definition, especially useless when SRv6 is used. It is a property that is most frequently used by applications using sr-mpls to associate a remote ip-address (for example a bgp next-hop) to a flex-algo derived sr-mpls tunnel. I strongly believe that we must not define a ‘color’ leaf and keep focussed upon those components in the flex-algo definition that are defined in the flex-algo specification

Agreed, most vendors associate color with a flex-algo differently and this may not be the best place to have the color configuration. Removed it now.

Yes. I know that we (Nokia) associate a flex-algo differently using another level of abstraction compared to other vendor OS's

  • Under the flex-algo definition, it could be interesting to have a description leaf (string) to provide readable information on the purpose of the flex-algo definition

Yes, that will be nice. Added a 'flex-algo-description' leaf.

Thank you

  • Should a leaf flags-tlv of type ‘boolean’ be added? When flex-algo is used only intra-domain there is no need for the flags-tlv and some older vendor OS’s did not support the flags-tlv causing havoc and non-compatible flex-algo implementations. With this Boolean we could control if a router is advertising the flags-tlv or not. Inside the flags-tlv there is the M-flag which could be used for consistent inter-area flex-algo operation, but may not be supported by all vendors, hence a Boolean to advertise flags-tlv is beneficial

Got it, I have added a 'prefix-metric-flag' option now. I thought in case if more flags are added to flags-tlv we can control each flag separately using different Boolean insteasd of one Boolean for complete flags-tlv

The reason i suggested a Boolean to either advertise or not advertise the flags-tlv was because i discovered incompatibility with older OS's that did not supported the latest version of flex-algo flags. Maybe we should have a Boolean for advertising/not-advertising the flags-tlv and have a container to control the flags individually?

+--rw flex-algorithms | +--rw algorithm* [name] | +--rw name -> ../config/name | +--rw config | | +--rw name? string | | +--rw flex-algo-id flex-algo-id | | +--rw metric-type? flex-algo-metric-type | | +--rw calc-type? flex-algo-calc-type | | +--rw priority? uint8 ... | | +--flags-tlv boolean | | +--flags-tlv-flags | | | +--prefix-metric-flag boolean //flag that when unset, then prefix-metric-flag is not supported in the IGP area instance will always be advertised as value '0' in the flags-tlv (if a flags-tls is originated by the FAD), however when prefix-metric-flag is set, then that setting identifies that prefix-metric-flag is supported.

Beyond the Flex-algo definition, we should define extensions in applications running on the router so that applications do the correct binding of a service to a corresponding sr-mpls flex algo tunnel. If for example for L3VPNs the bgp next-hop is reachable through sr-mpls and needs to be resolved using a particular flex-algo, then bgp must be made aware of this for the binding of the next-hop to the correct sr-mpls tunnel. Keep in mind that some vendors can only use the bgp color attribute for this purpose, while other vendors are less constraint. (Nokia for example, can match upon any of bgp attributes using legacy pre-existing bgp policies). I believe that the OC model should not constrain to only the bgp color attribute, especialy knowing that color is not even mentioned once in the flex-algo ietf draft specification. I think OC model should propose extensions in the policy yang with a new action ‘flex-algo <128..255>’ to steer the traffic into the correct flex-algo tunnels when sr-mpls is used. Note that for srv6 this is a non-existing problem as the srv6 locater used already provide a 1-to-1 relationship with a given flexible algorithm.

Sure, I guess the model for applications to bind to a flex-algo can come in later if that is ok?

Yes, i think that is correct. How applications figure out the mapping is decoupled from flex-algo technology itself and each application may potentially have its own capabilities and limitations on how that binding is achieved. Taking this out of the equation, avoids introducing biased restrictions on how such binding is achieved.

Be well, Gunter Van de Velde

gvandeve avatar Jul 22 '22 13:07 gvandeve

Sorry for my super late response on this.

  • Should a leaf flags-tlv of type ‘boolean’ be added? When flex-algo is used only intra-domain there is no need for the flags-tlv and some older vendor OS’s did not support the flags-tlv causing havoc and non-compatible flex-algo implementations. With this Boolean we could control if a router is advertising the flags-tlv or not. Inside the flags-tlv there is the M-flag which could be used for consistent inter-area flex-algo operation, but may not be supported by all vendors, hence a Boolean to advertise flags-tlv is beneficial

Got it, I have added a 'prefix-metric-flag' option now. I thought in case if more flags are added to flags-tlv we can control each flag separately using different Boolean insteasd of one Boolean for complete flags-tlv

The reason i suggested a Boolean to either advertise or not advertise the flags-tlv was because i discovered incompatibility with older OS's that did not supported the latest version of flex-algo flags. Maybe we should have a Boolean for advertising/not-advertising the flags-tlv and have a container to control the flags individually?

+--rw flex-algorithms | +--rw algorithm* [name] | +--rw name -> ../config/name | +--rw config | | +--rw name? string | | +--rw flex-algo-id flex-algo-id | | +--rw metric-type? flex-algo-metric-type | | +--rw calc-type? flex-algo-calc-type | | +--rw priority? uint8 ... | | +--flags-tlv boolean | | +--flags-tlv-flags | | | +--prefix-metric-flag boolean //flag that when unset, then prefix-metric-flag is not supported in the IGP area instance will always be advertised as value '0' in the flags-tlv (if a flags-tls is originated by the FAD), however when prefix-metric-flag is set, then that setting identifies that prefix-metric-flag is supported.

I checked the older revisions of the flex-algo draft and could not find anything other than the M flag in the flags subtlv section. So I did not understand the 'older OS's that did not supported the latest version of flex-algo flags'. Maybe these implementations used their own flags which are not present in the draft?

I now updated to just include the 'flags-tlv' boolean that you suggested earlier to keep it simple. If there is a need in the future, we can add control for individual flags.

Thanks, -Vivek

vivek-ilangovan avatar Aug 19 '22 11:08 vivek-ilangovan

I now updated to just include the 'flags-tlv' boolean that you suggested earlier to keep it simple. If there is a need in the future, we can add control for individual flags.

Thanks, -Vivek

Yes, that would be good enough. What i meant is that between version -02 and -03 the flags-tlv was defined, and that some early adopter implementations did not support the encoding of the flags-tlv within an ISIS LSP at all. This caused initially some interop issues because newer implementations did simply advertise the flags-tlv by default. As result we (=Nokia) implemented a knob (Boolean) to either advertise or suppress the flags-tlv to facilitate interop with these early (pre draft -03) implementations. i agree that a future consideration would be to discuss knobs to control individual flags within the flags-tlv

gvandeve avatar Feb 06 '23 13:02 gvandeve

Thank you for the explanation Gunter!

vivek-ilangovan avatar Feb 06 '23 14:02 vivek-ilangovan

Hi @vivek-ilangovan

Can this proposal be progressed? There are some checks not successful. Maybe the pyang tree's can be updated to reflect your latest code edits?

I had a quick ran through the yang and believe that one item is missing. In the fad-bindings we should add the option for configuring a flex-algo without the router participating and only start the flex-algo when it is enabled. For this there should be a another leaf 'participate' from the type boolean. In addition this it would allow to advertise a flex-algo fad, without the need for local router to participate. At the moment, when a binding is added, the flex-algo is activated and the router is participating, eventhough activation of the flex-algo is not required yet.

+--rw isis
|  +--rw global
...
|  |  +--rw segment-routing
|  |  |  +--rw config
|  |  |  |  +--rw enabled?        boolean
|  |  |  |  +--rw srgb?           -> ../../../../../../../segment-routing/srgbs/srgb/config/local-id
|  |  |  |  +--rw srlb?           -> ../../../../../../../segment-routing/srlbs/srlb/config/local-id
|  |  |  |  +--rw fad-bindings
|  |  |  |     +--rw fad-binding* [flex-algo-name]
|  |  |  |        +--rw flex-algo-name    -> /network-instances/network-instance/flex-algorithms/algorithm/name
|  |  |  |        +--rw isis-level?       oc-isis-types:level-type
|  |  |  |        +--rw advertised?       boolean
|  |  |  |        +--rw participate       boolean    <--- The new proposed leaf

gvandeve avatar Feb 22 '23 14:02 gvandeve

Major YANG version changes in commit b7103831e5026f7ba74e29fb397297c215c21edb:

OpenConfigBot avatar Feb 24 '23 11:02 OpenConfigBot

Hi @gvandeve

Thanks for the follow up!

Hi @vivek-ilangovan

Can this proposal be progressed? There are some checks not successful. Maybe the pyang tree's can be updated to reflect your latest code edits?

I resolved conflicts and seems like all checks are passing now except "Review required" and "Merging is blocked" (which I think requires review to be approved) Updated the pyang tree with latest code.

I had a quick ran through the yang and believe that one item is missing. In the fad-bindings we should add the option for configuring a flex-algo without the router participating and only start the flex-algo when it is enabled. For this there should be a another leaf 'participate' from the type boolean. In addition this it would allow to advertise a flex-algo fad, without the need for local router to participate. At the moment, when a binding is added, the flex-algo is activated and the router is participating, eventhough activation of the flex-algo is not required yet.

+--rw isis
|  +--rw global
...
|  |  +--rw segment-routing
|  |  |  +--rw config
|  |  |  |  +--rw enabled?        boolean
|  |  |  |  +--rw srgb?           -> ../../../../../../../segment-routing/srgbs/srgb/config/local-id
|  |  |  |  +--rw srlb?           -> ../../../../../../../segment-routing/srlbs/srlb/config/local-id
|  |  |  |  +--rw fad-bindings
|  |  |  |     +--rw fad-binding* [flex-algo-name]
|  |  |  |        +--rw flex-algo-name    -> /network-instances/network-instance/flex-algorithms/algorithm/name
|  |  |  |        +--rw isis-level?       oc-isis-types:level-type
|  |  |  |        +--rw advertised?       boolean
|  |  |  |        +--rw participate       boolean    <--- The new proposed leaf

I have added the participate bool. Both advertise and participate set a false does not make sense here but I couldn't think of a better way

vivek-ilangovan avatar Feb 24 '23 13:02 vivek-ilangovan

@vivek-ilangovan Many thanks.

I have added the participate bool. Both advertise and participate set a false does not make sense here but I couldn't think of a better way

Many thanks. There is benefit for both 'participate' and 'advertised' configuration options.

Participate: When this is set to 'true', the router will try to participate with the flex-algo. It will participate when the router has support for the winning Flexible Algorithm Definition (FAD) and set support for relevant algorithm in the supported algorithms. If participate is set to False, then the router will not participate at all in the flexible algorithm.

Advertised: When set to 'true' then a locally configured fad is advertised and will be compared with all other fads learned from other routers. If set to 'false' the router will not advertise or consider the locally configured fad and will only use learned fads from other routers advertising their fad's

could we remove the algorithm out of the fad configuration? it seems to be more inline with your EOS config sniplet

I get impression that with EOS the algorithm itself is also configured within the ISIS context and not within a fad definition. With Nokia SROS the algorithm is configured under ISIS context and not within the configuration of the (named) fad itself.

in EOS

router traffic-engineering
   flex-algo
      flex-algo 128 HFT
      priority 85
      color 47
      metric min-delay
      administrative-group include all 0,3,5 include any 2,4,6 exclude 7-15
      srlg exclude flag marea warf 101 680 880 17

in SROS

router
  flexible-algorithm-definitions
    flex-algo "My128" create
      description "This-is-my-algo128"
        metric-type delay
        no shutdown
    exit
  exit
  isis 0
    flexible-algorithms
      flex-algo 128  <-- This is the ISIS algorithm the router is intending to support
        advertise "My128”  <-- This is binding with a locally configured fad (optional requirement)
        participate  <-- with this the router will try to participate in a flex-algo 128 if the winning fad can be supported
      exit
      no shutdown
    exit

gvandeve avatar Feb 28 '23 13:02 gvandeve

@gvandeve

I have added the participate bool. Both advertise and participate set a false does not make sense here but I couldn't think of a better way

Many thanks. There is benefit for both 'participate' and 'advertised' configuration options.

Sorry for not being clear. Having the option to just advertise sounds good to me. I was pointing out that a config that has both participate=false and advertise=false is not useful as it is a no-op. When both are false neither it will advertise nor it will participate. But I guess it is ok!

could we remove the algorithm out of the fad configuration? it seems to be more inline with your EOS config sniplet

In EOS, the algorithm is actually tied in the FAD definition itself:

router traffic-engineering
   flex-algo
      flex-algo 128 HFT

This config gives a name HFT to the actual algorithm value 128

router isis Amun
   ...
   segment-routing mpls
      flex-algo HFT level-1 advertised

This config picks HFT config and advertises as algorithm 128 in the IGP. So in EOS we need the algorithm->name map even is IS-IS just wants to participate in an algorithm and not advertise FAD.

Is it ok to retain it this way and SROS can probably fetch the algorithm from the flex-algorithm config and use it IS-IS?

vivek-ilangovan avatar Mar 02 '23 12:03 vivek-ilangovan

@vivek-ilangovan

Is it ok to retain it this way and SROS can probably fetch the algorithm from the flex-algorithm config and use it IS-IS?

It is different hierarchy structure used. I suspect with proposed config model that Nokia SROS must deviate by using a flex-algo name that looks like integer value [128-255]. This means that name and algorithm are contained in single parameter (i.e. 129). Having flex-algo definition decoupled from the algorithm seems more flexible to me on the long run.

gvandeve avatar Mar 09 '23 10:03 gvandeve

@gvandeve

It is different hierarchy structure used. I suspect with proposed config model that Nokia SROS must deviate by using a flex-algo name that looks like integer value [128-255]. This means that name and algorithm are contained in single parameter (i.e. 129). Having flex-algo definition decoupled from the algorithm seems more flexible to me on the long run.

I don't think we need to have a flex-algo name that looks like integer.

A sample open-config configuration might be something like this:

        +--rw flex-algorithms
        |  +--rw algorithm* [name]
        |     +--rw name      -> ../config/name
        |     +--rw config
        |     |  +--rw name?                    string.     =====> "My128"
        |     |  +--rw flex-algo-id             flex-algo-id.     =====> 128

Flex-algo name and flex-algo-id are configured

+--rw isis
|  +--rw global
...
             |  |  +--rw segment-routing
             |  |  |  +--rw config
             |  |  |  |  +--rw enabled?   boolean
...
             |  |  |  +--ro state
             |  |  |  |  +--ro enabled?   boolean
...
             |  |  |  +--rw fad-bindings
             |  |  |     +--rw fad-binding* [flex-algo-name]
             |  |  |        +--rw flex-algo-name    -> ../config/flex-algo-name
             |  |  |        +--rw config
             |  |  |        |  +--rw flex-algo-name?    =====>  "My128"

IS-IS uses flex-algo name that is configured earlier

I am assuming SROS should then save the name to flex-algo-id map i.e. "My128"->128 when the "flex-algorithms" config is pushed. And use the flex-algo-id 128 when the "isis" config is pushed to configure IS-IS with flex-algo 128.

In SROS, the conversion of openconfig to SROS config is possible by keeping a map of the name to flex-algo-id map.

But in your suggestion, since we will not have algo-id in the "flex-algorithms" config, EOS will not be able to convert the config from open-config to EOS config as algorithm is mandatory there. It will have to look into IS-IS specific openconfig to find the matching algorithm number and in future if OSPF is supported then it might have a different algorithm number altogether causing conflict of algorithm number for the same flex-algo name

vivek-ilangovan avatar Mar 09 '23 12:03 vivek-ilangovan

@vivek-ilangovan

I am assuming SROS should then save the name to flex-algo-id map i.e. "My128"->128 when the "flex-algorithms" config is pushed. And use the flex-algo-id 128 when the "isis" config is pushed to configure IS-IS with flex-algo 128.

In SROS, the conversion of openconfig to SROS config is possible by keeping a map of the name to flex-algo-id map.

There are few possibilities that may work reasonably well for SROS using the proposed flex-algo model. Thanks Vivek.

gvandeve avatar Mar 10 '23 13:03 gvandeve

Thank you @gvandeve for reviewing this! Can you approve this review or do you know who can help in approving this.?Currently it is blocked with "Review required"

vivek-ilangovan avatar Mar 10 '23 15:03 vivek-ilangovan

@dplore can you help in approving this? or can you point me to this correct person?

vivek-ilangovan avatar Mar 28 '23 06:03 vivek-ilangovan

Thank you @gvandeve for reviewing this! Can you approve this review or do you know who can help in approving this.?Currently it is blocked with "Review required"

Apologies for delay. I lost track of this. I can not approve myself, but can talk to a colleague belonging to the approval chain.

gvandeve avatar Apr 25 '23 11:04 gvandeve

@dplore From Nokia perspective the proposed model reflects meaningful functionality documented by Flex-Algo RFC9350. In addition the proposed model, while not fully aligned with Nokia yang model, is reasonably close and represents a functional configuration tree.

gvandeve avatar May 03 '23 18:05 gvandeve

Hi,

Proxying some comments on this model from an internal expert (and author of RFC 9350):

  1. Flex-algo affinities are encoded using ASLA, which is different to affinities used for MPLS TE. As such referring to some TE related config does not seem to be correct. The mapping for the flex-algo ASLA affinity bits should be independent of the TE affinity mapping.

  2. Enabling flex-algo per level - I'm not sure how useful that is and what value does it bring?

  3. They have defined the association between the interface's prefix and flex-algo specific SIDs. That works for the SR-MPLS. In SRv6 and IP flex-algo there are no SIDs, the prefix itself is bound to the flex-algo.

Do the YANG tree structures at the top of this review still represent the proposed configuration?

Thanks, Rob

rgwilton avatar May 04 '23 13:05 rgwilton

Last call for additional comments, to be merged on May 28th.

dplore avatar May 04 '23 15:05 dplore

Hi @rgwilton

Thanks for the comments

  1. Flex-algo affinities are encoded using ASLA, which is different to affinities used for MPLS TE. As such referring to some TE related config does not seem to be correct. The mapping for the flex-algo ASLA affinity bits should be independent of the TE affinity mapping.

Makes sense. I have created a new flex-algo-global-attributes and flex-algo-interface-attributes and referring to that in the flex-algo definition. The attributes are mostly copied from the mpls container @gvandeve can you please help review this part again where I have added the attributes to flex-algorithms container now.

  1. Enabling flex-algo per level - I'm not sure how useful that is and what value does it bring?

Arista EOS supports assigning different flex-algo to different levels. So I would like to retain it. Other vendors can probably set the level as level-1-2 in case they do not have that support?

  1. They have defined the association between the interface's prefix and flex-algo specific SIDs. That works for the SR-MPLS. In SRv6 and IP flex-algo there are no SIDs, the prefix itself is bound to the flex-algo.

I thought of initially supporting the SR-MPLS flex-algo segment for now. Is it ok to add the support for srv6 flex-algo and ip flex-algo later?

Do the YANG tree structures at the top of this review still represent the proposed configuration?

I have updated now with the suggested comments.

Thanks, -Vivek

vivek-ilangovan avatar May 09 '23 14:05 vivek-ilangovan

@dplore just wanted to check with you if this is in a state to be accepted

vivek-ilangovan avatar Jun 26 '23 11:06 vivek-ilangovan

We will discuss at OC Operators meeting on July 11, 2023

dplore avatar Jul 07 '23 00:07 dplore

We will discuss at OC Operators meeting on July 11, 2023

Thanks for discussing about this PR!

vivek-ilangovan avatar Jul 14 '23 15:07 vivek-ilangovan

Thanks for making the flex algo ID the key, this seems appropriate.

Are there any well known / rfc defined flexalgo ID’s? I didn't see any at the IANA registry but I am not sure I am looking in the right place.

dplore avatar Jul 14 '23 16:07 dplore