| < draft-ietf-detnet-yang-12.txt | draft-ietf-detnet-yang-13.txt > | |||
|---|---|---|---|---|
| Network Working Group X. Geng | Network Working Group X. Geng | |||
| Internet-Draft M. Chen | Internet-Draft Huawei Technologies | |||
| Intended status: Standards Track Huawei Technologies | Intended status: Standards Track Y. Ryoo | |||
| Expires: 20 November 2021 Y. Ryoo | Expires: 7 April 2022 ETRI | |||
| ETRI | ||||
| D. Fedyk | D. Fedyk | |||
| LabN Consulting, L.L.C. | LabN Consulting, L.L.C. | |||
| R. Rahman | R. Rahman | |||
| Individual | Individual | |||
| Z. Li | Z. Li | |||
| China Mobile | China Mobile | |||
| 19 May 2021 | 4 October 2021 | |||
| Deterministic Networking (DetNet) YANG Model | Deterministic Networking (DetNet) YANG Model | |||
| draft-ietf-detnet-yang-12 | draft-ietf-detnet-yang-13 | |||
| Abstract | Abstract | |||
| This document contains the specification for the Deterministic | This document contains the specification for the Deterministic | |||
| Networking YANG Model for configuration and operational data for | Networking YANG Model for configuration and operational data for | |||
| DetNet Flows. The model allows for provisioning of end-to-end DetNet | DetNet Flows. The model allows for provisioning of end-to-end DetNet | |||
| service along the path without dependency on any signaling protocol. | service on devices along the path without dependency on any signaling | |||
| It also specifies operational status for flows. | protocol. It also specifies operational status for flows. An | |||
| operator or network controller programs the configuration of the | ||||
| devices. | ||||
| The YANG module defined in this document conforms to the Network | The YANG module defined in this document conforms to the Network | |||
| Management Datastore Architecture (NMDA). | Management Datastore Architecture (NMDA). | |||
| Requirements Language | Requirements Language | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
| document are to be interpreted as described in RFC 2119 [RFC2119]. | "OPTIONAL" in this document are to be interpreted as described in BCP | |||
| 14 [RFC2119] [RFC8174] when, and only when, they appear in all | ||||
| capitals, as shown here. | ||||
| Status of This Memo | Status of This Memo | |||
| This Internet-Draft is submitted in full conformance with the | This Internet-Draft is submitted in full conformance with the | |||
| provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
| Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
| Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
| working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
| Drafts is at https://datatracker.ietf.org/drafts/current/. | Drafts is at https://datatracker.ietf.org/drafts/current/. | |||
| Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
| and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
| time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
| material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
| This Internet-Draft will expire on 20 November 2021. | ||||
| This Internet-Draft will expire on 7 April 2022. | ||||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2021 IETF Trust and the persons identified as the | Copyright (c) 2021 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents (https://trustee.ietf.org/ | Provisions Relating to IETF Documents (https://trustee.ietf.org/ | |||
| license-info) in effect on the date of publication of this document. | license-info) in effect on the date of publication of this document. | |||
| Please review these documents carefully, as they describe your rights | Please review these documents carefully, as they describe your rights | |||
| and restrictions with respect to this document. Code Components | and restrictions with respect to this document. Code Components | |||
| extracted from this document must include Simplified BSD License text | extracted from this document must include Simplified BSD License text | |||
| as described in Section 4.e of the Trust Legal Provisions and are | as described in Section 4.e of the Trust Legal Provisions and are | |||
| provided without warranty as described in the Simplified BSD License. | provided without warranty as described in the Simplified BSD License. | |||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
| 2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 3 | 2. Abbreviations . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
| 3. DetNet YANG Module . . . . . . . . . . . . . . . . . . . . . 3 | 3. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
| 3.1. DetNet Application Flow YANG Attributes . . . . . . . . . 3 | 4. DetNet YANG Module . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 3.2. DetNet Service Sub-layer YANG Attributes . . . . . . . . 3 | 4.1. DetNet Application Flow YANG Attributes . . . . . . . . . 5 | |||
| 3.3. DetNet Forwarding Sub-layer YANG Attributes . . . . . . . 4 | 4.2. DetNet Service Sub-layer YANG Attributes . . . . . . . . 5 | |||
| 4. DetNet Flow Aggregation . . . . . . . . . . . . . . . . . . . 4 | 4.3. DetNet Forwarding Sub-layer YANG Attributes . . . . . . . 5 | |||
| 5. DetNet YANG Structure Considerations . . . . . . . . . . . . 5 | 5. DetNet Flow Aggregation . . . . . . . . . . . . . . . . . . . 6 | |||
| 6. DetNet Configuration YANG Structures . . . . . . . . . . . . 6 | 6. DetNet YANG Structure Considerations . . . . . . . . . . . . 7 | |||
| 7. DetNet Configuration YANG Model . . . . . . . . . . . . . . . 15 | 7. DetNet Configuration YANG Structures . . . . . . . . . . . . 8 | |||
| 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 44 | 8. DetNet Configuration YANG Model . . . . . . . . . . . . . . . 9 | |||
| 9. Security Considerations . . . . . . . . . . . . . . . . . . . 44 | 10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 39 | |||
| 10. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 44 | 10. Security Considerations . . . . . . . . . . . . . . . . . . . 40 | |||
| 11. References . . . . . . . . . . . . . . . . . . . . . . . . . 44 | 11. Contributors . . . . . . . . . . . . . . . . . . . . . . . . 40 | |||
| 11.1. Normative References . . . . . . . . . . . . . . . . . . 44 | 12. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 41 | |||
| 11.2. Informative References . . . . . . . . . . . . . . . . . 45 | 13. References . . . . . . . . . . . . . . . . . . . . . . . . . 41 | |||
| Appendix A. Examples . . . . . . . . . . . . . . . . . . . . . . 45 | 13.1. Normative References . . . . . . . . . . . . . . . . . . 41 | |||
| A.1. Example A-1 JSON Configuration/Operational . . . . . . . 45 | 13.2. Informative References . . . . . . . . . . . . . . . . . 42 | |||
| A.2. Example B-1 XML Config: Aggregation using a Forwarding | Appendix A. DetNet Configuration YANG Tree . . . . . . . . . . . 43 | |||
| Sub-layer . . . . . . . . . . . . . . . . . . . . . . . . 50 | Appendix B. Examples . . . . . . . . . . . . . . . . . . . . . . 52 | |||
| A.3. Example B-2 JSON Service Aggregation Configuration . . . 55 | B.1. Example A-1 JSON Configuration/Operational . . . . . . . 52 | |||
| A.4. Example C-1 JSON Relay Aggregation/Disaggregation | B.2. Example B-1 XML Config: Aggregation using a Forwarding | |||
| Configuration . . . . . . . . . . . . . . . . . . . . . . 60 | Sub-layer . . . . . . . . . . . . . . . . . . . . . . . . 57 | |||
| A.5. Example C-2 JSON Relay Aggregation Service Sub-Layer . . 77 | B.3. Example B-2 JSON Service Aggregation Configuration . . . 61 | |||
| A.6. Example C-3 JSON Relay Service Sub-Layer Aggregation/ | B.4. Example C-1 JSON Relay Aggregation/Disaggregation | |||
| Disaggregation . . . . . . . . . . . . . . . . . . . . . 89 | Configuration . . . . . . . . . . . . . . . . . . . . . . 67 | |||
| A.7. Example C-4 JSON Relay Service Sub-Layer Aggregation/ | B.5. Example C-2 JSON Relay Aggregation Service Sub-Layer . . 83 | |||
| Disaggregation . . . . . . . . . . . . . . . . . . . . . 103 | B.6. Example C-3 JSON Relay Service Sub-Layer Aggregation/ | |||
| A.8. Example D-1 JSON Transit Forwarding Sub-Layer Aggregation/ | Disaggregation . . . . . . . . . . . . . . . . . . . . . 96 | |||
| Disaggregation . . . . . . . . . . . . . . . . . . . . . 120 | B.7. Example C-4 JSON Relay Service Sub-Layer Aggregation/ | |||
| Disaggregation . . . . . . . . . . . . . . . . . . . . . 110 | ||||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 127 | B.8. Example D-1 JSON Transit Forwarding Sub-Layer Aggregation/ | |||
| Disaggregation . . . . . . . . . . . . . . . . . . . . . 126 | ||||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 133 | ||||
| 1. Introduction | 1. Introduction | |||
| DetNet (Deterministic Networking) provides a capability to carry | DetNet (Deterministic Networking) provides a capability to carry | |||
| specified unicast or multicast data flows for real-time applications | specified unicast or multicast data flows for real-time applications | |||
| with extremely low packet loss rates and assured maximum end-to-end | with extremely low packet loss rates and assured maximum end-to-end | |||
| delivery latency. A description of the general background and | delivery latency. A description of the general background and | |||
| concepts of DetNet can be found in [RFC8655]. | concepts of DetNet can be found in [RFC8655]. | |||
| This document defines a YANG model for DetNet based on YANG data | This document defines a YANG model for DetNet based on YANG data | |||
| types and modeling language defined in [RFC6991] and [RFC7950]. | types and modeling language defined in [RFC6991] and [RFC7950]. | |||
| DetNet service, which is designed for describing the characteristics | DetNet service, which is designed for describing the characteristics | |||
| of services being provided for application flows over a network, and | of services being provided for application flows over a network, and | |||
| DetNet configuration, which is designed for DetNet flow path | DetNet configuration, which is designed for DetNet flow path | |||
| establishment, flow status reporting, and DetNet functions | establishment, flow status reporting, and DetNet functions | |||
| configuration in order to achieve end-to-end bounded latency and zero | configuration in order to achieve end-to-end bounded latency and zero | |||
| congestion loss, are both included in this document. | congestion loss, are both included in this document. | |||
| 2. Terminology | 2. Abbreviations | |||
| The following abbreviations are used in this document: | ||||
| PEF Packet Elimination Function | ||||
| PRF Packet Replication Function | ||||
| PEOF Packet Elimination and Ordering Functions | ||||
| PERF Packet Elimination and Replication Functions | ||||
| PREOF Packet Replication, Elimination and Ordering Functions | ||||
| MPLS Multiprotocol Label Switching | ||||
| 3. Terminology | ||||
| This document uses the terminology defined in [RFC8655]. | This document uses the terminology defined in [RFC8655]. | |||
| 3. DetNet YANG Module | 4. DetNet YANG Module | |||
| The DetNet YANG module includes DetNet App-flow, DetNet Service Sub- | The DetNet YANG module includes DetNet App-flow, DetNet Service Sub- | |||
| layer, and DetNet Forwarding Sub-layer configuration and operational | layer, and DetNet Forwarding Sub-layer configuration and operational | |||
| objects. The corresponding attributes used in different sub-layers | objects. The corresponding attributes used in different sub-layers | |||
| are defined in Section 3.1, 3.2, 3.3 respectively. | are defined in Section 3.1, 3.2, 3.3 respectively. | |||
| 3.1. DetNet Application Flow YANG Attributes | Layers of the objects typically occur in the different data instances | |||
| forming the node types defined in [RFC8655]. Figure 1 illustrates | ||||
| the relationship between data instance node types and the included | ||||
| layers. Node types typically are logical per DetNet service and one | ||||
| DetNet service can be one node type while another is another node | ||||
| type on same device. This model is a controller based model because | ||||
| a controller or operator configures all the devices to form a | ||||
| service. | ||||
| +---------------------------------------------------+ | ||||
| | Instance | | ||||
| +-----+-----------------+-----------------+---------------+ | ||||
| | |Edge Node | Transit Node | Relay Node | | ||||
| +-----+-----------------+-----------------+---------------+ | ||||
| | L |Application | | | | ||||
| | a +-----------------+-----------------+---------------+ | ||||
| | y |Service Sub-Layer|Service Sub-Layer| | | ||||
| | e +-----------------+-----------------+---------------+ | ||||
| | r |Forwarding S-L |Forwarding S-L | Forwarding S-L| | ||||
| +-----+-----------------+-----------------+---------------+ | ||||
| Figure 1: Detnet Layers and Node Types | ||||
| All of the layers have ingress/incoming and egress/outgoing | ||||
| operations but any instance may be configured as only unidirectional. | ||||
| This means that each unidirectional flow identifier configuration is | ||||
| programmed starting at the ingress and flow status is reported at | ||||
| ingress on each end. In the MPLS cases once encapsulated, the IP six | ||||
| tuple parameters may not be required to be programmed again. In the | ||||
| IP case, without encapsulation, various IP flow id parameters must be | ||||
| configured along the flow path. | ||||
| In the YANG model the terms source and destination are used as flow | ||||
| identifiers whereas ingress and egress refer to a DetNet application | ||||
| direction from the application edge. Ingress is to the DetNet | ||||
| application and egress is from the application. The terms incoming | ||||
| and outgoing generally represent the flow direction towards the | ||||
| remote application. Outgoing is viewed as going up the stack from | ||||
| Application to Service sub-layer to Forwarding sub-layer and incoming | ||||
| is the reverse. Although, in examples where there is aggregation and | ||||
| disaggregation outgoing relates to the aggregating output and | ||||
| incoming relates to the disaggregating flows. | ||||
| At the egress the YANG model is handing off IP or MPLS to a next hop | ||||
| and a routing next hop structure is used. | ||||
| 4.1. DetNet Application Flow YANG Attributes | ||||
| DetNet application flow is responsible for mapping between | DetNet application flow is responsible for mapping between | |||
| application flows and DetNet flows at the edge node(egress/ingress | application flows and DetNet flows at the edge node(egress/ingress | |||
| node). The application flows can be either layer 2 or layer 3 flows. | node). The application flows can be either layer 2 or layer 3 flows. | |||
| To map a flow at the User Network Interface (UNI), the corresponding | To map a flow at the User Network Interface (UNI), the corresponding | |||
| attributes are defined in [I-D.ietf-detnet-flow-information-model]. | attributes are defined in [RFC9016]. | |||
| 3.2. DetNet Service Sub-layer YANG Attributes | 4.2. DetNet Service Sub-layer YANG Attributes | |||
| DetNet service functions, e.g., DetNet tunnel initialization/ | DetNet service functions, e.g., DetNet tunnel initialization/ | |||
| termination and service protection, are provided in the DetNet | termination and service protection, are provided in the DetNet | |||
| service sub-layer. To support these functions, the following service | service sub-layer. To support these functions, the following service | |||
| attributes need to be configured: | attributes need to be configured: | |||
| * DetNet flow identification | * DetNet flow identification | |||
| * Service function indication, indicates which service function will | * Service function indication, indicates which service function will | |||
| be invoked at a DetNet edge, relay node or end station. (DetNet | be invoked at a DetNet edge, relay node or end station. (DetNet | |||
| tunnel initialization or termination are default functions in | tunnel initialization or termination are default functions in | |||
| DetNet service layer, so there is no need for explicit | DetNet service layer, so there is no need for explicit | |||
| indication). The corresponding arguments for service functions | indication). The corresponding arguments for service functions | |||
| also needs to be defined. | also needs to be defined. | |||
| 3.3. DetNet Forwarding Sub-layer YANG Attributes | 4.3. DetNet Forwarding Sub-layer YANG Attributes | |||
| As defined in [RFC8655], DetNet forwarding sub-layer optionally | As defined in [RFC8655], DetNet forwarding sub-layer optionally | |||
| provides congestion protection for DetNet flows over paths provided | provides congestion protection for DetNet flows over paths provided | |||
| by the underlying network. Explicit route is another mechanism that | by the underlying network. Explicit route is another mechanism that | |||
| is used by DetNet to avoid temporary interruptions caused by the | is used by DetNet to avoid temporary interruptions caused by the | |||
| convergence of routing or bridging protocols, and it is also | convergence of routing or bridging protocols, and it is also | |||
| implemented at the DetNet forwarding sub-layer. | implemented at the DetNet forwarding sub-layer. | |||
| To support congestion protection and explicit route, the following | To support congestion protection and explicit route, the following | |||
| transport layer related attributes are necessary: | transport layer related attributes are necessary: | |||
| * Flow Specification and Traffic Requirements, refers to | * Flow Specification and Traffic Requirements, refers to [RFC9016]. | |||
| [I-D.ietf-detnet-flow-information-model]. These may used for | These may used for resource reservation, flow shaping, filtering | |||
| resource reservation, flow shaping, filtering and policing by a | and policing by a control plane or other network management and | |||
| control plane or other network management and control mechanisms. | control mechanisms. | |||
| * Since this model programs the data plane existing explicit route | * Since this model programs the data plane existing explicit route | |||
| mechanisms can be reused. If a static MPLS tunnel is used as the | mechanisms can be reused. If a static MPLS tunnel is used as the | |||
| transport tunnel, the configuration need to be at every transit | transport tunnel, the configuration need to be at every transit | |||
| node along the path. For an IP based path, the static | node along the path. For an IP based path, the static | |||
| configuration is similar to the static MPLS case. This document | configuration is similar to the static MPLS case. This document | |||
| provides data-plane configuration of IP addresses or MPLS labels | provides data-plane configuration of IP addresses or MPLS labels | |||
| but it does not provide control plane mapping or other aspects. | but it does not provide control plane mapping or other aspects. | |||
| 4. DetNet Flow Aggregation | 5. DetNet Flow Aggregation | |||
| DetNet provides the capability of flow aggregation to improve | DetNet provides the capability of flow aggregation to improve | |||
| scalability of DetNet data, management and control planes. | scalability of DetNet data, management and control planes. | |||
| Aggregated flows can be viewed by the some DetNet nodes as individual | Aggregated flows can be viewed by the some DetNet nodes as individual | |||
| DetNet flows. When aggregating DetNet flows, the flows should be | DetNet flows. When aggregating DetNet flows, the flows should be | |||
| compatible: if bandwidth reservations are used, the reservation | compatible: if bandwidth reservations are used, the reservation | |||
| should be a reasonable representation of the individual reservations; | should be a reasonable representation of the individual reservations; | |||
| if maximum delay bounds are used, the system should ensure that the | if maximum delay bounds are used, the system should ensure that the | |||
| aggregate does not exceed the delay bounds of the individual flows. | aggregate does not exceed the delay bounds of the individual flows. | |||
| skipping to change at page 5, line 38 ¶ | skipping to change at page 7, line 24 ¶ | |||
| * Relay node aggregates the forwarding sub-layers of DetNet flow | * Relay node aggregates the forwarding sub-layers of DetNet flow | |||
| into a service sub-layer of Aggregated DetNet flow | into a service sub-layer of Aggregated DetNet flow | |||
| * Transit node aggregates the forwarding sub-layers of DetNet flows | * Transit node aggregates the forwarding sub-layers of DetNet flows | |||
| into a forwarding sub-layer | into a forwarding sub-layer | |||
| Traffic requirements and traffic specification may be tracked for | Traffic requirements and traffic specification may be tracked for | |||
| individual or aggregate flows but reserving resources and tracking | individual or aggregate flows but reserving resources and tracking | |||
| the services in the aggregated flow is out of scope. | the services in the aggregated flow is out of scope. | |||
| 5. DetNet YANG Structure Considerations | 6. DetNet YANG Structure Considerations | |||
| The picture shows that the general structure of the DetNet YANG | The picture shows that the general structure of the DetNet YANG | |||
| Model: | Model: | |||
| +-----------+ | +-----------+ | |||
| |ietf-detnet| | |ietf-detnet| | |||
| +-----+-----+ | +-----+-----+ | |||
| | | | | |||
| +-------------+---------------+-------------------+ | +--------------+----------------+-------------------+ | |||
| | | | | | | | | | | |||
| +-----+-----+ +-----+-----+ +-------+------+ | | +-----+------+ +-----+------+ +-------+------+ | | |||
| | App Flows | |service s-l| |forwarding s-l| | | | App Flows | |service s-l | |forwarding s-l| | | |||
| +-----+-----+ +-----+-----+ +-------+------+ | | +-----+------+ +-----+------+ +-------+------+ | | |||
| | | | | | | | | | | |||
| +-----+-----+ +-----+-----+ +-------+------+ +--------+-------+ | +-----+------+ +-----+------+ +-------+------+ | | |||
| | Ref to TR | | Ref to TR | | Ref to TR | | Traffic Profile| | | Reference | | Reference | | Reference | | | |||
| +-----------+ +-----------+ +--------------+ +----------------+ | | to Traffic | | to Traffic | | to Traffic | +--------+-------+ | |||
| | Profile | | Profile | | Profile | | Traffic Profile| | ||||
| +------------+ +------------+ +--------------+ +----------------+ | ||||
| There are three instances in DetNet YANG Model: App-flow instance, | There are three layer types in DetNet YANG Model: App-flow data | |||
| service sub-layer instance and forwarding sub-layer instance, | layer, service sub-layer and forwarding sub-layer. Additionally, the | |||
| respectively corresponding to four parts of DetNet functions defined | Traffic parameters are captured in a Traffic profile that can be | |||
| in section 3. | referenced by any of the layers. | |||
| 6. DetNet Configuration YANG Structures | Below is a a summary YANG tree showing the major items. A complete | |||
| YANG tree is in section Appendix A. | ||||
| module: ietf-detnet | A traffic profile can be created for application, service sub-layer | |||
| +--rw detnet | or forwarding sub-layer. A single profile may be shared by multiple | |||
| +--rw traffic-profile* [profile-name] | applications/sub-layer. Each profile indicates the members that | |||
| | +--rw profile-name string | currently are using a profile. | |||
| | +--rw traffic-requirements | ||||
| | | +--rw min-bandwidth? uint64 | ||||
| | | +--rw max-latency? uint32 | ||||
| | | +--rw max-latency-variation? uint32 | ||||
| | | +--rw max-loss? uint32 | ||||
| | | +--rw max-consecutive-loss-tolerance? uint32 | ||||
| | | +--rw max-misordering? uint32 | ||||
| | +--rw flow-spec | ||||
| | | +--rw interval? uint32 | ||||
| | | +--rw max-pkts-per-interval? uint32 | ||||
| | | +--rw max-payload-size? uint32 | ||||
| | | +--rw min-payload-size? uint32 | ||||
| | | +--rw min-pkts-per-interval? uint32 | ||||
| | +--ro member-apps* app-flow-ref | ||||
| | +--ro member-services* service-sub-layer-ref | ||||
| | +--ro member-fwd-sublayers* forwarding-sub-layer-ref | ||||
| +--rw app-flows | ||||
| | +--rw app-flow* [name] | ||||
| | +--rw name string | ||||
| | +--rw app-flow-bidir-congruent? boolean | ||||
| | +--ro outgoing-service? service-sub-layer-ref | ||||
| | +--ro incoming-service? service-sub-layer-ref | ||||
| | +--rw traffic-profile? traffic-profile-ref | ||||
| | +--rw ingress | ||||
| | | +--rw name? string | ||||
| | | +--ro app-flow-status? identityref | ||||
| | | +--rw interface? if:interface-ref | ||||
| | | +--rw (data-flow-type)? | ||||
| | | +--:(tsn-app-flow) | ||||
| | | | +--rw tsn-app-flow | ||||
| | | | +--rw source-mac-address? | ||||
| | | | | yang:mac-address | ||||
| | | | +--rw destination-mac-address? | ||||
| | | | | yang:mac-address | ||||
| | | | +--rw ethertype? | ||||
| | | | | ethertypes:ethertype | ||||
| | | | +--rw vlan-id? | ||||
| | | | | dot1q-types:vlanid | ||||
| | | | +--rw pcp? | ||||
| | | | dot1q-types:priority-type | ||||
| | | +--:(ip-app-flow) | ||||
| | | | +--rw ip-app-flow | ||||
| | | | +--rw src-ip-prefix? inet:ip-prefix | ||||
| | | | +--rw dest-ip-prefix? inet:ip-prefix | ||||
| | | | +--rw protocol-next-header? uint8 | ||||
| | | | +--rw dscp? inet:dscp | ||||
| | | | +--rw flow-label? | ||||
| | | | | inet:ipv6-flow-label | ||||
| | | | +--rw source-port | ||||
| | | | | +--rw (port-range-or-operator)? | ||||
| | | | | +--:(range) | ||||
| | | | | | +--rw lower-port inet:port-number | ||||
| | | | | | +--rw upper-port inet:port-number | ||||
| | | | | +--:(operator) | ||||
| | | | | +--rw operator? operator | ||||
| | | | | +--rw port inet:port-number | ||||
| | | | +--rw destination-port | ||||
| | | | | +--rw (port-range-or-operator)? | ||||
| | | | | +--:(range) | ||||
| | | | | | +--rw lower-port inet:port-number | ||||
| | | | | | +--rw upper-port inet:port-number | ||||
| | | | | +--:(operator) | ||||
| | | | | +--rw operator? operator | ||||
| | | | | +--rw port inet:port-number | ||||
| | | | +--rw ipsec-spi? ipsec-spi | ||||
| | | +--:(mpls-app-flow) | ||||
| | | +--rw mpls-app-flow | ||||
| | | +--rw (label-space)? | ||||
| | | +--:(context-label-space) | ||||
| | | | +--rw mpls-label-stack | ||||
| | | | +--rw entry* [id] | ||||
| | | | +--rw id uint8 | ||||
| | | | +--rw label? | ||||
| | | | | rt-types:mpls-label | ||||
| | | | +--rw ttl? uint8 | ||||
| | | | +--rw traffic-class? uint8 | ||||
| | | +--:(platform-label-space) | ||||
| | | +--rw label? | ||||
| | | rt-types:mpls-label | ||||
| | +--rw egress | ||||
| | +--rw name? string | ||||
| | +--rw (application-type)? | ||||
| | +--:(ethernet) | ||||
| | | +--rw ethernet | ||||
| | | +--rw interface? if:interface-ref | ||||
| | +--:(ip-mpls) | ||||
| | +--rw ip-mpls | ||||
| | +--rw (next-hop-options) | ||||
| | +--:(simple-next-hop) | ||||
| | | +--rw outgoing-interface? | ||||
| | | | if:interface-ref | ||||
| | | +--rw (flow-type)? | ||||
| | | +--:(ip) | ||||
| | | | +--rw next-hop-address? | ||||
| | | | inet:ip-address | ||||
| | | +--:(mpls) | ||||
| | | +--rw mpls-label-stack | ||||
| | | +--rw entry* [id] | ||||
| | | +--rw id uint8 | ||||
| | | +--rw label? | ||||
| | | | rt-types:mpls-label | ||||
| | | +--rw ttl? uint8 | ||||
| | | +--rw traffic-class? uint8 | ||||
| | +--:(next-hop-list) | ||||
| | +--rw next-hop* [hop-index] | ||||
| | +--rw hop-index uint8 | ||||
| | +--rw outgoing-interface? | ||||
| | | if:interface-ref | ||||
| | +--rw (flow-type)? | ||||
| | +--:(ip) | ||||
| | | +--rw next-hop-address? | ||||
| | | inet:ip-address | ||||
| | +--:(mpls) | ||||
| | +--rw mpls-label-stack | ||||
| | +--rw entry* [id] | ||||
| | +--rw id | ||||
| | | uint8 | ||||
| | +--rw label? | ||||
| | | rt-types:mpls-label | ||||
| | +--rw ttl? | ||||
| | | uint8 | ||||
| | +--rw traffic-class? | ||||
| | uint8 | ||||
| +--rw service-sub-layer | ||||
| | +--rw service-sub-layer-list* [name] | ||||
| | +--rw name string | ||||
| | +--rw service-rank? uint8 | ||||
| | +--rw traffic-profile? traffic-profile-ref | ||||
| | +--rw service-protection | ||||
| | | +--rw service-protection-type? service-protection-type | ||||
| | | +--rw sequence-number-length? sequence-number-field | ||||
| | +--rw service-operation-type? service-operation-type | ||||
| | +--rw incoming-type | ||||
| | | +--rw (incoming-type) | ||||
| | | +--:(app-flow) | ||||
| | | | +--rw app-flow | ||||
| | | | +--rw app-flow-list* app-flow-ref | ||||
| | | +--:(service-aggregation) | ||||
| | | | +--rw service-aggregation | ||||
| | | | +--rw service-sub-layer* | ||||
| | | | service-sub-layer-ref | ||||
| | | +--:(forwarding-aggregation) | ||||
| | | | +--rw forwarding-aggregation | ||||
| | | | +--rw forwarding-sub-layer* | ||||
| | | | forwarding-sub-layer-ref | ||||
| | | +--:(service-id) | ||||
| | | +--rw service-id | ||||
| | | +--rw (detnet-flow-type)? | ||||
| | | +--:(ip-detnet-flow) | ||||
| | | | +--rw src-ip-prefix? | ||||
| | | | | inet:ip-prefix | ||||
| | | | +--rw dest-ip-prefix? | ||||
| | | | | inet:ip-prefix | ||||
| | | | +--rw protocol-next-header? uint8 | ||||
| | | | +--rw dscp? inet:dscp | ||||
| | | | +--rw flow-label? | ||||
| | | | | inet:ipv6-flow-label | ||||
| | | | +--rw source-port | ||||
| | | | | +--rw (port-range-or-operator)? | ||||
| | | | | +--:(range) | ||||
| | | | | | +--rw lower-port | ||||
| | | | | | | inet:port-number | ||||
| | | | | | +--rw upper-port | ||||
| | | | | | inet:port-number | ||||
| | | | | +--:(operator) | ||||
| | | | | +--rw operator? operator | ||||
| | | | | +--rw port | ||||
| | | | | inet:port-number | ||||
| | | | +--rw destination-port | ||||
| | | | | +--rw (port-range-or-operator)? | ||||
| | | | | +--:(range) | ||||
| | | | | | +--rw lower-port | ||||
| | | | | | | inet:port-number | ||||
| | | | | | +--rw upper-port | ||||
| | | | | | inet:port-number | ||||
| | | | | +--:(operator) | ||||
| | | | | +--rw operator? operator | ||||
| | | | | +--rw port | ||||
| | | | | inet:port-number | ||||
| | | | +--rw ipsec-spi? ipsec-spi | ||||
| | | +--:(mpls-detnet-flow) | ||||
| | | +--rw (label-space)? | ||||
| | | +--:(context-label-space) | ||||
| | | | +--rw mpls-label-stack | ||||
| | | | +--rw entry* [id] | ||||
| | | | +--rw id uint8 | ||||
| | | | +--rw label? | ||||
| | | | | rt-types:mpls-label | ||||
| | | | +--rw ttl? uint8 | ||||
| | | | +--rw traffic-class? uint8 | ||||
| | | +--:(platform-label-space) | ||||
| | | +--rw label? | ||||
| | | rt-types:mpls-label | ||||
| | +--rw outgoing-type | ||||
| | +--rw (outgoing-type) | ||||
| | +--:(forwarding-sub-layer) | ||||
| | | +--rw forwarding-sub-layer | ||||
| | | +--rw service-outgoing-list* | ||||
| | | [service-outgoing-index] | ||||
| | | +--rw service-outgoing-index uint8 | ||||
| | | +--rw (header-type)? | ||||
| | | | +--:(detnet-mpls-header) | ||||
| | | | | +--rw mpls-label-stack | ||||
| | | | | +--rw entry* [id] | ||||
| | | | | +--rw id uint8 | ||||
| | | | | +--rw label? | ||||
| | | | | | rt-types:mpls-label | ||||
| | | | | +--rw ttl? uint8 | ||||
| | | | | +--rw traffic-class? uint8 | ||||
| | | | +--:(detnet-ip-header) | ||||
| | | | +--rw src-ip-address? | ||||
| | | | | inet:ip-address | ||||
| | | | +--rw dest-ip-address? | ||||
| | | | | inet:ip-address | ||||
| | | | +--rw protocol-next-header? uint8 | ||||
| | | | +--rw dscp? | ||||
| | | | | inet:dscp | ||||
| | | | +--rw flow-label? | ||||
| | | | | inet:ipv6-flow-label | ||||
| | | | +--rw source-port? | ||||
| | | | | inet:port-number | ||||
| | | | +--rw destination-port? | ||||
| | | | inet:port-number | ||||
| | | +--rw forwarding-sub-layer* | ||||
| | | forwarding-sub-layer-ref | ||||
| | +--:(service-sub-layer) | ||||
| | | +--rw service-sub-layer | ||||
| | | +--rw aggregation-service-sub-layer? | ||||
| | | | service-sub-layer-ref | ||||
| | | +--rw service-label | ||||
| | | +--rw mpls-label-stack | ||||
| | | +--rw entry* [id] | ||||
| | | +--rw id uint8 | ||||
| | | +--rw label? | ||||
| | | | rt-types:mpls-label | ||||
| | | +--rw ttl? uint8 | ||||
| | | +--rw traffic-class? uint8 | ||||
| | +--:(app-flow) | ||||
| | | +--rw app-flow | ||||
| | | +--rw app-flow-list* app-flow-ref | ||||
| | +--:(service-disaggregation) | ||||
| | | +--rw service-disaggregation | ||||
| | | +--rw service-sub-layer* | ||||
| | | service-sub-layer-ref | ||||
| | +--:(forwarding-disaggregation) | ||||
| | +--rw forwarding-disaggregation | ||||
| | +--rw forwarding-sub-layer* | ||||
| | forwarding-sub-layer-ref | ||||
| +--rw forwarding-sub-layer | ||||
| +--rw forwarding-sub-layer-list* [name] | ||||
| +--rw name string | ||||
| +--rw traffic-profile? traffic-profile-ref | ||||
| +--rw forwarding-operation-type? | ||||
| | forwarding-operations-type | ||||
| +--rw incoming-type | ||||
| | +--rw (incoming-type) | ||||
| | +--:(service-sub-layer) | ||||
| | | +--rw service-sub-layer | ||||
| | | +--rw service-sub-layer* | ||||
| | | service-sub-layer-ref | ||||
| | +--:(forwarding-aggregation) | ||||
| | | +--rw forwarding-aggregation | ||||
| | | +--rw forwarding-sub-layer* | ||||
| | | forwarding-sub-layer-ref | ||||
| | +--:(forwarding-id) | ||||
| | +--rw forwarding-id | ||||
| | +--rw interface? | ||||
| | | if:interface-ref | ||||
| | +--rw (detnet-flow-type)? | ||||
| | +--:(ip-detnet-flow) | ||||
| | | +--rw src-ip-prefix? | ||||
| | | | inet:ip-prefix | ||||
| | | +--rw dest-ip-prefix? | ||||
| | | | inet:ip-prefix | ||||
| | | +--rw protocol-next-header? uint8 | ||||
| | | +--rw dscp? inet:dscp | ||||
| | | +--rw flow-label? | ||||
| | | | inet:ipv6-flow-label | ||||
| | | +--rw source-port | ||||
| | | | +--rw (port-range-or-operator)? | ||||
| | | | +--:(range) | ||||
| | | | | +--rw lower-port | ||||
| | | | | | inet:port-number | ||||
| | | | | +--rw upper-port | ||||
| | | | | inet:port-number | ||||
| | | | +--:(operator) | ||||
| | | | +--rw operator? operator | ||||
| | | | +--rw port | ||||
| | | | inet:port-number | ||||
| | | +--rw destination-port | ||||
| | | | +--rw (port-range-or-operator)? | ||||
| | | | +--:(range) | ||||
| | | | | +--rw lower-port | ||||
| | | | | | inet:port-number | ||||
| | | | | +--rw upper-port | ||||
| | | | | inet:port-number | ||||
| | | | +--:(operator) | ||||
| | | | +--rw operator? operator | ||||
| | | | +--rw port | ||||
| | | | inet:port-number | ||||
| | | +--rw ipsec-spi? ipsec-spi | ||||
| | +--:(mpls-detnet-flow) | ||||
| | +--rw (label-space)? | ||||
| | +--:(context-label-space) | ||||
| | | +--rw mpls-label-stack | ||||
| | | +--rw entry* [id] | ||||
| | | +--rw id uint8 | ||||
| | | +--rw label? | ||||
| | | | rt-types:mpls-label | ||||
| | | +--rw ttl? uint8 | ||||
| | | +--rw traffic-class? uint8 | ||||
| | +--:(platform-label-space) | ||||
| | +--rw label? | ||||
| | rt-types:mpls-label | ||||
| +--rw outgoing-type | ||||
| +--rw (outgoing-type) | ||||
| +--:(interface) | ||||
| | +--rw interface | ||||
| | +--rw (next-hop-options) | ||||
| | +--:(simple-next-hop) | ||||
| | | +--rw outgoing-interface? | ||||
| | | | if:interface-ref | ||||
| | | +--rw (flow-type)? | ||||
| | | +--:(ip) | ||||
| | | | +--rw (operation-type)? | ||||
| | | | +--:(ip-forwarding) | ||||
| | | | | +--rw next-hop-address? | ||||
| | | | | inet:ip-address | ||||
| | | | +--:(mpls-over-ip-encapsulation) | ||||
| | | | +--rw src-ip-address? | ||||
| | | | | inet:ip-address | ||||
| | | | +--rw dest-ip-address? | ||||
| | | | | inet:ip-address | ||||
| | | | +--rw protocol-next-header? | ||||
| | | | | uint8 | ||||
| | | | +--rw dscp? | ||||
| | | | | inet:dscp | ||||
| | | | +--rw flow-label? | ||||
| | | | | inet:ipv6-flow-label | ||||
| | | | +--rw source-port? | ||||
| | | | | inet:port-number | ||||
| | | | +--rw destination-port? | ||||
| | | | inet:port-number | ||||
| | | +--:(mpls) | ||||
| | | +--rw mpls-label-stack | ||||
| | | +--rw entry* [id] | ||||
| | | +--rw id uint8 | ||||
| | | +--rw label? | ||||
| | | | rt-types:mpls-label | ||||
| | | +--rw ttl? uint8 | ||||
| | | +--rw traffic-class? uint8 | ||||
| | +--:(next-hop-list) | ||||
| | +--rw next-hop* [hop-index] | ||||
| | +--rw hop-index | ||||
| | | uint8 | ||||
| | +--rw outgoing-interface? | ||||
| | | if:interface-ref | ||||
| | +--rw (flow-type)? | ||||
| | +--:(ip) | ||||
| | | +--rw (operation-type)? | ||||
| | | +--:(ip-forwarding) | ||||
| | | | +--rw next-hop-address? | ||||
| | | | inet:ip-address | ||||
| | | +--:(mpls-over-ip- | ||||
| | | encapsulation) | ||||
| | | +--rw src-ip-address? | ||||
| | | | inet:ip-address | ||||
| | | +--rw dest-ip-address? | ||||
| | | | inet:ip-address | ||||
| | | +--rw protocol-next-header? | ||||
| | | | uint8 | ||||
| | | +--rw dscp? | ||||
| | | | inet:dscp | ||||
| | | +--rw flow-label? | ||||
| | | | inet:ipv6-flow-label | ||||
| | | +--rw source-port? | ||||
| | | | inet:port-number | ||||
| | | +--rw destination-port? | ||||
| | | inet:port-number | ||||
| | +--:(mpls) | ||||
| | +--rw mpls-label-stack | ||||
| | +--rw entry* [id] | ||||
| | +--rw id | ||||
| | | uint8 | ||||
| | +--rw label? | ||||
| | | rt-types:mpls-label | ||||
| | +--rw ttl? | ||||
| | | uint8 | ||||
| | +--rw traffic-class? | ||||
| | uint8 | ||||
| +--:(service-aggregation) | ||||
| | +--rw service-aggregation | ||||
| | +--rw aggregation-service-sub-layer? | ||||
| | | service-sub-layer-ref | ||||
| | +--rw optional-forwarding-label | ||||
| | +--rw mpls-label-stack | ||||
| | +--rw entry* [id] | ||||
| | +--rw id uint8 | ||||
| | +--rw label? | ||||
| | | rt-types:mpls-label | ||||
| | +--rw ttl? uint8 | ||||
| | +--rw traffic-class? uint8 | ||||
| +--:(forwarding-sub-layer) | ||||
| | +--rw forwarding-sub-layer | ||||
| | +--rw aggregation-forwarding-sub-layer? | ||||
| | | forwarding-sub-layer-ref | ||||
| | +--rw forwarding-label | ||||
| | +--rw mpls-label-stack | ||||
| | +--rw entry* [id] | ||||
| | +--rw id uint8 | ||||
| | +--rw label? | ||||
| | | rt-types:mpls-label | ||||
| | +--rw ttl? uint8 | ||||
| | +--rw traffic-class? uint8 | ||||
| +--:(service-sub-layer) | ||||
| | +--rw service-sub-layer | ||||
| | +--rw service-sub-layer* | ||||
| | service-sub-layer-ref | ||||
| +--:(forwarding-disaggregation) | ||||
| +--rw forwarding-disaggregation | ||||
| +--rw forwarding-sub-layer* | ||||
| forwarding-sub-layer-ref | ||||
| 7. DetNet Configuration YANG Model | Depending on which DetNet layers and functions are required, some or | |||
| all of the components may configured. Examples are shown in | ||||
| Appendix B. | ||||
| 7. DetNet Configuration YANG Structures | ||||
| The following is a partial tree representation of the YANG as defined | ||||
| in [RFC8340]. This corresponds to the structure layout in the | ||||
| previous section. | ||||
| module: ietf-detnet | ||||
| +--rw detnet | ||||
| +--rw traffic-profile* [name] | ||||
| | +--rw name string | ||||
| | +--rw traffic-requirements | ||||
| | +--rw traffic-spec | ||||
| | +--ro member-apps* app-flow-ref | ||||
| | +--ro member-services* service-sub-layer-ref | ||||
| | +--ro member-fwd-sublayers* forwarding-sub-layer-ref | ||||
| +--rw app-flows | ||||
| | +--rw app-flow* [name] | ||||
| | +--rw name string | ||||
| | +--rw bidir-congruent? boolean | ||||
| | +--ro outgoing-service? service-sub-layer-ref | ||||
| | +--ro incoming-service? service-sub-layer-ref | ||||
| | +--rw traffic-profile? traffic-profile-ref | ||||
| | +--rw ingress | ||||
| | | ... | ||||
| | +--rw egress | ||||
| | ... | ||||
| +--rw service | ||||
| | +--rw sub-layer* [name] | ||||
| | +--rw name string | ||||
| | +--rw service-rank? uint8 | ||||
| | +--rw traffic-profile? traffic-profile-ref | ||||
| | +--rw service-protection | ||||
| | | ... | ||||
| | +--rw operation? operation | ||||
| | +--rw incoming | ||||
| | | ... | ||||
| | +--rw outgoing | ||||
| | ... | ||||
| +--rw forwarding | ||||
| +--rw sub-layer* [name] | ||||
| +--rw name string | ||||
| +--rw traffic-profile? traffic-profile-ref | ||||
| +--rw operation? forwarding-operations | ||||
| +--rw incoming | ||||
| | ... | ||||
| +--rw outgoing | ||||
| ... | ||||
| 8. DetNet Configuration YANG Model | ||||
| The following model has references to RFCs [RFC4303], [RFC8349], | ||||
| [RFC8960], [RFC8964], and [IEEE8021Q]. | ||||
| <CODE BEGINS> | <CODE BEGINS> | |||
| module ietf-detnet { | module ietf-detnet { | |||
| yang-version 1.1; | yang-version 1.1; | |||
| namespace "urn:ietf:params:xml:ns:yang:ietf-detnet"; | namespace "urn:ietf:params:xml:ns:yang:ietf-detnet"; | |||
| prefix ietf-detnet; | prefix dnet; | |||
| import ietf-yang-types { | import ietf-yang-types { | |||
| prefix yang; | prefix yang; | |||
| reference | reference | |||
| "RFC 6021 - Common YANG Data Types."; | "RFC 6991 - Common YANG Data Types."; | |||
| } | } | |||
| import ietf-inet-types { | import ietf-inet-types { | |||
| prefix inet; | prefix inet; | |||
| reference | reference | |||
| "RFC 6991 - Common YANG Data Types."; | "RFC 6991 - Common YANG Data Types."; | |||
| } | } | |||
| import ietf-ethertypes { | import ietf-ethertypes { | |||
| prefix ethertypes; | prefix ethertypes; | |||
| reference | reference | |||
| "RFC 8519 - YANG Data Model for Network Access Control | "RFC 8519 - YANG Data Model for Network Access Control | |||
| skipping to change at page 17, line 20 ¶ | skipping to change at page 11, line 51 ¶ | |||
| This version of this YANG module is part of RFC XXXX | This version of this YANG module is part of RFC XXXX | |||
| (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself | (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself | |||
| for full legal notices. | for full legal notices. | |||
| The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL | The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL | |||
| NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED', | NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED', | |||
| 'MAY', and 'OPTIONAL' in this document are to be interpreted as | 'MAY', and 'OPTIONAL' in this document are to be interpreted as | |||
| described in BCP 14 (RFC 2119) (RFC 8174) when, and only when, | described in BCP 14 (RFC 2119) (RFC 8174) when, and only when, | |||
| they appear in all capitals, as shown here. "; | they appear in all capitals, as shown here. "; | |||
| revision 2021-02-17 { | revision 2021-10-04 { | |||
| description | description | |||
| "initial revision"; | "initial revision"; | |||
| reference | reference | |||
| "RFC XXXX: draft-ietf-detnet-yang-10"; | "RFC XXXX: Deterministic Networking (DetNet) YANG Model"; | |||
| } | } | |||
| identity app-status { | identity app-status { | |||
| description | description | |||
| "Base identity from which all application-status | "Base identity from which all application-status | |||
| status types are derived."; | status types are derived."; | |||
| reference | reference | |||
| "draft-ietf-detnet-flow-information-model Section 5.8"; | "RFC 9016 Section 5.8"; | |||
| } | } | |||
| identity none { | identity none { | |||
| base app-status; | base app-status; | |||
| description | description | |||
| "This Application has no status. This type of status is | "This Application has no status. This type of status is | |||
| expected when the configuration is incomplete."; | expected when the configuration is incomplete."; | |||
| reference | reference | |||
| "draft-ietf-detnet-flow-information-model Section 5.8"; | "RFC 9016 Section 5.8"; | |||
| } | } | |||
| identity ready { | identity ready { | |||
| base app-status; | base app-status; | |||
| description | description | |||
| "Application ingress/egress ready."; | "Application ingress/egress ready."; | |||
| reference | reference | |||
| "draft-ietf-detnet-flow-information-model Section 5.8"; | "RFC 9016 Section 5.8"; | |||
| } | } | |||
| identity failed { | identity failed { | |||
| base app-status; | base app-status; | |||
| description | description | |||
| "Application ingres/egresss failed."; | "Application ingres/egresss failed."; | |||
| reference | reference | |||
| "draft-ietf-detnet-flow-information-model Section 5.8"; | "RFC 9016 Section 5.8"; | |||
| } | } | |||
| identity out-of-service { | identity out-of-service { | |||
| base app-status; | base app-status; | |||
| description | description | |||
| "Application Administratively blocked."; | "Application Administratively blocked."; | |||
| reference | reference | |||
| "draft-ietf-detnet-flow-information-model Section 5.8"; | "RFC 9016 Section 5.8"; | |||
| } | } | |||
| identity partial-failed { | identity partial-failed { | |||
| base app-status; | base app-status; | |||
| description | description | |||
| "This is an Application with one or more Egress ready, and one | "This is an Application with one or more Egress ready, and one | |||
| or more Egress failed. The DetNet flow can be used if the | or more Egress failed. The DetNet flow can be used if the | |||
| Ingress is Ready."; | Ingress is Ready."; | |||
| reference | reference | |||
| "draft-ietf-detnet-flow-information-model Section 5.8"; | "RFC 9016 Section 5.8"; | |||
| } | } | |||
| typedef app-flow-ref { | typedef app-flow-ref { | |||
| type leafref { | type leafref { | |||
| path "/ietf-detnet:detnet" | path "/dnet:detnet" | |||
| + "/ietf-detnet:app-flows" | + "/dnet:app-flows" | |||
| + "/ietf-detnet:app-flow" | + "/dnet:app-flow" | |||
| + "/ietf-detnet:name"; | + "/dnet:name"; | |||
| } | } | |||
| description | description | |||
| "This is an Application Reference."; | "This is an Application Reference."; | |||
| } | } | |||
| typedef service-sub-layer-ref { | typedef service-sub-layer-ref { | |||
| type leafref { | type leafref { | |||
| path "/ietf-detnet:detnet" | path "/dnet:detnet" | |||
| + "/ietf-detnet:service-sub-layer" | + "/dnet:service" | |||
| + "/ietf-detnet:service-sub-layer-list" | + "/dnet:sub-layer" | |||
| + "/ietf-detnet:name"; | + "/dnet:name"; | |||
| } | } | |||
| description | description | |||
| "This is a Service sub-layer Reference."; | "This is a Service sub-layer Reference."; | |||
| } | } | |||
| typedef forwarding-sub-layer-ref { | typedef forwarding-sub-layer-ref { | |||
| type leafref { | type leafref { | |||
| path "/ietf-detnet:detnet" | path "/dnet:detnet" | |||
| + "/ietf-detnet:forwarding-sub-layer" | + "/dnet:forwarding" | |||
| + "/ietf-detnet:forwarding-sub-layer-list" | + "/dnet:sub-layer" | |||
| + "/ietf-detnet:name"; | + "/dnet:name"; | |||
| } | } | |||
| description | description | |||
| "This is a Forwarding sub-layer Reference."; | "This is a Forwarding sub-layer Reference."; | |||
| } | } | |||
| typedef traffic-profile-ref { | typedef traffic-profile-ref { | |||
| type leafref { | type leafref { | |||
| path "/ietf-detnet:detnet" | path "/dnet:detnet" | |||
| + "/ietf-detnet:traffic-profile" | + "/dnet:traffic-profile" | |||
| + "/ietf-detnet:profile-name"; | + "/dnet:name"; | |||
| } | } | |||
| description | description | |||
| "This is a Traffic Profile Reference."; | "This is a Traffic Profile Reference."; | |||
| } | } | |||
| typedef ipsec-spi { | typedef ipsec-spi { | |||
| type uint32 { | type uint32 { | |||
| range "1..max"; | range "1..max"; | |||
| } | } | |||
| description | description | |||
| "IPsec Security Parameters Index."; | "IPsec Security Parameters Index. A 32 bit value | |||
| where 0 is reserved."; | ||||
| reference | reference | |||
| "IETF RFC 6071"; | "IETF RFC 4303 Encapsulating Security Payload (ESP)."; | |||
| } | } | |||
| typedef service-operation-type { | typedef operation { | |||
| type enumeration { | type enumeration { | |||
| enum service-initiation { | enum initiation { | |||
| description | description | |||
| "This is an initiating service sub-layer encapsulation."; | "This is an initiating service sub-layer encapsulation."; | |||
| } | } | |||
| enum service-termination { | enum termination { | |||
| description | description | |||
| "Operation for DetNet service sub-layer decapsulation."; | "Operation for DetNet service sub-layer decapsulation."; | |||
| } | } | |||
| enum service-relay { | enum relay { | |||
| description | description | |||
| "Operation for DetNet service sub-layer swap."; | "Operation for DetNet service sub-layer swap."; | |||
| } | } | |||
| enum non-detnet { | enum non-detnet { | |||
| description | description | |||
| "No operation for DetNet service sub-layer."; | "No operation for DetNet service sub-layer."; | |||
| } | } | |||
| } | } | |||
| description | description | |||
| "Operation type identifies the behavior for this service | "Operation type identifies the behavior for this service | |||
| sub-layer instance. Operations are described as unidirectional | sub-layer. Operations are described as unidirectional | |||
| but a service sub-layer may combine operation types."; | but a service sub-layer may combine operation types."; | |||
| } | } | |||
| typedef forwarding-operations-type { | typedef forwarding-operations { | |||
| type enumeration { | type enumeration { | |||
| enum impose-and-forward { | enum impose-and-forward { | |||
| description | description | |||
| "This operation impose outgoing label(s) and forward to | "This operation impose outgoing label(s) and forward to | |||
| next-hop."; | next-hop."; | |||
| reference | reference | |||
| " A YANG Data Model for MPLS Base | " A YANG Data Model for MPLS Base RFC 8960."; | |||
| draft-ietf-mpls-base-yang."; | ||||
| } | } | |||
| enum pop-and-forward { | enum pop-and-forward { | |||
| description | description | |||
| "This operation pops the incoming label and forwards to | "This operation pops the incoming label and forwards to | |||
| the next-hop."; | the next-hop."; | |||
| reference | reference | |||
| " A YANG Data Model for MPLS Base | " A YANG Data Model for MPLS Base RFC 8960."; | |||
| draft-ietf-mpls-base-yang."; | ||||
| } | } | |||
| enum pop-impose-and-forward { | enum pop-impose-and-forward { | |||
| description | description | |||
| "This operation pops the incoming label, imposes one or | "This operation pops the incoming label, imposes one or | |||
| more outgoing label(s) and forwards to the next-hop."; | more outgoing label(s) and forwards to the next-hop."; | |||
| reference | reference | |||
| " A YANG Data Model for MPLS Base | " A YANG Data Model for MPLS Base RFC 8960."; | |||
| draft-ietf-mpls-base-yang."; | ||||
| } | } | |||
| enum swap-and-forward { | enum swap-and-forward { | |||
| description | description | |||
| "This operation swaps incoming label, with an outgoing | "This operation swaps incoming label, with an outgoing | |||
| label and forwards to the next-hop."; | label and forwards to the next-hop."; | |||
| reference | reference | |||
| " A YANG Data Model for MPLS Base | " A YANG Data Model for MPLS Base RFC 8960."; | |||
| draft-ietf-mpls-base-yang."; | ||||
| } | } | |||
| enum forward { | enum forward { | |||
| description | description | |||
| "This operation forward to next-hop."; | "This operation forward to next-hop."; | |||
| } | } | |||
| enum pop-and-lookup { | enum pop-and-lookup { | |||
| description | description | |||
| "This operation pops incoming label and performs a | "This operation pops incoming label and performs a | |||
| lookup."; | lookup."; | |||
| } | } | |||
| } | } | |||
| description | description | |||
| "MPLS operations types. This is an enum modeled after the | "MPLS operations types. This is an enum modeled after the | |||
| MPLS enum. The first 4 enums are the same as A YANG Data | MPLS enum. The enums are the same as A YANG Data Model | |||
| Model for MPLS Base. draft-ietf-mpls-base-yang."; | for MPLS Base. RFC 8960."; | |||
| } | } | |||
| typedef service-protection-type { | typedef service-protection { | |||
| type enumeration { | type enumeration { | |||
| enum none { | enum none { | |||
| description | description | |||
| "No service protection provided."; | "No service protection provided."; | |||
| } | } | |||
| enum replication { | enum replication { | |||
| description | description | |||
| "A Packet Replication Function (PRF) replicates DetNet | "A Packet Replication Function (PRF) replicates DetNet | |||
| flow packets and forwards them to one or more next hops in | flow packets and forwards them to one or more next hops in | |||
| the DetNet domain. The number of packet copies sent to | the DetNet domain. The number of packet copies sent to | |||
| skipping to change at page 22, line 16 ¶ | skipping to change at page 16, line 44 ¶ | |||
| enum elimination-ordering-replication { | enum elimination-ordering-replication { | |||
| description | description | |||
| "A combination of PEF, POF and PRF that can be implemented | "A combination of PEF, POF and PRF that can be implemented | |||
| by an edge node, a relay node, or an end system."; | by an edge node, a relay node, or an end system."; | |||
| } | } | |||
| } | } | |||
| description | description | |||
| "This typedef describes the service protection types."; | "This typedef describes the service protection types."; | |||
| } | } | |||
| typedef sequence-number-generation-type { | typedef sequence-number-generation { | |||
| type enumeration { | type enumeration { | |||
| enum copy-from-app-flow { | enum copy-from-app-flow { | |||
| description | description | |||
| "This type means copy the app-flow sequence number to the | "This type means copy the app-flow sequence number to the | |||
| DetNet-flow."; | DetNet-flow."; | |||
| } | } | |||
| enum generate-by-detnet-flow { | enum generate-by-detnet-flow { | |||
| description | description | |||
| "This type means generate the sequence number by the | "This type means generate the sequence number by the | |||
| DetNet flow."; | DetNet flow."; | |||
| skipping to change at page 23, line 4 ¶ | skipping to change at page 17, line 32 ¶ | |||
| "A 16-bit DetNet sequence number field is used."; | "A 16-bit DetNet sequence number field is used."; | |||
| } | } | |||
| enum long-sn { | enum long-sn { | |||
| value 28; | value 28; | |||
| description | description | |||
| "A 28-bit DetNet sequence number field is used."; | "A 28-bit DetNet sequence number field is used."; | |||
| } | } | |||
| } | } | |||
| description | description | |||
| "This type captures the sequence number behavior."; | "This type captures the sequence number behavior."; | |||
| } | } | |||
| grouping ip-header { | grouping ip-header { | |||
| description | description | |||
| "This grouping captures the IPv4/IPv6 packet header | "This grouping captures the IPv4/IPv6 packet header | |||
| information. it is modeled after existing fields."; | information. it is modeled after existing fields."; | |||
| leaf src-ip-address { | leaf src-ip-address { | |||
| type inet:ip-address-no-zone; | type inet:ip-address-no-zone; | |||
| description | description | |||
| "The source IP address in the header."; | "The source IP address in the header."; | |||
| reference | reference | |||
| "RFC 6021 Common YANG Data Types"; | "RFC 6991 Common YANG Data Types"; | |||
| } | } | |||
| leaf dest-ip-address { | leaf dest-ip-address { | |||
| type inet:ip-address-no-zone; | type inet:ip-address-no-zone; | |||
| description | description | |||
| "The destination IP address in the header."; | "The destination IP address in the header."; | |||
| reference | reference | |||
| "RFC 6021 Common YANG Data Types"; | "RFC 6991 Common YANG Data Types"; | |||
| } | } | |||
| leaf protocol-next-header { | leaf protocol-next-header { | |||
| type uint8; | type uint8; | |||
| description | description | |||
| "Internet Protocol number. Refers to the protocol of the | "Internet Protocol number. Refers to the protocol of the | |||
| payload. In IPv6, this field is known as 'next-header', | payload. In IPv6, this field is known as 'next-header', | |||
| and if extension headers are present, the protocol is | and if extension headers are present, the protocol is | |||
| present in the 'upper-layer' header."; | present in the 'upper-layer' header."; | |||
| reference | reference | |||
| "RFC 791: Internet Protocol | "RFC 791: Internet Protocol | |||
| RFC 8200: Internet Protocol, Version 6 (IPv6) | RFC 8200: Internet Protocol, Version 6 (IPv6) | |||
| Specification."; | Specification."; | |||
| } | } | |||
| leaf dscp { | leaf dscp { | |||
| type inet:dscp; | type inet:dscp; | |||
| description | description | |||
| "The traffic class value in the header."; | "The traffic class value in the header."; | |||
| reference | reference | |||
| "RFC 6021 Common YANG Data Types"; | "RFC 6991 Common YANG Data Types"; | |||
| } | } | |||
| leaf flow-label { | leaf flow-label { | |||
| type inet:ipv6-flow-label; | type inet:ipv6-flow-label; | |||
| description | description | |||
| "The flow label value of the header.IPV6 only."; | "The flow label value of the header.IPV6 only."; | |||
| reference | reference | |||
| "RFC 6021 Common YANG Data Types"; | "RFC 6991 Common YANG Data Types"; | |||
| } | } | |||
| leaf source-port { | leaf source-port { | |||
| type inet:port-number; | type inet:port-number; | |||
| description | description | |||
| "The source port number."; | "The source port number."; | |||
| reference | reference | |||
| "RFC 6021 Common YANG Data Types"; | "RFC 6991 Common YANG Data Types"; | |||
| } | } | |||
| leaf destination-port { | leaf destination-port { | |||
| type inet:port-number; | type inet:port-number; | |||
| description | description | |||
| "The destination port number."; | "The destination port number."; | |||
| reference | reference | |||
| "RFC 6021 Common YANG Data Types"; | "RFC 6991 Common YANG Data Types"; | |||
| } | } | |||
| } | } | |||
| grouping l2-header { | grouping l2-header { | |||
| description | description | |||
| "The Ethernet or TSN packet header information."; | "The Ethernet or TSN packet header information."; | |||
| leaf source-mac-address { | leaf source-mac-address { | |||
| type yang:mac-address; | type yang:mac-address; | |||
| description | description | |||
| "The source MAC address value of the Ethernet header."; | "The source MAC address value of the Ethernet header."; | |||
| skipping to change at page 25, line 24 ¶ | skipping to change at page 20, line 4 ¶ | |||
| grouping source-ip-port-id { | grouping source-ip-port-id { | |||
| description | description | |||
| "The TCP/UDP port(source/destination) identification | "The TCP/UDP port(source/destination) identification | |||
| information."; | information."; | |||
| container source-port { | container source-port { | |||
| uses packet-fields:port-range-or-operator; | uses packet-fields:port-range-or-operator; | |||
| description | description | |||
| "This grouping captures the source port fields."; | "This grouping captures the source port fields."; | |||
| } | } | |||
| } | } | |||
| grouping ip-flow-id { | grouping ip-flow-id { | |||
| description | description | |||
| "The IPv4/IPv6 packet header identification information."; | "The IPv4/IPv6 packet header identification information."; | |||
| leaf src-ip-prefix { | leaf src-ip-prefix { | |||
| type inet:ip-prefix; | type inet:ip-prefix; | |||
| description | description | |||
| "The source IP prefix."; | "The source IP prefix."; | |||
| reference | reference | |||
| "RFC 6021 Common YANG Data Types"; | "RFC 6991 Common YANG Data Types"; | |||
| } | } | |||
| leaf dest-ip-prefix { | leaf dest-ip-prefix { | |||
| type inet:ip-prefix; | type inet:ip-prefix; | |||
| description | description | |||
| "The destination IP prefix."; | "The destination IP prefix."; | |||
| reference | reference | |||
| "RFC 6021 Common YANG Data Types"; | "RFC 6991 Common YANG Data Types"; | |||
| } | } | |||
| leaf protocol-next-header { | leaf protocol-next-header { | |||
| type uint8; | type uint8; | |||
| description | description | |||
| "Internet Protocol number. Refers to the protocol of the | "Internet Protocol number. Refers to the protocol of the | |||
| payload. In IPv6, this field is known as 'next-header', and | payload. In IPv6, this field is known as 'next-header', and | |||
| if extension headers are present, the protocol is present in | if extension headers are present, the protocol is present in | |||
| the 'upper-layer' header."; | the 'upper-layer' header."; | |||
| reference | reference | |||
| "RFC 791: Internet Protocol | "RFC 791: Internet Protocol | |||
| RFC 8200: Internet Protocol, Version 6 (IPv6) | RFC 8200: Internet Protocol, Version 6 (IPv6) | |||
| Specification."; | Specification."; | |||
| } | } | |||
| leaf dscp { | leaf dscp { | |||
| type inet:dscp; | type inet:dscp; | |||
| description | description | |||
| "The traffic class value in the header."; | "The traffic class value in the header."; | |||
| reference | reference | |||
| "RFC 6021 Common YANG Data Types"; | "RFC 6991 Common YANG Data Types"; | |||
| } | } | |||
| leaf flow-label { | leaf flow-label { | |||
| type inet:ipv6-flow-label; | type inet:ipv6-flow-label; | |||
| description | description | |||
| "The flow label value of the header."; | "The flow label value of the header."; | |||
| reference | reference | |||
| "RFC 6021 Common YANG Data Types"; | "RFC 6991 Common YANG Data Types"; | |||
| } | } | |||
| uses source-ip-port-id; | uses source-ip-port-id; | |||
| uses destination-ip-port-id; | uses destination-ip-port-id; | |||
| leaf ipsec-spi { | leaf ipsec-spi { | |||
| type ipsec-spi; | type ipsec-spi; | |||
| description | description | |||
| "IPsec Security Parameters Index of the Security | "IPsec Security Parameters Index of the Security | |||
| Association."; | Association."; | |||
| reference | reference | |||
| "IETF RFC 6071 IP Security (IPsec) and Internet Key Exchange | "IETF RFC 4303 Encapsulating Security Payload (ESP)."; | |||
| (IKE) Document Roadmap."; | ||||
| } | } | |||
| } | } | |||
| grouping mpls-flow-id { | grouping mpls-flow-id { | |||
| description | description | |||
| "The MPLS packet header identification information."; | "The MPLS packet header identification information."; | |||
| choice label-space { | choice label-space { | |||
| description | description | |||
| "Designates the label space being used."; | "Designates the label space being used."; | |||
| case context-label-space { | case context-label-space { | |||
| skipping to change at page 27, line 46 ¶ | skipping to change at page 22, line 27 ¶ | |||
| } | } | |||
| case mpls-detnet-flow { | case mpls-detnet-flow { | |||
| uses mpls-flow-id; | uses mpls-flow-id; | |||
| } | } | |||
| } | } | |||
| } | } | |||
| grouping app-flows-group { | grouping app-flows-group { | |||
| description | description | |||
| "Incoming or outgoing app-flow reference group."; | "Incoming or outgoing app-flow reference group."; | |||
| leaf-list app-flow-list { | leaf-list flow { | |||
| type app-flow-ref; | type app-flow-ref; | |||
| description | description | |||
| "List of ingress or egress app-flows."; | "List of ingress or egress app-flows."; | |||
| } | } | |||
| } | } | |||
| grouping service-sub-layer-group { | grouping service-sub-layer-group { | |||
| description | description | |||
| "Incoming or outgoing service sub-layer reference group."; | "Incoming or outgoing service sub-layer reference group."; | |||
| leaf-list service-sub-layer { | leaf-list sub-layer { | |||
| type service-sub-layer-ref; | type service-sub-layer-ref; | |||
| description | description | |||
| "List of incoming or outgoing service sub-layers that have | "List of incoming or outgoing service sub-layers that have | |||
| to aggregate or disaggregate."; | to aggregate or disaggregate."; | |||
| } | } | |||
| } | } | |||
| grouping forwarding-sub-layer-group { | grouping forwarding-sub-layer-group { | |||
| description | description | |||
| "Incoming or outgoing forwarding sub-layer reference group."; | "Incoming or outgoing forwarding sub-layer reference group."; | |||
| leaf-list forwarding-sub-layer { | leaf-list sub-layer { | |||
| type forwarding-sub-layer-ref; | type forwarding-sub-layer-ref; | |||
| description | description | |||
| "List of incoming or outgoing forwarding sub-layers that | "List of incoming or outgoing forwarding sub-layers that | |||
| have to aggregate or disaggregate."; | have to aggregate or disaggregate."; | |||
| } | } | |||
| } | } | |||
| grouping detnet-header { | grouping detnet-header { | |||
| description | description | |||
| "DetNet header info for DetNet encapsulation or swap."; | "DetNet header info for DetNet encapsulation or swap."; | |||
| choice header-type { | choice header-type { | |||
| description | description | |||
| "The choice of DetNet header type."; | "The choice of DetNet header type."; | |||
| case detnet-mpls-header { | case mpls { | |||
| description | description | |||
| "MPLS label stack for DetNet MPLS encapsulation or | "MPLS label stack for DetNet MPLS encapsulation or | |||
| forwarding."; | forwarding."; | |||
| uses rt-types:mpls-label-stack; | uses rt-types:mpls-label-stack; | |||
| } | } | |||
| case detnet-ip-header { | case ip { | |||
| description | description | |||
| "IPv4/IPv6 packet header for DetNet IP encapsulation."; | "IPv4/IPv6 packet header for DetNet IP encapsulation."; | |||
| uses ip-header; | uses ip-header; | |||
| } | } | |||
| } | } | |||
| } | } | |||
| grouping detnet-app-next-hop-content { | grouping detnet-app-next-hop-content { | |||
| description | description | |||
| "Generic parameters of DetNet next hops."; | "Generic parameters of DetNet next hops. This follows the | |||
| principles for next hops in RFC 8349"; | ||||
| choice next-hop-options { | choice next-hop-options { | |||
| mandatory true; | mandatory true; | |||
| description | description | |||
| "Options for next hops. It is expected that further cases | "Options for next hops. It is expected that further cases | |||
| will be added through | will be added through | |||
| augments from other modules, e.g., for recursive | augments from other modules, e.g., for recursive | |||
| next hops."; | next hops."; | |||
| case simple-next-hop { | case simple-next-hop { | |||
| description | description | |||
| "This case represents a simple next hop consisting of the | "This case represents a simple next hop consisting of the | |||
| next-hop address and/or outgoing interface. | next-hop address and/or outgoing interface."; | |||
| Modules for address families MUST augment this case with a | ||||
| leaf containing a next-hop address of that address | ||||
| family."; | ||||
| leaf outgoing-interface { | leaf outgoing-interface { | |||
| type if:interface-ref; | type if:interface-ref; | |||
| description | description | |||
| "The outgoing interface, if this is a whole interface."; | "The outgoing interface, when matching all flows to | |||
| the interface."; | ||||
| } | } | |||
| choice flow-type { | choice flow-type { | |||
| description | description | |||
| "The flow type choices."; | "The flow type choices."; | |||
| case ip { | case ip { | |||
| leaf next-hop-address { | leaf next-hop-address { | |||
| type inet:ip-address-no-zone; | type inet:ip-address-no-zone; | |||
| description | description | |||
| "The IP next hop case."; | "The IP next hop case."; | |||
| } | } | |||
| skipping to change at page 29, line 43 ¶ | skipping to change at page 24, line 23 ¶ | |||
| "The MPLS Label stack next hop case."; | "The MPLS Label stack next hop case."; | |||
| } | } | |||
| } | } | |||
| } | } | |||
| case next-hop-list { | case next-hop-list { | |||
| description | description | |||
| "Container for multiple next hops."; | "Container for multiple next hops."; | |||
| list next-hop { | list next-hop { | |||
| key "hop-index"; | key "hop-index"; | |||
| description | description | |||
| "An entry in a next-hop list. Modules for address | "An entry in a next-hop list."; | |||
| families MUST augment this list with a leaf containing a | ||||
| next-hop address of that address family."; | ||||
| leaf hop-index { | leaf hop-index { | |||
| type uint8; | type uint8; | |||
| description | description | |||
| "A user-specified identifier utilized to uniquely | "A user-specified identifier utilized to uniquely | |||
| reference the next-hop entry in the next-hop list. | reference the next-hop entry in the next-hop list. | |||
| The value of this index has no semantic meaning other | The value of this index has no semantic meaning other | |||
| than for referencing the entry."; | than for referencing the entry."; | |||
| } | } | |||
| leaf outgoing-interface { | leaf outgoing-interface { | |||
| type if:interface-ref; | type if:interface-ref; | |||
| description | description | |||
| "Name of the outgoing interface."; | "The outgoing interface, when matching all flows to | |||
| the interface."; | ||||
| } | } | |||
| choice flow-type { | choice flow-type { | |||
| description | description | |||
| "The flow types supported."; | "The flow types supported."; | |||
| case ip { | case ip { | |||
| leaf next-hop-address { | leaf next-hop-address { | |||
| type inet:ip-address-no-zone; | type inet:ip-address-no-zone; | |||
| description | description | |||
| "This is the IP flow type next hop."; | "This is the IP flow type next hop."; | |||
| } | } | |||
| skipping to change at page 30, line 25 ¶ | skipping to change at page 25, line 4 ¶ | |||
| leaf next-hop-address { | leaf next-hop-address { | |||
| type inet:ip-address-no-zone; | type inet:ip-address-no-zone; | |||
| description | description | |||
| "This is the IP flow type next hop."; | "This is the IP flow type next hop."; | |||
| } | } | |||
| } | } | |||
| case mpls { | case mpls { | |||
| uses rt-types:mpls-label-stack; | uses rt-types:mpls-label-stack; | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| grouping detnet-forwarding-next-hop-content { | grouping detnet-forwarding-next-hop-content { | |||
| description | description | |||
| "Generic parameters of DetNet next hops."; | "Generic parameters of DetNet next hops. This follows the | |||
| principles for next hops in RFC 8349"; | ||||
| choice next-hop-options { | choice next-hop-options { | |||
| mandatory true; | mandatory true; | |||
| description | description | |||
| "Options for next hops. | "Options for next hops. | |||
| It is expected that further cases will be added through | It is expected that further cases will be added through | |||
| augments from other modules, e.g., for recursive | augments from other modules, e.g., for recursive | |||
| next hops."; | next hops."; | |||
| case simple-next-hop { | case simple-next-hop { | |||
| description | description | |||
| "This case represents a simple next hop consisting of the | "This case represents a simple next hop consisting of the | |||
| next-hop address and/or outgoing interface. | next-hop address and/or outgoing interface."; | |||
| Modules for address families MUST augment this case with a | ||||
| leaf containing a next-hop address of that address | ||||
| family."; | ||||
| leaf outgoing-interface { | leaf outgoing-interface { | |||
| type if:interface-ref; | type if:interface-ref; | |||
| description | description | |||
| "This is the interface as an outgoing type."; | "The outgoing interface, when matching all flows to | |||
| the interface."; | ||||
| } | } | |||
| choice flow-type { | choice flow-type { | |||
| description | description | |||
| "These are the flow type next hop choices."; | "These are the flow type next hop choices."; | |||
| case ip { | case ip { | |||
| choice operation-type { | choice operation-type { | |||
| description | description | |||
| "This is the IP forwarding operation choices."; | "This is the IP forwarding operation choices."; | |||
| case ip-forwarding { | case ip-forwarding { | |||
| leaf next-hop-address { | leaf next-hop-address { | |||
| skipping to change at page 31, line 26 ¶ | skipping to change at page 26, line 4 ¶ | |||
| } | } | |||
| } | } | |||
| case mpls-over-ip-encapsulation { | case mpls-over-ip-encapsulation { | |||
| uses ip-header; | uses ip-header; | |||
| } | } | |||
| } | } | |||
| } | } | |||
| case mpls { | case mpls { | |||
| uses rt-types:mpls-label-stack; | uses rt-types:mpls-label-stack; | |||
| } | } | |||
| } | } | |||
| } | } | |||
| case next-hop-list { | case next-hop-list { | |||
| description | description | |||
| "Container for multiple next hops."; | "Container for multiple next hops."; | |||
| list next-hop { | list next-hop { | |||
| key "hop-index"; | key "hop-index"; | |||
| description | description | |||
| "An entry in a next-hop list. Modules for address | "An entry in a next-hop list."; | |||
| families MUST augment this list with a leaf containing a | ||||
| next-hop address of that address family."; | ||||
| leaf hop-index { | leaf hop-index { | |||
| type uint8; | type uint8; | |||
| description | description | |||
| "The value of the index for a hop."; | "The value of the index for a hop."; | |||
| } | } | |||
| leaf outgoing-interface { | leaf outgoing-interface { | |||
| type if:interface-ref; | type if:interface-ref; | |||
| description | description | |||
| "This is a whole interface as the next hop."; | "The outgoing interface, when matching all flows to | |||
| the interface."; | ||||
| } | } | |||
| choice flow-type { | choice flow-type { | |||
| description | description | |||
| "These are the flow type next hop choices."; | "These are the flow type next hop choices."; | |||
| case ip { | case ip { | |||
| choice operation-type { | choice operation-type { | |||
| description | description | |||
| "These are the next hop choices."; | "These are the next hop choices."; | |||
| case ip-forwarding { | case ip-forwarding { | |||
| leaf next-hop-address { | leaf next-hop-address { | |||
| skipping to change at page 32, line 26 ¶ | skipping to change at page 27, line 4 ¶ | |||
| } | } | |||
| } | } | |||
| case mpls { | case mpls { | |||
| uses rt-types:mpls-label-stack; | uses rt-types:mpls-label-stack; | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| container detnet { | container detnet { | |||
| description | description | |||
| "The top level DetNet container. This contains | "The top level DetNet container. This contains | |||
| applications, service sub-layers and forwarding sub-layers | applications, service sub-layers and forwarding sub-layers | |||
| as well as the traffic profiles."; | as well as the traffic profiles."; | |||
| list traffic-profile { | list traffic-profile { | |||
| key "profile-name"; | key "name"; | |||
| description | description | |||
| "A traffic profile."; | "A traffic profile."; | |||
| leaf profile-name { | leaf name { | |||
| type string; | type string; | |||
| description | description | |||
| "An Aggregation group ID. Zero means the service is not | "An Aggregation group ID."; | |||
| part of a group."; | ||||
| } | } | |||
| container traffic-requirements { | container traffic-requirements { | |||
| description | description | |||
| "This defines the attributes of the App-flow | "This defines the attributes of the App-flow | |||
| regarding bandwidth, latency, latency variation, loss, and | regarding bandwidth, latency, latency variation, loss, and | |||
| misordering tolerance."; | misordering tolerance."; | |||
| reference | reference | |||
| "draft-ietf-detnet-flow-information-model Section 4.2"; | "RFC 9016 Section 4.2"; | |||
| leaf min-bandwidth { | leaf min-bandwidth { | |||
| type uint64; | type uint64; | |||
| units "bps"; | units 'octets per second'; | |||
| description | description | |||
| "This is the minimum bandwidth that has to be | "This is the minimum bandwidth that has to be | |||
| guaranteed for the DetNet service. MinBandwidth is | guaranteed for the DetNet service. MinBandwidth is | |||
| specified in octets per second."; | specified in octets per second."; | |||
| reference | ||||
| "RFC 9016 Section 4.2"; | ||||
| } | } | |||
| leaf max-latency { | leaf max-latency { | |||
| type uint32; | type uint32; | |||
| units "nanoseconds"; | units "nanoseconds"; | |||
| description | description | |||
| "This is the maximum latency from Ingress to | "This is the maximum latency from Ingress to | |||
| Egress(es) for a single packet of the DetNet flow. | Egress(es) for a single packet of the DetNet flow. | |||
| MaxLatency is specified as an integer number of | MaxLatency is specified as an integer number of | |||
| nanoseconds."; | nanoseconds. Any value above the MAX 4,294,967,295 | |||
| is displayed as MAX"; | ||||
| reference | ||||
| "RFC 9016 Section 4.2"; | ||||
| } | } | |||
| leaf max-latency-variation { | leaf max-latency-variation { | |||
| type uint32; | type uint32; | |||
| units "nanoseconds"; | units "nanoseconds"; | |||
| description | description | |||
| "This is the difference between the | "This is the difference between the | |||
| minimum and the maximum end-to-end one-way latency. | minimum and the maximum end-to-end one-way latency. | |||
| MaxLatencyVariation is specified as an integer number of | MaxLatencyVariation is specified as an integer number of | |||
| nanoseconds."; | nanoseconds."; | |||
| reference | ||||
| "RFC 9016 Section 4.2"; | ||||
| } | } | |||
| leaf max-loss { | leaf max-loss { | |||
| type uint32; | type uint32; | |||
| description | description | |||
| "This defines the maximum Packet Loss Ratio (PLR) | "This defines the maximum Packet Loss Ratio (PLR) | |||
| parameter for the DetNet service between the Ingress and | parameter for the DetNet service between the Ingress and | |||
| Egress(es) of the DetNet domain."; | Egress(es) of the DetNet domain."; | |||
| reference | ||||
| "RFC 9016 Section 4.2"; | ||||
| } | } | |||
| leaf max-consecutive-loss-tolerance { | leaf max-consecutive-loss-tolerance { | |||
| type uint32; | type uint32; | |||
| units "packets"; | units "packets"; | |||
| description | description | |||
| "Some applications have special loss requirement, such | "Some applications have special loss requirement, such | |||
| as MaxConsecutiveLossTolerance. The maximum consecutive | as MaxConsecutiveLossTolerance. The maximum consecutive | |||
| loss tolerance parameter describes the maximum number of | loss tolerance parameter describes the maximum number of | |||
| consecutive packets whose loss can be tolerated. The | consecutive packets whose loss can be tolerated. The | |||
| maximum consecutive loss tolerance can be measured for | maximum consecutive loss tolerance can be measured for | |||
| example based on sequence number."; | example based on sequence number."; | |||
| reference | ||||
| "RFC 9016 Section 4.2"; | ||||
| } | } | |||
| leaf max-misordering { | leaf max-misordering { | |||
| type uint32; | type uint32; | |||
| units "packets"; | units "packets"; | |||
| description | description | |||
| "This describes the tolerable maximum number | "This describes the tolerable maximum number | |||
| of packets that can be received out of order. The | of packets that can be received out of order. The | |||
| maximum allowed misordering can be measured for example | maximum allowed misordering can be measured for example | |||
| based on sequence number. The value zero for the | based on sequence number. The value zero for the | |||
| maximum allowed misordering indicates that in order | maximum allowed misordering indicates that in order | |||
| delivery is required, misordering cannot be tolerated."; | delivery is required, misordering cannot be tolerated."; | |||
| reference | ||||
| "RFC 9016 Section 4.2"; | ||||
| } | } | |||
| } | } | |||
| container flow-spec { | container traffic-spec { | |||
| description | description | |||
| "Flow-specification specifies how the Source transmits | "Flow-specification specifies how the Source transmits | |||
| packets for the flow. This is the promise/request of the | packets for the flow. This is the promise/request of the | |||
| Source to the network. The network uses this flow | Source to the network. The network uses this flow | |||
| specification to allocate resources and adjust queue | specification to allocate resources and adjust queue | |||
| parameters in network nodes."; | parameters in network nodes."; | |||
| reference | reference | |||
| "draft-ietf-detnet-flow-information-model Section 5.5"; | "RFC 9016 Section 5.5"; | |||
| leaf interval { | leaf interval { | |||
| type uint32; | type uint32; | |||
| units "nanoseconds"; | units "nanoseconds"; | |||
| description | description | |||
| "The period of time in which the traffic | "The period of time in which the traffic | |||
| specification cannot be exceeded."; | specification should not be exceeded."; | |||
| reference | ||||
| "RFC 9016 Section 5.5, IEEE802.1Q"; | ||||
| } | } | |||
| leaf max-pkts-per-interval { | leaf max-pkts-per-interval { | |||
| type uint32; | type uint32; | |||
| description | description | |||
| "The maximum number of packets that the | "The maximum number of packets that the | |||
| source will transmit in one interval."; | source will transmit in one interval."; | |||
| reference | ||||
| "RFC 9016 Section 5.5, IEEE802.1Q"; | ||||
| } | } | |||
| leaf max-payload-size { | leaf max-payload-size { | |||
| type uint32; | type uint32; | |||
| description | description | |||
| "The maximum payload size that the source | "The maximum payload size that the source | |||
| will transmit."; | will transmit."; | |||
| reference | ||||
| "RFC 9016 Section 5.5, IEEE802.1Q"; | ||||
| } | } | |||
| leaf min-payload-size { | leaf min-payload-size { | |||
| type uint32; | type uint32; | |||
| description | description | |||
| "The minimum payload size that the source | "The minimum payload size that the source | |||
| will transmit."; | will transmit., IEEE802.1Q"; | |||
| } | } | |||
| leaf min-pkts-per-interval { | leaf min-pkts-per-interval { | |||
| type uint32; | type uint32; | |||
| description | description | |||
| "The minimum number of packets that the | "The minimum number of packets that the | |||
| source will transmit in one interval."; | source will transmit in one interval."; | |||
| reference | ||||
| "RFC 9016 Section 5.5, IEEE802.1Q"; | ||||
| } | } | |||
| } | } | |||
| leaf-list member-apps { | leaf-list member-apps { | |||
| type app-flow-ref; | type app-flow-ref; | |||
| config false; | config false; | |||
| description | description | |||
| "Applications attached to this profile."; | "A list of Applications attached to this profile. Each | |||
| application that uses a profile has an automatically | ||||
| populated reference."; | ||||
| reference | ||||
| "RFC XXXX: Deterministic Networking (DetNet) YANG Model | ||||
| Section 5"; | ||||
| } | } | |||
| leaf-list member-services { | leaf-list member-services { | |||
| type service-sub-layer-ref; | type service-sub-layer-ref; | |||
| config false; | config false; | |||
| description | description | |||
| "Services attached to this profile."; | "A list of Service Sub-layers attached to this profile. | |||
| Each Service Sub-layers that uses a profile has an | ||||
| automatically populated reference."; | ||||
| reference | ||||
| "RFC XXXX: Deterministic Networking (DetNet) YANG Model | ||||
| Section 5"; | ||||
| } | } | |||
| leaf-list member-fwd-sublayers { | leaf-list member-fwd-sublayers { | |||
| type forwarding-sub-layer-ref; | type forwarding-sub-layer-ref; | |||
| config false; | config false; | |||
| description | description | |||
| "Forwarding sub-layer attached to this profile."; | "A list of Forwarding Sub-layers attached to this profile. | |||
| Each Forwarding Sub-layers that uses a profile has an | ||||
| automatically populated reference."; | ||||
| reference | ||||
| "RFC XXXX: Deterministic Networking (DetNet) YANG Model | ||||
| Section 5"; | ||||
| } | } | |||
| } | } | |||
| container app-flows { | container app-flows { | |||
| description | description | |||
| "The DetNet app-flow configuration."; | "The DetNet app-flow configuration."; | |||
| reference | reference | |||
| "draft-ietf-detnet-flow-information-model Section 4.1"; | "RFC 9016 Section 4.1"; | |||
| list app-flow { | list app-flow { | |||
| key "name"; | key "name"; | |||
| description | description | |||
| "A unique (management) identifier of the App-flow."; | "A unique (management) identifier of the App-flow."; | |||
| leaf name { | leaf name { | |||
| type string; | type string; | |||
| description | description | |||
| "A unique (management) identifier of the App-flow."; | "A unique (management) identifier of the App-flow."; | |||
| reference | reference | |||
| "draft-ietf-detnet-flow-information-model | "RFC 9016 | |||
| Sections 4.1, 5.1"; | Sections 4.1, 5.1"; | |||
| } | } | |||
| leaf app-flow-bidir-congruent { | leaf bidir-congruent { | |||
| type boolean; | type boolean; | |||
| default false; | default false; | |||
| description | description | |||
| "Defines the data path requirement of the App-flow | "Defines the data path requirement of the App-flow | |||
| whether it must share the same data path and physical | whether it must share the same data path and physical | |||
| path for both directions through the network, e.g., to | path for both directions through the network, e.g., to | |||
| provide congruent paths in the two directions."; | provide congruent paths in the two directions."; | |||
| reference | reference | |||
| "draft-ietf-detnet-flow-information-model | "RFC 9016 | |||
| Section 4.2"; | Section 4.2"; | |||
| } | } | |||
| leaf outgoing-service { | leaf outgoing-service { | |||
| type service-sub-layer-ref; | type service-sub-layer-ref; | |||
| config false; | config false; | |||
| description | description | |||
| "Binding to this applications outgoing | "Binding to this applications outgoing | |||
| service."; | service."; | |||
| } | } | |||
| leaf incoming-service { | leaf incoming-service { | |||
| skipping to change at page 36, line 23 ¶ | skipping to change at page 31, line 35 ¶ | |||
| "Binding to this applications incoming service."; | "Binding to this applications incoming service."; | |||
| } | } | |||
| leaf traffic-profile { | leaf traffic-profile { | |||
| type traffic-profile-ref; | type traffic-profile-ref; | |||
| description | description | |||
| "The Traffic Profile for this group."; | "The Traffic Profile for this group."; | |||
| } | } | |||
| container ingress { | container ingress { | |||
| description | description | |||
| "Ingress DetNet application flows or a compound flow."; | "Ingress DetNet application flows or a compound flow."; | |||
| leaf name { | ||||
| type string; | ||||
| description | ||||
| "Ingress DetNet application."; | ||||
| } | ||||
| leaf app-flow-status { | leaf app-flow-status { | |||
| type identityref { | type identityref { | |||
| base app-status; | base app-status; | |||
| } | } | |||
| default none; | ||||
| config false; | config false; | |||
| description | description | |||
| "Status of ingress application flow."; | "Status of ingress application flow. This is an | |||
| operational status and defaults to none if | ||||
| incomplete."; | ||||
| reference | reference | |||
| "draft-ietf-detnet-flow-information-model Sections | "RFC 9016 Sections | |||
| 4.1, 5.8"; | 4.1, 5.8"; | |||
| } | } | |||
| leaf interface { | leaf interface { | |||
| type if:interface-ref; | type if:interface-ref; | |||
| mandatory true; | ||||
| description | description | |||
| "Interface is used for any service type where a whole | "Interface is used for any service type when | |||
| interface is mapped to the applications. It may be | matching all flows to the interface."; | |||
| further filtered by type."; | ||||
| } | } | |||
| uses data-flow-spec; | uses data-flow-spec; | |||
| } //End of app-ingress | } //End of app-ingress | |||
| container egress { | container egress { | |||
| description | description | |||
| "Route's next-hop attribute."; | "Route's next-hop attribute."; | |||
| leaf name { | ||||
| type string; | ||||
| description | ||||
| "Egress DetNet application."; | ||||
| } | ||||
| choice application-type { | choice application-type { | |||
| description | description | |||
| "This is the application type choices."; | "This is the application type choices."; | |||
| container ethernet { | container ethernet { | |||
| description | description | |||
| "This is TSN unaware traffic that maps to an | "This is TSN unaware traffic that maps to an | |||
| interface."; | interface."; | |||
| leaf interface { | leaf interface { | |||
| type if:interface-ref; | type if:interface-ref; | |||
| description | description | |||
| skipping to change at page 37, line 30 ¶ | skipping to change at page 32, line 35 ¶ | |||
| } | } | |||
| container ip-mpls { | container ip-mpls { | |||
| description | description | |||
| "This is IP or MPLS DetNet application types."; | "This is IP or MPLS DetNet application types."; | |||
| uses detnet-app-next-hop-content; | uses detnet-app-next-hop-content; | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| container service-sub-layer { | container service { | |||
| description | description | |||
| "The DetNet service sub-layer configuration."; | "The DetNet service sub-layer configuration."; | |||
| list service-sub-layer-list { | list sub-layer { | |||
| key "name"; | key "name"; | |||
| description | description | |||
| "Services are indexed by name."; | "Services are indexed by name."; | |||
| leaf name { | leaf name { | |||
| type string; | type string; | |||
| description | description | |||
| "The name of the DetNet service sub-layer."; | "The name of the DetNet service sub-layer."; | |||
| } | } | |||
| leaf service-rank { | leaf service-rank { | |||
| type uint8; | type uint8; | |||
| default 255; | ||||
| description | description | |||
| "The DetNet rank for this service."; | "The DetNet rank for this service. Defaults to 255 | |||
| lowest rank if not specified."; | ||||
| reference | reference | |||
| "draft-ietf-detnet-flow-information-model Section 5.7."; | "RFC 9016 Section 5.7."; | |||
| } | } | |||
| leaf traffic-profile { | leaf traffic-profile { | |||
| type traffic-profile-ref; | type traffic-profile-ref; | |||
| description | description | |||
| "The Traffic Profile for this service."; | "The Traffic Profile for this service."; | |||
| } | } | |||
| container service-protection { | container service-protection { | |||
| description | description | |||
| "This is the service protection type an sequence number | "This is the service protection type and sequence number | |||
| options."; | options."; | |||
| leaf service-protection-type { | leaf protection { | |||
| type service-protection-type; | type service-protection; | |||
| description | description | |||
| "The DetNet service protection type such as PRF, PEF, | "The DetNet service protection type such as | |||
| PEOF,PERF, and PEORF."; | Packet Replication Function (PRF), | |||
| Packet Elimination Function (PEF), | ||||
| Packet Replication, Elimination, and Ordering Functions | ||||
| (PREOF)."; | ||||
| reference | reference | |||
| "draft-ietf-detnet-data-plane-framework Section 4.3"; | "RFC 8938 Section 4.3"; | |||
| } | } | |||
| leaf sequence-number-length { | leaf sequence-number-length { | |||
| type sequence-number-field; | type sequence-number-field; | |||
| default zero-sn; | ||||
| description | description | |||
| "Sequence number field length can be one of 0 (none), | "Sequence number field length can be one of 0 (none), | |||
| 16-bits or 28-bits."; | 16-bits or 28-bits. The default is none."; | |||
| } | } | |||
| } | } | |||
| leaf service-operation-type { | leaf operation { | |||
| type service-operation-type; | type operation; | |||
| description | description | |||
| "This is the service operation type for this service | "This is the service operation type for this service | |||
| sub-layer;"; | sub-layer;"; | |||
| } | } | |||
| container incoming-type { | container incoming { | |||
| description | description | |||
| "The DetNet service sub-layer incoming configuration."; | "The DetNet service sub-layer incoming configuration."; | |||
| choice incoming-type { | choice incoming { | |||
| mandatory true; | mandatory true; | |||
| description | description | |||
| "A service sub-layer may have App flows or other | "A service sub-layer may have App flows or other | |||
| service sub-layers."; | service sub-layers."; | |||
| container app-flow { | container app-flow { | |||
| description | description | |||
| "This service sub-layer is related to the app-flows | "This service sub-layer is related to the app-flows | |||
| of the upper layer and provide ingress proxy or | of the upper layer and provide ingress proxy or | |||
| ingress aggregation at the ingress node."; | ingress aggregation at the ingress node."; | |||
| uses app-flows-group; | uses app-flows-group; | |||
| skipping to change at page 39, line 4 ¶ | skipping to change at page 34, line 15 ¶ | |||
| of the upper layer and provide ingress proxy or | of the upper layer and provide ingress proxy or | |||
| ingress aggregation at the ingress node."; | ingress aggregation at the ingress node."; | |||
| uses app-flows-group; | uses app-flows-group; | |||
| } | } | |||
| container service-aggregation { | container service-aggregation { | |||
| description | description | |||
| "This service sub-layer is related to the service | "This service sub-layer is related to the service | |||
| sub-layer of the upper layer and provide | sub-layer of the upper layer and provide | |||
| service-to-service aggregation at the ingress node | service-to-service aggregation at the ingress node | |||
| or relay node."; | or relay node."; | |||
| uses service-sub-layer-group; | uses service-sub-layer-group; | |||
| } | } | |||
| container forwarding-aggregation { | container forwarding-aggregation { | |||
| description | description | |||
| "This service sub-layer is related to the forwarding | "This service sub-layer is related to the forwarding | |||
| sub-layer of the upper layer and provide | sub-layer of the upper layer and provide | |||
| forwarding-to-service aggregation at the ingress | forwarding-to-service aggregation at the ingress | |||
| node or relay node."; | node or relay node."; | |||
| uses forwarding-sub-layer-group; | uses forwarding-sub-layer-group; | |||
| } | } | |||
| container service-id { | container service-id { | |||
| description | description | |||
| "This service sub-layer is related to the service or | "This service sub-layer is related to the service or | |||
| forwarding sub-layer of the lower layer and provide | forwarding sub-layer of the lower layer and provide | |||
| DetNet service relay or termination at the relay | DetNet service relay or termination at the relay | |||
| node or egress node."; | node or egress node."; | |||
| uses detnet-flow-spec; | uses detnet-flow-spec; | |||
| } | } | |||
| } | } | |||
| } | } | |||
| container outgoing-type { | container outgoing { | |||
| description | description | |||
| "The DetNet service sub-layer outgoing configuration."; | "The DetNet service sub-layer outgoing configuration."; | |||
| choice outgoing-type { | choice outgoing { | |||
| mandatory true; | mandatory true; | |||
| description | description | |||
| "The out-going type may be a forwarding Sub-layer or a | "The outgoing type may be a forwarding Sub-layer or a | |||
| service sub-layer or ? types need to be named."; | service sub-layer or aggregation type."; | |||
| container forwarding-sub-layer { | container forwarding-sub-layer { | |||
| description | description | |||
| "This service sub-layer is sent to the forwarding | "This service sub-layer is sent to the forwarding | |||
| sub-layers of the lower layer for DetNet service | sub-layers of the lower layer for DetNet service | |||
| forwarding or service-to-forwarding aggregation at | forwarding or service-to-forwarding aggregation at | |||
| the ingress node or relay node. When the operation | the ingress node or relay node. When the operation | |||
| type is service-initiation, The service sub-layer | type is service-initiation, The service sub-layer | |||
| encapsulates the DetNet Control-Word and services | encapsulates the DetNet Control-Word and services | |||
| label, which are for individual DetNet flow when the | label, which are for individual DetNet flow when the | |||
| incoming type is app-flow and for aggregated DetNet | incoming type is app-flow and for aggregated DetNet | |||
| flow when the incoming type is service or | flow when the incoming type is service or | |||
| forwarding. The service sub-layer swaps the service | forwarding. The service sub-layer swaps the service | |||
| label when the operation type is service-relay."; | label when the operation type is service-relay."; | |||
| list service-outgoing-list { | reference | |||
| key "service-outgoing-index"; | "RFC 8964 Section 4.2.1 and 4.2.2."; | |||
| list service-outgoing { | ||||
| key "index"; | ||||
| description | description | |||
| "List of the outgoing service | "List of the outgoing service | |||
| that separately for each node | that separately for each node | |||
| where services will be eliminated."; | where services will be eliminated."; | |||
| leaf service-outgoing-index { | leaf index { | |||
| type uint8; | type uint8; | |||
| description | description | |||
| "This index allows a list of multiple outgoing | "This index allows a list of multiple outgoing | |||
| forwarding sub-layers"; | forwarding sub-layers"; | |||
| } | } | |||
| uses detnet-header; | uses detnet-header; | |||
| uses forwarding-sub-layer-group; | uses forwarding-sub-layer-group; | |||
| } | } | |||
| } | } | |||
| container service-sub-layer { | container service-sub-layer { | |||
| description | description | |||
| "This service sub-layer is sent to the service | "This service sub-layer is sent to the service | |||
| sub-layers of the lower layer for service-to-service | sub-layers of the lower layer for service-to-service | |||
| aggregation at the ingress node or relay node. The | aggregation at the ingress node or relay node. The | |||
| service sub-layer encapsulates the DetNet | service sub-layer encapsulates the DetNet | |||
| Control-Word and S-label when the operation type is | Control-Word and S-label when the operation type is | |||
| service-initiation, and swaps the S-label when the | service-initiation, and swaps the S-label when the | |||
| operation type is service-relay."; | operation type is service-relay."; | |||
| leaf aggregation-service-sub-layer { | reference | |||
| "RFC 8964 Section 4.2.1 and 4.2.2."; | ||||
| leaf aggregation-sub-layer { | ||||
| type service-sub-layer-ref; | type service-sub-layer-ref; | |||
| description | description | |||
| "reference point of the service-sub-layer | "reference point of the service-sub-layer | |||
| at which this service will be aggregated."; | at which this service will be aggregated."; | |||
| } | } | |||
| container service-label { | container service-label { | |||
| description | description | |||
| "This is the MPLS service sub-layer label."; | "This is the MPLS service sub-layer label. This | |||
| is optional and only used when the service | ||||
| sublayer uses MPLS. It is an MPLS stack since | ||||
| more than a single label may be used."; | ||||
| uses rt-types:mpls-label-stack; | uses rt-types:mpls-label-stack; | |||
| } | } | |||
| } | } | |||
| container app-flow { | container app-flow { | |||
| description | description | |||
| "This service sub-layer is sent to the app-flow of | "This service sub-layer is sent to the app-flow of | |||
| the upper layer for egress proxy at the egress node, | the upper layer for egress proxy at the egress node, | |||
| and decapsulates the DetNet Control-Word and S-label | and decapsulates the DetNet Control-Word and S-label | |||
| for individual DetNet service. This outgoing type | for individual DetNet service. This outgoing type | |||
| only can be chosen when the operation type is | only can be chosen when the operation type is | |||
| service-termination."; | service-termination."; | |||
| reference | ||||
| "RFC 8964 Section 4.2.1 and 4.2.2."; | ||||
| uses app-flows-group; | uses app-flows-group; | |||
| } | } | |||
| container service-disaggregation { | container service-disaggregation { | |||
| description | description | |||
| "This service sub-layer is sent to the service | "This service sub-layer is sent to the service | |||
| sub-layer of the upper layer for service-to-service | sub-layer of the upper layer for service-to-service | |||
| disaggregation at the relay node or egress node, and | disaggregation at the relay node or egress node, and | |||
| decapsulates the DetNet Control-Word and A-label for | decapsulates the DetNet Control-Word and A-label for | |||
| aggregated DetNet service. This outgoing type only | aggregated DetNet service. This outgoing type only | |||
| can be chosen when the operation type is | can be chosen when the operation type is | |||
| service-termination."; | service-termination."; | |||
| reference | ||||
| "RFC 8964 Section 4.2.1 and 4.2.2."; | ||||
| uses service-sub-layer-group; | uses service-sub-layer-group; | |||
| } | } | |||
| container forwarding-disaggregation { | container forwarding-disaggregation { | |||
| description | description | |||
| "This service sub-layer is sent to the forwarding | "This service sub-layer is sent to the forwarding | |||
| sub-layer of the upper layer for | sub-layer of the upper layer for | |||
| forwarding-to-service disaggregation at the relay | forwarding-to-service disaggregation at the relay | |||
| node or egress node, and decapsulates the DetNet | node or egress node, and decapsulates the DetNet | |||
| Control-Word and A-label for aggregated DetNet | Control-Word and A-label for aggregated DetNet | |||
| service. This outgoing type only can be chosen when | service. This outgoing type only can be chosen when | |||
| the operation type is service-termination."; | the operation type is service-termination."; | |||
| reference | ||||
| "RFC 8964 Section 4.2.1 and 4.2.2."; | ||||
| uses forwarding-sub-layer-group; | uses forwarding-sub-layer-group; | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| container forwarding-sub-layer { | container forwarding { | |||
| description | description | |||
| "The DetNet forwarding sub-layer configuration."; | "The DetNet forwarding sub-layer configuration."; | |||
| list forwarding-sub-layer-list { | list sub-layer { | |||
| key "name"; | key "name"; | |||
| description | description | |||
| "The List is one or more DetNet Traffic types."; | "The List is one or more DetNet Traffic types."; | |||
| leaf name { | leaf name { | |||
| type string; | type string; | |||
| description | description | |||
| "The name of the DetNet forwarding sub-layer."; | "The name of the DetNet forwarding sub-layer."; | |||
| } | } | |||
| leaf traffic-profile { | leaf traffic-profile { | |||
| type traffic-profile-ref; | type traffic-profile-ref; | |||
| description | description | |||
| "The Traffic Profile for this group."; | "The Traffic Profile for this group."; | |||
| } | } | |||
| leaf forwarding-operation-type { | leaf operation { | |||
| type forwarding-operations-type; | type forwarding-operations; | |||
| description | description | |||
| "This is the forwarding operation types | "This is the forwarding operation types | |||
| impose-and-forward, pop-and-forward, | impose-and-forward, pop-and-forward, | |||
| pop-impose-and-forward, forward, pop-and-lookup."; | pop-impose-and-forward, forward, pop-and-lookup."; | |||
| } | } | |||
| container incoming-type { | container incoming { | |||
| description | description | |||
| "The DetNet forwarding sub-layer incoming | "The DetNet forwarding sub-layer incoming | |||
| configuration."; | configuration."; | |||
| choice incoming-type { | choice incoming { | |||
| mandatory true; | mandatory true; | |||
| description | description | |||
| "Cases of incoming types."; | "Cases of incoming types."; | |||
| container service-sub-layer { | container service-sub-layer { | |||
| description | description | |||
| "This forwarding sub-layer is related to the service | "This forwarding sub-layer is related to the service | |||
| sub-layers of the upper layer and provide DetNet | sub-layers of the upper layer and provide DetNet | |||
| forwarding or service-to-forwarding aggregation at | forwarding or service-to-forwarding aggregation at | |||
| the ingress node or relay node."; | the ingress node or relay node."; | |||
| uses service-sub-layer-group; | uses service-sub-layer-group; | |||
| skipping to change at page 42, line 28 ¶ | skipping to change at page 38, line 4 ¶ | |||
| forwarding-to-forwarding aggregation at the ingress | forwarding-to-forwarding aggregation at the ingress | |||
| node or relay node or transit node."; | node or relay node or transit node."; | |||
| uses forwarding-sub-layer-group; | uses forwarding-sub-layer-group; | |||
| } | } | |||
| container forwarding-id { | container forwarding-id { | |||
| description | description | |||
| "This forwarding sub-layer is related to all of the | "This forwarding sub-layer is related to all of the | |||
| lower layer and provide DetNet forwarding swap or | lower layer and provide DetNet forwarding swap or | |||
| termination at the transit node or relay node or | termination at the transit node or relay node or | |||
| egress node."; | egress node."; | |||
| leaf interface { | leaf interface { | |||
| type if:interface-ref; | type if:interface-ref; | |||
| description | description | |||
| "This is the interface associated with the | "This is the interface associated with the | |||
| forwarding sub-layer."; | forwarding sub-layer."; | |||
| } | } | |||
| uses detnet-flow-spec; | uses detnet-flow-spec; | |||
| } | } | |||
| } | } | |||
| } | } | |||
| container outgoing-type { | container outgoing { | |||
| description | description | |||
| "The DetNet forwarding sub-layer outbound | "The DetNet forwarding sub-layer outbound | |||
| configuration."; | configuration."; | |||
| choice outgoing-type { | choice outgoing { | |||
| mandatory true; | mandatory true; | |||
| description | description | |||
| "This is when a service connected directly to an | "This is when a service connected directly to an | |||
| interface with no forwarding sub-layer."; | interface with no forwarding sub-layer."; | |||
| container | container | |||
| interface { | interface { | |||
| description | description | |||
| "This forwarding sub-layer is sent to the interface | "This forwarding sub-layer is sent to the interface | |||
| for send to next-hop at the ingress node or relay | for send to next-hop at the ingress node or relay | |||
| node or transit node."; | node or transit node."; | |||
| uses detnet-forwarding-next-hop-content; | uses detnet-forwarding-next-hop-content; | |||
| } | } | |||
| container service-aggregation { | container service-aggregation { | |||
| description | description | |||
| "This forwarding sub-layer is sent to the service | "This forwarding sub-layer is sent to the service | |||
| sub-layers of the lower layer for | sub-layers of the lower layer for | |||
| forwarding-to-service aggregation at the ingress | forwarding-to-service aggregation at the ingress | |||
| node or relay node."; | node or relay node."; | |||
| leaf aggregation-service-sub-layer { | leaf aggregation-sub-layer { | |||
| type service-sub-layer-ref; | type service-sub-layer-ref; | |||
| description | description | |||
| "This is reference to the service sub-layer."; | "This is a reference to the service sub-layer."; | |||
| } | } | |||
| container optional-forwarding-label { | container optional-forwarding-label { | |||
| description | description | |||
| "This is the optional forwarding label for service | "This is the optional forwarding label for service | |||
| aggregation."; | aggregation."; | |||
| uses rt-types:mpls-label-stack; | uses rt-types:mpls-label-stack; | |||
| } | } | |||
| } | } | |||
| container forwarding-sub-layer { | container forwarding-sub-layer { | |||
| description | description | |||
| "This forwarding sub-layer is sent to the forwarding | "This forwarding sub-layer is sent to the forwarding | |||
| sub-layers of the lower layer for | sub-layers of the lower layer for | |||
| forwarding-to-forwarding aggregation at the ingress | forwarding-to-forwarding aggregation at the ingress | |||
| node or relay node or transit node."; | node or relay node or transit node."; | |||
| leaf aggregation-forwarding-sub-layer { | leaf aggregation-sub-layer { | |||
| type forwarding-sub-layer-ref; | type forwarding-sub-layer-ref; | |||
| description | description | |||
| "This is reference to the forwarding sub-layer."; | "This is a reference to the forwarding sub-layer."; | |||
| } | } | |||
| container forwarding-label { | container forwarding-label { | |||
| description | description | |||
| "This is the forwarding label for forwarding | "This is the forwarding label for forwarding | |||
| sub-layer aggregation."; | sub-layer aggregation."; | |||
| uses rt-types:mpls-label-stack; | uses rt-types:mpls-label-stack; | |||
| } | } | |||
| } | } | |||
| container service-sub-layer { | container service-sub-layer { | |||
| description | description | |||
| skipping to change at page 44, line 4 ¶ | skipping to change at page 39, line 28 ¶ | |||
| } | } | |||
| container service-sub-layer { | container service-sub-layer { | |||
| description | description | |||
| "This forwarding sub-layer is sent to the service | "This forwarding sub-layer is sent to the service | |||
| sub-layer of the upper layer and decapsulate the | sub-layer of the upper layer and decapsulate the | |||
| F-label for DetNet service or service-to-forwarding | F-label for DetNet service or service-to-forwarding | |||
| disaggregation at the relay node or egress node. | disaggregation at the relay node or egress node. | |||
| This outgoing type only can be chosen when the | This outgoing type only can be chosen when the | |||
| operation type is pop-and-lookup."; | operation type is pop-and-lookup."; | |||
| uses service-sub-layer-group; | uses service-sub-layer-group; | |||
| } | } | |||
| container forwarding-disaggregation { | container forwarding-disaggregation { | |||
| description | description | |||
| "This forwarding sub-layer is sent to the forwarding | "This forwarding sub-layer is sent to the forwarding | |||
| sub-layer of the upper layer and decapsulate the | sub-layer of the upper layer and decapsulate the | |||
| F-label for forwarding-to-forwarding disaggregation | F-label for forwarding-to-forwarding disaggregation | |||
| at the transit node or relay node or egress node. | at the transit node or relay node or egress node. | |||
| This outgoing type only can be chosen when the | This outgoing type only can be chosen when the | |||
| operation type is pop-and-lookup."; | operation type is pop-and-lookup."; | |||
| uses forwarding-sub-layer-group; | uses forwarding-sub-layer-group; | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| <CODE ENDS> | <CODE ENDS> | |||
| 8. IANA Considerations | 10. IANA Considerations | |||
| This document makes no request of IANA. | This document registers a URI in the "IETF XML Registry" [RFC3688]. | |||
| Following the format in [RFC3688], the following registration is | ||||
| requested to be made: | ||||
| Note to RFC Editor: this section may be removed on publication as an | ID: yang:ietf-detnet | |||
| RFC. | URI: urn:ietf:params:xml:ns:yang:ietf-detnet | |||
| Registrant Contact: The IESG. | ||||
| XML: N/A, the requested URI is an XML namespace. | ||||
| 9. Security Considerations | This document registers YANG modules in the "YANG Module Names" | |||
| registry [RFC6020]. | ||||
| <TBD> | Name: ietf-detnet | |||
| Maintained by IANA: N | ||||
| Namespace: urn:ietf:params:xml:ns:yang:ietf-detnet | ||||
| Prefix: dnet | ||||
| Reference: This RFC when published. | ||||
| 10. Acknowledgements | 10. Security Considerations | |||
| 11. References | Security considerations for DetNet are covered in the DetNet | |||
| Archtiecture [RFC8655]. | ||||
| 11.1. Normative References | The YANG modules specified in this document define a schema for data | |||
| that is designed to be accessed via network management protocols, | ||||
| such as NETCONF [RFC6241] or RESTCONF [RFC8040]. The lowest NETCONF | ||||
| layer is the secure transport layer, and the mandatory-to-implement | ||||
| secure transport is Secure Shell (SSH) [RFC6242]. The lowest | ||||
| RESTCONF layer is HTTPS, and the mandatory-to-implement secure | ||||
| transport is TLS [RFC8446]. | ||||
| The Network Configuration Access Control Model (NACM) [RFC8341] | ||||
| provides the means to restrict access for particular NETCONF or | ||||
| RESTCONF users to a preconfigured subset of all available NETCONF or | ||||
| RESTCONF protocol operations and content. | ||||
| There are a number of data nodes defined in the modules that are | ||||
| writable/creatable/deletable (i.e., config true, which is the | ||||
| default). These data nodes may be considered sensitive or vulnerable | ||||
| in some network environments. Write operations (e.g., edit-config) | ||||
| to these data nodes without proper protection can break or | ||||
| incorrectly connect DetNet flows. | ||||
| 11. Contributors | ||||
| The editors of this document wish to thank and acknowledge the | ||||
| following people who contributed substantially to the content of this | ||||
| document and should be considered coauthors: | ||||
| Mach(Guoyi) Chen | ||||
| Huawei Technologies | ||||
| Email: mach.chen@huawei.com | ||||
| 12. Acknowledgments | ||||
| The editors of this document would like to thank Lou Berger, Tom | ||||
| Petch and Xufeng Lui for their detailed comments. | ||||
| 13. References | ||||
| 13.1. Normative References | ||||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
| Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
| DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
| <https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
| [RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688, | ||||
| DOI 10.17487/RFC3688, January 2004, | ||||
| <https://www.rfc-editor.org/info/rfc3688>. | ||||
| [RFC4303] Kent, S., "IP Encapsulating Security Payload (ESP)", | ||||
| RFC 4303, DOI 10.17487/RFC4303, December 2005, | ||||
| <https://www.rfc-editor.org/info/rfc4303>. | ||||
| [RFC6020] Bjorklund, M., Ed., "YANG - A Data Modeling Language for | ||||
| the Network Configuration Protocol (NETCONF)", RFC 6020, | ||||
| DOI 10.17487/RFC6020, October 2010, | ||||
| <https://www.rfc-editor.org/info/rfc6020>. | ||||
| [RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., | ||||
| and A. Bierman, Ed., "Network Configuration Protocol | ||||
| (NETCONF)", RFC 6241, DOI 10.17487/RFC6241, June 2011, | ||||
| <https://www.rfc-editor.org/info/rfc6241>. | ||||
| [RFC6242] Wasserman, M., "Using the NETCONF Protocol over Secure | ||||
| Shell (SSH)", RFC 6242, DOI 10.17487/RFC6242, June 2011, | ||||
| <https://www.rfc-editor.org/info/rfc6242>. | ||||
| [RFC6991] Schoenwaelder, J., Ed., "Common YANG Data Types", | [RFC6991] Schoenwaelder, J., Ed., "Common YANG Data Types", | |||
| RFC 6991, DOI 10.17487/RFC6991, July 2013, | RFC 6991, DOI 10.17487/RFC6991, July 2013, | |||
| <https://www.rfc-editor.org/info/rfc6991>. | <https://www.rfc-editor.org/info/rfc6991>. | |||
| [RFC7950] Bjorklund, M., Ed., "The YANG 1.1 Data Modeling Language", | [RFC7950] Bjorklund, M., Ed., "The YANG 1.1 Data Modeling Language", | |||
| RFC 7950, DOI 10.17487/RFC7950, August 2016, | RFC 7950, DOI 10.17487/RFC7950, August 2016, | |||
| <https://www.rfc-editor.org/info/rfc7950>. | <https://www.rfc-editor.org/info/rfc7950>. | |||
| [RFC8040] Bierman, A., Bjorklund, M., and K. Watsen, "RESTCONF | ||||
| Protocol", RFC 8040, DOI 10.17487/RFC8040, January 2017, | ||||
| <https://www.rfc-editor.org/info/rfc8040>. | ||||
| [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | ||||
| 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | ||||
| May 2017, <https://www.rfc-editor.org/info/rfc8174>. | ||||
| [RFC8341] Bierman, A. and M. Bjorklund, "Network Configuration | ||||
| Access Control Model", STD 91, RFC 8341, | ||||
| DOI 10.17487/RFC8341, March 2018, | ||||
| <https://www.rfc-editor.org/info/rfc8341>. | ||||
| [RFC8349] Lhotka, L., Lindem, A., and Y. Qu, "A YANG Data Model for | ||||
| Routing Management (NMDA Version)", RFC 8349, | ||||
| DOI 10.17487/RFC8349, March 2018, | ||||
| <https://www.rfc-editor.org/info/rfc8349>. | ||||
| [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol | ||||
| Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | ||||
| <https://www.rfc-editor.org/info/rfc8446>. | ||||
| [RFC8655] Finn, N., Thubert, P., Varga, B., and J. Farkas, | [RFC8655] Finn, N., Thubert, P., Varga, B., and J. Farkas, | |||
| "Deterministic Networking Architecture", RFC 8655, | "Deterministic Networking Architecture", RFC 8655, | |||
| DOI 10.17487/RFC8655, October 2019, | DOI 10.17487/RFC8655, October 2019, | |||
| <https://www.rfc-editor.org/info/rfc8655>. | <https://www.rfc-editor.org/info/rfc8655>. | |||
| 11.2. Informative References | [RFC8960] Saad, T., Raza, K., Gandhi, R., Liu, X., and V. Beeram, "A | |||
| YANG Data Model for MPLS Base", RFC 8960, | ||||
| DOI 10.17487/RFC8960, December 2020, | ||||
| <https://www.rfc-editor.org/info/rfc8960>. | ||||
| [I-D.ietf-detnet-flow-information-model] | [RFC8964] Varga, B., Ed., Farkas, J., Berger, L., Malis, A., Bryant, | |||
| Varga, B., Farkas, J., Cummings, R., Jiang, Y., and D. | S., and J. Korhonen, "Deterministic Networking (DetNet) | |||
| Fedyk, "DetNet Flow and Service Information Model", Work | Data Plane: MPLS", RFC 8964, DOI 10.17487/RFC8964, January | |||
| in Progress, Internet-Draft, draft-ietf-detnet-flow- | 2021, <https://www.rfc-editor.org/info/rfc8964>. | |||
| information-model-14, 24 January 2021, | ||||
| <http://www.ietf.org/internet-drafts/draft-ietf-detnet- | ||||
| flow-information-model-14.txt>. | ||||
| Appendix A. Examples | 13.2. Informative References | |||
| [IEEE8021Q] | ||||
| IEEE, "IEEE Standard for Local and Metropolitan Area | ||||
| Networks--Bridges and Bridged Networks", | ||||
| DOI 10.1109/IEEESTD.2018.8403927, IEEE 802.1Q-2018, July | ||||
| 2018, <https://ieeexplore.ieee.org/document/8403927>. | ||||
| [RFC8340] Bjorklund, M. and L. Berger, Ed., "YANG Tree Diagrams", | ||||
| BCP 215, RFC 8340, DOI 10.17487/RFC8340, March 2018, | ||||
| <https://www.rfc-editor.org/info/rfc8340>. | ||||
| [RFC9016] Varga, B., Farkas, J., Cummings, R., Jiang, Y., and D. | ||||
| Fedyk, "Flow and Service Information Model for | ||||
| Deterministic Networking (DetNet)", RFC 9016, | ||||
| DOI 10.17487/RFC9016, March 2021, | ||||
| <https://www.rfc-editor.org/info/rfc9016>. | ||||
| Appendix A. DetNet Configuration YANG Tree | ||||
| This is the full YANG tree as described in [RFC8340]. | ||||
| module: ietf-detnet | ||||
| +--rw detnet | ||||
| +--rw traffic-profile* [name] | ||||
| | +--rw name string | ||||
| | +--rw traffic-requirements | ||||
| | | +--rw min-bandwidth? uint64 | ||||
| | | +--rw max-latency? uint32 | ||||
| | | +--rw max-latency-variation? uint32 | ||||
| | | +--rw max-loss? uint32 | ||||
| | | +--rw max-consecutive-loss-tolerance? uint32 | ||||
| | | +--rw max-misordering? uint32 | ||||
| | +--rw traffic-spec | ||||
| | | +--rw interval? uint32 | ||||
| | | +--rw max-pkts-per-interval? uint32 | ||||
| | | +--rw max-payload-size? uint32 | ||||
| | | +--rw min-payload-size? uint32 | ||||
| | | +--rw min-pkts-per-interval? uint32 | ||||
| | +--ro member-apps* app-flow-ref | ||||
| | +--ro member-services* service-sub-layer-ref | ||||
| | +--ro member-fwd-sublayers* forwarding-sub-layer-ref | ||||
| +--rw app-flows | ||||
| | +--rw app-flow* [name] | ||||
| | +--rw name string | ||||
| | +--rw bidir-congruent? boolean | ||||
| | +--ro outgoing-service? service-sub-layer-ref | ||||
| | +--ro incoming-service? service-sub-layer-ref | ||||
| | +--rw traffic-profile? traffic-profile-ref | ||||
| | +--rw ingress | ||||
| | | +--ro app-flow-status? identityref | ||||
| | | +--rw interface if:interface-ref | ||||
| | | +--rw (data-flow-type)? | ||||
| | | +--:(tsn-app-flow) | ||||
| | | | +--rw tsn-app-flow | ||||
| | | | +--rw source-mac-address? | ||||
| | | | | yang:mac-address | ||||
| | | | +--rw destination-mac-address? | ||||
| | | | | yang:mac-address | ||||
| | | | +--rw ethertype? | ||||
| | | | | ethertypes:ethertype | ||||
| | | | +--rw vlan-id? | ||||
| | | | | dot1q-types:vlanid | ||||
| | | | +--rw pcp? | ||||
| | | | dot1q-types:priority-type | ||||
| | | +--:(ip-app-flow) | ||||
| | | | +--rw ip-app-flow | ||||
| | | | +--rw src-ip-prefix? inet:ip-prefix | ||||
| | | | +--rw dest-ip-prefix? inet:ip-prefix | ||||
| | | | +--rw protocol-next-header? uint8 | ||||
| | | | +--rw dscp? inet:dscp | ||||
| | | | +--rw flow-label? | ||||
| | | | | inet:ipv6-flow-label | ||||
| | | | +--rw source-port | ||||
| | | | | +--rw (port-range-or-operator)? | ||||
| | | | | +--:(range) | ||||
| | | | | | +--rw lower-port | ||||
| | | | | | | inet:port-number | ||||
| | | | | | +--rw upper-port | ||||
| | | | | | inet:port-number | ||||
| | | | | +--:(operator) | ||||
| | | | | +--rw operator? operator | ||||
| | | | | +--rw port inet:port-number | ||||
| | | | +--rw destination-port | ||||
| | | | | +--rw (port-range-or-operator)? | ||||
| | | | | +--:(range) | ||||
| | | | | | +--rw lower-port | ||||
| | | | | | | inet:port-number | ||||
| | | | | | +--rw upper-port | ||||
| | | | | | inet:port-number | ||||
| | | | | +--:(operator) | ||||
| | | | | +--rw operator? operator | ||||
| | | | | +--rw port inet:port-number | ||||
| | | | +--rw ipsec-spi? ipsec-spi | ||||
| | | +--:(mpls-app-flow) | ||||
| | | +--rw mpls-app-flow | ||||
| | | +--rw (label-space)? | ||||
| | | +--:(context-label-space) | ||||
| | | | +--rw mpls-label-stack | ||||
| | | | +--rw entry* [id] | ||||
| | | | +--rw id uint8 | ||||
| | | | +--rw label? | ||||
| | | | | rt-types:mpls-label | ||||
| | | | +--rw ttl? uint8 | ||||
| | | | +--rw traffic-class? uint8 | ||||
| | | +--:(platform-label-space) | ||||
| | | +--rw label? | ||||
| | | rt-types:mpls-label | ||||
| | +--rw egress | ||||
| | +--rw (application-type)? | ||||
| | +--:(ethernet) | ||||
| | | +--rw ethernet | ||||
| | | +--rw interface? if:interface-ref | ||||
| | +--:(ip-mpls) | ||||
| | +--rw ip-mpls | ||||
| | +--rw (next-hop-options) | ||||
| | +--:(simple-next-hop) | ||||
| | | +--rw outgoing-interface? | ||||
| | | | if:interface-ref | ||||
| | | +--rw (flow-type)? | ||||
| | | +--:(ip) | ||||
| | | | +--rw next-hop-address? | ||||
| | | | inet:ip-address-no-zone | ||||
| | | +--:(mpls) | ||||
| | | +--rw mpls-label-stack | ||||
| | | +--rw entry* [id] | ||||
| | | +--rw id uint8 | ||||
| | | +--rw label? | ||||
| | | | rt-types:mpls-label | ||||
| | | +--rw ttl? uint8 | ||||
| | | +--rw traffic-class? uint8 | ||||
| | +--:(next-hop-list) | ||||
| | +--rw next-hop* [hop-index] | ||||
| | +--rw hop-index uint8 | ||||
| | +--rw outgoing-interface? | ||||
| | | if:interface-ref | ||||
| | +--rw (flow-type)? | ||||
| | +--:(ip) | ||||
| | | +--rw next-hop-address? | ||||
| | | inet:ip-address-no-zone | ||||
| | +--:(mpls) | ||||
| | +--rw mpls-label-stack | ||||
| | +--rw entry* [id] | ||||
| | +--rw id | ||||
| | | uint8 | ||||
| | +--rw label? | ||||
| | | rt-types:mpls-label | ||||
| | +--rw ttl? | ||||
| | | uint8 | ||||
| | +--rw traffic-class? | ||||
| | uint8 | ||||
| +--rw service | ||||
| | +--rw sub-layer* [name] | ||||
| | +--rw name string | ||||
| | +--rw service-rank? uint8 | ||||
| | +--rw traffic-profile? traffic-profile-ref | ||||
| | +--rw service-protection | ||||
| | | +--rw protection? service-protection | ||||
| | | +--rw sequence-number-length? sequence-number-field | ||||
| | +--rw operation? operation | ||||
| | +--rw incoming | ||||
| | | +--rw (incoming) | ||||
| | | +--:(app-flow) | ||||
| | | | +--rw app-flow | ||||
| | | | +--rw flow* app-flow-ref | ||||
| | | +--:(service-aggregation) | ||||
| | | | +--rw service-aggregation | ||||
| | | | +--rw sub-layer* service-sub-layer-ref | ||||
| | | +--:(forwarding-aggregation) | ||||
| | | | +--rw forwarding-aggregation | ||||
| | | | +--rw sub-layer* forwarding-sub-layer-ref | ||||
| | | +--:(service-id) | ||||
| | | +--rw service-id | ||||
| | | +--rw (detnet-flow-type)? | ||||
| | | +--:(ip-detnet-flow) | ||||
| | | | +--rw src-ip-prefix? | ||||
| | | | | inet:ip-prefix | ||||
| | | | +--rw dest-ip-prefix? | ||||
| | | | | inet:ip-prefix | ||||
| | | | +--rw protocol-next-header? uint8 | ||||
| | | | +--rw dscp? inet:dscp | ||||
| | | | +--rw flow-label? | ||||
| | | | | inet:ipv6-flow-label | ||||
| | | | +--rw source-port | ||||
| | | | | +--rw (port-range-or-operator)? | ||||
| | | | | +--:(range) | ||||
| | | | | | +--rw lower-port | ||||
| | | | | | | inet:port-number | ||||
| | | | | | +--rw upper-port | ||||
| | | | | | inet:port-number | ||||
| | | | | +--:(operator) | ||||
| | | | | +--rw operator? operator | ||||
| | | | | +--rw port | ||||
| | | | | inet:port-number | ||||
| | | | +--rw destination-port | ||||
| | | | | +--rw (port-range-or-operator)? | ||||
| | | | | +--:(range) | ||||
| | | | | | +--rw lower-port | ||||
| | | | | | | inet:port-number | ||||
| | | | | | +--rw upper-port | ||||
| | | | | | inet:port-number | ||||
| | | | | +--:(operator) | ||||
| | | | | +--rw operator? operator | ||||
| | | | | +--rw port | ||||
| | | | | inet:port-number | ||||
| | | | +--rw ipsec-spi? ipsec-spi | ||||
| | | +--:(mpls-detnet-flow) | ||||
| | | +--rw (label-space)? | ||||
| | | +--:(context-label-space) | ||||
| | | | +--rw mpls-label-stack | ||||
| | | | +--rw entry* [id] | ||||
| | | | +--rw id uint8 | ||||
| | | | +--rw label? | ||||
| | | | | rt-types:mpls-label | ||||
| | | | +--rw ttl? uint8 | ||||
| | | | +--rw traffic-class? uint8 | ||||
| | | +--:(platform-label-space) | ||||
| | | +--rw label? | ||||
| | | rt-types:mpls-label | ||||
| | +--rw outgoing | ||||
| | +--rw (outgoing) | ||||
| | +--:(forwarding-sub-layer) | ||||
| | | +--rw forwarding-sub-layer | ||||
| | | +--rw service-outgoing* [index] | ||||
| | | +--rw index uint8 | ||||
| | | +--rw (header-type)? | ||||
| | | | +--:(mpls) | ||||
| | | | | +--rw mpls-label-stack | ||||
| | | | | +--rw entry* [id] | ||||
| | | | | +--rw id uint8 | ||||
| | | | | +--rw label? | ||||
| | | | | | rt-types:mpls-label | ||||
| | | | | +--rw ttl? uint8 | ||||
| | | | | +--rw traffic-class? uint8 | ||||
| | | | +--:(ip) | ||||
| | | | +--rw src-ip-address? | ||||
| | | | | inet:ip-address-no-zone | ||||
| | | | +--rw dest-ip-address? | ||||
| | | | | inet:ip-address-no-zone | ||||
| | | | +--rw protocol-next-header? uint8 | ||||
| | | | +--rw dscp? | ||||
| | | | | inet:dscp | ||||
| | | | +--rw flow-label? | ||||
| | | | | inet:ipv6-flow-label | ||||
| | | | +--rw source-port? | ||||
| | | | | inet:port-number | ||||
| | | | +--rw destination-port? | ||||
| | | | inet:port-number | ||||
| | | +--rw sub-layer* | ||||
| | | forwarding-sub-layer-ref | ||||
| | +--:(service-sub-layer) | ||||
| | | +--rw service-sub-layer | ||||
| | | +--rw aggregation-sub-layer? | ||||
| | | | service-sub-layer-ref | ||||
| | | +--rw service-label | ||||
| | | +--rw mpls-label-stack | ||||
| | | +--rw entry* [id] | ||||
| | | +--rw id uint8 | ||||
| | | +--rw label? | ||||
| | | | rt-types:mpls-label | ||||
| | | +--rw ttl? uint8 | ||||
| | | +--rw traffic-class? uint8 | ||||
| | +--:(app-flow) | ||||
| | | +--rw app-flow | ||||
| | | +--rw flow* app-flow-ref | ||||
| | +--:(service-disaggregation) | ||||
| | | +--rw service-disaggregation | ||||
| | | +--rw sub-layer* service-sub-layer-ref | ||||
| | +--:(forwarding-disaggregation) | ||||
| | +--rw forwarding-disaggregation | ||||
| | +--rw sub-layer* forwarding-sub-layer-ref | ||||
| +--rw forwarding | ||||
| +--rw sub-layer* [name] | ||||
| +--rw name string | ||||
| +--rw traffic-profile? traffic-profile-ref | ||||
| +--rw operation? forwarding-operations | ||||
| +--rw incoming | ||||
| | +--rw (incoming) | ||||
| | +--:(service-sub-layer) | ||||
| | | +--rw service-sub-layer | ||||
| | | +--rw sub-layer* service-sub-layer-ref | ||||
| | +--:(forwarding-aggregation) | ||||
| | | +--rw forwarding-aggregation | ||||
| | | +--rw sub-layer* forwarding-sub-layer-ref | ||||
| | +--:(forwarding-id) | ||||
| | +--rw forwarding-id | ||||
| | +--rw interface? | ||||
| | | if:interface-ref | ||||
| | +--rw (detnet-flow-type)? | ||||
| | +--:(ip-detnet-flow) | ||||
| | | +--rw src-ip-prefix? | ||||
| | | | inet:ip-prefix | ||||
| | | +--rw dest-ip-prefix? | ||||
| | | | inet:ip-prefix | ||||
| | | +--rw protocol-next-header? uint8 | ||||
| | | +--rw dscp? inet:dscp | ||||
| | | +--rw flow-label? | ||||
| | | | inet:ipv6-flow-label | ||||
| | | +--rw source-port | ||||
| | | | +--rw (port-range-or-operator)? | ||||
| | | | +--:(range) | ||||
| | | | | +--rw lower-port | ||||
| | | | | | inet:port-number | ||||
| | | | | +--rw upper-port | ||||
| | | | | inet:port-number | ||||
| | | | +--:(operator) | ||||
| | | | +--rw operator? operator | ||||
| | | | +--rw port | ||||
| | | | inet:port-number | ||||
| | | +--rw destination-port | ||||
| | | | +--rw (port-range-or-operator)? | ||||
| | | | +--:(range) | ||||
| | | | | +--rw lower-port | ||||
| | | | | | inet:port-number | ||||
| | | | | +--rw upper-port | ||||
| | | | | inet:port-number | ||||
| | | | +--:(operator) | ||||
| | | | +--rw operator? operator | ||||
| | | | +--rw port | ||||
| | | | inet:port-number | ||||
| | | +--rw ipsec-spi? ipsec-spi | ||||
| | +--:(mpls-detnet-flow) | ||||
| | +--rw (label-space)? | ||||
| | +--:(context-label-space) | ||||
| | | +--rw mpls-label-stack | ||||
| | | +--rw entry* [id] | ||||
| | | +--rw id uint8 | ||||
| | | +--rw label? | ||||
| | | | rt-types:mpls-label | ||||
| | | +--rw ttl? uint8 | ||||
| | | +--rw traffic-class? uint8 | ||||
| | +--:(platform-label-space) | ||||
| | +--rw label? | ||||
| | rt-types:mpls-label | ||||
| +--rw outgoing | ||||
| +--rw (outgoing) | ||||
| +--:(interface) | ||||
| | +--rw interface | ||||
| | +--rw (next-hop-options) | ||||
| | +--:(simple-next-hop) | ||||
| | | +--rw outgoing-interface? | ||||
| | | | if:interface-ref | ||||
| | | +--rw (flow-type)? | ||||
| | | +--:(ip) | ||||
| | | | +--rw (operation-type)? | ||||
| | | | +--:(ip-forwarding) | ||||
| | | | | +--rw next-hop-address? | ||||
| | | | | inet:ip-address-no-zone | ||||
| | | | +--:(mpls-over-ip-encapsulation) | ||||
| | | | +--rw src-ip-address? | ||||
| | | | | inet:ip-address-no-zone | ||||
| | | | +--rw dest-ip-address? | ||||
| | | | | inet:ip-address-no-zone | ||||
| | | | +--rw protocol-next-header? | ||||
| | | | | uint8 | ||||
| | | | +--rw dscp? | ||||
| | | | | inet:dscp | ||||
| | | | +--rw flow-label? | ||||
| | | | | inet:ipv6-flow-label | ||||
| | | | +--rw source-port? | ||||
| | | | | inet:port-number | ||||
| | | | +--rw destination-port? | ||||
| | | | inet:port-number | ||||
| | | +--:(mpls) | ||||
| | | +--rw mpls-label-stack | ||||
| | | +--rw entry* [id] | ||||
| | | +--rw id uint8 | ||||
| | | +--rw label? | ||||
| | | | rt-types:mpls-label | ||||
| | | +--rw ttl? uint8 | ||||
| | | +--rw traffic-class? uint8 | ||||
| | +--:(next-hop-list) | ||||
| | +--rw next-hop* [hop-index] | ||||
| | +--rw hop-index | ||||
| | | uint8 | ||||
| | +--rw outgoing-interface? | ||||
| | | if:interface-ref | ||||
| | +--rw (flow-type)? | ||||
| | +--:(ip) | ||||
| | | +--rw (operation-type)? | ||||
| | | +--:(ip-forwarding) | ||||
| | | | +--rw next-hop-address? | ||||
| | | | inet:ip-address-no-zone | ||||
| | | +--:(mpls-over-ip- | ||||
| | | encapsulation) | ||||
| | | +--rw src-ip-address? | ||||
| | | | inet:ip-address-no-zone | ||||
| | | +--rw dest-ip-address? | ||||
| | | | inet:ip-address-no-zone | ||||
| | | +--rw protocol-next-header? | ||||
| | | | uint8 | ||||
| | | +--rw dscp? | ||||
| | | | inet:dscp | ||||
| | | +--rw flow-label? | ||||
| | | | inet:ipv6-flow-label | ||||
| | | +--rw source-port? | ||||
| | | | inet:port-number | ||||
| | | +--rw destination-port? | ||||
| | | inet:port-number | ||||
| | +--:(mpls) | ||||
| | +--rw mpls-label-stack | ||||
| | +--rw entry* [id] | ||||
| | +--rw id | ||||
| | | uint8 | ||||
| | +--rw label? | ||||
| | | rt-types:mpls-label | ||||
| | +--rw ttl? | ||||
| | | uint8 | ||||
| | +--rw traffic-class? | ||||
| | uint8 | ||||
| +--:(service-aggregation) | ||||
| | +--rw service-aggregation | ||||
| | +--rw aggregation-sub-layer? | ||||
| | | service-sub-layer-ref | ||||
| | +--rw optional-forwarding-label | ||||
| | +--rw mpls-label-stack | ||||
| | +--rw entry* [id] | ||||
| | +--rw id uint8 | ||||
| | +--rw label? | ||||
| | | rt-types:mpls-label | ||||
| | +--rw ttl? uint8 | ||||
| | +--rw traffic-class? uint8 | ||||
| +--:(forwarding-sub-layer) | ||||
| | +--rw forwarding-sub-layer | ||||
| | +--rw aggregation-sub-layer? | ||||
| | | forwarding-sub-layer-ref | ||||
| | +--rw forwarding-label | ||||
| | +--rw mpls-label-stack | ||||
| | +--rw entry* [id] | ||||
| | +--rw id uint8 | ||||
| | +--rw label? | ||||
| | | rt-types:mpls-label | ||||
| | +--rw ttl? uint8 | ||||
| | +--rw traffic-class? uint8 | ||||
| +--:(service-sub-layer) | ||||
| | +--rw service-sub-layer | ||||
| | +--rw sub-layer* service-sub-layer-ref | ||||
| +--:(forwarding-disaggregation) | ||||
| +--rw forwarding-disaggregation | ||||
| +--rw sub-layer* forwarding-sub-layer-ref | ||||
| Appendix B. Examples | ||||
| The following examples are provided. These examples are tested with | The following examples are provided. These examples are tested with | |||
| Yanglint and use operational output to exercise both config true and | Yanglint and use operational output to exercise both config true and | |||
| config false objects. | config false objects. Note that IPv4 and IPv6 addresses are | |||
| supported but for clarity in the examples and diagrams IPv4 has been | ||||
| used in most examples. The IP types are imported from [RFC6991] and | ||||
| these support both IPv4 and IPv6. | ||||
| The following are examples of aggregation and disaggregation at | The following are examples of aggregation and disaggregation at | |||
| various points in Detnet. Figures are provided in the PDF version of | various points in Detnet. Figures are provided in the PDF version of | |||
| this document. | this document. | |||
| A.1. Example A-1 JSON Configuration/Operational | B.1. Example A-1 JSON Configuration/Operational | |||
| This illustrates simple aggregation. Ingress node 1 aggregates App | This illustrates simple aggregation. Ingress node 1 aggregates App | |||
| flows 0 and 1 into a service sub-layer of DetNet flow 1. Two ways of | flows 0 and 1 into a service sub-layer of DetNet flow 1. Two ways of | |||
| illustrating this follow, then the JSON operational data model | illustrating this follow, then the JSON operational data model | |||
| corresponding to the diagrams follows. | corresponding to the diagrams follows. This example uses IPv6 | |||
| address format. | ||||
| Please consult the PDF or HTML versions for the Case A-1 Diagram. | Please consult the PDF or HTML versions for the Case A-1 Diagram. | |||
| Figure 1: Case A-1 Example JSON Operational/Configuration | Figure 2: Case A-1 Example JSON Operational/Configuration | |||
| Please consult the PDF or HTML versions for the Case A-1 Diagram. | Please consult the PDF or HTML versions for the Case A-1 Diagram. | |||
| Figure 2: Case A-1 Example JSON Operational/Configuration | Figure 3: Case A-1 Example JSON Operational/Configuration | |||
| { | { | |||
| "ietf-interfaces:interfaces": { | ||||
| "interface": [ | ||||
| { | ||||
| "name": "eth0", | ||||
| "type": "iana-if-type:ethernetCsmacd", | ||||
| "oper-status": "up", | ||||
| "statistics": { | ||||
| "discontinuity-time": "2020-12-18T23:59:00Z" | ||||
| } | ||||
| }, | ||||
| { | ||||
| "name": "eth1", | ||||
| "type": "iana-if-type:ethernetCsmacd", | ||||
| "oper-status": "up", | ||||
| "statistics": { | ||||
| "discontinuity-time": "2020-12-18T23:59:00Z" | ||||
| } | ||||
| }, | ||||
| { | ||||
| "name": "eth2", | ||||
| "type": "iana-if-type:ethernetCsmacd", | ||||
| "oper-status": "up", | ||||
| "statistics": { | ||||
| "discontinuity-time": "2020-12-18T23:59:00Z" | ||||
| } | ||||
| }, | ||||
| { | ||||
| "name": "eth3", | ||||
| "type": "iana-if-type:ethernetCsmacd", | ||||
| "oper-status": "up", | ||||
| "statistics": { | ||||
| "discontinuity-time": "2020-12-18T23:59:00Z" | ||||
| } | ||||
| }, | ||||
| { | ||||
| "name": "eth4", | ||||
| "type": "iana-if-type:ethernetCsmacd", | ||||
| "oper-status": "up", | ||||
| "statistics": { | ||||
| "discontinuity-time": "2020-12-18T23:59:00Z" | ||||
| } | ||||
| } | ||||
| ] | ||||
| }, | ||||
| "ietf-detnet:detnet": { | "ietf-detnet:detnet": { | |||
| "app-flows": { | ||||
| "app-flow": [ | ||||
| { | ||||
| "name": "app-0", | ||||
| "app-flow-bidir-congruent": false, | ||||
| "outgoing-service": "ssl-1", | ||||
| "traffic-profile": "pf-1", | ||||
| "ingress": { | ||||
| "app-flow-status": "ready", | ||||
| "interface": "eth0", | ||||
| "ip-app-flow": { | ||||
| "src-ip-prefix": "1.1.1.1/32", | ||||
| "dest-ip-prefix": "8.8.8.8/32", | ||||
| "dscp": 6 | ||||
| } | ||||
| } | ||||
| }, | ||||
| { | ||||
| "name": "app-1", | ||||
| "app-flow-bidir-congruent": false, | ||||
| "outgoing-service": "ssl-1", | ||||
| "traffic-profile": "pf-1", | ||||
| "ingress": { | ||||
| "app-flow-status": "ready", | ||||
| "interface": "eth0", | ||||
| "ip-app-flow": { | ||||
| "src-ip-prefix": "1.1.1.1/32", | ||||
| "dest-ip-prefix": "8.8.8.8/32", | ||||
| "dscp": 7 | ||||
| } | ||||
| } | ||||
| } | ||||
| ] | ||||
| }, | ||||
| "traffic-profile": [ | "traffic-profile": [ | |||
| { | { | |||
| "profile-name": "pf-1", | "name": "pf-1", | |||
| "traffic-requirements": { | "traffic-requirements": { | |||
| "min-bandwidth": "100000000", | "min-bandwidth": "100000000", | |||
| "max-latency": 100000000, | "max-latency": 100000000, | |||
| "max-latency-variation": 200000000, | "max-latency-variation": 200000000, | |||
| "max-loss": 2, | "max-loss": 2, | |||
| "max-consecutive-loss-tolerance": 5, | "max-consecutive-loss-tolerance": 5, | |||
| "max-misordering": 0 | "max-misordering": 0 | |||
| }, | }, | |||
| "flow-spec": { | "traffic-spec": { | |||
| "interval": 5, | "interval": 5, | |||
| "max-pkts-per-interval": 10, | "max-pkts-per-interval": 10, | |||
| "max-payload-size": 1500, | "max-payload-size": 1500, | |||
| "min-payload-size": 100, | "min-payload-size": 100, | |||
| "min-pkts-per-interval": 1 | "min-pkts-per-interval": 1 | |||
| }, | }, | |||
| "member-apps": [ | "member-apps": [ | |||
| "app-0", | "app-0", | |||
| "app-1" | "app-1" | |||
| ] | ] | |||
| }, | }, | |||
| { | { | |||
| "profile-name": "pf-2", | "name": "pf-2", | |||
| "traffic-requirements": { | "traffic-requirements": { | |||
| "min-bandwidth": "200000000", | "min-bandwidth": "200000000", | |||
| "max-latency": 100000000, | "max-latency": 100000000, | |||
| "max-latency-variation": 200000000, | "max-latency-variation": 200000000, | |||
| "max-loss": 2, | "max-loss": 2, | |||
| "max-consecutive-loss-tolerance": 5, | "max-consecutive-loss-tolerance": 5, | |||
| "max-misordering": 0 | "max-misordering": 0 | |||
| }, | }, | |||
| "flow-spec": { | "traffic-spec": { | |||
| "interval": 5, | "interval": 5, | |||
| "max-pkts-per-interval": 10, | "max-pkts-per-interval": 10, | |||
| "max-payload-size": 1500, | "max-payload-size": 1500, | |||
| "min-payload-size": 100, | "min-payload-size": 100, | |||
| "min-pkts-per-interval": 1 | "min-pkts-per-interval": 1 | |||
| }, | }, | |||
| "member-services": [ | "member-services": [ | |||
| "ssl-1" | "ssl-1" | |||
| ] | ] | |||
| }, | }, | |||
| { | { | |||
| "profile-name": "pf-3", | "name": "pf-3", | |||
| "flow-spec": { | "traffic-spec": { | |||
| "interval": 5, | "interval": 5, | |||
| "max-pkts-per-interval": 10, | "max-pkts-per-interval": 10, | |||
| "max-payload-size": 1500 | "max-payload-size": 1500 | |||
| }, | }, | |||
| "member-fwd-sublayers": [ | "member-fwd-sublayers": [ | |||
| "fsl-1" | "fsl-1" | |||
| ] | ] | |||
| } | } | |||
| ], | ], | |||
| "service-sub-layer": { | "app-flows": { | |||
| "service-sub-layer-list": [ | "app-flow": [ | |||
| { | ||||
| "name": "app-0", | ||||
| "bidir-congruent": false, | ||||
| "outgoing-service": "ssl-1", | ||||
| "traffic-profile": "pf-1", | ||||
| "ingress": { | ||||
| "app-flow-status": "ietf-detnet:ready", | ||||
| "interface": "eth0", | ||||
| "ip-app-flow": { | ||||
| "src-ip-prefix": "2001:db8::1/128", | ||||
| "dest-ip-prefix": "2001:db8::8/128", | ||||
| "dscp": 6 | ||||
| } | ||||
| } | ||||
| }, | ||||
| { | ||||
| "name": "app-1", | ||||
| "bidir-congruent": false, | ||||
| "outgoing-service": "ssl-1", | ||||
| "traffic-profile": "pf-1", | ||||
| "ingress": { | ||||
| "app-flow-status": "ietf-detnet:ready", | ||||
| "interface": "eth0", | ||||
| "ip-app-flow": { | ||||
| "src-ip-prefix": "2001:db8::1/128", | ||||
| "dest-ip-prefix": "2001:db8::8/128", | ||||
| "dscp": 7 | ||||
| } | ||||
| } | ||||
| } | ||||
| ] | ||||
| }, | ||||
| "service": { | ||||
| "sub-layer": [ | ||||
| { | { | |||
| "name": "ssl-1", | "name": "ssl-1", | |||
| "service-rank": 10, | "service-rank": 10, | |||
| "traffic-profile": "pf-2", | "traffic-profile": "pf-2", | |||
| "service-operation-type": "service-initiation", | ||||
| "service-protection": { | "service-protection": { | |||
| "service-protection-type": "none", | "protection": "none", | |||
| "sequence-number-length": "long-sn" | "sequence-number-length": "long-sn" | |||
| }, | }, | |||
| "incoming-type": { | "operation": "initiation", | |||
| "incoming": { | ||||
| "app-flow": { | "app-flow": { | |||
| "app-flow-list": [ | "flow": [ | |||
| "app-0", | "app-0", | |||
| "app-1" | "app-1" | |||
| ] | ] | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "forwarding-sub-layer": { | "forwarding-sub-layer": { | |||
| "service-outgoing-list": [ | "service-outgoing": [ | |||
| { | { | |||
| "service-outgoing-index": 0, | "index": 0, | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 100 | "label": "100" | |||
| } | } | |||
| ] | ] | |||
| }, | }, | |||
| "forwarding-sub-layer": [ | "sub-layer": [ | |||
| "fsl-1" | "fsl-1" | |||
| ] | ] | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| }, | }, | |||
| "forwarding-sub-layer": { | "forwarding": { | |||
| "forwarding-sub-layer-list": [ | "sub-layer": [ | |||
| { | { | |||
| "name": "fsl-1", | "name": "fsl-1", | |||
| "traffic-profile": "pf-3", | "traffic-profile": "pf-3", | |||
| "forwarding-operation-type": "impose-and-forward", | "operation": "impose-and-forward", | |||
| "incoming-type": { | "incoming": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-1" | "ssl-1" | |||
| ] | ] | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "interface": { | "interface": { | |||
| "outgoing-interface": "eth2", | "outgoing-interface": "eth2", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10000 | "label": "10000" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| }, | ||||
| "ietf-interfaces:interfaces": { | ||||
| "interface": [ | ||||
| { | ||||
| "name": "eth0", | ||||
| "type": "iana-if-type:ethernetCsmacd", | ||||
| "oper-status": "up", | ||||
| "statistics": { | ||||
| "discontinuity-time": "2020-12-18T18:59:00-05:00" | ||||
| } | ||||
| }, | ||||
| { | ||||
| "name": "eth1", | ||||
| "type": "iana-if-type:ethernetCsmacd", | ||||
| "oper-status": "up", | ||||
| "statistics": { | ||||
| "discontinuity-time": "2020-12-18T18:59:00-05:00" | ||||
| } | ||||
| }, | ||||
| { | ||||
| "name": "eth2", | ||||
| "type": "iana-if-type:ethernetCsmacd", | ||||
| "oper-status": "up", | ||||
| "statistics": { | ||||
| "discontinuity-time": "2020-12-18T18:59:00-05:00" | ||||
| } | ||||
| }, | ||||
| { | ||||
| "name": "eth3", | ||||
| "type": "iana-if-type:ethernetCsmacd", | ||||
| "oper-status": "up", | ||||
| "statistics": { | ||||
| "discontinuity-time": "2020-12-18T18:59:00-05:00" | ||||
| } | ||||
| }, | ||||
| { | ||||
| "name": "eth4", | ||||
| "type": "iana-if-type:ethernetCsmacd", | ||||
| "oper-status": "up", | ||||
| "statistics": { | ||||
| "discontinuity-time": "2020-12-18T18:59:00-05:00" | ||||
| } | ||||
| } | ||||
| ] | ||||
| } | } | |||
| } | } | |||
| Figure 3: Example A-1 DetNet JSON configuration | Figure 4: Example A-1 DetNet JSON configuration | |||
| A.2. Example B-1 XML Config: Aggregation using a Forwarding Sub-layer | B.2. Example B-1 XML Config: Aggregation using a Forwarding Sub-layer | |||
| This illustrates aggrgation in the service sub-layers of DetNet. | This illustrates aggrgation in the service sub-layers of DetNet. | |||
| Flows 1 and 2 are aggregated into a forwarding sub-layer. A diagram | Flows 1 and 2 are aggregated into a forwarding sub-layer. A diagram | |||
| illustrating this case is shown and then the corresponding XML | illustrating this case is shown and then the corresponding XML | |||
| operational data follows. | operational data follows. | |||
| Please consult the PDF or HTML versions for the Case B-1 Diagram. | Please consult the PDF or HTML versions for the Case B-1 Diagram. | |||
| Figure 4: Case B-1 Example XML Config: Aggregation using a | Figure 5: Case B-1 Example XML Config: Aggregation using a | |||
| Forwarding Sub-layer | Forwarding Sub-layer | |||
| <interfaces | <interfaces | |||
| xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces" | xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces" | |||
| xmlns:ia="urn:ietf:params:xml:ns:yang:iana-if-type"> | xmlns:ia="urn:ietf:params:xml:ns:yang:iana-if-type"> | |||
| <interface> | <interface> | |||
| <name>eth0</name> | <name>eth0</name> | |||
| <type>ia:ethernetCsmacd</type> | <type>ia:ethernetCsmacd</type> | |||
| <oper-status>up</oper-status> | <oper-status>up</oper-status> | |||
| <statistics> | <statistics> | |||
| skipping to change at page 51, line 38 ¶ | skipping to change at page 58, line 17 ¶ | |||
| <statistics> | <statistics> | |||
| <discontinuity-time>2020-12-18T23:59:00Z</discontinuity-time> | <discontinuity-time>2020-12-18T23:59:00Z</discontinuity-time> | |||
| </statistics> | </statistics> | |||
| </interface> | </interface> | |||
| </interfaces> | </interfaces> | |||
| <detnet | <detnet | |||
| xmlns="urn:ietf:params:xml:ns:yang:ietf-detnet"> | xmlns="urn:ietf:params:xml:ns:yang:ietf-detnet"> | |||
| <app-flows> | <app-flows> | |||
| <app-flow> | <app-flow> | |||
| <name>app-1</name> | <name>app-1</name> | |||
| <app-flow-bidir-congruent>false</app-flow-bidir-congruent> | <bidir-congruent>false</bidir-congruent> | |||
| <outgoing-service>ssl-1</outgoing-service> | <outgoing-service>ssl-1</outgoing-service> | |||
| <traffic-profile>1</traffic-profile> | <traffic-profile>1</traffic-profile> | |||
| <ingress> | <ingress> | |||
| <app-flow-status>ready</app-flow-status> | <app-flow-status>ready</app-flow-status> | |||
| <interface>eth0</interface> | <interface>eth0</interface> | |||
| <ip-app-flow> | <ip-app-flow> | |||
| <src-ip-prefix>1.1.1.1/32</src-ip-prefix> | <src-ip-prefix>192.0.2.1/32</src-ip-prefix> | |||
| <dest-ip-prefix>8.8.8.8/32</dest-ip-prefix> | <dest-ip-prefix>192.0.2.8/32</dest-ip-prefix> | |||
| <dscp>6</dscp> | <dscp>6</dscp> | |||
| </ip-app-flow> | </ip-app-flow> | |||
| </ingress> | </ingress> | |||
| </app-flow> | </app-flow> | |||
| <app-flow> | <app-flow> | |||
| <name>app-2</name> | <name>app-2</name> | |||
| <app-flow-bidir-congruent>false</app-flow-bidir-congruent> | <bidir-congruent>false</bidir-congruent> | |||
| <outgoing-service>ssl-2</outgoing-service> | <outgoing-service>ssl-2</outgoing-service> | |||
| <traffic-profile>1</traffic-profile> | <traffic-profile>1</traffic-profile> | |||
| <ingress> | <ingress> | |||
| <app-flow-status>ready</app-flow-status> | <app-flow-status>ready</app-flow-status> | |||
| <interface>eth1</interface> | <interface>eth1</interface> | |||
| <ip-app-flow> | <ip-app-flow> | |||
| <src-ip-prefix>1.1.1.2/32</src-ip-prefix> | <src-ip-prefix>192.0.2.2/32</src-ip-prefix> | |||
| <dest-ip-prefix>8.8.8.9/32</dest-ip-prefix> | <dest-ip-prefix>192.0.2.9/32</dest-ip-prefix> | |||
| <dscp>7</dscp> | <dscp>7</dscp> | |||
| </ip-app-flow> | </ip-app-flow> | |||
| <dscp>7</dscp> | ||||
| </ingress> | </ingress> | |||
| </app-flow> | </app-flow> | |||
| </app-flows> | </app-flows> | |||
| <traffic-profile> | <traffic-profile> | |||
| <profile-name>1</profile-name> | <name>1</name> | |||
| <traffic-requirements> | <traffic-requirements> | |||
| <min-bandwidth>100000000</min-bandwidth> | <min-bandwidth>100000000</min-bandwidth> | |||
| <max-latency>100000000</max-latency> | <max-latency>100000000</max-latency> | |||
| <max-latency-variation>200000000</max-latency-variation> | <max-latency-variation>200000000</max-latency-variation> | |||
| <max-loss>2</max-loss> | <max-loss>2</max-loss> | |||
| <max-consecutive-loss-tolerance>5</max-consecutive-loss-tolerance> | <max-consecutive-loss-tolerance>5</max-consecutive-loss-tolerance> | |||
| <max-misordering>0</max-misordering> | <max-misordering>0</max-misordering> | |||
| </traffic-requirements> | </traffic-requirements> | |||
| <member-apps>app-1</member-apps> | <member-apps>app-1</member-apps> | |||
| <member-apps>app-2</member-apps> | <member-apps>app-2</member-apps> | |||
| </traffic-profile> | </traffic-profile> | |||
| <traffic-profile> | <traffic-profile> | |||
| <profile-name>2</profile-name> | <name>2</name> | |||
| <traffic-requirements> | <traffic-requirements> | |||
| <min-bandwidth>100000000</min-bandwidth> | <min-bandwidth>100000000</min-bandwidth> | |||
| <max-latency>100000000</max-latency> | <max-latency>100000000</max-latency> | |||
| <max-latency-variation>200000000</max-latency-variation> | <max-latency-variation>200000000</max-latency-variation> | |||
| <max-loss>2</max-loss> | <max-loss>2</max-loss> | |||
| <max-consecutive-loss-tolerance>5</max-consecutive-loss-tolerance> | <max-consecutive-loss-tolerance>5</max-consecutive-loss-tolerance> | |||
| <max-misordering>0</max-misordering> | <max-misordering>0</max-misordering> | |||
| </traffic-requirements> | </traffic-requirements> | |||
| <member-services>ssl-1</member-services> | <member-services>ssl-1</member-services> | |||
| <member-services>ssl-2</member-services> | <member-services>ssl-2</member-services> | |||
| </traffic-profile> | </traffic-profile> | |||
| <traffic-profile> | <traffic-profile> | |||
| <profile-name>3</profile-name> | <name>3</name> | |||
| <flow-spec> | <traffic-spec> | |||
| <interval>5</interval> | <interval>5</interval> | |||
| <max-pkts-per-interval>10</max-pkts-per-interval> | <max-pkts-per-interval>10</max-pkts-per-interval> | |||
| <max-payload-size>1500</max-payload-size> | <max-payload-size>1500</max-payload-size> | |||
| </traffic-spec> | ||||
| </flow-spec> | ||||
| <member-fwd-sublayers>afl-1</member-fwd-sublayers> | <member-fwd-sublayers>afl-1</member-fwd-sublayers> | |||
| </traffic-profile> | </traffic-profile> | |||
| <service-sub-layer> | <service> | |||
| <service-sub-layer-list> | <sub-layer> | |||
| <name>ssl-1</name> | <name>ssl-1</name> | |||
| <service-rank>10</service-rank> | <service-rank>10</service-rank> | |||
| <traffic-profile>2</traffic-profile> | <traffic-profile>2</traffic-profile> | |||
| <service-operation-type>service-initiation | <operation>initiation</operation> | |||
| </service-operation-type> | ||||
| <service-protection> | <service-protection> | |||
| <service-protection-type>none</service-protection-type> | <protection>none</protection> | |||
| <sequence-number-length>long-sn</sequence-number-length> | <sequence-number-length>long-sn</sequence-number-length> | |||
| </service-protection> | </service-protection> | |||
| <incoming-type> | <incoming> | |||
| <app-flow> | <app-flow> | |||
| <app-flow-list>app-1</app-flow-list> | <flow>app-1</flow> | |||
| </app-flow> | </app-flow> | |||
| </incoming-type> | </incoming> | |||
| <outgoing-type> | <outgoing> | |||
| <forwarding-sub-layer> | <forwarding-sub-layer> | |||
| <service-outgoing-list> | <service-outgoing> | |||
| <service-outgoing-index>0</service-outgoing-index> | <index>0</index> | |||
| <mpls-label-stack> | <mpls-label-stack> | |||
| <entry> | <entry> | |||
| <id>0</id> | <id>0</id> | |||
| <label>100</label> | <label>100</label> | |||
| </entry> | </entry> | |||
| </mpls-label-stack> | </mpls-label-stack> | |||
| <forwarding-sub-layer>afl-1</forwarding-sub-layer> | <sub-layer>afl-1</sub-layer> | |||
| </service-outgoing-list> | </service-outgoing> | |||
| </forwarding-sub-layer> | </forwarding-sub-layer> | |||
| </outgoing-type> | </outgoing> | |||
| </service-sub-layer-list> | </sub-layer> | |||
| <service-sub-layer-list> | <sub-layer> | |||
| <name>ssl-2</name> | <name>ssl-2</name> | |||
| <service-rank>10</service-rank> | <service-rank>10</service-rank> | |||
| <traffic-profile>2</traffic-profile> | <traffic-profile>2</traffic-profile> | |||
| <service-operation-type>service-initiation | <operation>initiation</operation> | |||
| </service-operation-type> | ||||
| <service-protection> | <service-protection> | |||
| <service-protection-type>none</service-protection-type> | <protection>none</protection> | |||
| <sequence-number-length>long-sn</sequence-number-length> | <sequence-number-length>long-sn</sequence-number-length> | |||
| </service-protection> | </service-protection> | |||
| <incoming-type> | <incoming> | |||
| <app-flow> | <app-flow> | |||
| <app-flow-list>app-2</app-flow-list> | <flow>app-2</flow> | |||
| </app-flow> | </app-flow> | |||
| </incoming> | ||||
| </incoming-type> | <outgoing> | |||
| <outgoing-type> | ||||
| <forwarding-sub-layer> | <forwarding-sub-layer> | |||
| <service-outgoing-list> | <service-outgoing> | |||
| <service-outgoing-index>0</service-outgoing-index> | <index>0</index> | |||
| <mpls-label-stack> | <mpls-label-stack> | |||
| <entry> | <entry> | |||
| <id>0</id> | <id>0</id> | |||
| <label>103</label> | <label>103</label> | |||
| </entry> | </entry> | |||
| </mpls-label-stack> | </mpls-label-stack> | |||
| <forwarding-sub-layer>afl-1</forwarding-sub-layer> | <sub-layer>afl-1</sub-layer> | |||
| </service-outgoing-list> | </service-outgoing> | |||
| </forwarding-sub-layer> | </forwarding-sub-layer> | |||
| </outgoing-type> | </outgoing> | |||
| </service-sub-layer-list> | </sub-layer> | |||
| </service-sub-layer> | </service> | |||
| <forwarding-sub-layer> | <forwarding> | |||
| <forwarding-sub-layer-list> | <sub-layer> | |||
| <name>afl-1</name> | <name>afl-1</name> | |||
| <traffic-profile>3</traffic-profile> | <traffic-profile>3</traffic-profile> | |||
| <forwarding-operation-type>impose-and-forward | <operation>impose-and-forward</operation> | |||
| </forwarding-operation-type> | <incoming> | |||
| <incoming-type> | ||||
| <service-sub-layer> | <service-sub-layer> | |||
| <service-sub-layer>ssl-1</service-sub-layer> | <sub-layer>ssl-1</sub-layer> | |||
| <service-sub-layer>ssl-2</service-sub-layer> | <sub-layer>ssl-2</sub-layer> | |||
| </service-sub-layer> | </service-sub-layer> | |||
| </incoming-type> | </incoming> | |||
| <outgoing-type> | <outgoing> | |||
| <interface> | <interface> | |||
| <outgoing-interface>eth2</outgoing-interface> | <outgoing-interface>eth2</outgoing-interface> | |||
| <mpls-label-stack> | <mpls-label-stack> | |||
| <entry> | <entry> | |||
| <id>0</id> | <id>0</id> | |||
| <label>10000</label> | <label>10000</label> | |||
| </entry> | </entry> | |||
| </mpls-label-stack> | </mpls-label-stack> | |||
| </interface> | </interface> | |||
| </outgoing-type> | </outgoing> | |||
| </forwarding-sub-layer-list> | </sub-layer> | |||
| </forwarding-sub-layer> | </forwarding> | |||
| </detnet> | </detnet> | |||
| Figure 5: Example B-1 DetNet XML configuration | Figure 6: Example B-1 DetNet XML configuration | |||
| A.3. Example B-2 JSON Service Aggregation Configuration | B.3. Example B-2 JSON Service Aggregation Configuration | |||
| This illustrates the service sub-layers of DetNet. Flows 1 and 2 are | This illustrates the service sub-layers of DetNet. Flows 1 and 2 are | |||
| aggregated into a service sub-layer of aggregated DetNet flow 1. A | aggregated into a service sub-layer of aggregated DetNet flow 1. A | |||
| diagram illustrating this case is shown and then the corresponding | diagram illustrating this case is shown and then the corresponding | |||
| JSON operational data follows. | JSON operational data follows. | |||
| Please consult the PDF or HTML versions for the Case B-2 Diagram. | Please consult the PDF or HTML versions for the Case B-2 Diagram. | |||
| Figure 6: Case B-2 Example JSON Service Aggregation | Figure 7: Case B-2 Example JSON Service Aggregation | |||
| { | { | |||
| "ietf-interfaces:interfaces": { | ||||
| "interface": [ | ||||
| { | ||||
| "name": "eth0", | ||||
| "type": "iana-if-type:ethernetCsmacd", | ||||
| "oper-status": "up", | ||||
| "statistics": { | ||||
| "discontinuity-time": "2020-10-02T23:59:00Z" | ||||
| } | ||||
| }, | ||||
| { | ||||
| "name": "eth1", | ||||
| "type": "iana-if-type:ethernetCsmacd", | ||||
| "oper-status": "up", | ||||
| "statistics": { | ||||
| "discontinuity-time": "2020-10-02T23:59:00Z" | ||||
| } | ||||
| }, | ||||
| { | ||||
| "name": "eth2", | ||||
| "type": "iana-if-type:ethernetCsmacd", | ||||
| "oper-status": "up", | ||||
| "statistics": { | ||||
| "discontinuity-time": "2020-10-02T23:59:00Z" | ||||
| } | ||||
| }, | ||||
| { | ||||
| "name": "eth3", | ||||
| "type": "iana-if-type:ethernetCsmacd", | ||||
| "oper-status": "up", | ||||
| "statistics": { | ||||
| "discontinuity-time": "2020-10-02T23:59:00Z" | ||||
| } | ||||
| }, | ||||
| { | ||||
| "name": "eth4", | ||||
| "type": "iana-if-type:ethernetCsmacd", | ||||
| "oper-status": "up", | ||||
| "statistics": { | ||||
| "discontinuity-time": "2020-10-02T23:59:00Z" | ||||
| } | ||||
| } | ||||
| ] | ||||
| }, | ||||
| "ietf-detnet:detnet": { | "ietf-detnet:detnet": { | |||
| "app-flows": { | ||||
| "app-flow": [ | ||||
| { | ||||
| "name": "app-1", | ||||
| "app-flow-bidir-congruent": false, | ||||
| "outgoing-service": "ssl-1", | ||||
| "traffic-profile": "1", | ||||
| "ingress": { | ||||
| "app-flow-status": "ready", | ||||
| "interface": "eth0", | ||||
| "ip-app-flow": { | ||||
| "src-ip-prefix": "1.1.1.1/32", | ||||
| "dest-ip-prefix": "8.8.8.8/32", | ||||
| "dscp": 6 | ||||
| } | ||||
| } | ||||
| }, | ||||
| { | ||||
| "name": "app-2", | ||||
| "app-flow-bidir-congruent": false, | ||||
| "outgoing-service": "ssl-2", | ||||
| "traffic-profile": "1", | ||||
| "ingress": { | ||||
| "app-flow-status": "ready", | ||||
| "interface": "eth0", | ||||
| "ip-app-flow": { | ||||
| "src-ip-prefix": "1.1.1.2/32", | ||||
| "dest-ip-prefix": "8.8.8.9/32", | ||||
| "dscp": 7 | ||||
| } | ||||
| } | ||||
| } | ||||
| ] | ||||
| }, | ||||
| "traffic-profile": [ | "traffic-profile": [ | |||
| { | { | |||
| "profile-name": "1", | "name": "1", | |||
| "traffic-requirements": { | "traffic-requirements": { | |||
| "min-bandwidth": "100000000", | "min-bandwidth": "100000000", | |||
| "max-latency": 100000000, | "max-latency": 100000000, | |||
| "max-latency-variation": 200000000, | "max-latency-variation": 200000000, | |||
| "max-loss": 2, | "max-loss": 2, | |||
| "max-consecutive-loss-tolerance": 5, | "max-consecutive-loss-tolerance": 5, | |||
| "max-misordering": 0 | "max-misordering": 0 | |||
| }, | }, | |||
| "member-apps": [ | "member-apps": [ | |||
| "app-1", | "app-1", | |||
| skipping to change at page 57, line 14 ¶ | skipping to change at page 62, line 4 ¶ | |||
| "min-bandwidth": "100000000", | "min-bandwidth": "100000000", | |||
| "max-latency": 100000000, | "max-latency": 100000000, | |||
| "max-latency-variation": 200000000, | "max-latency-variation": 200000000, | |||
| "max-loss": 2, | "max-loss": 2, | |||
| "max-consecutive-loss-tolerance": 5, | "max-consecutive-loss-tolerance": 5, | |||
| "max-misordering": 0 | "max-misordering": 0 | |||
| }, | }, | |||
| "member-apps": [ | "member-apps": [ | |||
| "app-1", | "app-1", | |||
| "app-2" | "app-2" | |||
| ] | ] | |||
| }, | }, | |||
| { | { | |||
| "profile-name": "2", | "name": "2", | |||
| "traffic-requirements": { | "traffic-requirements": { | |||
| "min-bandwidth": "100000000", | "min-bandwidth": "100000000", | |||
| "max-latency": 100000000, | "max-latency": 100000000, | |||
| "max-latency-variation": 200000000, | "max-latency-variation": 200000000, | |||
| "max-loss": 2, | "max-loss": 2, | |||
| "max-consecutive-loss-tolerance": 5, | "max-consecutive-loss-tolerance": 5, | |||
| "max-misordering": 0 | "max-misordering": 0 | |||
| }, | }, | |||
| "member-services": [ | "member-services": [ | |||
| "ssl-1", | "ssl-1", | |||
| "ssl-2" | "ssl-2" | |||
| ] | ] | |||
| }, | }, | |||
| { | { | |||
| "profile-name": "3", | "name": "3", | |||
| "flow-spec": { | "traffic-spec": { | |||
| "interval": 5, | "interval": 5, | |||
| "max-pkts-per-interval": 10, | "max-pkts-per-interval": 10, | |||
| "max-payload-size": 1500 | "max-payload-size": 1500 | |||
| }, | }, | |||
| "member-fwd-sublayers": [ | "member-fwd-sublayers": [ | |||
| "afl-1" | "afl-1" | |||
| ] | ] | |||
| } | } | |||
| ], | ], | |||
| "service-sub-layer": { | "app-flows": { | |||
| "service-sub-layer-list": [ | "app-flow": [ | |||
| { | ||||
| "name": "app-1", | ||||
| "bidir-congruent": false, | ||||
| "outgoing-service": "ssl-1", | ||||
| "traffic-profile": "1", | ||||
| "ingress": { | ||||
| "app-flow-status": "ietf-detnet:ready", | ||||
| "interface": "eth0", | ||||
| "ip-app-flow": { | ||||
| "src-ip-prefix": "192.0.2.1/32", | ||||
| "dest-ip-prefix": "192.0.2.8/32", | ||||
| "dscp": 6 | ||||
| } | ||||
| } | ||||
| }, | ||||
| { | ||||
| "name": "app-2", | ||||
| "bidir-congruent": false, | ||||
| "outgoing-service": "ssl-2", | ||||
| "traffic-profile": "1", | ||||
| "ingress": { | ||||
| "app-flow-status": "ietf-detnet:ready", | ||||
| "interface": "eth0", | ||||
| "ip-app-flow": { | ||||
| "src-ip-prefix": "192.0.2.2/32", | ||||
| "dest-ip-prefix": "192.0.2.9/32", | ||||
| "dscp": 7 | ||||
| } | ||||
| } | ||||
| } | ||||
| ] | ||||
| }, | ||||
| "service": { | ||||
| "sub-layer": [ | ||||
| { | { | |||
| "name": "ssl-1", | "name": "ssl-1", | |||
| "service-rank": 10, | "service-rank": 10, | |||
| "traffic-profile": "2", | "traffic-profile": "2", | |||
| "service-protection": { | "service-protection": { | |||
| "service-protection-type": "none", | "protection": "none", | |||
| "sequence-number-length": "long-sn" | "sequence-number-length": "long-sn" | |||
| }, | }, | |||
| "service-operation-type": "service-initiation", | "operation": "initiation", | |||
| "incoming-type": { | "incoming": { | |||
| "app-flow": { | "app-flow": { | |||
| "app-flow-list": [ | "flow": [ | |||
| "app-1" | "app-1" | |||
| ] | ] | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "aggregation-service-sub-layer": "asl-1", | "aggregation-sub-layer": "asl-1", | |||
| "service-label": { | "service-label": { | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 102 | "label": "102" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "ssl-2", | "name": "ssl-2", | |||
| "service-rank": 10, | "service-rank": 10, | |||
| "traffic-profile": "2", | "traffic-profile": "2", | |||
| "service-operation-type": "service-initiation", | ||||
| "service-protection": { | "service-protection": { | |||
| "service-protection-type": "none", | "protection": "none", | |||
| "sequence-number-length": "long-sn" | "sequence-number-length": "long-sn" | |||
| }, | }, | |||
| "incoming-type": { | "operation": "initiation", | |||
| "incoming": { | ||||
| "app-flow": { | "app-flow": { | |||
| "app-flow-list": [ | "flow": [ | |||
| "app-2" | "app-2" | |||
| ] | ] | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "aggregation-service-sub-layer": "asl-1", | "aggregation-sub-layer": "asl-1", | |||
| "service-label": { | "service-label": { | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 105 | "label": "105" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "asl-1", | "name": "asl-1", | |||
| "service-rank": 10, | "service-rank": 10, | |||
| "traffic-profile": "2", | ||||
| "service-protection": { | "service-protection": { | |||
| "service-protection-type": "none", | "protection": "none", | |||
| "sequence-number-length": "long-sn" | "sequence-number-length": "long-sn" | |||
| }, | }, | |||
| "incoming-type": { | "operation": "initiation", | |||
| "incoming": { | ||||
| "service-aggregation": { | "service-aggregation": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-1", | "ssl-1", | |||
| "ssl-2" | "ssl-2" | |||
| ] | ] | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "forwarding-sub-layer": { | "forwarding-sub-layer": { | |||
| "service-outgoing-list": [ | "service-outgoing": [ | |||
| { | { | |||
| "service-outgoing-index": 0, | "index": 0, | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 1000 | "label": "1000" | |||
| } | } | |||
| ] | ] | |||
| }, | }, | |||
| "forwarding-sub-layer": [ | "sub-layer": [ | |||
| "afl-1" | "afl-1" | |||
| ] | ] | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| }, | }, | |||
| "forwarding-sub-layer": { | "forwarding": { | |||
| "forwarding-sub-layer-list": [ | "sub-layer": [ | |||
| { | { | |||
| "name": "afl-1", | "name": "afl-1", | |||
| "traffic-profile": "3", | "traffic-profile": "3", | |||
| "forwarding-operation-type": "impose-and-forward", | "operation": "impose-and-forward", | |||
| "incoming-type": { | "incoming": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "asl-1" | "asl-1" | |||
| ] | ] | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "interface": { | "interface": { | |||
| "outgoing-interface": "eth2", | "outgoing-interface": "eth2", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 20000 | "label": "20000" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | }, | |||
| } | ||||
| Figure 7: Example B-2 DetNet JSON Service Aggregation | ||||
| A.4. Example C-1 JSON Relay Aggregation/Disaggregation Configuration | ||||
| This illustrates the Relay node 1 aggregating the forwarding sub- | ||||
| layers of DetNet flows 1 and 2 into a forwarding sub-layer. A | ||||
| diagram illustrating both aggregation and disaggregation is shown and | ||||
| then the corresponding JSON operational data follows. | ||||
| Please consult the PDF or HTML versions for the Case C-1 Diagram. | ||||
| Figure 8: Case C-1 Example JSON Service Aggregation/Disaggregation | ||||
| { | ||||
| "ietf-interfaces:interfaces": { | "ietf-interfaces:interfaces": { | |||
| "interface": [ | "interface": [ | |||
| { | { | |||
| "name": "eth0", | "name": "eth0", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-10-02T19:59:00-04:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth1", | "name": "eth1", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-10-02T19:59:00-04:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth2", | "name": "eth2", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-10-02T19:59:00-04:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth3", | "name": "eth3", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-10-02T19:59:00-04:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth4", | "name": "eth4", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-10-02T19:59:00-04:00" | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| }, | } | |||
| } | ||||
| Figure 8: Example B-2 DetNet JSON Service Aggregation | ||||
| B.4. Example C-1 JSON Relay Aggregation/Disaggregation Configuration | ||||
| This illustrates the Relay node 1 aggregating the forwarding sub- | ||||
| layers of DetNet flows 1 and 2 into a forwarding sub-layer. A | ||||
| diagram illustrating both aggregation and disaggregation is shown and | ||||
| then the corresponding JSON operational data follows. | ||||
| Please consult the PDF or HTML versions for the Case C-1 Diagram. | ||||
| Figure 9: Case C-1 Example JSON Service Aggregation/Disaggregation | ||||
| { | ||||
| "ietf-detnet:detnet": { | "ietf-detnet:detnet": { | |||
| "traffic-profile": [ | "traffic-profile": [ | |||
| { | { | |||
| "profile-name": "pf-1", | "name": "pf-1", | |||
| "traffic-requirements": { | "traffic-requirements": { | |||
| "min-bandwidth": "100000000", | "min-bandwidth": "100000000", | |||
| "max-latency": 100000000, | "max-latency": 100000000, | |||
| "max-latency-variation": 100000000, | "max-latency-variation": 100000000, | |||
| "max-loss": 2, | "max-loss": 2, | |||
| "max-consecutive-loss-tolerance": 5, | "max-consecutive-loss-tolerance": 5, | |||
| "max-misordering": 0 | "max-misordering": 0 | |||
| }, | }, | |||
| "member-services": [ | "member-services": [ | |||
| "ssl-1", | "ssl-1", | |||
| "ssl-2" | "ssl-2" | |||
| ] | ] | |||
| }, | }, | |||
| { | { | |||
| "profile-name": "pf-2", | "name": "pf-2", | |||
| "flow-spec": { | "traffic-spec": { | |||
| "interval": 125, | "interval": 125, | |||
| "max-pkts-per-interval": 2, | "max-pkts-per-interval": 2, | |||
| "max-payload-size": 1518 | "max-payload-size": 1518 | |||
| }, | }, | |||
| "member-fwd-sublayers": [ | "member-fwd-sublayers": [ | |||
| "afl-1", | "afl-1", | |||
| "afl-2" | "afl-2" | |||
| ] | ] | |||
| }, | }, | |||
| { | { | |||
| "profile-name": "pf-3", | "name": "pf-3", | |||
| "flow-spec": { | "traffic-spec": { | |||
| "interval": 125, | "interval": 125, | |||
| "max-pkts-per-interval": 1, | "max-pkts-per-interval": 1, | |||
| "max-payload-size": 1518 | "max-payload-size": 1518 | |||
| }, | }, | |||
| "member-fwd-sublayers": [ | "member-fwd-sublayers": [ | |||
| "fsl-1", | "fsl-1", | |||
| "fsl-2", | "fsl-2", | |||
| "fsl-3", | "fsl-3", | |||
| "fsl-4", | "fsl-4", | |||
| "fsl-5", | "fsl-5", | |||
| "fsl-6" | "fsl-6" | |||
| ] | ] | |||
| } | } | |||
| ], | ], | |||
| "service-sub-layer": { | "service": { | |||
| "service-sub-layer-list": [ | "sub-layer": [ | |||
| { | { | |||
| "name": "ssl-1", | "name": "ssl-1", | |||
| "service-rank": 10, | "service-rank": 10, | |||
| "traffic-profile": "pf-1", | "traffic-profile": "pf-1", | |||
| "service-protection": { | "service-protection": { | |||
| "service-protection-type": "replication", | "protection": "replication", | |||
| "sequence-number-length": "long-sn" | "sequence-number-length": "long-sn" | |||
| }, | }, | |||
| "service-operation-type": "service-relay", | "operation": "relay", | |||
| "incoming-type": { | "incoming": { | |||
| "service-id": { | "service-id": { | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 100 | "label": "100" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "forwarding-sub-layer": { | "forwarding-sub-layer": { | |||
| "service-outgoing-list": [ | "service-outgoing": [ | |||
| { | { | |||
| "service-outgoing-index": 0, | "index": 0, | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 101 | "label": "101" | |||
| } | } | |||
| ] | ] | |||
| }, | }, | |||
| "forwarding-sub-layer": [ | "sub-layer": [ | |||
| "fsl-2", | "fsl-2", | |||
| "fsl-3" | "fsl-3" | |||
| ] | ] | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "ssl-2", | "name": "ssl-2", | |||
| "service-rank": 10, | "service-rank": 10, | |||
| "traffic-profile": "pf-1", | "traffic-profile": "pf-1", | |||
| "service-protection": { | "service-protection": { | |||
| "service-protection-type": "replication", | "protection": "replication", | |||
| "sequence-number-length": "long-sn" | "sequence-number-length": "long-sn" | |||
| }, | }, | |||
| "service-operation-type": "service-relay", | "operation": "relay", | |||
| "incoming-type": { | "incoming": { | |||
| "service-id": { | "service-id": { | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 103 | "label": "103" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "forwarding-sub-layer": { | "forwarding-sub-layer": { | |||
| "service-outgoing-list": [ | "service-outgoing": [ | |||
| { | { | |||
| "service-outgoing-index": 0, | "index": 0, | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 104 | "label": "104" | |||
| } | } | |||
| ] | ] | |||
| }, | }, | |||
| "forwarding-sub-layer": [ | "sub-layer": [ | |||
| "fsl-5", | "fsl-5", | |||
| "fsl-6" | "fsl-6" | |||
| ] | ] | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| }, | }, | |||
| "forwarding-sub-layer": { | "forwarding": { | |||
| "forwarding-sub-layer-list": [ | "sub-layer": [ | |||
| { | { | |||
| "name": "fsl-1", | "name": "fsl-1", | |||
| "traffic-profile": "pf-3", | "traffic-profile": "pf-3", | |||
| "forwarding-operation-type": "pop-and-lookup", | "operation": "pop-and-lookup", | |||
| "incoming-type": { | "incoming": { | |||
| "forwarding-id": { | "forwarding-id": { | |||
| "interface": "eth0", | "interface": "eth0", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10000 | "label": "10000" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-1" | "ssl-1" | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-2", | "name": "fsl-2", | |||
| "traffic-profile": "pf-3", | "traffic-profile": "pf-3", | |||
| "forwarding-operation-type": "impose-and-forward", | "operation": "impose-and-forward", | |||
| "incoming-type": { | "incoming": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-1" | "ssl-1" | |||
| ] | ] | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "forwarding-sub-layer": { | "forwarding-sub-layer": { | |||
| "aggregation-forwarding-sub-layer": "afl-1", | "aggregation-sub-layer": "afl-1", | |||
| "forwarding-label": { | "forwarding-label": { | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10003 | "label": "10003" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-3", | "name": "fsl-3", | |||
| "traffic-profile": "pf-3", | "traffic-profile": "pf-3", | |||
| "forwarding-operation-type": "impose-and-forward", | "operation": "impose-and-forward", | |||
| "incoming-type": { | "incoming": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-1" | "ssl-1" | |||
| ] | ] | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "forwarding-sub-layer": { | "forwarding-sub-layer": { | |||
| "aggregation-forwarding-sub-layer": "afl-2", | "aggregation-sub-layer": "afl-2", | |||
| "forwarding-label": { | "forwarding-label": { | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10004 | "label": "10004" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-4", | "name": "fsl-4", | |||
| "traffic-profile": "pf-3", | "traffic-profile": "pf-3", | |||
| "forwarding-operation-type": "pop-and-lookup", | "operation": "pop-and-lookup", | |||
| "incoming-type": { | "incoming": { | |||
| "forwarding-id": { | "forwarding-id": { | |||
| "interface": "eth1", | "interface": "eth1", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10006 | "label": "10006" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-2" | "ssl-2" | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-5", | "name": "fsl-5", | |||
| "traffic-profile": "pf-3", | "traffic-profile": "pf-3", | |||
| "forwarding-operation-type": "impose-and-forward", | "operation": "impose-and-forward", | |||
| "incoming-type": { | "incoming": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-2" | "ssl-2" | |||
| ] | ] | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "forwarding-sub-layer": { | "forwarding-sub-layer": { | |||
| "aggregation-forwarding-sub-layer": "afl-1", | "aggregation-sub-layer": "afl-1", | |||
| "forwarding-label": { | "forwarding-label": { | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10009 | "label": "10009" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-6", | "name": "fsl-6", | |||
| "traffic-profile": "pf-3", | "traffic-profile": "pf-3", | |||
| "forwarding-operation-type": "impose-and-forward", | "operation": "impose-and-forward", | |||
| "incoming-type": { | "incoming": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-2" | "ssl-2" | |||
| ] | ] | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "forwarding-sub-layer": { | "forwarding-sub-layer": { | |||
| "aggregation-forwarding-sub-layer": "afl-2", | "aggregation-sub-layer": "afl-2", | |||
| "forwarding-label": { | "forwarding-label": { | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10010 | "label": "10010" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "afl-1", | "name": "afl-1", | |||
| "traffic-profile": "pf-2", | "traffic-profile": "pf-2", | |||
| "forwarding-operation-type": "impose-and-forward", | "operation": "impose-and-forward", | |||
| "incoming-type": { | "incoming": { | |||
| "forwarding-aggregation": { | "forwarding-aggregation": { | |||
| "forwarding-sub-layer": [ | "sub-layer": [ | |||
| "fsl-2", | "fsl-2", | |||
| "fsl-5" | "fsl-5" | |||
| ] | ] | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "interface": { | "interface": { | |||
| "outgoing-interface": "eth2", | "outgoing-interface": "eth2", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 20000 | "label": "20000" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "afl-2", | "name": "afl-2", | |||
| "traffic-profile": "pf-2", | "traffic-profile": "pf-2", | |||
| "forwarding-operation-type": "impose-and-forward", | "operation": "impose-and-forward", | |||
| "incoming-type": { | "incoming": { | |||
| "forwarding-aggregation": { | "forwarding-aggregation": { | |||
| "forwarding-sub-layer": [ | "sub-layer": [ | |||
| "fsl-3", | "fsl-3", | |||
| "fsl-6" | "fsl-6" | |||
| ] | ] | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "interface": { | "interface": { | |||
| "outgoing-interface": "eth3", | "outgoing-interface": "eth3", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 20001 | "label": "20001" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | }, | |||
| } | ||||
| Figure 9: Example C-1 DetNet JSON Relay Service Aggregation | ||||
| { | ||||
| "ietf-interfaces:interfaces": { | "ietf-interfaces:interfaces": { | |||
| "interface": [ | "interface": [ | |||
| { | { | |||
| "name": "eth0", | "name": "eth0", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth1", | "name": "eth1", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth2", | "name": "eth2", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth3", | "name": "eth3", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth4", | "name": "eth4", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| }, | } | |||
| } | ||||
| Figure 10: Example C-1 DetNet JSON Relay Service Aggregation | ||||
| { | ||||
| "ietf-detnet:detnet": { | "ietf-detnet:detnet": { | |||
| "traffic-profile": [ | "traffic-profile": [ | |||
| { | { | |||
| "profile-name": "pf-1", | "name": "pf-1", | |||
| "traffic-requirements": { | "traffic-requirements": { | |||
| "min-bandwidth": "100000000", | "min-bandwidth": "100000000", | |||
| "max-latency": 100000000, | "max-latency": 100000000, | |||
| "max-latency-variation": 100000000, | "max-latency-variation": 100000000, | |||
| "max-loss": 2, | "max-loss": 2, | |||
| "max-consecutive-loss-tolerance": 5, | "max-consecutive-loss-tolerance": 5, | |||
| "max-misordering": 0 | "max-misordering": 0 | |||
| }, | }, | |||
| "member-services": [ | "member-services": [ | |||
| "ssl-1", | "ssl-1", | |||
| "ssl-2" | "ssl-2" | |||
| ] | ] | |||
| }, | }, | |||
| { | { | |||
| "profile-name": "pf-2", | "name": "pf-2", | |||
| "flow-spec": { | "traffic-spec": { | |||
| "interval": 125, | "interval": 125, | |||
| "max-pkts-per-interval": 2, | "max-pkts-per-interval": 2, | |||
| "max-payload-size": 1518 | "max-payload-size": 1518 | |||
| }, | }, | |||
| "member-fwd-sublayers": [ | "member-fwd-sublayers": [ | |||
| "afl-1", | "afl-1", | |||
| "afl-2" | "afl-2" | |||
| ] | ] | |||
| }, | }, | |||
| { | { | |||
| "profile-name": "pf-3", | "name": "pf-3", | |||
| "flow-spec": { | "traffic-spec": { | |||
| "interval": 125, | "interval": 125, | |||
| "max-pkts-per-interval": 1, | "max-pkts-per-interval": 1, | |||
| "max-payload-size": 1518 | "max-payload-size": 1518 | |||
| }, | }, | |||
| "member-fwd-sublayers": [ | "member-fwd-sublayers": [ | |||
| "fsl-1", | "fsl-1", | |||
| "fsl-2", | "fsl-2", | |||
| "fsl-3", | "fsl-3", | |||
| "fsl-4", | "fsl-4", | |||
| "fsl-5", | "fsl-5", | |||
| "fsl-6" | "fsl-6" | |||
| ] | ] | |||
| } | } | |||
| ], | ], | |||
| "service-sub-layer": { | "service": { | |||
| "service-sub-layer-list": [ | "sub-layer": [ | |||
| { | { | |||
| "name": "ssl-1", | "name": "ssl-1", | |||
| "service-rank": 10, | "service-rank": 10, | |||
| "traffic-profile": "pf-1", | "traffic-profile": "pf-1", | |||
| "service-protection": { | "service-protection": { | |||
| "service-protection-type": "elimination", | "protection": "elimination", | |||
| "sequence-number-length": "long-sn" | "sequence-number-length": "long-sn" | |||
| }, | }, | |||
| "service-operation-type": "service-relay", | "operation": "relay", | |||
| "incoming-type": { | "incoming": { | |||
| "service-id": { | "service-id": { | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 101 | "label": "101" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "forwarding-sub-layer": { | "forwarding-sub-layer": { | |||
| "service-outgoing-list": [ | "service-outgoing": [ | |||
| { | { | |||
| "service-outgoing-index": 0, | "index": 0, | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 102 | "label": "102" | |||
| } | } | |||
| ] | ] | |||
| }, | }, | |||
| "forwarding-sub-layer": [ | "sub-layer": [ | |||
| "fsl-3" | "fsl-3" | |||
| ] | ] | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "ssl-2", | "name": "ssl-2", | |||
| "service-rank": 10, | "service-rank": 10, | |||
| "traffic-profile": "pf-1", | "traffic-profile": "pf-1", | |||
| "service-protection": { | "service-protection": { | |||
| "service-protection-type": "elimination", | "protection": "elimination", | |||
| "sequence-number-length": "long-sn" | "sequence-number-length": "long-sn" | |||
| }, | }, | |||
| "service-operation-type": "service-relay", | "operation": "relay", | |||
| "incoming-type": { | "incoming": { | |||
| "service-id": { | "service-id": { | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 104 | "label": "104" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "forwarding-sub-layer": { | "forwarding-sub-layer": { | |||
| "service-outgoing-list": [ | "service-outgoing": [ | |||
| { | { | |||
| "service-outgoing-index": 0, | "index": 0, | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 105 | "label": "105" | |||
| } | } | |||
| ] | ] | |||
| }, | }, | |||
| "forwarding-sub-layer": [ | "sub-layer": [ | |||
| "fsl-6" | "fsl-6" | |||
| ] | ] | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| }, | }, | |||
| "forwarding-sub-layer": { | "forwarding": { | |||
| "forwarding-sub-layer-list": [ | "sub-layer": [ | |||
| { | { | |||
| "name": "afl-1", | "name": "afl-1", | |||
| "traffic-profile": "pf-2", | "traffic-profile": "pf-2", | |||
| "forwarding-operation-type": "pop-and-lookup", | "operation": "pop-and-lookup", | |||
| "incoming-type": { | "incoming": { | |||
| "forwarding-id": { | "forwarding-id": { | |||
| "interface": "eth0", | "interface": "eth0", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 20002 | "label": "20002" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "forwarding-disaggregation": { | "forwarding-disaggregation": { | |||
| "forwarding-sub-layer": [ | "sub-layer": [ | |||
| "fsl-1", | "fsl-1", | |||
| "fsl-4" | "fsl-4" | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "afl-2", | "name": "afl-2", | |||
| "traffic-profile": "pf-2", | "traffic-profile": "pf-2", | |||
| "forwarding-operation-type": "pop-and-lookup", | "operation": "pop-and-lookup", | |||
| "incoming-type": { | "incoming": { | |||
| "forwarding-id": { | "forwarding-id": { | |||
| "interface": "eth1", | "interface": "eth1", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 20003 | "label": "20003" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "forwarding-disaggregation": { | "forwarding-disaggregation": { | |||
| "forwarding-sub-layer": [ | "sub-layer": [ | |||
| "fsl-2", | "fsl-2", | |||
| "fsl-5" | "fsl-5" | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-1", | "name": "fsl-1", | |||
| "traffic-profile": "pf-3", | "traffic-profile": "pf-3", | |||
| "forwarding-operation-type": "pop-and-lookup", | "operation": "pop-and-lookup", | |||
| "incoming-type": { | "incoming": { | |||
| "forwarding-id": { | "forwarding-id": { | |||
| "interface": "eth0", | "interface": "eth0", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10003 | "label": "10003" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-1" | "ssl-1" | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-2", | "name": "fsl-2", | |||
| "traffic-profile": "pf-3", | "traffic-profile": "pf-3", | |||
| "forwarding-operation-type": "pop-and-lookup", | "operation": "pop-and-lookup", | |||
| "incoming-type": { | "incoming": { | |||
| "forwarding-id": { | "forwarding-id": { | |||
| "interface": "eth1", | "interface": "eth1", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10004 | "label": "10004" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-1" | "ssl-1" | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-3", | "name": "fsl-3", | |||
| "traffic-profile": "pf-3", | "traffic-profile": "pf-3", | |||
| "forwarding-operation-type": "impose-and-forward", | "operation": "impose-and-forward", | |||
| "incoming-type": { | "incoming": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-1" | "ssl-1" | |||
| ] | ] | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "interface": { | "interface": { | |||
| "outgoing-interface": "eth2", | "outgoing-interface": "eth2", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10005 | "label": "10005" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-4", | "name": "fsl-4", | |||
| "traffic-profile": "pf-3", | "traffic-profile": "pf-3", | |||
| "forwarding-operation-type": "pop-and-lookup", | "operation": "pop-and-lookup", | |||
| "incoming-type": { | "incoming": { | |||
| "forwarding-id": { | "forwarding-id": { | |||
| "interface": "eth0", | "interface": "eth0", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10009 | "label": "10009" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-2" | "ssl-2" | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-5", | "name": "fsl-5", | |||
| "traffic-profile": "pf-3", | "traffic-profile": "pf-3", | |||
| "forwarding-operation-type": "pop-and-lookup", | "operation": "pop-and-lookup", | |||
| "incoming-type": { | "incoming": { | |||
| "forwarding-id": { | "forwarding-id": { | |||
| "interface": "eth1", | "interface": "eth1", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10010 | "label": "10010" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-2" | "ssl-2" | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-6", | "name": "fsl-6", | |||
| "traffic-profile": "pf-3", | "traffic-profile": "pf-3", | |||
| "forwarding-operation-type": "impose-and-forward", | "operation": "impose-and-forward", | |||
| "incoming-type": { | "incoming": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-2" | "ssl-2" | |||
| ] | ] | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "interface": { | "interface": { | |||
| "outgoing-interface": "eth3", | "outgoing-interface": "eth3", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10011 | "label": "10011" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | }, | |||
| } | ||||
| Figure 10: Example C-1 DetNet JSON Relay Service Disaggregation | ||||
| A.5. Example C-2 JSON Relay Aggregation Service Sub-Layer | ||||
| This illustrates the Relay node 1 aggregating the service sub-layers | ||||
| of DetNet flows 1 and 2 into a forwarding sub-layer A diagram | ||||
| illustrating both aggregation and disaggregation is shown and then | ||||
| the corresponding JSON operational data follows. | ||||
| Please consult the PDF or HTML versions for the Case C-2 Diagram. | ||||
| Figure 11: Case C-2 Example JSON Service Aggregation/Disaggregation | ||||
| { | ||||
| "ietf-interfaces:interfaces": { | "ietf-interfaces:interfaces": { | |||
| "interface": [ | "interface": [ | |||
| { | { | |||
| "name": "eth0", | "name": "eth0", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth1", | "name": "eth1", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth2", | "name": "eth2", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth3", | "name": "eth3", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth4", | "name": "eth4", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| }, | } | |||
| } | ||||
| Figure 11: Example C-1 DetNet JSON Relay Service Disaggregation | ||||
| B.5. Example C-2 JSON Relay Aggregation Service Sub-Layer | ||||
| This illustrates the Relay node 1 aggregating the service sub-layers | ||||
| of DetNet flows 1 and 2 into a forwarding sub-layer A diagram | ||||
| illustrating both aggregation and disaggregation is shown and then | ||||
| the corresponding JSON operational data follows. | ||||
| Please consult the PDF or HTML versions for the Case C-2 Diagram. | ||||
| Figure 12: Case C-2 Example JSON Service Aggregation/Disaggregation | ||||
| { | ||||
| "ietf-detnet:detnet": { | "ietf-detnet:detnet": { | |||
| "traffic-profile": [ | "traffic-profile": [ | |||
| { | { | |||
| "profile-name": "pf-1", | "name": "pf-1", | |||
| "traffic-requirements": { | "traffic-requirements": { | |||
| "min-bandwidth": "100000000", | "min-bandwidth": "100000000", | |||
| "max-latency": 100000000, | "max-latency": 100000000, | |||
| "max-latency-variation": 100000000, | "max-latency-variation": 100000000, | |||
| "max-loss": 2, | "max-loss": 2, | |||
| "max-consecutive-loss-tolerance": 5, | "max-consecutive-loss-tolerance": 5, | |||
| "max-misordering": 0 | "max-misordering": 0 | |||
| }, | }, | |||
| "member-services": [ | "member-services": [ | |||
| "ssl-1", | "ssl-1", | |||
| "ssl-2" | "ssl-2" | |||
| ] | ] | |||
| }, | }, | |||
| { | { | |||
| "profile-name": "pf-2", | "name": "pf-2", | |||
| "flow-spec": { | "traffic-spec": { | |||
| "interval": 125, | "interval": 125, | |||
| "max-pkts-per-interval": 1, | "max-pkts-per-interval": 1, | |||
| "max-payload-size": 1518 | "max-payload-size": 1518 | |||
| }, | }, | |||
| "member-fwd-sublayers": [ | "member-fwd-sublayers": [ | |||
| "fsl-1", | "fsl-1", | |||
| "fsl-2" | "fsl-2" | |||
| ] | ] | |||
| }, | }, | |||
| { | { | |||
| "profile-name": "pf-3", | "name": "pf-3", | |||
| "flow-spec": { | "traffic-spec": { | |||
| "interval": 125, | "interval": 125, | |||
| "max-pkts-per-interval": 2, | "max-pkts-per-interval": 2, | |||
| "max-payload-size": 1518 | "max-payload-size": 1518 | |||
| }, | }, | |||
| "member-fwd-sublayers": [ | "member-fwd-sublayers": [ | |||
| "afl-1", | "afl-1", | |||
| "afl-2" | "afl-2" | |||
| ] | ] | |||
| } | } | |||
| ], | ], | |||
| "service-sub-layer": { | "service": { | |||
| "service-sub-layer-list": [ | "sub-layer": [ | |||
| { | { | |||
| "name": "ssl-1", | "name": "ssl-1", | |||
| "service-rank": 10, | "service-rank": 10, | |||
| "traffic-profile": "pf-1", | "traffic-profile": "pf-1", | |||
| "service-protection": { | "service-protection": { | |||
| "service-protection-type": "replication", | "protection": "replication", | |||
| "sequence-number-length": "long-sn" | "sequence-number-length": "long-sn" | |||
| }, | }, | |||
| "service-operation-type": "service-relay", | "operation": "relay", | |||
| "incoming-type": { | "incoming": { | |||
| "service-id": { | "service-id": { | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 100 | "label": "100" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "forwarding-sub-layer": { | "forwarding-sub-layer": { | |||
| "service-outgoing-list": [ | "service-outgoing": [ | |||
| { | { | |||
| "service-outgoing-index": 0, | "index": 0, | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 101 | "label": "101" | |||
| } | } | |||
| ] | ] | |||
| }, | }, | |||
| "forwarding-sub-layer": [ | "sub-layer": [ | |||
| "afl-1", | "afl-1", | |||
| "afl-2" | "afl-2" | |||
| ] | ] | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "ssl-2", | "name": "ssl-2", | |||
| "service-rank": 10, | "service-rank": 10, | |||
| "traffic-profile": "pf-1", | "traffic-profile": "pf-1", | |||
| "service-protection": { | "service-protection": { | |||
| "service-protection-type": "replication", | "protection": "replication", | |||
| "sequence-number-length": "long-sn" | "sequence-number-length": "long-sn" | |||
| }, | }, | |||
| "service-operation-type": "service-relay", | "operation": "relay", | |||
| "incoming-type": { | "incoming": { | |||
| "service-id": { | "service-id": { | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 103 | "label": "103" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "forwarding-sub-layer": { | "forwarding-sub-layer": { | |||
| "service-outgoing-list": [ | "service-outgoing": [ | |||
| { | { | |||
| "service-outgoing-index": 0, | "index": 0, | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 104 | "label": "104" | |||
| } | } | |||
| ] | ] | |||
| }, | }, | |||
| "forwarding-sub-layer": [ | "sub-layer": [ | |||
| "afl-1", | "afl-1", | |||
| "afl-2" | "afl-2" | |||
| ] | ] | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| }, | }, | |||
| "forwarding-sub-layer": { | "forwarding": { | |||
| "forwarding-sub-layer-list": [ | "sub-layer": [ | |||
| { | { | |||
| "name": "fsl-1", | "name": "fsl-1", | |||
| "traffic-profile": "pf-2", | "traffic-profile": "pf-2", | |||
| "forwarding-operation-type": "pop-and-lookup", | "operation": "pop-and-lookup", | |||
| "incoming-type": { | "incoming": { | |||
| "forwarding-id": { | "forwarding-id": { | |||
| "interface": "eth0", | "interface": "eth0", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10000 | "label": "10000" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-1" | "ssl-1" | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-2", | "name": "fsl-2", | |||
| "traffic-profile": "pf-2", | "traffic-profile": "pf-2", | |||
| "forwarding-operation-type": "pop-and-lookup", | "operation": "pop-and-lookup", | |||
| "incoming-type": { | "incoming": { | |||
| "forwarding-id": { | "forwarding-id": { | |||
| "interface": "eth1", | "interface": "eth1", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10006 | "label": "10006" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-2" | "ssl-2" | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "afl-1", | "name": "afl-1", | |||
| "traffic-profile": "pf-3", | "traffic-profile": "pf-3", | |||
| "forwarding-operation-type": "impose-and-forward", | "operation": "impose-and-forward", | |||
| "incoming-type": { | "incoming": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-1", | "ssl-1", | |||
| "ssl-2" | "ssl-2" | |||
| ] | ] | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "interface": { | "interface": { | |||
| "outgoing-interface": "eth2", | "outgoing-interface": "eth2", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 20000 | "label": "20000" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "afl-2", | "name": "afl-2", | |||
| "traffic-profile": "pf-3", | "traffic-profile": "pf-3", | |||
| "forwarding-operation-type": "impose-and-forward", | "operation": "impose-and-forward", | |||
| "incoming-type": { | "incoming": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-1", | "ssl-1", | |||
| "ssl-2" | "ssl-2" | |||
| ] | ] | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "interface": { | "interface": { | |||
| "outgoing-interface": "eth3", | "outgoing-interface": "eth3", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 20001 | "label": "20001" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| } | ||||
| } | ||||
| } | ||||
| Figure 12: Example C-2 DetNet JSON Relay Aggregation Service Sub- | ||||
| Layer | ||||
| { | } | |||
| }, | ||||
| "ietf-interfaces:interfaces": { | "ietf-interfaces:interfaces": { | |||
| "interface": [ | "interface": [ | |||
| { | { | |||
| "name": "eth0", | "name": "eth0", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth1", | "name": "eth1", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth2", | "name": "eth2", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth3", | "name": "eth3", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth4", | "name": "eth4", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| }, | } | |||
| } | ||||
| Figure 13: Example C-2 DetNet JSON Relay Aggregation Service Sub- | ||||
| Layer | ||||
| { | ||||
| "ietf-detnet:detnet": { | "ietf-detnet:detnet": { | |||
| "traffic-profile": [ | "traffic-profile": [ | |||
| { | { | |||
| "profile-name": "pf-1", | "name": "pf-1", | |||
| "traffic-requirements": { | "traffic-requirements": { | |||
| "min-bandwidth": "100000000", | "min-bandwidth": "100000000", | |||
| "max-latency": 100000000, | "max-latency": 100000000, | |||
| "max-latency-variation": 100000000, | "max-latency-variation": 100000000, | |||
| "max-loss": 2, | "max-loss": 2, | |||
| "max-consecutive-loss-tolerance": 5, | "max-consecutive-loss-tolerance": 5, | |||
| "max-misordering": 0 | "max-misordering": 0 | |||
| }, | }, | |||
| "member-services": [ | "member-services": [ | |||
| "ssl-1", | "ssl-1", | |||
| skipping to change at page 85, line 4 ¶ | skipping to change at page 90, line 24 ¶ | |||
| "max-latency": 100000000, | "max-latency": 100000000, | |||
| "max-latency-variation": 100000000, | "max-latency-variation": 100000000, | |||
| "max-loss": 2, | "max-loss": 2, | |||
| "max-consecutive-loss-tolerance": 5, | "max-consecutive-loss-tolerance": 5, | |||
| "max-misordering": 0 | "max-misordering": 0 | |||
| }, | }, | |||
| "member-services": [ | "member-services": [ | |||
| "ssl-1", | "ssl-1", | |||
| "ssl-2" | "ssl-2" | |||
| ] | ] | |||
| }, | }, | |||
| { | { | |||
| "profile-name": "pf-2", | "name": "pf-2", | |||
| "flow-spec": { | "traffic-spec": { | |||
| "interval": 125, | "interval": 125, | |||
| "max-pkts-per-interval": 1, | "max-pkts-per-interval": 1, | |||
| "max-payload-size": 1518 | "max-payload-size": 1518 | |||
| }, | }, | |||
| "member-fwd-sublayers": [ | "member-fwd-sublayers": [ | |||
| "fsl-1", | "fsl-1", | |||
| "fsl-2" | "fsl-2" | |||
| ] | ] | |||
| }, | }, | |||
| { | { | |||
| "profile-name": "pf-3", | "name": "pf-3", | |||
| "flow-spec": { | "traffic-spec": { | |||
| "interval": 125, | "interval": 125, | |||
| "max-pkts-per-interval": 2, | "max-pkts-per-interval": 2, | |||
| "max-payload-size": 1518 | "max-payload-size": 1518 | |||
| }, | }, | |||
| "member-fwd-sublayers": [ | "member-fwd-sublayers": [ | |||
| "afl-1", | "afl-1", | |||
| "afl-2" | "afl-2" | |||
| ] | ] | |||
| } | } | |||
| ], | ], | |||
| "service-sub-layer": { | "service": { | |||
| "service-sub-layer-list": [ | "sub-layer": [ | |||
| { | { | |||
| "name": "ssl-1", | "name": "ssl-1", | |||
| "service-rank": 10, | "service-rank": 10, | |||
| "traffic-profile": "pf-1", | "traffic-profile": "pf-1", | |||
| "service-protection": { | "service-protection": { | |||
| "service-protection-type": "elimination", | "protection": "elimination", | |||
| "sequence-number-length": "long-sn" | "sequence-number-length": "long-sn" | |||
| }, | }, | |||
| "service-operation-type": "service-relay", | "operation": "relay", | |||
| "incoming-type": { | "incoming": { | |||
| "service-id": { | "service-id": { | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 101 | "label": "101" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "forwarding-sub-layer": { | "forwarding-sub-layer": { | |||
| "service-outgoing-list": [ | "service-outgoing": [ | |||
| { | { | |||
| "service-outgoing-index": 0, | "index": 0, | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 102 | "label": "102" | |||
| } | } | |||
| ] | ] | |||
| }, | }, | |||
| "forwarding-sub-layer": [ | "sub-layer": [ | |||
| "fsl-1" | "fsl-1" | |||
| ] | ] | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "ssl-2", | "name": "ssl-2", | |||
| "service-rank": 10, | "service-rank": 10, | |||
| "traffic-profile": "pf-1", | "traffic-profile": "pf-1", | |||
| "service-protection": { | "service-protection": { | |||
| "service-protection-type": "elimination", | "protection": "elimination", | |||
| "sequence-number-length": "long-sn" | "sequence-number-length": "long-sn" | |||
| }, | }, | |||
| "service-operation-type": "service-relay", | "operation": "relay", | |||
| "incoming-type": { | "incoming": { | |||
| "service-id": { | "service-id": { | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 104 | "label": "104" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "forwarding-sub-layer": { | "forwarding-sub-layer": { | |||
| "service-outgoing-list": [ | "service-outgoing": [ | |||
| { | { | |||
| "service-outgoing-index": 0, | "index": 0, | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 105 | "label": "105" | |||
| } | } | |||
| ] | ] | |||
| }, | }, | |||
| "forwarding-sub-layer": [ | "sub-layer": [ | |||
| "fsl-2" | "fsl-2" | |||
| ] | ] | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| }, | }, | |||
| "forwarding-sub-layer": { | "forwarding": { | |||
| "forwarding-sub-layer-list": [ | "sub-layer": [ | |||
| { | { | |||
| "name": "afl-1", | "name": "afl-1", | |||
| "traffic-profile": "pf-3", | "traffic-profile": "pf-3", | |||
| "forwarding-operation-type": "pop-and-lookup", | "operation": "pop-and-lookup", | |||
| "incoming-type": { | "incoming": { | |||
| "forwarding-id": { | "forwarding-id": { | |||
| "interface": "eth0", | "interface": "eth0", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 20002 | "label": "20002" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-1", | "ssl-1", | |||
| "ssl-2" | "ssl-2" | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "afl-2", | "name": "afl-2", | |||
| "traffic-profile": "pf-3", | "traffic-profile": "pf-3", | |||
| "forwarding-operation-type": "pop-and-lookup", | "operation": "pop-and-lookup", | |||
| "incoming-type": { | "incoming": { | |||
| "forwarding-id": { | "forwarding-id": { | |||
| "interface": "eth1", | "interface": "eth1", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 20003 | "label": "20003" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-1", | "ssl-1", | |||
| "ssl-2" | "ssl-2" | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-1", | "name": "fsl-1", | |||
| "traffic-profile": "pf-2", | "traffic-profile": "pf-2", | |||
| "forwarding-operation-type": "impose-and-forward", | "operation": "impose-and-forward", | |||
| "incoming-type": { | "incoming": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-1" | "ssl-1" | |||
| ] | ] | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "interface": { | "interface": { | |||
| "outgoing-interface": "eth2", | "outgoing-interface": "eth2", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10005 | "label": "10005" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-2", | "name": "fsl-2", | |||
| "traffic-profile": "pf-2", | "traffic-profile": "pf-2", | |||
| "forwarding-operation-type": "impose-and-forward", | "operation": "impose-and-forward", | |||
| "incoming-type": { | "incoming": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-2" | "ssl-2" | |||
| ] | ] | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "interface": { | "interface": { | |||
| "outgoing-interface": "eth3", | "outgoing-interface": "eth3", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10011 | "label": "10011" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | ||||
| } | ||||
| Figure 13: Example C-2 DetNet JSON Relay Disaggregation Service | ||||
| Sub-Layer | ||||
| A.6. Example C-3 JSON Relay Service Sub-Layer Aggregation/ | ||||
| Disaggregation | ||||
| This illustrates the Relay node 1 aggregating the service sub-layers | ||||
| of DetNet flows 1 and 2 into a service sub-layer of Aggregated DetNet | ||||
| flow 1. It also illustrates the Relay node 2 disaggregating the | ||||
| aggregated DetNet flow 1 into the DetNet flows 1 and 2 service sub- | ||||
| layers. A diagram illustrating both aggregation and disaggregation | ||||
| is shown and then the corresponding JSON operational data follows. | ||||
| Please consult the PDF or HTML versions for the Case C-3 Diagram. | ||||
| Figure 14: Case C-3 Example JSON Service Aggregation/Disaggregation | ||||
| { | }, | |||
| "ietf-interfaces:interfaces": { | "ietf-interfaces:interfaces": { | |||
| "interface": [ | "interface": [ | |||
| { | { | |||
| "name": "eth0", | "name": "eth0", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth1", | "name": "eth1", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth2", | "name": "eth2", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth3", | "name": "eth3", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth4", | "name": "eth4", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| }, | } | |||
| } | ||||
| Figure 14: Example C-2 DetNet JSON Relay Disaggregation Service | ||||
| Sub-Layer | ||||
| B.6. Example C-3 JSON Relay Service Sub-Layer Aggregation/ | ||||
| Disaggregation | ||||
| This illustrates the Relay node 1 aggregating the service sub-layers | ||||
| of DetNet flows 1 and 2 into a service sub-layer of Aggregated DetNet | ||||
| flow 1. It also illustrates the Relay node 2 disaggregating the | ||||
| aggregated DetNet flow 1 into the DetNet flows 1 and 2 service sub- | ||||
| layers. A diagram illustrating both aggregation and disaggregation | ||||
| is shown and then the corresponding JSON operational data follows. | ||||
| Please consult the PDF or HTML versions for the Case C-3 Diagram. | ||||
| Figure 15: Case C-3 Example JSON Service Aggregation/Disaggregation | ||||
| { | ||||
| "ietf-detnet:detnet": { | "ietf-detnet:detnet": { | |||
| "traffic-profile": [ | "traffic-profile": [ | |||
| { | { | |||
| "profile-name": "pf-1", | "name": "pf-1", | |||
| "traffic-requirements": { | "traffic-requirements": { | |||
| "min-bandwidth": "100000000", | "min-bandwidth": "100000000", | |||
| "max-latency": 100000000, | "max-latency": 100000000, | |||
| "max-latency-variation": 100000000, | "max-latency-variation": 100000000, | |||
| "max-loss": 2, | "max-loss": 2, | |||
| "max-consecutive-loss-tolerance": 5, | "max-consecutive-loss-tolerance": 5, | |||
| "max-misordering": 0 | "max-misordering": 0 | |||
| }, | }, | |||
| "member-services": [ | "member-services": [ | |||
| "ssl-1", | "ssl-1", | |||
| "ssl-2" | "ssl-2" | |||
| ] | ] | |||
| }, | }, | |||
| { | { | |||
| "profile-name": "pf-2", | "name": "pf-2", | |||
| "traffic-requirements": { | "traffic-requirements": { | |||
| "min-bandwidth": "200000000", | "min-bandwidth": "200000000", | |||
| "max-latency": 100000000, | "max-latency": 100000000, | |||
| "max-latency-variation": 100000000, | "max-latency-variation": 100000000, | |||
| "max-loss": 2, | "max-loss": 2, | |||
| "max-consecutive-loss-tolerance": 5, | "max-consecutive-loss-tolerance": 5, | |||
| "max-misordering": 0 | "max-misordering": 0 | |||
| }, | }, | |||
| "member-services": [ | "member-services": [ | |||
| "asl-1" | "asl-1" | |||
| skipping to change at page 91, line 31 ¶ | skipping to change at page 97, line 4 ¶ | |||
| "min-bandwidth": "200000000", | "min-bandwidth": "200000000", | |||
| "max-latency": 100000000, | "max-latency": 100000000, | |||
| "max-latency-variation": 100000000, | "max-latency-variation": 100000000, | |||
| "max-loss": 2, | "max-loss": 2, | |||
| "max-consecutive-loss-tolerance": 5, | "max-consecutive-loss-tolerance": 5, | |||
| "max-misordering": 0 | "max-misordering": 0 | |||
| }, | }, | |||
| "member-services": [ | "member-services": [ | |||
| "asl-1" | "asl-1" | |||
| ] | ] | |||
| }, | }, | |||
| { | { | |||
| "profile-name": "pf-3", | "name": "pf-3", | |||
| "flow-spec": { | "traffic-spec": { | |||
| "interval": 125, | "interval": 125, | |||
| "max-pkts-per-interval": 1, | "max-pkts-per-interval": 1, | |||
| "max-payload-size": 1518 | "max-payload-size": 1518 | |||
| }, | }, | |||
| "member-fwd-sublayers": [ | "member-fwd-sublayers": [ | |||
| "fsl-1", | "fsl-1", | |||
| "fsl-2" | "fsl-2" | |||
| ] | ] | |||
| }, | }, | |||
| { | { | |||
| "profile-name": "pf-4", | "name": "pf-4", | |||
| "flow-spec": { | "traffic-spec": { | |||
| "interval": 125, | "interval": 125, | |||
| "max-pkts-per-interval": 2, | "max-pkts-per-interval": 2, | |||
| "max-payload-size": 1518 | "max-payload-size": 1518 | |||
| }, | }, | |||
| "member-fwd-sublayers": [ | "member-fwd-sublayers": [ | |||
| "fsl-3", | "fsl-3", | |||
| "fsl-4" | "fsl-4" | |||
| ] | ] | |||
| } | } | |||
| ], | ], | |||
| "service-sub-layer": { | "service": { | |||
| "service-sub-layer-list": [ | "sub-layer": [ | |||
| { | { | |||
| "name": "ssl-1", | "name": "ssl-1", | |||
| "service-rank": 10, | "service-rank": 10, | |||
| "traffic-profile": "pf-1", | "traffic-profile": "pf-1", | |||
| "service-protection": { | "service-protection": { | |||
| "service-protection-type": "none", | "protection": "none", | |||
| "sequence-number-length": "long-sn" | "sequence-number-length": "long-sn" | |||
| }, | }, | |||
| "service-operation-type": "service-relay", | "operation": "relay", | |||
| "incoming-type": { | "incoming": { | |||
| "service-id": { | "service-id": { | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 100 | "label": "100" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "aggregation-service-sub-layer": "asl-1", | "aggregation-sub-layer": "asl-1", | |||
| "service-label": { | "service-label": { | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 101 | "label": "101" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "ssl-2", | "name": "ssl-2", | |||
| "service-rank": 10, | "service-rank": 10, | |||
| "traffic-profile": "pf-1", | "traffic-profile": "pf-1", | |||
| "service-protection": { | "service-protection": { | |||
| "service-protection-type": "none", | "protection": "none", | |||
| "sequence-number-length": "long-sn" | "sequence-number-length": "long-sn" | |||
| }, | }, | |||
| "service-operation-type": "service-relay", | "operation": "relay", | |||
| "incoming-type": { | "incoming": { | |||
| "service-id": { | "service-id": { | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 103 | "label": "103" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "aggregation-service-sub-layer": "asl-1", | "aggregation-sub-layer": "asl-1", | |||
| "service-label": { | "service-label": { | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 104 | "label": "104" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "asl-1", | "name": "asl-1", | |||
| "service-rank": 10, | "service-rank": 10, | |||
| "traffic-profile": "pf-2", | "traffic-profile": "pf-2", | |||
| "service-protection": { | "service-protection": { | |||
| "service-protection-type": "replication", | "protection": "replication", | |||
| "sequence-number-length": "long-sn" | "sequence-number-length": "long-sn" | |||
| }, | }, | |||
| "service-operation-type": "service-initiation", | "operation": "initiation", | |||
| "incoming-type": { | "incoming": { | |||
| "service-aggregation": { | "service-aggregation": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-1", | "ssl-1", | |||
| "ssl-2" | "ssl-2" | |||
| ] | ] | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "forwarding-sub-layer": { | "forwarding-sub-layer": { | |||
| "service-outgoing-list": [ | "service-outgoing": [ | |||
| { | { | |||
| "service-outgoing-index": 0, | "index": 0, | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 1000 | "label": "1000" | |||
| } | } | |||
| ] | ] | |||
| }, | }, | |||
| "forwarding-sub-layer": [ | "sub-layer": [ | |||
| "fsl-3", | "fsl-3", | |||
| "fsl-4" | "fsl-4" | |||
| ] | ] | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| }, | }, | |||
| "forwarding-sub-layer": { | "forwarding": { | |||
| "forwarding-sub-layer-list": [ | "sub-layer": [ | |||
| { | { | |||
| "name": "fsl-1", | "name": "fsl-1", | |||
| "traffic-profile": "pf-3", | "traffic-profile": "pf-3", | |||
| "forwarding-operation-type": "pop-and-lookup", | "operation": "pop-and-lookup", | |||
| "incoming-type": { | "incoming": { | |||
| "forwarding-id": { | "forwarding-id": { | |||
| "interface": "eth0", | "interface": "eth0", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10000 | "label": "10000" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-1" | "ssl-1" | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-2", | "name": "fsl-2", | |||
| "traffic-profile": "pf-3", | "traffic-profile": "pf-3", | |||
| "forwarding-operation-type": "pop-and-lookup", | "operation": "pop-and-lookup", | |||
| "incoming-type": { | "incoming": { | |||
| "forwarding-id": { | "forwarding-id": { | |||
| "interface": "eth1", | "interface": "eth1", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10006 | "label": "10006" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-2" | "ssl-2" | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-3", | "name": "fsl-3", | |||
| "traffic-profile": "pf-4", | "traffic-profile": "pf-4", | |||
| "forwarding-operation-type": "impose-and-forward", | "operation": "impose-and-forward", | |||
| "incoming-type": { | "incoming": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "asl-1" | "asl-1" | |||
| ] | ] | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "interface": { | "interface": { | |||
| "outgoing-interface": "eth2", | "outgoing-interface": "eth2", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 20000 | "label": "20000" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-4", | "name": "fsl-4", | |||
| "traffic-profile": "pf-4", | "traffic-profile": "pf-4", | |||
| "forwarding-operation-type": "impose-and-forward", | "operation": "impose-and-forward", | |||
| "incoming-type": { | "incoming": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "asl-1" | "asl-1" | |||
| ] | ] | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "interface": { | "interface": { | |||
| "outgoing-interface": "eth3", | "outgoing-interface": "eth3", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 20001 | "label": "20001" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | }, | |||
| } | ||||
| Figure 15: Example C-3 DetNet JSON Relay Service Sub-Layer | ||||
| Aggregation | ||||
| { | ||||
| "ietf-interfaces:interfaces": { | "ietf-interfaces:interfaces": { | |||
| "interface": [ | "interface": [ | |||
| { | { | |||
| "name": "eth0", | "name": "eth0", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth1", | "name": "eth1", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth2", | "name": "eth2", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth3", | "name": "eth3", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth4", | "name": "eth4", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| }, | } | |||
| } | ||||
| Figure 16: Example C-3 DetNet JSON Relay Service Sub-Layer | ||||
| Aggregation | ||||
| { | ||||
| "ietf-detnet:detnet": { | "ietf-detnet:detnet": { | |||
| "traffic-profile": [ | "traffic-profile": [ | |||
| { | { | |||
| "profile-name": "pf-1", | "name": "pf-1", | |||
| "traffic-requirements": { | "traffic-requirements": { | |||
| "min-bandwidth": "100000000", | "min-bandwidth": "100000000", | |||
| "max-latency": 100000000, | "max-latency": 100000000, | |||
| "max-latency-variation": 100000000, | "max-latency-variation": 100000000, | |||
| "max-loss": 2, | "max-loss": 2, | |||
| "max-consecutive-loss-tolerance": 5, | "max-consecutive-loss-tolerance": 5, | |||
| "max-misordering": 0 | "max-misordering": 0 | |||
| }, | }, | |||
| "member-services": [ | "member-services": [ | |||
| "ssl-1", | "ssl-1", | |||
| "ssl-2" | "ssl-2" | |||
| ] | ] | |||
| }, | }, | |||
| { | { | |||
| "profile-name": "pf-2", | "name": "pf-2", | |||
| "traffic-requirements": { | "traffic-requirements": { | |||
| "min-bandwidth": "200000000", | "min-bandwidth": "200000000", | |||
| "max-latency": 100000000, | "max-latency": 100000000, | |||
| "max-latency-variation": 100000000, | "max-latency-variation": 100000000, | |||
| "max-loss": 2, | "max-loss": 2, | |||
| "max-consecutive-loss-tolerance": 5, | "max-consecutive-loss-tolerance": 5, | |||
| "max-misordering": 0 | "max-misordering": 0 | |||
| }, | }, | |||
| "member-services": [ | "member-services": [ | |||
| "asl-1" | "asl-1" | |||
| ] | ] | |||
| }, | }, | |||
| { | { | |||
| "profile-name": "pf-3", | "name": "pf-3", | |||
| "flow-spec": { | "traffic-spec": { | |||
| "interval": 125, | "interval": 125, | |||
| "max-pkts-per-interval": 1, | "max-pkts-per-interval": 1, | |||
| "max-payload-size": 1518 | "max-payload-size": 1518 | |||
| }, | }, | |||
| "member-fwd-sublayers": [ | "member-fwd-sublayers": [ | |||
| "fsl-3", | "fsl-3", | |||
| "fsl-4" | "fsl-4" | |||
| ] | ] | |||
| }, | }, | |||
| { | { | |||
| "profile-name": "pf-4", | "name": "pf-4", | |||
| "flow-spec": { | "traffic-spec": { | |||
| "interval": 125, | "interval": 125, | |||
| "max-pkts-per-interval": 2, | "max-pkts-per-interval": 2, | |||
| "max-payload-size": 1518 | "max-payload-size": 1518 | |||
| }, | }, | |||
| "member-fwd-sublayers": [ | "member-fwd-sublayers": [ | |||
| "fsl-1", | "fsl-1", | |||
| "fsl-2" | "fsl-2" | |||
| ] | ] | |||
| } | } | |||
| ], | ], | |||
| "service-sub-layer": { | "service": { | |||
| "service-sub-layer-list": [ | "sub-layer": [ | |||
| { | { | |||
| "name": "ssl-1", | "name": "ssl-1", | |||
| "service-rank": 10, | "service-rank": 10, | |||
| "traffic-profile": "pf-1", | "traffic-profile": "pf-1", | |||
| "service-protection": { | "service-protection": { | |||
| "service-protection-type": "none", | "protection": "none", | |||
| "sequence-number-length": "long-sn" | "sequence-number-length": "long-sn" | |||
| }, | }, | |||
| "service-operation-type": "service-relay", | "operation": "relay", | |||
| "incoming-type": { | "incoming": { | |||
| "service-id": { | "service-id": { | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 101 | "label": "101" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "forwarding-sub-layer": { | "forwarding-sub-layer": { | |||
| "service-outgoing-list": [ | "service-outgoing": [ | |||
| { | { | |||
| "service-outgoing-index": 0, | "index": 0, | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 102 | "label": "102" | |||
| } | } | |||
| ] | ] | |||
| }, | }, | |||
| "forwarding-sub-layer": [ | "sub-layer": [ | |||
| "fsl-3" | "fsl-3" | |||
| ] | ] | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "ssl-2", | "name": "ssl-2", | |||
| "service-rank": 10, | "service-rank": 10, | |||
| "traffic-profile": "pf-1", | "traffic-profile": "pf-1", | |||
| "service-protection": { | "service-protection": { | |||
| "service-protection-type": "none", | "protection": "none", | |||
| "sequence-number-length": "long-sn" | "sequence-number-length": "long-sn" | |||
| }, | }, | |||
| "service-operation-type": "service-relay", | "operation": "relay", | |||
| "incoming-type": { | "incoming": { | |||
| "service-id": { | "service-id": { | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 104 | "label": "104" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "forwarding-sub-layer": { | "forwarding-sub-layer": { | |||
| "service-outgoing-list": [ | "service-outgoing": [ | |||
| { | { | |||
| "service-outgoing-index": 0, | "index": 0, | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 105 | "label": "105" | |||
| } | } | |||
| ] | ] | |||
| }, | }, | |||
| "forwarding-sub-layer": [ | "sub-layer": [ | |||
| "fsl-4" | "fsl-4" | |||
| ] | ] | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "asl-1", | "name": "asl-1", | |||
| "service-rank": 10, | "service-rank": 10, | |||
| "traffic-profile": "pf-2", | "traffic-profile": "pf-2", | |||
| "service-protection": { | "service-protection": { | |||
| "service-protection-type": "elimination", | "protection": "elimination", | |||
| "sequence-number-length": "long-sn" | "sequence-number-length": "long-sn" | |||
| }, | }, | |||
| "service-operation-type": "service-termination", | "operation": "termination", | |||
| "incoming-type": { | "incoming": { | |||
| "service-id": { | "service-id": { | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 1000 | "label": "1000" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "service-disaggregation": { | "service-disaggregation": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-1", | "ssl-1", | |||
| "ssl-2" | "ssl-2" | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| }, | }, | |||
| "forwarding-sub-layer": { | "forwarding": { | |||
| "forwarding-sub-layer-list": [ | "sub-layer": [ | |||
| { | { | |||
| "name": "fsl-1", | "name": "fsl-1", | |||
| "traffic-profile": "pf-4", | "traffic-profile": "pf-4", | |||
| "forwarding-operation-type": "pop-and-lookup", | "operation": "pop-and-lookup", | |||
| "incoming-type": { | "incoming": { | |||
| "forwarding-id": { | "forwarding-id": { | |||
| "interface": "eth0", | "interface": "eth0", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 20002 | "label": "20002" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "asl-1" | "asl-1" | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-2", | "name": "fsl-2", | |||
| "traffic-profile": "pf-4", | "traffic-profile": "pf-4", | |||
| "forwarding-operation-type": "pop-and-lookup", | "operation": "pop-and-lookup", | |||
| "incoming-type": { | "incoming": { | |||
| "forwarding-id": { | "forwarding-id": { | |||
| "interface": "eth1", | "interface": "eth1", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 20003 | "label": "20003" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "asl-1" | "asl-1" | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-3", | "name": "fsl-3", | |||
| "traffic-profile": "pf-3", | "traffic-profile": "pf-3", | |||
| "forwarding-operation-type": "impose-and-forward", | "operation": "impose-and-forward", | |||
| "incoming-type": { | "incoming": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-1" | "ssl-1" | |||
| ] | ] | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "interface": { | "interface": { | |||
| "outgoing-interface": "eth2", | "outgoing-interface": "eth2", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10005 | "label": "10005" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-4", | "name": "fsl-4", | |||
| "traffic-profile": "pf-3", | "traffic-profile": "pf-3", | |||
| "forwarding-operation-type": "impose-and-forward", | "operation": "impose-and-forward", | |||
| "incoming-type": { | "incoming": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-2" | "ssl-2" | |||
| ] | ] | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "interface": { | "interface": { | |||
| "outgoing-interface": "eth3", | "outgoing-interface": "eth3", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10011 | "label": "10011" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | ||||
| } | ||||
| Figure 16: Example C-3 DetNet JSON Relay Service Sub-Layer | ||||
| Disaggregation | ||||
| A.7. Example C-4 JSON Relay Service Sub-Layer Aggregation/ | ||||
| Disaggregation | ||||
| This illustrates the Relay node 1 aggregating the forwarding sub- | ||||
| layers of DetNet flow 1 and 2 into a service sub-layer of Aggregated | ||||
| DetNet flow 1. This also illustrates the Relay node 2 disaggregating | ||||
| the service sub-layer of Aggregated DetNet flow 1 to forwarding sub- | ||||
| layers of DetNet flow 1 and 2. A diagram illustrating both | ||||
| aggregation and disaggregation is shown and then the corresponding | ||||
| JSON operational data follows. | ||||
| Please consult the PDF or HTML versions for the Case C-4 Diagram | ||||
| Figure 17: Case C-4 Example JSON Service Aggregation/Disaggregation | }, | |||
| { | ||||
| "ietf-interfaces:interfaces": { | "ietf-interfaces:interfaces": { | |||
| "interface": [ | "interface": [ | |||
| { | { | |||
| "name": "eth0", | "name": "eth0", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth1", | "name": "eth1", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth2", | "name": "eth2", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth3", | "name": "eth3", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth4", | "name": "eth4", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| }, | } | |||
| } | ||||
| Figure 17: Example C-3 DetNet JSON Relay Service Sub-Layer | ||||
| Disaggregation | ||||
| B.7. Example C-4 JSON Relay Service Sub-Layer Aggregation/ | ||||
| Disaggregation | ||||
| This illustrates the Relay node 1 aggregating the forwarding sub- | ||||
| layers of DetNet flow 1 and 2 into a service sub-layer of Aggregated | ||||
| DetNet flow 1. This also illustrates the Relay node 2 disaggregating | ||||
| the service sub-layer of Aggregated DetNet flow 1 to forwarding sub- | ||||
| layers of DetNet flow 1 and 2. A diagram illustrating both | ||||
| aggregation and disaggregation is shown and then the corresponding | ||||
| JSON operational data follows. | ||||
| Please consult the PDF or HTML versions for the Case C-4 Diagram | ||||
| Figure 18: Case C-4 Example JSON Service Aggregation/Disaggregation | ||||
| { | ||||
| "ietf-detnet:detnet": { | "ietf-detnet:detnet": { | |||
| "traffic-profile": [ | "traffic-profile": [ | |||
| { | { | |||
| "profile-name": "pf-1", | "name": "pf-1", | |||
| "traffic-requirements": { | "traffic-requirements": { | |||
| "min-bandwidth": "100000000", | "min-bandwidth": "100000000", | |||
| "max-latency": 100000000, | "max-latency": 100000000, | |||
| "max-latency-variation": 100000000, | "max-latency-variation": 100000000, | |||
| "max-loss": 2, | "max-loss": 2, | |||
| "max-consecutive-loss-tolerance": 5, | "max-consecutive-loss-tolerance": 5, | |||
| "max-misordering": 0 | "max-misordering": 0 | |||
| }, | }, | |||
| "member-services": [ | "member-services": [ | |||
| "ssl-1", | "ssl-1", | |||
| "ssl-2" | "ssl-2" | |||
| ] | ] | |||
| }, | }, | |||
| { | { | |||
| "profile-name": "pf-2", | "name": "pf-2", | |||
| "traffic-requirements": { | "traffic-requirements": { | |||
| "min-bandwidth": "200000000", | "min-bandwidth": "200000000", | |||
| "max-latency": 100000000, | "max-latency": 100000000, | |||
| "max-latency-variation": 100000000, | "max-latency-variation": 100000000, | |||
| "max-loss": 2, | "max-loss": 2, | |||
| "max-consecutive-loss-tolerance": 5, | "max-consecutive-loss-tolerance": 5, | |||
| "max-misordering": 0 | "max-misordering": 0 | |||
| }, | }, | |||
| "member-services": [ | "member-services": [ | |||
| "asl-1" | "asl-1" | |||
| skipping to change at page 105, line 30 ¶ | skipping to change at page 111, line 4 ¶ | |||
| "traffic-requirements": { | "traffic-requirements": { | |||
| "min-bandwidth": "200000000", | "min-bandwidth": "200000000", | |||
| "max-latency": 100000000, | "max-latency": 100000000, | |||
| "max-latency-variation": 100000000, | "max-latency-variation": 100000000, | |||
| "max-loss": 2, | "max-loss": 2, | |||
| "max-consecutive-loss-tolerance": 5, | "max-consecutive-loss-tolerance": 5, | |||
| "max-misordering": 0 | "max-misordering": 0 | |||
| }, | }, | |||
| "member-services": [ | "member-services": [ | |||
| "asl-1" | "asl-1" | |||
| ] | ] | |||
| }, | }, | |||
| { | { | |||
| "profile-name": "pf-3", | "name": "pf-3", | |||
| "flow-spec": { | "traffic-spec": { | |||
| "interval": 125, | "interval": 125, | |||
| "max-pkts-per-interval": 1, | "max-pkts-per-interval": 1, | |||
| "max-payload-size": 1518 | "max-payload-size": 1518 | |||
| }, | }, | |||
| "member-fwd-sublayers": [ | "member-fwd-sublayers": [ | |||
| "fsl-1", | "fsl-1", | |||
| "fsl-2", | "fsl-2", | |||
| "fsl-3", | "fsl-3", | |||
| "fsl-4" | "fsl-4" | |||
| ] | ] | |||
| }, | }, | |||
| { | { | |||
| "profile-name": "pf-4", | "name": "pf-4", | |||
| "flow-spec": { | "traffic-spec": { | |||
| "interval": 125, | "interval": 125, | |||
| "max-pkts-per-interval": 2, | "max-pkts-per-interval": 2, | |||
| "max-payload-size": 1518 | "max-payload-size": 1518 | |||
| }, | }, | |||
| "member-fwd-sublayers": [ | "member-fwd-sublayers": [ | |||
| "fsl-5", | "fsl-5", | |||
| "fsl-6" | "fsl-6" | |||
| ] | ] | |||
| } | } | |||
| ], | ], | |||
| "service-sub-layer": { | "service": { | |||
| "service-sub-layer-list": [ | "sub-layer": [ | |||
| { | { | |||
| "name": "ssl-1", | "name": "ssl-1", | |||
| "service-rank": 10, | "service-rank": 10, | |||
| "traffic-profile": "pf-1", | "traffic-profile": "pf-1", | |||
| "service-protection": { | "service-protection": { | |||
| "service-protection-type": "none", | "protection": "none", | |||
| "sequence-number-length": "long-sn" | "sequence-number-length": "long-sn" | |||
| }, | }, | |||
| "service-operation-type": "service-relay", | "operation": "relay", | |||
| "incoming-type": { | "incoming": { | |||
| "service-id": { | "service-id": { | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 100 | "label": "100" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "forwarding-sub-layer": { | "forwarding-sub-layer": { | |||
| "service-outgoing-list": [ | "service-outgoing": [ | |||
| { | { | |||
| "service-outgoing-index": 0, | "index": 0, | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 101 | "label": "101" | |||
| } | } | |||
| ] | ] | |||
| }, | }, | |||
| "forwarding-sub-layer": [ | "sub-layer": [ | |||
| "fsl-3" | "fsl-3" | |||
| ] | ] | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "ssl-2", | "name": "ssl-2", | |||
| "service-rank": 10, | "service-rank": 10, | |||
| "traffic-profile": "pf-1", | "traffic-profile": "pf-1", | |||
| "service-protection": { | "service-protection": { | |||
| "service-protection-type": "none", | "protection": "none", | |||
| "sequence-number-length": "long-sn" | "sequence-number-length": "long-sn" | |||
| }, | }, | |||
| "service-operation-type": "service-relay", | "operation": "relay", | |||
| "incoming-type": { | "incoming": { | |||
| "service-id": { | "service-id": { | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 103 | "label": "103" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "forwarding-sub-layer": { | "forwarding-sub-layer": { | |||
| "service-outgoing-list": [ | "service-outgoing": [ | |||
| { | { | |||
| "service-outgoing-index": 0, | "index": 0, | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 104 | "label": "104" | |||
| } | } | |||
| ] | ] | |||
| }, | }, | |||
| "forwarding-sub-layer": [ | "sub-layer": [ | |||
| "fsl-4" | "fsl-4" | |||
| ] | ] | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "asl-1", | "name": "asl-1", | |||
| "service-rank": 10, | "service-rank": 10, | |||
| "traffic-profile": "pf-2", | "traffic-profile": "pf-2", | |||
| "service-protection": { | "service-protection": { | |||
| "service-protection-type": "replication", | "protection": "replication", | |||
| "sequence-number-length": "long-sn" | "sequence-number-length": "long-sn" | |||
| }, | }, | |||
| "service-operation-type": "service-initiation", | "operation": "initiation", | |||
| "incoming-type": { | "incoming": { | |||
| "forwarding-aggregation": { | "forwarding-aggregation": { | |||
| "forwarding-sub-layer": [ | "sub-layer": [ | |||
| "fsl-3", | "fsl-3", | |||
| "fsl-4" | "fsl-4" | |||
| ] | ] | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "forwarding-sub-layer": { | "forwarding-sub-layer": { | |||
| "service-outgoing-list": [ | "service-outgoing": [ | |||
| { | { | |||
| "service-outgoing-index": 0, | "index": 0, | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 1000 | "label": "1000" | |||
| } | } | |||
| ] | ] | |||
| }, | }, | |||
| "forwarding-sub-layer": [ | "sub-layer": [ | |||
| "fsl-5", | "fsl-5", | |||
| "fsl-6" | "fsl-6" | |||
| ] | ] | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| }, | }, | |||
| "forwarding-sub-layer": { | "forwarding": { | |||
| "forwarding-sub-layer-list": [ | "sub-layer": [ | |||
| { | { | |||
| "name": "fsl-1", | "name": "fsl-1", | |||
| "traffic-profile": "pf-3", | "traffic-profile": "pf-3", | |||
| "forwarding-operation-type": "pop-and-lookup", | "operation": "pop-and-lookup", | |||
| "incoming-type": { | "incoming": { | |||
| "forwarding-id": { | "forwarding-id": { | |||
| "interface": "eth0", | "interface": "eth0", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10000 | "label": "10000" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-1" | "ssl-1" | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-2", | "name": "fsl-2", | |||
| "traffic-profile": "pf-3", | "traffic-profile": "pf-3", | |||
| "forwarding-operation-type": "pop-and-lookup", | "operation": "pop-and-lookup", | |||
| "incoming-type": { | "incoming": { | |||
| "forwarding-id": { | "forwarding-id": { | |||
| "interface": "eth1", | "interface": "eth1", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10006 | "label": "10006" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-2" | "ssl-2" | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-3", | "name": "fsl-3", | |||
| "traffic-profile": "pf-3", | "traffic-profile": "pf-3", | |||
| "forwarding-operation-type": "impose-and-forward", | "operation": "impose-and-forward", | |||
| "incoming-type": { | "incoming": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-1" | "ssl-1" | |||
| ] | ] | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "service-aggregation": { | "service-aggregation": { | |||
| "aggregation-service-sub-layer": "asl-1", | "aggregation-sub-layer": "asl-1", | |||
| "optional-forwarding-label": { | "optional-forwarding-label": { | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 20004 | "label": "20004" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-4", | "name": "fsl-4", | |||
| "traffic-profile": "pf-3", | "traffic-profile": "pf-3", | |||
| "forwarding-operation-type": "impose-and-forward", | "operation": "impose-and-forward", | |||
| "incoming-type": { | "incoming": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-2" | "ssl-2" | |||
| ] | ] | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "service-aggregation": { | "service-aggregation": { | |||
| "aggregation-service-sub-layer": "asl-1", | "aggregation-sub-layer": "asl-1", | |||
| "optional-forwarding-label": { | "optional-forwarding-label": { | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 20005 | "label": "20005" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-5", | "name": "fsl-5", | |||
| "traffic-profile": "pf-4", | "traffic-profile": "pf-4", | |||
| "forwarding-operation-type": "impose-and-forward", | "operation": "impose-and-forward", | |||
| "incoming-type": { | "incoming": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "asl-1" | "asl-1" | |||
| ] | ] | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "interface": { | "interface": { | |||
| "outgoing-interface": "eth2", | "outgoing-interface": "eth2", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 20000 | "label": "20000" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-6", | "name": "fsl-6", | |||
| "traffic-profile": "pf-4", | "traffic-profile": "pf-4", | |||
| "forwarding-operation-type": "impose-and-forward", | "operation": "impose-and-forward", | |||
| "incoming-type": { | "incoming": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "asl-1" | "asl-1" | |||
| ] | ] | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "interface": { | "interface": { | |||
| "outgoing-interface": "eth3", | "outgoing-interface": "eth3", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 20001 | "label": "20001" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | }, | |||
| } | ||||
| Figure 18: Example C-4 DetNet JSON Relay Service Sub-Layer | ||||
| Aggregation | ||||
| { | ||||
| "ietf-interfaces:interfaces": { | "ietf-interfaces:interfaces": { | |||
| "interface": [ | "interface": [ | |||
| { | { | |||
| "name": "eth0", | "name": "eth0", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth1", | "name": "eth1", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth2", | "name": "eth2", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth3", | "name": "eth3", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth4", | "name": "eth4", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| }, | } | |||
| } | ||||
| Figure 19: Example C-4 DetNet JSON Relay Service Sub-Layer | ||||
| Aggregation | ||||
| { | ||||
| "ietf-detnet:detnet": { | "ietf-detnet:detnet": { | |||
| "traffic-profile": [ | "traffic-profile": [ | |||
| { | { | |||
| "profile-name": "pf-1", | "name": "pf-1", | |||
| "traffic-requirements": { | "traffic-requirements": { | |||
| "min-bandwidth": "100000000", | "min-bandwidth": "100000000", | |||
| "max-latency": 100000000, | "max-latency": 100000000, | |||
| "max-latency-variation": 100000000, | "max-latency-variation": 100000000, | |||
| "max-loss": 2, | "max-loss": 2, | |||
| "max-consecutive-loss-tolerance": 5, | "max-consecutive-loss-tolerance": 5, | |||
| "max-misordering": 0 | "max-misordering": 0 | |||
| }, | }, | |||
| "member-services": [ | "member-services": [ | |||
| "ssl-1", | "ssl-1", | |||
| "ssl-2" | "ssl-2" | |||
| ] | ] | |||
| }, | }, | |||
| { | { | |||
| "profile-name": "pf-2", | "name": "pf-2", | |||
| "traffic-requirements": { | "traffic-requirements": { | |||
| "min-bandwidth": "200000000", | "min-bandwidth": "200000000", | |||
| "max-latency": 100000000, | "max-latency": 100000000, | |||
| "max-latency-variation": 100000000, | "max-latency-variation": 100000000, | |||
| "max-loss": 2, | "max-loss": 2, | |||
| "max-consecutive-loss-tolerance": 5, | "max-consecutive-loss-tolerance": 5, | |||
| "max-misordering": 0 | "max-misordering": 0 | |||
| }, | }, | |||
| "member-services": [ | "member-services": [ | |||
| "asl-1" | "asl-1" | |||
| ] | ] | |||
| }, | }, | |||
| { | { | |||
| "profile-name": "pf-3", | "name": "pf-3", | |||
| "flow-spec": { | "traffic-spec": { | |||
| "interval": 125, | "interval": 125, | |||
| "max-pkts-per-interval": 1, | "max-pkts-per-interval": 1, | |||
| "max-payload-size": 1518 | "max-payload-size": 1518 | |||
| }, | }, | |||
| "member-fwd-sublayers": [ | "member-fwd-sublayers": [ | |||
| "fsl-3", | "fsl-3", | |||
| "fsl-4", | "fsl-4", | |||
| "fsl-5", | "fsl-5", | |||
| "fsl-6" | "fsl-6" | |||
| ] | ] | |||
| }, | }, | |||
| { | { | |||
| "profile-name": "pf-4", | "name": "pf-4", | |||
| "flow-spec": { | "traffic-spec": { | |||
| "interval": 125, | "interval": 125, | |||
| "max-pkts-per-interval": 2, | "max-pkts-per-interval": 2, | |||
| "max-payload-size": 1518 | "max-payload-size": 1518 | |||
| }, | }, | |||
| "member-fwd-sublayers": [ | "member-fwd-sublayers": [ | |||
| "fsl-1", | "fsl-1", | |||
| "fsl-2" | "fsl-2" | |||
| ] | ] | |||
| } | } | |||
| ], | ], | |||
| "service-sub-layer": { | "service": { | |||
| "service-sub-layer-list": [ | "sub-layer": [ | |||
| { | { | |||
| "name": "ssl-1", | "name": "ssl-1", | |||
| "service-rank": 10, | "service-rank": 10, | |||
| "traffic-profile": "pf-1", | "traffic-profile": "pf-1", | |||
| "service-protection": { | "service-protection": { | |||
| "service-protection-type": "none", | "protection": "none", | |||
| "sequence-number-length": "long-sn" | "sequence-number-length": "long-sn" | |||
| }, | }, | |||
| "service-operation-type": "service-relay", | "operation": "relay", | |||
| "incoming-type": { | "incoming": { | |||
| "service-id": { | "service-id": { | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 101 | "label": "101" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "forwarding-sub-layer": { | "forwarding-sub-layer": { | |||
| "service-outgoing-list": [ | "service-outgoing": [ | |||
| { | { | |||
| "service-outgoing-index": 0, | "index": 0, | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 102 | "label": "102" | |||
| } | } | |||
| ] | ] | |||
| }, | }, | |||
| "forwarding-sub-layer": [ | "sub-layer": [ | |||
| "fsl-5" | "fsl-5" | |||
| ] | ] | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "ssl-2", | "name": "ssl-2", | |||
| "service-rank": 10, | "service-rank": 10, | |||
| "traffic-profile": "pf-1", | "traffic-profile": "pf-1", | |||
| "service-protection": { | "service-protection": { | |||
| "service-protection-type": "none", | "protection": "none", | |||
| "sequence-number-length": "long-sn" | "sequence-number-length": "long-sn" | |||
| }, | }, | |||
| "service-operation-type": "service-relay", | "operation": "relay", | |||
| "incoming-type": { | "incoming": { | |||
| "service-id": { | "service-id": { | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 104 | "label": "104" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "forwarding-sub-layer": { | "forwarding-sub-layer": { | |||
| "service-outgoing-list": [ | "service-outgoing": [ | |||
| { | { | |||
| "service-outgoing-index": 0, | "index": 0, | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 105 | "label": "105" | |||
| } | } | |||
| ] | ] | |||
| }, | }, | |||
| "forwarding-sub-layer": [ | "sub-layer": [ | |||
| "fsl-6" | "fsl-6" | |||
| ] | ] | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "asl-1", | "name": "asl-1", | |||
| "service-rank": 10, | "service-rank": 10, | |||
| "traffic-profile": "pf-2", | "traffic-profile": "pf-2", | |||
| "service-protection": { | "service-protection": { | |||
| "service-protection-type": "elimination", | "protection": "elimination", | |||
| "sequence-number-length": "long-sn" | "sequence-number-length": "long-sn" | |||
| }, | }, | |||
| "service-operation-type": "service-termination", | "operation": "termination", | |||
| "incoming-type": { | "incoming": { | |||
| "service-id": { | "service-id": { | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 1000 | "label": "1000" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "forwarding-disaggregation": { | "forwarding-disaggregation": { | |||
| "forwarding-sub-layer": [ | "sub-layer": [ | |||
| "fsl-3", | "fsl-3", | |||
| "fsl-4" | "fsl-4" | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| }, | }, | |||
| "forwarding-sub-layer": { | "forwarding": { | |||
| "forwarding-sub-layer-list": [ | "sub-layer": [ | |||
| { | { | |||
| "name": "fsl-1", | "name": "fsl-1", | |||
| "traffic-profile": "pf-4", | "traffic-profile": "pf-4", | |||
| "forwarding-operation-type": "pop-and-lookup", | "operation": "pop-and-lookup", | |||
| "incoming-type": { | "incoming": { | |||
| "forwarding-id": { | "forwarding-id": { | |||
| "interface": "eth0", | "interface": "eth0", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 20002 | "label": "20002" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "asl-1" | "asl-1" | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-2", | "name": "fsl-2", | |||
| "traffic-profile": "pf-4", | "traffic-profile": "pf-4", | |||
| "forwarding-operation-type": "pop-and-lookup", | "operation": "pop-and-lookup", | |||
| "incoming-type": { | "incoming": { | |||
| "forwarding-id": { | "forwarding-id": { | |||
| "interface": "eth1", | "interface": "eth1", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 20003 | "label": "20003" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "asl-1" | "asl-1" | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-3", | "name": "fsl-3", | |||
| "traffic-profile": "pf-3", | "traffic-profile": "pf-3", | |||
| "forwarding-operation-type": "pop-and-lookup", | "operation": "pop-and-lookup", | |||
| "incoming-type": { | "incoming": { | |||
| "forwarding-id": { | "forwarding-id": { | |||
| "interface": "eth0", | "interface": "eth0", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 20004 | "label": "20004" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-1" | "ssl-1" | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-4", | "name": "fsl-4", | |||
| "traffic-profile": "pf-3", | "traffic-profile": "pf-3", | |||
| "forwarding-operation-type": "pop-and-lookup", | "operation": "pop-and-lookup", | |||
| "incoming-type": { | "incoming": { | |||
| "forwarding-id": { | "forwarding-id": { | |||
| "interface": "eth1", | "interface": "eth1", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 20005 | "label": "20005" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-2" | "ssl-2" | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-5", | "name": "fsl-5", | |||
| "traffic-profile": "pf-3", | "traffic-profile": "pf-3", | |||
| "forwarding-operation-type": "impose-and-forward", | "operation": "impose-and-forward", | |||
| "incoming-type": { | "incoming": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-1" | "ssl-1" | |||
| ] | ] | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "interface": { | "interface": { | |||
| "outgoing-interface": "eth2", | "outgoing-interface": "eth2", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10005 | "label": "10005" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-6", | "name": "fsl-6", | |||
| "traffic-profile": "pf-3", | "traffic-profile": "pf-3", | |||
| "forwarding-operation-type": "impose-and-forward", | "operation": "impose-and-forward", | |||
| "incoming-type": { | "incoming": { | |||
| "service-sub-layer": { | "service-sub-layer": { | |||
| "service-sub-layer": [ | "sub-layer": [ | |||
| "ssl-2" | "ssl-2" | |||
| ] | ] | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "interface": { | "interface": { | |||
| "outgoing-interface": "eth3", | "outgoing-interface": "eth3", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10011 | "label": "10011" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | }, | |||
| } | ||||
| Figure 19: Example C-4 DetNet JSON Relay Service Sub-Layer | ||||
| Disaggregation | ||||
| A.8. Example D-1 JSON Transit Forwarding Sub-Layer Aggregation/ | ||||
| Disaggregation | ||||
| This illustrates the Transit node 1 aggregating the forwarding sub- | ||||
| layers of DetNet flow 1 and 2 into a forwarding sub-layer. This also | ||||
| illustrates a Transit node 4 disaggregating a forwarding sub-layer | ||||
| into DetNet flow 1 and 2 forwarding sub-layers. | ||||
| Please consult the PDF or HTML versions for the Case D-1 Diagram | ||||
| Figure 20: Case D-1 Example Service Aggregation/Disaggregation | ||||
| { | ||||
| "ietf-interfaces:interfaces": { | "ietf-interfaces:interfaces": { | |||
| "interface": [ | "interface": [ | |||
| { | { | |||
| "name": "eth0", | "name": "eth0", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth1", | "name": "eth1", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth2", | "name": "eth2", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth3", | "name": "eth3", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth4", | "name": "eth4", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| }, | } | |||
| } | ||||
| Figure 20: Example C-4 DetNet JSON Relay Service Sub-Layer | ||||
| Disaggregation | ||||
| B.8. Example D-1 JSON Transit Forwarding Sub-Layer Aggregation/ | ||||
| Disaggregation | ||||
| This illustrates the Transit node 1 aggregating the forwarding sub- | ||||
| layers of DetNet flow 1 and 2 into a forwarding sub-layer. This also | ||||
| illustrates a Transit node 4 disaggregating a forwarding sub-layer | ||||
| into DetNet flow 1 and 2 forwarding sub-layers. | ||||
| Please consult the PDF or HTML versions for the Case D-1 Diagram | ||||
| Figure 21: Case D-1 Example Service Aggregation/Disaggregation | ||||
| { | ||||
| "ietf-detnet:detnet": { | "ietf-detnet:detnet": { | |||
| "traffic-profile": [ | "traffic-profile": [ | |||
| { | { | |||
| "profile-name": "pf-1", | "name": "pf-1", | |||
| "flow-spec": { | "traffic-spec": { | |||
| "interval": 125, | "interval": 125, | |||
| "max-pkts-per-interval": 1, | "max-pkts-per-interval": 1, | |||
| "max-payload-size": 1518 | "max-payload-size": 1518 | |||
| }, | }, | |||
| "member-fwd-sublayers": [ | "member-fwd-sublayers": [ | |||
| "fsl-1", | "fsl-1", | |||
| "fsl-2" | "fsl-2" | |||
| ] | ] | |||
| }, | }, | |||
| { | { | |||
| "profile-name": "pf-2", | "name": "pf-2", | |||
| "flow-spec": { | "traffic-spec": { | |||
| "interval": 125, | "interval": 125, | |||
| "max-pkts-per-interval": 2, | "max-pkts-per-interval": 2, | |||
| "max-payload-size": 1518 | "max-payload-size": 1518 | |||
| }, | }, | |||
| "member-fwd-sublayers": [ | "member-fwd-sublayers": [ | |||
| "afl-1" | "afl-1" | |||
| ] | ] | |||
| } | } | |||
| ], | ], | |||
| "forwarding-sub-layer": { | "forwarding": { | |||
| "forwarding-sub-layer-list": [ | "sub-layer": [ | |||
| { | { | |||
| "name": "fsl-1", | "name": "fsl-1", | |||
| "traffic-profile": "pf-1", | "traffic-profile": "pf-1", | |||
| "forwarding-operation-type": "pop-impose-and-forward", | "operation": "pop-impose-and-forward", | |||
| "incoming-type": { | "incoming": { | |||
| "forwarding-id": { | "forwarding-id": { | |||
| "interface": "eth0", | "interface": "eth0", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10000 | "label": "10000" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "forwarding-sub-layer": { | "forwarding-sub-layer": { | |||
| "aggregation-forwarding-sub-layer": "afl-1", | "aggregation-sub-layer": "afl-1", | |||
| "forwarding-label": { | "forwarding-label": { | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10002 | "label": "10002" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-2", | "name": "fsl-2", | |||
| "traffic-profile": "pf-1", | "traffic-profile": "pf-1", | |||
| "forwarding-operation-type": "pop-impose-and-forward", | "operation": "pop-impose-and-forward", | |||
| "incoming-type": { | "incoming": { | |||
| "forwarding-id": { | "forwarding-id": { | |||
| "interface": "eth1", | "interface": "eth1", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10004 | "label": "10004" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "forwarding-sub-layer": { | "forwarding-sub-layer": { | |||
| "aggregation-forwarding-sub-layer": "afl-1", | "aggregation-sub-layer": "afl-1", | |||
| "forwarding-label": { | "forwarding-label": { | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10006 | "label": "10006" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "afl-1", | "name": "afl-1", | |||
| "traffic-profile": "pf-2", | "traffic-profile": "pf-2", | |||
| "forwarding-operation-type": "impose-and-forward", | "operation": "impose-and-forward", | |||
| "incoming-type": { | "incoming": { | |||
| "forwarding-aggregation": { | "forwarding-aggregation": { | |||
| "forwarding-sub-layer": [ | "sub-layer": [ | |||
| "fsl-1", | "fsl-1", | |||
| "fsl-2" | "fsl-2" | |||
| ] | ] | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "interface": { | "interface": { | |||
| "outgoing-interface": "eth3", | "outgoing-interface": "eth3", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 20000 | "label": "20000" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | }, | |||
| } | ||||
| Figure 21: Example D-1 DetNet JSON Relay Service Sub-Layer | ||||
| Aggregation | ||||
| { | ||||
| "ietf-interfaces:interfaces": { | "ietf-interfaces:interfaces": { | |||
| "interface": [ | "interface": [ | |||
| { | { | |||
| "name": "eth0", | "name": "eth0", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth1", | "name": "eth1", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth2", | "name": "eth2", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth3", | "name": "eth3", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "eth4", | "name": "eth4", | |||
| "type": "iana-if-type:ethernetCsmacd", | "type": "iana-if-type:ethernetCsmacd", | |||
| "oper-status": "up", | "oper-status": "up", | |||
| "statistics": { | "statistics": { | |||
| "discontinuity-time": "2020-12-18T23:59:00Z" | "discontinuity-time": "2020-12-18T18:59:00-05:00" | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| }, | } | |||
| } | ||||
| Figure 22: Example D-1 DetNet JSON Relay Service Sub-Layer | ||||
| Aggregation | ||||
| { | ||||
| "ietf-detnet:detnet": { | "ietf-detnet:detnet": { | |||
| "traffic-profile": [ | "traffic-profile": [ | |||
| { | { | |||
| "profile-name": "pf-1", | "name": "pf-1", | |||
| "flow-spec": { | "traffic-spec": { | |||
| "interval": 125, | "interval": 125, | |||
| "max-pkts-per-interval": 1, | "max-pkts-per-interval": 1, | |||
| "max-payload-size": 1518 | "max-payload-size": 1518 | |||
| }, | }, | |||
| "member-fwd-sublayers": [ | "member-fwd-sublayers": [ | |||
| "fsl-1", | "fsl-1", | |||
| "fsl-2" | "fsl-2" | |||
| ] | ] | |||
| }, | }, | |||
| { | { | |||
| "profile-name": "pf-2", | "name": "pf-2", | |||
| "flow-spec": { | "traffic-spec": { | |||
| "interval": 125, | "interval": 125, | |||
| "max-pkts-per-interval": 2, | "max-pkts-per-interval": 2, | |||
| "max-payload-size": 1518 | "max-payload-size": 1518 | |||
| }, | }, | |||
| "member-fwd-sublayers": [ | "member-fwd-sublayers": [ | |||
| "afl-1" | "afl-1" | |||
| ] | ] | |||
| } | } | |||
| ], | ], | |||
| "forwarding-sub-layer": { | "forwarding": { | |||
| "forwarding-sub-layer-list": [ | "sub-layer": [ | |||
| { | { | |||
| "name": "fsl-1", | "name": "fsl-1", | |||
| "traffic-profile": "pf-1", | "traffic-profile": "pf-1", | |||
| "forwarding-operation-type": "swap-and-forward", | "operation": "swap-and-forward", | |||
| "incoming-type": { | "incoming": { | |||
| "forwarding-id": { | "forwarding-id": { | |||
| "interface": "eth1", | "interface": "eth1", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10002 | "label": "10002" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "interface": { | "interface": { | |||
| "outgoing-interface": "eth3", | "outgoing-interface": "eth3", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10003 | "label": "10003" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "fsl-2", | "name": "fsl-2", | |||
| "traffic-profile": "pf-1", | "traffic-profile": "pf-1", | |||
| "forwarding-operation-type": "swap-and-forward", | "operation": "swap-and-forward", | |||
| "incoming-type": { | "incoming": { | |||
| "forwarding-id": { | "forwarding-id": { | |||
| "interface": "eth1", | "interface": "eth1", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10006 | "label": "10006" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "interface": { | "interface": { | |||
| "outgoing-interface": "eth2", | "outgoing-interface": "eth2", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 10007 | "label": "10007" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "name": "afl-1", | "name": "afl-1", | |||
| "traffic-profile": "pf-2", | "traffic-profile": "pf-2", | |||
| "forwarding-operation-type": "pop-and-lookup", | "operation": "pop-and-lookup", | |||
| "incoming-type": { | "incoming": { | |||
| "forwarding-id": { | "forwarding-id": { | |||
| "interface": "eth1", | "interface": "eth1", | |||
| "mpls-label-stack": { | "mpls-label-stack": { | |||
| "entry": [ | "entry": [ | |||
| { | { | |||
| "id": 0, | "id": 0, | |||
| "label": 20001 | "label": "20001" | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "outgoing-type": { | "outgoing": { | |||
| "forwarding-disaggregation": { | "forwarding-disaggregation": { | |||
| "forwarding-sub-layer": [ | "sub-layer": [ | |||
| "fsl-1", | "fsl-1", | |||
| "fsl-2" | "fsl-2" | |||
| ] | ] | |||
| } | } | |||
| } | } | |||
| } | } | |||
| ] | ] | |||
| } | } | |||
| }, | ||||
| "ietf-interfaces:interfaces": { | ||||
| "interface": [ | ||||
| { | ||||
| "name": "eth0", | ||||
| "type": "iana-if-type:ethernetCsmacd", | ||||
| "oper-status": "up", | ||||
| "statistics": { | ||||
| "discontinuity-time": "2020-12-18T18:59:00-05:00" | ||||
| } | ||||
| }, | ||||
| { | ||||
| "name": "eth1", | ||||
| "type": "iana-if-type:ethernetCsmacd", | ||||
| "oper-status": "up", | ||||
| "statistics": { | ||||
| "discontinuity-time": "2020-12-18T18:59:00-05:00" | ||||
| } | ||||
| }, | ||||
| { | ||||
| "name": "eth2", | ||||
| "type": "iana-if-type:ethernetCsmacd", | ||||
| "oper-status": "up", | ||||
| "statistics": { | ||||
| "discontinuity-time": "2020-12-18T18:59:00-05:00" | ||||
| } | ||||
| }, | ||||
| { | ||||
| "name": "eth3", | ||||
| "type": "iana-if-type:ethernetCsmacd", | ||||
| "oper-status": "up", | ||||
| "statistics": { | ||||
| "discontinuity-time": "2020-12-18T18:59:00-05:00" | ||||
| } | ||||
| }, | ||||
| { | ||||
| "name": "eth4", | ||||
| "type": "iana-if-type:ethernetCsmacd", | ||||
| "oper-status": "up", | ||||
| "statistics": { | ||||
| "discontinuity-time": "2020-12-18T18:59:00-05:00" | ||||
| } | ||||
| } | ||||
| ] | ||||
| } | } | |||
| } | } | |||
| Figure 22: Example D-1 DetNet JSON Relay Service Sub-Layer | Figure 23: Example D-1 DetNet JSON Relay Service Sub-Layer | |||
| Disaggregation | Disaggregation | |||
| Authors' Addresses | Authors' Addresses | |||
| Xuesong Geng | Xuesong Geng | |||
| Huawei Technologies | Huawei Technologies | |||
| Email: gengxuesong@huawei.com | Email: gengxuesong@huawei.com | |||
| Mach(Guoyi) Chen | ||||
| Huawei Technologies | ||||
| Email: mach.chen@huawei.com | ||||
| Yeoncheol Ryoo | Yeoncheol Ryoo | |||
| ETRI | ETRI | |||
| Email: dbduscjf@etri.re.kr | Email: dbduscjf@etri.re.kr | |||
| Don Fedyk | Don Fedyk | |||
| LabN Consulting, L.L.C. | LabN Consulting, L.L.C. | |||
| Email: dfedyk@labn.net | Email: dfedyk@labn.net | |||
| End of changes. 790 change blocks. | ||||
| 1684 lines changed or deleted | 1965 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||