module odl-pcep-segment-routing { yang-version 1; namespace "urn:opendaylight:params:xml:ns:yang:pcep:segment:routing"; prefix "pcep-sr"; import pcep-types { prefix pcep; revision-date 2018-11-09; } import pcep-message { prefix msg; revision-date 2018-11-09; } import odl-pcep-ietf-stateful { prefix stateful; revision-date 2020-07-20; } import odl-pcep-ietf-initiated { prefix initiated; revision-date 2020-07-20; } import ietf-inet-types { prefix inet; revision-date 2013-07-15; } import network-topology { prefix nt; revision-date 2013-10-21; } import network-topology-pcep { prefix pn; revision-date 2022-07-30; } organization "Cisco Systems, Inc."; contact "Milos Fabian "; description "This module contains the data model of PCEP Extensions for Segment Routing, as defined in RFC 8664. Copyright (c)2015 Cisco Systems, Inc. All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html"; revision "2020-07-20" { description "Update to RFC 8664"; reference "RFC8664: https://tools.ietf.org/html/rfc8664"; } revision "2018-11-09" { description "P2MP extension."; reference "RFC8306"; } revision 2017-10-25 { description "Update network-topology-pcep revision"; } revision "2015-01-12" { description "Upgrade from draft-sivabalan-pce-segment-routing-02."; reference "http://tools.ietf.org/html/draft-ietf-pce-segment-routing-01"; } grouping sr-pce-capability-tlv { description "SR-PCE-CAPABILITY TLV"; reference "http://tools.ietf.org/html/rfc8664#section-4.1.2"; container sr-pce-capability { uses pcep:tlv; leaf n-flag { description "N flag used by a PCC to indicate that it is capable of resolving a NAI to a SID"; type boolean; default false; } leaf x-flag { description " X flag used by a PCC to indicate that it does not impose any limit to the MSD"; type boolean; default false; } leaf msd { description "Maximum SID Depth"; type uint8; default 0; } } } augment "/msg:open/msg:open-message/msg:open/msg:tlvs" { reference "http://tools.ietf.org/html/rfc4664#section-4.1"; uses sr-pce-capability-tlv; } augment "/msg:pcerr/msg:pcerr-message/msg:error-type/msg:session-case/msg:session/msg:open/msg:tlvs" { reference "http://tools.ietf.org/html/rfc8664#section-5.1"; uses sr-pce-capability-tlv; } typedef nai-type { reference "http://tools.ietf.org/html/rfc8664#section-4.3.1"; type enumeration { enum ipv4-node-id { value 1; } enum ipv6-node-id { value 2; } enum ipv4-adjacency { value 3; } enum ipv6-adjacency { value 4; } enum unnumbered { value 5; } enum ipv6-local { value 6; } } } grouping sr-subobject { description "Common grouping for both SR-ERO and SR-RRO subobjects as they share the same content representation."; leaf nai-type { description "Node or Adjacency Identifier Type (NT)"; type nai-type; } leaf m-flag { description "If this bit is set to 1, the SID value represents an MPLS label stack entry"; type boolean; default false; } leaf c-flag { description "TC, S & TTL fields in the MPLS label are specified by the PCE if M & C are set to 1"; type boolean; default false; } /* S-Flag is represented by the presence of the SID TLV: isSflag() is equivalent to getSid() != null */ leaf sid { description "Segment Identifier"; type uint32; } /* F-Flag is represented by the presence of the NAI TLV: isFflag() is equivalent to getNai() != null */ choice nai { reference "http://tools.ietf.org/html/rfc8664#section-4.3.2"; description "Node or Adjacency Identifier"; case ip-node-id { when "../nai-type = 'ipv4-node-id' or ../nai-type = 'ipv6-node-id'"; description "IP Node ID"; leaf ip-address { type inet:ip-address-no-zone; mandatory true; } } case ip-adjacency { when "../nai-type = 'ipv4-adjacency' or ../nai-type = 'ipv6-adjacency'"; description "IP Adjacency"; leaf local-ip-address { type inet:ip-address-no-zone; mandatory true; } leaf remote-ip-address { type inet:ip-address-no-zone; mandatory true; } } case unnumbered-adjacency { when "../nai-type = 'unnumbered'"; description "Unnumbered Adjacency with IPv4 NodeIDs"; leaf local-node-id { type uint32; mandatory true; } leaf local-interface-id { type uint32; mandatory true; } leaf remote-node-id { type uint32; mandatory true; } leaf remote-interface-id { type uint32; mandatory true; } } case ipv6-local { when "../nai-type = 'ipv6-local'"; description "IPv6 adjacency with link-local IPv6 addresses"; leaf local-ipv6-address { type inet:ipv6-address-no-zone; mandatory true; } leaf local-id { type uint32; mandatory true; } leaf remote-ipv6-address { type inet:ipv6-address-no-zone; mandatory true; } leaf remote-id { type uint32; mandatory true; } } } } // kept both groupings in case draft changes and they won't be equal grouping sr-ero-subobject { reference "http://tools.ietf.org/html/rfc8664#section-4.3"; /* L(oose)-flag is already present within the ERO subObject */ uses sr-subobject; } grouping sr-rro-subobject { reference "http://tools.ietf.org/html/rfc8664#section-4.4"; uses sr-subobject; } //ERO augmentations augment "/msg:pcrep/msg:pcrep-message/msg:replies/msg:result/msg:success-case/msg:success/msg:paths/msg:ero/msg:subobject/msg:subobject-type" { case sr-ero-type { uses sr-ero-subobject; } } //stateful augment "/initiated:pcinitiate/initiated:pcinitiate-message/initiated:requests/initiated:ero/initiated:subobject/initiated:subobject-type" { case sr-ero-type { uses sr-ero-subobject; } } augment "/stateful:pcrpt/stateful:pcrpt-message/stateful:reports/stateful:path/stateful:ero/stateful:subobject/stateful:subobject-type" { case sr-ero-type { uses sr-ero-subobject; } } augment "/stateful:pcupd/stateful:pcupd-message/stateful:updates/stateful:path/stateful:ero/stateful:subobject/stateful:subobject-type" { case sr-ero-type { uses sr-ero-subobject; } } //nt-pcep augment "/pn:add-lsp/pn:input/pn:arguments/pn:ero/pn:subobject/pn:subobject-type" { case sr-ero-type { uses sr-ero-subobject; } } augment "/pn:update-lsp/pn:input/pn:arguments/pn:ero/pn:subobject/pn:subobject-type" { case sr-ero-type { uses sr-ero-subobject; } } augment "/nt:network-topology/nt:topology/nt:node/pn:path-computation-client/pn:reported-lsp/pn:path/pn:ero/pn:subobject/pn:subobject-type" { case sr-ero-type { uses sr-ero-subobject; } } //RRO augmentations augment "/msg:pcreq/msg:pcreq-message/msg:requests/msg:segment-computation/msg:p2p/msg:reported-route/msg:rro/msg:subobject/msg:subobject-type" { case sr-rro-type { uses sr-rro-subobject; } } augment "/msg:pcreq/msg:pcreq-message/msg:requests/msg:segment-computation/msg:p2p/msg:rro/msg:subobject/msg:subobject-type" { case sr-rro-type { uses sr-rro-subobject; } } augment "/msg:pcrep/msg:pcrep-message/msg:replies/msg:result/msg:failure-case/msg:rro/msg:subobject/msg:subobject-type" { case sr-rro-type { uses sr-rro-subobject; } } augment "/msg:pcrep/msg:pcrep-message/msg:replies/msg:result/msg:success-case/msg:success/msg:paths/msg:rro/msg:subobject/msg:subobject-type" { case sr-rro-type { uses sr-rro-subobject; } } //stateful augment "/initiated:pcinitiate/initiated:pcinitiate-message/initiated:requests/initiated:rro/initiated:subobject/initiated:subobject-type" { case sr-rro-type { uses sr-rro-subobject; } } augment "/stateful:pcrpt/stateful:pcrpt-message/stateful:reports/stateful:path/stateful:rro/stateful:subobject/stateful:subobject-type" { case sr-rro-type { uses sr-rro-subobject; } } augment "/stateful:pcupd/stateful:pcupd-message/stateful:updates/stateful:path/stateful:rro/stateful:subobject/stateful:subobject-type" { case sr-rro-type { uses sr-rro-subobject; } } //nt-pcep augment "/pn:add-lsp/pn:input/pn:arguments/pn:rro/pn:subobject/pn:subobject-type" { case sr-rro-type { uses sr-rro-subobject; } } augment "/pn:update-lsp/pn:input/pn:arguments/pn:rro/pn:subobject/pn:subobject-type" { case sr-rro-type { uses sr-rro-subobject; } } augment "/nt:network-topology/nt:topology/nt:node/pn:path-computation-client/pn:reported-lsp/pn:path/pn:rro/pn:subobject/pn:subobject-type" { case sr-rro-type { uses sr-rro-subobject; } } }