Internet Draft I. Chen Ericsson Intended Status: Standards Track Expires in 6 months April 20, 2016 YANG Data Model for QoS Status of this Memo Distribution of this memo is unlimited. This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79. Internet-Drafts are working documents of the Internet Engineering Task Force (IETF), its areas, and its working groups. Note that other groups may also distribute working documents as Internet- Drafts. Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress." The list of current Internet-Drafts can be accessed at http://www.ietf.org/ietf/1id-abstracts.txt. The list of Internet-Draft Shadow Directories can be accessed at http://www.ietf.org/shadow.html. This Internet-Draft will expire in 6 months. Copyright Notice Copyright (c) 2016 IETF Trust and the persons identified as the document authors. All rights reserved. This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License. Chen Expires in 6 months [Page 1] Internet Draft QoS YANG April 20, 2016 Abstract This document defines a YANG data model to describe quality-of- service (QoS) configurations. Chen Expires in 6 months [Page 2] Internet Draft QoS YANG April 20, 2016 Table of Contents 1. Introduction ....................................................3 1.1 Tree Diagram ................................................3 2. Design of the Data Model ........................................3 3. YANG Module .....................................................5 4. Security Considerations ........................................55 5. IANA Considerations ............................................55 6. Acknowledgments ................................................55 7. References .....................................................56 1. Introduction This document defines a YANG [RFC6020] data model to specify Quality- of-Service (QoS) configurations. QoS configurations include policies and profiles that allow an administrator of a device to classify, mark, rate-limit, and perform other actions on incoming and outgoing packets. 1.1. Tree Diagram A simplified graphical representation of the data model is presented in Section 2. The meaning of the symbols in these diagrams is as follows: o Brackets "[" and "]" enclose list keys. o Curly braces "{" and "}" contain names of optional features that make the corresponding node conditional. o Abbreviations before data node names: "rw" means configuration (read-write), and "ro" state data (read-only). o Symbols after data node names: "?" means an optional node and "*" denotes a "list" or "leaf-list". o Parentheses enclose choice and case nodes, and case nodes are also marked with a colon (":"). o Ellipsis ("...") stands for contents of subtrees that are not shown. 2. Design of the Data Model This data model intends to describe the processing that a device performs on incoming and outgoing packets. These actions include, but are not limited to, classification of packets, mapping of Chen Expires in 6 months [Page 3] Internet Draft QoS YANG April 20, 2016 packets, and rate limiting, scheduling and queuing of packets. This data model has one top level container, qos, which consists of several second level containers. Each of these second level containers describes a particular category of traffic handling, such as mapping traffic from one class to another class. A second-level container further consists of a list of different permutations of options within a traffic processing category. For example, the "class-maps" processing category below consists of a list of "class-map", which can be used to describe the mapping of a certain type of incoming traffic to a certain differentiated service (DS) codepoint [RFC2475] such that the device handles that type of incoming traffic as prescribed by the classification [RFC2474]. module: ietf-qos +--rw qos +--rw class-definitions | +--rw class-definition* [name] | +--rw name string | . | . | . +--rw class-maps | +--rw class-map* [name] | +--rw name string | . | . | . +--rw congestion-avoidance-maps | +--rw congestion-avoidance-map* [name] | +--rw name string | . | . | . +--rw profiles | +--rw profile* [name] | +--rw name string | . | . | . +--rw queue-maps | +--rw queue-map* [name] | +--rw name string | . | . | . +--rw policies Chen Expires in 6 months [Page 4] Internet Draft QoS YANG April 20, 2016 +--rw policy* [name] +--rw name string . . . 3. YANG Module file "ietf-qos.yang" module ietf-qos { namespace "urn:ietf:params:xml:ns:yang:ietf-qos"; prefix qos; organization "IETF when standardized"; contact "IETF when standardized"; description "QOS YANG Model"; revision "2015-06-04" { description "Initial revision"; reference ""; } typedef dscp-code-all-values-type { type union { type uint8 { range "0..63"; } type enumeration { enum "af11" { description "DSCP 10"; } enum "af12" { description "DSCP 12"; } enum "af13" { description "DSCP 14"; } enum "af21" { description "DSCP 18"; } Chen Expires in 6 months [Page 5] Internet Draft QoS YANG April 20, 2016 enum "af22" { description "DSCP 20"; } enum "af23" { description "DSCP 22"; } enum "af31" { description "DSCP 26"; } enum "af32" { description "DSCP 28"; } enum "af33" { description "DSCP 30"; } enum "af41" { description "DSCP 34"; } enum "af42" { description "DSCP 36"; } enum "af43" { description "DSCP 38"; } enum "cs0" { description "Class selector 000 000 (0)"; } enum "cs1" { description "Class Selector 001 000 (8)"; } enum "cs2" { description "Class Selector 010 000 (16)"; } enum "cs3" { description "Class Selector 011 000 (24)"; } Chen Expires in 6 months [Page 6] Internet Draft QoS YANG April 20, 2016 enum "cs4" { description "Class Selector 100 000 (32)"; } enum "cs5" { description "Class Selector 101 000 (40)"; } enum "cs6" { description "Class Selector 110 000 (48)"; } enum "cs7" { description "Class Selector 111 000 (56)"; } enum "df" { description "Default forwarding 000 000 (0)"; } enum "ef" { description "Expedited forwarding 101 110 (46)"; } enum "all" { description "All classes"; } } } description "dscp-code-all-values-type"; } grouping radius-guided-grp { description "radius-guided-grp"; leaf radius-guided { type empty; description "radius-guided"; } } grouping mdrr-congestion-avoidance-map-grp { description "mdrr-congestion-avoidance-map-grp"; leaf congestion-avoidance-map-reference { type leafref { path "/qos:qos/qos:congestion-avoidance-maps" + "/qos:congestion-avoidance-map/qos:name"; } Chen Expires in 6 months [Page 7] Internet Draft QoS YANG April 20, 2016 must "/qos:qos/qos:congestion-avoidance-maps" + "/qos:congestion-avoidance-map/" + "[qos:name = current()]/qos:mdrr" { description "Must be an mdrr congestion avoidance map"; } description "congestion-avoidance-map-reference"; } } grouping pwfq-congestion-avoidance-map-grp { description "pwfq-congestion-avoidance-map-grp"; leaf congestion-avoidance-map-reference { type leafref { path "/qos:qos/qos:congestion-avoidance-maps" + "/qos:congestion-avoidance-map/qos:name"; } must "/qos:qos/qos:congestion-avoidance-maps/" + "/qos:congestion-avoidance-map/" + "[qos:name = current()]/qos:pwfq" { description "Must be a pwfq congestion avoidance map"; } description "congestion-avoidance-map-reference"; } } grouping queue-map-grp { description "queue-map-grp"; leaf queue-map-reference { type leafref { path "/qos:qos/qos:queue-maps/qos:queue-map/qos:name"; } description "queue-map-reference"; } } grouping rate-option-grp { description "rate-option-grp"; choice burst-option { description "burst-option"; case burst { leaf burst { type uint32 { range "1..4250000000"; } units "byte"; description "burst"; Chen Expires in 6 months [Page 8] Internet Draft QoS YANG April 20, 2016 } } case time-burst { leaf time-burst { type uint32 { range "1..10000"; } units "millisecond"; description "time-burst"; } } } choice excess-burst-option { description "excess-burst-option"; case excess-burst { leaf excess-burst { type uint32 { range "1..4250000000"; } units "byte"; description "excess-burst"; } } case time-excess-burst { leaf time-excess-burst { type uint32 { range "1..10000"; } description "time-excess-burst"; } } } } grouping rate-counters-grp { description "rate-counters-grp"; choice counter-choice { description "counter-choice"; case counters { container counters { presence ""; description "counters"; container hierarchical-counters { presence ""; description "hierarchical-counters"; leaf dual-stack { type empty; description "dual-stack"; Chen Expires in 6 months [Page 9] Internet Draft QoS YANG April 20, 2016 } } } } case hierarchical-counters { container hierarchical-counters { presence ""; description "hierarchical-counters"; leaf dual-stack { type empty; description "dual-stack"; } } } } } grouping rate-percentage-grp { description "rate-percentage-grp"; leaf percentage { type uint8 { range "1..100"; } units "percent"; description "percentage"; } } grouping marking-priority-detail-grp { description "marking-priority-detail-grp"; choice marking-priority-detail { description "mark-priority-detail"; case drop-precedence { leaf drop-precedence { type union { type uint8 { range "1..7"; } type enumeration { enum "ignore" { description "ignore"; } } } description "drop-precedence"; } } case af-drop { Chen Expires in 6 months [Page 10] Internet Draft QoS YANG April 20, 2016 leaf af-drop { type uint8 { range "1..3"; } description "af-drop"; } } } } grouping marking-grp { description "marking-grp"; choice marking { description "marking"; case dscp { leaf mark-dscp { type dscp-code-all-values-type; description "mark-dscp"; } } case precedence { leaf mark-precedence { type uint8 { range "1..3"; } description "mark-precedence"; } } case priority { leaf mark-priority { type union { type uint8 { range "1..7"; } type enumeration { enum "ignore" { description "ignore"; } } } description "mark-priority"; } uses marking-priority-detail-grp; } } } grouping rate-conform-grp { Chen Expires in 6 months [Page 11] Internet Draft QoS YANG April 20, 2016 description "rate-conform-grp"; container conform-handling { description "conform-handling"; choice options { description "options"; case mark-packet { uses marking-grp; } case no-action { leaf no-action { type empty; description "no-action"; } } } } } grouping rate-exceed-grp { description "rate-exceed-grp"; container exceed-handling { description "exceed-handling"; choice options { description "options"; case drop-packet { leaf drop-packet { type empty; description "drop-packet"; } } case mark-packet { uses marking-grp; } case no-action { leaf no-action { type empty; description "no-action"; } } } } } grouping rate-violate-grp { description "rate-violate-grp"; container violate-handling { description "violate-handling"; choice options { Chen Expires in 6 months [Page 12] Internet Draft QoS YANG April 20, 2016 description "options"; case drop-packet { leaf drop-packet { type empty; description "drop-packet"; } } case mark-packet { uses marking-grp; } case no-action { leaf no-action { type empty; description "no-action"; } } } } } grouping policy-packet-handling-grp { description "policy-packet-handling-grp"; choice policy-packet-handling { description "policy-packet-handling"; case mark-dscp { leaf mark-dscp { type dscp-code-all-values-type; description "mark-dscp"; } } case mark-precedence { leaf mark-precedence { type uint8 { range "1..3"; } description "mark-precedence"; } } case mark-priority { leaf mark-priority { type union { type uint8 { range "1..7"; } type enumeration { enum "ignore" { description "ignore"; } Chen Expires in 6 months [Page 13] Internet Draft QoS YANG April 20, 2016 } } description "mark-priority"; } uses marking-priority-detail-grp; } case rate-limiting { choice rate-type { description "rate-type"; case bit-rate-type { container bit-rate { description "bit-rate"; uses rate-option-grp; uses rate-counters-grp; container actions { description "actions"; uses rate-conform-grp; uses rate-exceed-grp; } } } case percentage-type { container percentage { description "percentage"; leaf percentage { type uint8 { range "1..100"; } units "percent"; description "percentage"; } uses rate-counters-grp; } } } } } } grouping inline-rate-specifications-packet-handling-grp { description "inline-rate-specifications-packet-handling-grp"; choice inline-rate-specifications { description "inline-rate-specifications"; case mark-dscp { leaf mark-dscp { type dscp-code-all-values-type; description "mark-dscp"; } Chen Expires in 6 months [Page 14] Internet Draft QoS YANG April 20, 2016 } case mark-precedence { leaf mark-precedence { type uint8 { range "1..3"; } description "mark-precedence"; } } case mark-priority { leaf mark-priority { type union { type uint8 { range "1..7"; } type enumeration { enum "ignore" { description "ignore"; } } } description "mark-priority"; } uses marking-priority-detail-grp; } case rate-limiting { container rate { description "Specify rate limits inline"; uses rate-option-grp; uses rate-counters-grp; container actions { description "actions"; uses rate-conform-grp; uses rate-exceed-grp; uses rate-violate-grp; } } } } } grouping policy-card-family-1-3-bit-rate-grp { description "policy-card-family-1-3-bit-rate-grp"; leaf bit-rate { type uint32 { range "66..100000000"; } description "bit-rate"; Chen Expires in 6 months [Page 15] Internet Draft QoS YANG April 20, 2016 } } grouping policy-card-family-2-bit-rate-grp { description "policy-card-family-2-bit-rate-grp"; leaf bit-rate { type uint32 { range "5..100000000"; } description "bit-rate"; } } grouping informational-grp { description "informational-grp"; leaf informational { type empty; description "informational"; } } grouping metering-or-policing-grp { description "metering-or-policing-grp"; uses radius-guided-grp; choice card-family { description "card-family"; case card-family-1 { container card-family-1 { description "card-family-1"; uses metering-or-policing-card-family-1-grp; } } case card-family-2 { container card-family-2 { description "card-family-2"; uses metering-or-policing-card-family-2-grp; } } case card-family-3 { container card-family-3 { description "card-family-3"; uses metering-or-policing-card-family-3-grp; } } case default-card-family { /* The default card-family is card-family-1. */ uses metering-or-policing-card-family-1-grp; } Chen Expires in 6 months [Page 16] Internet Draft QoS YANG April 20, 2016 } } grouping metering-or-policing-card-family-1-grp { description "metering-or-policing-card-family-1-grp"; uses policy-group-grp { augment "policy/group/class-group/class-group/classes/class/" + "packet-handling" { description "augment packet-handling"; uses policy-packet-handling-grp { augment "policy-packet-handling/" + "rate-limiting/rate-type/bit-rate-type/bit-rate" { description "bit-rate"; uses policy-card-family-1-3-bit-rate-grp; } } } } uses inline-rate-specifications-packet-handling-grp { augment "inline-rate-specifications/rate-limiting/rate" { description "augment rate"; uses policy-card-family-1-3-bit-rate-grp; uses informational-grp; } } uses rate-calculation-exclude-layer-2-overhead-grp; } grouping metering-or-policing-card-family-2-grp { description "metering-or-policing-card-family-2-grp"; uses policy-group-grp { augment "policy/group/class-group/class-group/classes/class/" + "packet-handling" { description "packet-handling"; uses policy-packet-handling-grp { augment "policy-packet-handling/" + "rate-limiting/rate-type/bit-rate-type/bit-rate" { description "augment bit-rate"; uses policy-card-family-2-bit-rate-grp; } } } } uses inline-rate-specifications-packet-handling-grp { augment "inline-rate-specifications/rate-limiting/rate" { description "augment rate"; uses policy-card-family-2-bit-rate-grp; uses informational-grp; Chen Expires in 6 months [Page 17] Internet Draft QoS YANG April 20, 2016 } } uses rate-calculation-exclude-layer-2-overhead-grp; } grouping metering-or-policing-card-family-3-grp { description "metering-or-policing-card-family-3-grp"; uses policy-group-grp { augment "policy/group/class-group/class-group/classes/class/" + "packet-handling" { description "augment packet-handling"; uses policy-packet-handling-grp { augment "policy-packet-handling/" + "rate-limiting/rate-type/bit-rate-type/bit-rate" { uses policy-card-family-2-bit-rate-grp; description "augment bit-rate"; } } } } uses inline-rate-specifications-packet-handling-grp { augment "inline-rate-specifications/rate-limiting/rate" { description "augment rate"; uses policy-card-family-1-3-bit-rate-grp; uses informational-grp; } } uses rate-calculation-exclude-layer-2-overhead-grp; } grouping policy-group-grp { description "policy-group-grp"; container policy { description "policy"; choice group { description "group"; case class-group { container class-group { description "Reference a previously defined class"; leaf class-group-reference { type leafref { path "/qos:qos/qos:class-definitions" + "/qos:class-definition/qos:name"; } description "class-group-reference"; } container classes { description "classes"; Chen Expires in 6 months [Page 18] Internet Draft QoS YANG April 20, 2016 list class { key "name"; max-elements 8; description "class"; leaf name { type leafref { path "/qos:qos/qos:class-definitions" + "/qos:class-definition" + "[qos:name = " + "current()/../../../class-group-reference]" + "/qos:qos/qos:class"; } description "name"; } container packet-handling { description "packet-handling"; leaf parent-class { type string; description "parent-class"; } } } } } } case access-group { container access-group { description "access-group"; container ip-access-group { presence "Map an IPv4 access policy"; description "Reference an IPv4 policy"; leaf policy-name { type string; mandatory true; description "policy-name"; } leaf context-name { type string; mandatory true; description "context-name"; } } container ipv6-access-group { presence "Map an IPv6 access policy"; description "Reference an IPv6 policy"; leaf policy-name { type string; mandatory true; Chen Expires in 6 months [Page 19] Internet Draft QoS YANG April 20, 2016 description "policy-name"; } leaf context-name { type string; mandatory true; description "context-name"; } } container l2-access-group { presence "Map a layer-2 access policy"; description "Reference a layer-2 policy"; leaf policy-name { type string; mandatory true; description "policy-name"; } } container classes { description "classes"; list class { key "name"; max-elements 8; description "class"; leaf name { type string; description "name"; } container packet-handling { description "packet-handling"; leaf parent-class { type string; description "parent-class"; } } } } } } } } } grouping rate-calculation-exclude-layer-2-overhead-grp { description "rate-calculation-exclude-layer-2-overhead-grp"; leaf rate-calculation-exclude-layer-2-overhead { type empty; description "Specify that rate calculation excludes the size of" + Chen Expires in 6 months [Page 20] Internet Draft QoS YANG April 20, 2016 "Layer 2 overhead for the layer 3 circuit on which " + "a policy is applied"; } } grouping mdrr-qos-mode-grp { description "mdrr-qos-mode-grp"; leaf qos-mode { type enumeration { enum "priority" { description "priority"; } enum "strict" { description "strict"; } enum "wrr" { description "wrr"; } } default "wrr"; description "qos-mode"; } } grouping mdrr-queue-grp { description "mdrr-queue-grp"; leaf num-queues { type uint8 { range "1 | 2 | 4 | 8"; } description "num-queues"; } list queue { when "../num-queues and ../qos-mode != 'priority'" { description "only when the number of queues is >= 1"; } must "num < ../num-queues" { description "queue's num must be less than num-queues"; } key "num"; description "queue"; leaf num { type uint8 { range "0..8"; } description "num"; } leaf weight { Chen Expires in 6 months [Page 21] Internet Draft QoS YANG April 20, 2016 when "../num != 0 or ../../qos-mode != 'strict'" { description "queue 0's weight is not configurable in strict mode"; } type uint8 { range "5..100"; } description "weight"; } } } grouping queue-0-weight-grp { description "queue-0-weight-group"; leaf queue-0-weight { type uint8 { range "5..100"; } units "percentage"; must "../qos-mode != 'strict'" { description "qos-mode must not be strict mode"; } description "queue-0-weight"; } } grouping mdrr-rate-choice-grp { description "mdrr-rate-choice-grp"; choice mdrr-rate { description "mdrr-rate"; case specify-rate { leaf rate { type uint32 { range "56..10000000"; } units "kbps"; mandatory true; description "rate"; } leaf burst { type uint32 { range "1..8000000"; } units "byte"; mandatory true; description "burst"; } } Chen Expires in 6 months [Page 22] Internet Draft QoS YANG April 20, 2016 } } grouping mdrr-grp { description "mdrr-grp"; uses mdrr-congestion-avoidance-map-grp; uses queue-map-grp; uses mdrr-qos-mode-grp; uses mdrr-queue-grp; uses mdrr-rate-choice-grp; } grouping pwfq-queue-choice-priority-or-rate-grp { description "pwfq-queue-choice-priority-or-rate-grp"; choice priority-or-rate { mandatory true; description "priority-or-rate"; case priority { leaf priority { type uint8 { range "0..7"; } mandatory true; description "priority"; } leaf weight { type uint16 { range "1..1023"; } mandatory true; description "weight"; } } case rate { choice absolute-or-percentage { description "absolute-or-percentage"; case absolute { leaf rate-maximum { type uint32 { range "4..10000000"; } units "kbps"; description "rate-maximum"; } } case percentage { leaf rate-maximum-percentage { type uint8 { Chen Expires in 6 months [Page 23] Internet Draft QoS YANG April 20, 2016 range "1..100"; } units "percent"; description "rate-maximum-percentage"; } } } } } } grouping pwfq-queue-choice-grp { description "pwfq-queue-choice-grp"; leaf num-queues { type uint8 { range "1 | 2 | 4 | 8"; } description "num-queues"; } list queue { when "../num-queues" { description "queue entries exist only when num-queues > 0"; } must "priority < ../num-queues" { description "queue priority must be < num-queues"; } key "num"; description "queue"; leaf num { type uint8 { range "0..7"; } description "priority"; } uses pwfq-queue-choice-priority-or-rate-grp; } } grouping pwfq-rate-card-family-1-grp { description "pwfq-rate-card-family-1-grp"; choice rate-or-weight { description "rate-or-weight"; case rate-minimum { container rate-minimum { presence "Configure minimum rate"; description "rate-minimum"; leaf rate-minimum { type uint32 { Chen Expires in 6 months [Page 24] Internet Draft QoS YANG April 20, 2016 range "8..1000000"; } units "kbps"; mandatory true; description "rate-minimum"; } leaf burst { type uint32 { range "64..1875000000"; } units "byte"; description "burst"; } } } case weight { leaf weight { type uint16 { range "1..1023"; } description "weight"; } } } container rate-maximum { presence "Configure maximum rate"; description "rate-maximum"; leaf rate-maximum { type uint32 { range "8..10000000"; } units "kbps"; mandatory true; description "rate-maximum"; } leaf burst { type uint32 { range "64..1875000000"; } units "byte"; description "burst"; } } } grouping pwfq-rate-card-family-2-grp { description "pwfq-rate-card-family-2-grp"; choice rate-or-weight { Chen Expires in 6 months [Page 25] Internet Draft QoS YANG April 20, 2016 description "rate-or-weight"; case rate-minimum { container rate-minimum { presence "Configure minimum rate"; description "rate-minimum"; leaf rate-minimum { type uint32 { range "8..1000000"; } units "kbps"; mandatory true; description "rate-minimum"; } } } case weight { leaf weight { type uint16 { range "1..4096"; } description "weight"; } } } container rate-maximum { presence "Configure maximum rate"; description "rate-maximum"; leaf rate-maximum { type uint32 { range "64..1000000"; } units "kbps"; mandatory true; description "rate-maximum"; } } } grouping pwfq-rate-card-family-3-grp { description "pwfq-rate-card-family-3-grp"; container rate-minimum { presence "Configure minimum rate"; description "rate-minimum"; leaf rate-minimum { type uint32 { range "8..1000000"; } units "kbps"; Chen Expires in 6 months [Page 26] Internet Draft QoS YANG April 20, 2016 mandatory true; description "rate-minimum"; } leaf burst { type uint32 { range "64..1875000000"; } units "byte"; description "burst"; } } container rate-maximum { presence "Configure maximum rate"; description "rate-maximum"; leaf rate-maximum { type uint32 { range "8..10000000"; } units "kbps"; mandatory true; description "rate-maximum"; } container counters { presence "Enable counting"; description "counters"; leaf dual-stack { type empty; description "Enable dual-stack costing"; } } } } grouping pwfq-queue-priority-group-grp { description "pwfq-queue-priority-group-grp"; list queue-priority-group { key "priority-group"; description "queue-priority-group"; leaf priority-group { type uint8 { range "0..7"; } description "priority-group"; } choice absolute-minimum-percentage { mandatory true; description "absolute-minimum-percentage"; /* Allow users of this grouping to add different cases */ Chen Expires in 6 months [Page 27] Internet Draft QoS YANG April 20, 2016 } } } grouping pwfq-grp { description "pwfq-grp"; choice card-family { description "card-family"; case card-family-1 { container card-family-1 { must "rate-minimum/rate <= rate-maximum/rate" { description "minimum rate <= maximum rate"; } description "card-family-1"; uses pwfq-congestion-avoidance-map-grp; uses queue-map-grp; uses pwfq-queue-choice-grp; uses pwfq-queue-priority-group-grp { augment "queue-priority-group/" + "absolute-minimum-percentage" { description "augment absolute-minimum-percentage"; case rate-absolute { container rate-absolute { description "rate-absolute"; leaf rate { type uint32 { range "8..100000000"; } units "kbps"; description "rate"; } leaf exceed { type empty; description "empty"; } } } case rate-percentage { container rate-percentage { description "rate-percentage"; leaf rate-percentage { type uint8 { range "1..100"; } units "percent"; description "rate-percentage"; } } Chen Expires in 6 months [Page 28] Internet Draft QoS YANG April 20, 2016 } } } uses pwfq-rate-card-family-1-grp; } } case card-family-2 { container card-family-2 { must "rate-minimum/rate <= rate-maximum/rate" { description "minimum rate must be <= maximum rate"; } description "card-family-2"; uses pwfq-congestion-avoidance-map-grp; uses queue-map-grp; uses pwfq-queue-choice-grp; uses pwfq-queue-priority-group-grp { augment "queue-priority-group/" + "absolute-minimum-percentage" { description "absolute-minimum-percentage"; case rate-absolute { container rate-absolute { description "rate-absolute"; leaf rate { type uint32 { range "8..10000000"; } units "kpbs"; description "rate"; } leaf exceed { type empty; description "exceed"; } } } case rate-percentage { container rate-percentage { description "rate-percentage"; leaf rate-percentage { type uint8 { range "1..100"; } units "percent"; description "rate-percentage"; } leaf exceed { type empty; description "exceed"; Chen Expires in 6 months [Page 29] Internet Draft QoS YANG April 20, 2016 } } } } } uses pwfq-rate-card-family-2-grp; } } case card-family-3 { container card-family-3 { must "rate-minimum/rate <= rate-maximum/rate" { description "minimum rate must be <= maximum rate"; } description "card-family-3"; uses pwfq-congestion-avoidance-map-grp; uses queue-map-grp; uses pwfq-queue-choice-grp; uses pwfq-queue-priority-group-grp { augment "queue-priority-group/" + "absolute-minimum-percentage" { description "augment absolute-minimum-percentage"; case rate-absolute { container rate-absolute { description "rate-absolute"; leaf rate { type uint32 { range "8..100000000"; } units "kbps"; description "rate"; } } } case rate-minimum { container rate-minimum { description "rate-minimum"; leaf rate-minimum { type uint32 { range "8..100000000"; } description "rate-minimum"; } } } case rate-percentage { container rate-percentage { description "rate-percentage"; leaf rate-percentage { Chen Expires in 6 months [Page 30] Internet Draft QoS YANG April 20, 2016 type uint8 { range "1..100"; } units "percent"; description "rate-percentage"; } } } case rate-minimum-percentage { container rate-minimum-percentage { description "rate-minimum-percentage"; leaf rate-minimum-percentage { type uint8 { range "1..100"; } units "percent"; description "rate-minimum-percentage"; } } } } } uses pwfq-rate-card-family-3-grp; } } case default-card-family { /* Same as card-family-1 */ uses pwfq-congestion-avoidance-map-grp; uses queue-map-grp; uses pwfq-queue-choice-grp; uses pwfq-queue-priority-group-grp { augment "queue-priority-group/" + "absolute-minimum-percentage" { description "augment absolute-minimum-percentage"; case rate-absolute { container rate-absolute { description "rate-absolute"; leaf rate { type uint32 { range "8..100000000"; } units "kbps"; description "rate"; } leaf exceed { type empty; description "exceed"; } Chen Expires in 6 months [Page 31] Internet Draft QoS YANG April 20, 2016 } } case rate-percentage { container rate-percentage { description "rate-percentage"; leaf rate-percentage { type uint8 { range "1..100"; } units "percent"; description "rate-percentage"; } leaf exceed { type empty; description "exceed"; } } } } } uses pwfq-rate-card-family-1-grp; must "rate-minimum/rate <= rate-maximum/rate" { description "minimum rate must be <= maximum rate"; } } } } grouping arp-rate-limit-grp { description "arp-rate-limit-grp"; container arp { presence "arp"; description "arp"; leaf rate { type uint32 { range "1..2500000"; } units "packet per second"; mandatory true; description "rate"; } leaf burst { type uint32 { range "1..25000000"; } units "packet"; mandatory true; description "burst"; Chen Expires in 6 months [Page 32] Internet Draft QoS YANG April 20, 2016 } } } grouping qos-class-definition-grp { description "qos-class-definition"; list qos { key "class"; unique "dscp-code"; description "qos class"; leaf dscp-code { type uint8 { range "1..63"; } description "dscp-code"; } leaf class { type string { length "1..39"; } mandatory true; description "class name"; } } } grouping class-map-grp { description "class-map grouping"; choice marking-type { description "marking-type choice"; case atm-class-map { uses atm-class-map-grp; } case ethernet-class-map { uses ethernet-class-map-grp; } case ip-class-map { uses ip-class-map-grp; } case mpls-class-map { uses mpls-class-map-grp; } } } grouping atm-class-map-grp { description "atm-class-map-grp"; container atm { Chen Expires in 6 months [Page 33] Internet Draft QoS YANG April 20, 2016 presence "atm-class-map"; description "atm"; choice direction { description "direction choice"; case in { container in { presence "atm-class-map-in"; description "in"; list atm { key "class"; leaf class { type uint8 { range "0..1"; } description "class"; } uses atm-in-mapping-grp; description "atm list"; } } } case out { container out { presence "atm-class-map-out"; description "out"; list qos { key "dscp-code"; leaf dscp-code { type uint8 { range "0..63"; } description "dscp-code"; } uses atm-out-mapping; description "qos list"; } } } } } } grouping atm-in-mapping-grp { description "atm-in-mapping grouping"; choice atm-in-mapping { description "atm-in-mapping choice"; case to-qos { leaf to-qos { Chen Expires in 6 months [Page 34] Internet Draft QoS YANG April 20, 2016 type uint8 { range "0..63"; } description "to-qos"; } } case use-ethernet { leaf use-ethernet { type leafref { path "/qos/class-maps/class-map/name"; } must "/qos/class-maps/class-map[name = current()]/ethernet " + "and " + "/qos/class-maps/class-map[name = current()]/ethernet/" + "in" { description "must use ethernet in class-map"; } description "use-ethernet"; } } case use-ip { leaf use-ip { type leafref { path "/qos/class-maps/class-map/name"; } must "/qos/class-maps/class-map[name = current()]/ip and" + "/qos/class-maps/class-map[name = current()]/ip/in" { description "must use ip in class-map"; } description "use-ip"; } } } } grouping atm-out-mapping { description "atm-out-mapping grouping"; leaf to-atm { type uint8 { range "0..1"; } description "to-atm"; } } grouping ethernet-class-map-grp { description "ethernet-class-map grouping"; Chen Expires in 6 months [Page 35] Internet Draft QoS YANG April 20, 2016 container ethernet { presence "ethernet-class-map"; description "ethernet"; choice direction { description "direction choice"; case in { container in { presence "ethernet-class-map-in"; description "in"; list ethernet { key "class"; leaf class { type uint8 { range "0..7"; } description "class"; } uses ethernet-in-mapping-grp; description "ethernet list"; } uses mapping-schema-grp; } } case out { container out { presence "ethernet-class-map-out"; description "out"; list qos { key "dscp-code"; leaf dscp-code { type uint8 { range "0..63"; } description "dscp-code"; } uses ethernet-out-mapping-grp; description "qos list"; } uses mapping-schema-grp; } } } } } grouping ethernet-in-mapping-grp { description "ethernet-in-mapping grouping"; choice ethernet-in-mapping { Chen Expires in 6 months [Page 36] Internet Draft QoS YANG April 20, 2016 description "ethernet-in-mapping choice"; case to-qos { leaf to-qos { type uint8 { range "0..63"; } description "to-qos"; } } case use-ip { leaf use-ip { type leafref { path "/qos/class-maps/class-map/name"; } must "/qos/class-maps/class-map[name = current()]/ip and" + "/qos/class-maps/class-map[name = current()]/ip/in" { description "must use ip in class-map"; } description "use-ip"; } } } } grouping ethernet-out-mapping-grp { description "ethernet-out-mapping grouping"; choice ethernet-out-mapping { description "ethernet-out-mapping choice"; case to-ethernet { leaf to-ethernet { type uint8 { range "0..7"; } description "to-ethernet"; } } case use-ethernet { leaf use-ethernet { type leafref { path "/qos/class-maps/class-map/name"; } must "/qos/class-maps/class-map[name = current()]/ethernet " + " and" + "/qos/class-maps/class-map[name = current()]/ethernet/" + "out" { description "must use ethernet out class-map"; } Chen Expires in 6 months [Page 37] Internet Draft QoS YANG April 20, 2016 description "use-ethernet"; } } } } grouping mapping-schema-grp { description "mapping-schema grouping"; leaf mapping-schema { type enumeration { enum "5P3D" { description "5P3D"; } enum "6P2D" { description "6P2D"; } enum "7P1D" { description "7P1D"; } enum "8P0D" { description "7P1D"; } } description "mapping-schema"; } } grouping ip-class-map-grp { description "ip-class-map grouping"; container ip { presence "ip-class-map"; description "ip"; choice direction { description "direction choice"; case in { container in { presence "ip-class-map-in"; description "in direction"; list ip { must "dscp-code != to-qos" { description "dscp-code must be different from to-qos"; } key "dscp-code"; leaf dscp-code { type uint8 { range "0..63"; } Chen Expires in 6 months [Page 38] Internet Draft QoS YANG April 20, 2016 description "dscp-code"; } leaf to-qos { type uint8 { range "0..63"; } description "to-qos"; } description "ip list"; } } } case out { container out { presence "ip-class-map-out"; description "out direction"; list qos { must "dscp-code != to-qos" { description "dscp-code must be different from to-qos"; } key "dscp-code"; leaf dscp-code { type uint8 { range "0..63"; } description "dscp-code"; } leaf to-ip { type uint8 { range "0..63"; } description "to-ip"; } description "qos list"; } } } } } } grouping mpls-class-map-grp { description "mpls-class-map grouping"; container mpls { presence "mpls-class-map"; description "mpls"; choice direction { Chen Expires in 6 months [Page 39] Internet Draft QoS YANG April 20, 2016 description "direction choice"; case in { container in { presence "mpls-class-map-in"; description "in direction"; list mpls { key "exp-value"; leaf exp-value { type uint8 { range "0..7"; } description "exp-value"; } uses mpls-in-mapping-grp; description "mpls list"; } uses mapping-schema-grp; } } case out { container out { presence "mpls-class-map-out"; description "out"; list qos { key "dscp-code"; leaf dscp-code { type uint8 { range "0..63"; } description "dscp-code"; } uses mpls-out-mapping-grp; description "qos list"; } uses mapping-schema-grp; } } } } } grouping mpls-in-mapping-grp { description "mpls-in-mapping grouping"; choice mapping { description "mapping choice"; case to-qos { leaf to-qos { type uint8 { Chen Expires in 6 months [Page 40] Internet Draft QoS YANG April 20, 2016 range "0..63"; } description "to-qos"; } } case use-ethernet { leaf use-ethernet { type leafref { path "/qos/class-maps/class-map/name"; } must "/qos/class-maps/class-map[name = current()]/ethernet " + "and" + "/qos/class-maps/class-map[name = current()]/ethernet/" + "in" { description "must use ethernet incoming map"; } description "use-ethernet"; } } case use-ip { leaf use-ip { type leafref { path "/qos/class-maps/class-map/name"; } must "/qos/class-maps/class-map[name = current()]/ip and" + "/qos/class-maps/class-map[name = current()]/ip/in" { description "must use ip in class-map"; } description "use-ip"; } } } } grouping mpls-out-mapping-grp { description "mpls-out-mapping grouping"; choice mapping { description "mapping choice"; case to-mpls { leaf to-mpls { type uint8 { range "0..7"; } description "to-mpls"; } } case use-mpls { Chen Expires in 6 months [Page 41] Internet Draft QoS YANG April 20, 2016 leaf use-mpls { type leafref { path "/qos/class-maps/class-map/name"; } must "/qos/class-maps/class-map[name = current()]/mpls and" + "/qos/class-maps/class-map[name = current()]/mpls/out" { description "must use mpls out class-map"; } description "use-mpls"; } } } } grouping congestion-avoidance-map-grp { description "congestion-avoidance-map grouping"; choice map-type { description "map-type choice"; case mdrr { container mdrr { presence "congestion-avoidance-map-mdrr"; description "mdrr"; uses mdrr-map-grp; } } case pwfq { container pwfq { presence "congestion-avoidance-map-pwfq"; description "pwfq"; uses pwfq-map-grp; } } } } grouping mdrr-map-grp { description "mdrr-map-grp"; list queue { key "num"; description "queue"; leaf num { type uint8 { range "0..7"; } description "queue number"; } uses queue-depth-grp; Chen Expires in 6 months [Page 42] Internet Draft QoS YANG April 20, 2016 uses exponent-weighting-grp; uses drop-profile-grp; } } grouping queue-depth-grp { description "queue-depth-grp"; leaf depth { type uint32 { range "1..65536"; } description "depth"; } } grouping exponent-weighting-grp { description "exponent-weighting-grp"; leaf exponential-weight { type uint8 { range "1..15"; } description "exponential-weight"; } } grouping drop-profile-grp { description "drop-profile-grp"; container default { must "min-threshold <= max-threshold" { description "min-threshold must be <= max-threshold"; } presence "default drop profile"; uses threshold-grp; description "default drop profile"; } container profile-1 { must "min-threshold <= max-threshold" { description "min-threshold must be <= max-threshold"; } presence "drop profile-1"; uses threshold-grp; uses dscp-grp; description "drop profile-1"; } container profile-2 { must "min-threshold <= max-threshold" { description "min-threshold must be <= max-threshold"; } Chen Expires in 6 months [Page 43] Internet Draft QoS YANG April 20, 2016 presence "drop profile-2"; uses threshold-grp; uses dscp-grp; description "drop profile-2"; } } grouping average-packet-size-grp { description "average-packet-size-grp"; leaf average-packet-size { type uint16 { range "128..9600"; } description "Packet size must be multiples of 128"; } } grouping threshold-grp { description "threshold-grp"; leaf min-threshold { type uint16 { range "1..10240"; } mandatory true; description "min-threshold"; } leaf max-threshold { type uint16 { range "2..10240"; } mandatory true; description "max-threshold"; } leaf probability { type uint16 { range "1..1023"; } mandatory true; description "probability"; } } grouping dscp-grp { description "dscp-grp"; leaf-list dscp { type union { type enumeration { enum "af11" { Chen Expires in 6 months [Page 44] Internet Draft QoS YANG April 20, 2016 description "DSCP 10"; } enum "af12" { description "DSCP 12"; } enum "af13" { description "DSCP 14"; } enum "af21" { description "DSCP 18"; } enum "af22" { description "DSCP 20"; } enum "af23" { description "DSCP 22"; } enum "af31" { description "DSCP 26"; } enum "af32" { description "DSCP 28"; } enum "af33" { description "DSCP 30"; } enum "af41" { description "DSCP 34"; } enum "af42" { description "DSCP 36"; } enum "af43" { description "DSCP 38"; } enum "cs1" { description "Class Selector 001 000 (8)"; } enum "cs2" { description "Class Selector 010 000 (16)"; } enum "cs3" { description "Class Selector 011 000 (24)"; } enum "cs4" { description "Class Selector 100 000 (32)"; } enum "cs5" { Chen Expires in 6 months [Page 45] Internet Draft QoS YANG April 20, 2016 description "Class Selector 101 000 (40)"; } enum "cs6" { description "Class Selector 110 000 (48)"; } enum "cs7" { description "Class Selector 111 000 (56)"; } enum "df" { description "Default forwarding 000 000 (0). " + "This is synonymous to cs0"; } enum "ef" { description "Expedited forwarding 101 110 (46)"; } } type uint8 { range "1..7 | 9 | 11 | 13 | 15 | 17 | 19 | 21 | 23 | 25 | " + "27 | 29 | 31 | 33 | 35 | 37 | 39 | 41..45 | 47 | " + "49..55 | 57..63"; } } min-elements 1; description "dscp"; } } grouping pwfq-map-grp { description "pwfq-map-grp"; choice card-family { description "card-family"; case card-family-1 { container card-family-1 { description "card-family-1"; list queue { key "num"; description "queue"; leaf num { type uint8 { range "0..7"; } description "queue number"; } uses queue-depth-grp; uses drop-profile-grp; } } Chen Expires in 6 months [Page 46] Internet Draft QoS YANG April 20, 2016 } case card-family-2 { description "card-family-2"; container card-family-2 { description "card-family-2"; list queue { key "num"; description "queue"; leaf num { type uint8 { range "0..7"; } description "queue number"; } uses queue-depth-grp; uses drop-profile-grp; uses exponent-weighting-grp; } } } case card-family-3 { container card-family-3 { description "card-family-3"; list queue { key "num"; description "queue"; leaf num { type uint8 { range "0..7"; } description "queue number"; } uses queue-depth-grp; uses drop-profile-grp; uses exponent-weighting-grp; uses average-packet-size-grp; } } } } } grouping qos-profile-grp { description "qos"; leaf name { type string; description "qos-profile name"; } Chen Expires in 6 months [Page 47] Internet Draft QoS YANG April 20, 2016 choice qos-profile-choice { mandatory true; description "qos-profile choice"; case overhead { container overhead { presence ""; description "overhead"; container card-family { choice card-family { description "card family"; case card-family-1 { description "card-family-1"; container card-family-1 { presence ""; description "card-family-1"; container encaps-access-line { description "encaps-access-line"; choice encaps-access-line { mandatory true; description "encaps-access-line"; case ethernet { leaf ethernet { type empty; description "ethernet"; } } case value { leaf value { type uint8 { range "0..255"; } description "value"; } } } } leaf reserved { type uint8 { range "1..255"; } description "reserved"; } } Chen Expires in 6 months [Page 48] Internet Draft QoS YANG April 20, 2016 } case card-family-2 { container card-family-2 { description "2"; uses qos-grp; } } case card-family-3 { container card-family-3 { description "3"; uses qos-grp; } } } description "card-family"; } } } case resource { leaf resource { type empty; description resource ; } leaf tm-resource { type uint8 { range "1..4"; } description "tm-resource"; } container slot-port { description "slot-port"; leaf slot-port { type string; mandatory true; description "slot-port"; } leaf tm-resource { type uint8 { range "1..4"; } description "tm-resource"; } } Chen Expires in 6 months [Page 49] Internet Draft QoS YANG April 20, 2016 } } } grouping qos-grp { description "qos"; container encaps-access-line { description "encaps-access-line"; choice encaps-access-line { description "encaps-access-line"; case ether-aal5-llc { leaf ether-aal5-llc { type empty; description "ether-aal5-llc"; } } case ether-aal5-llc-fcs { leaf ether-aal5-llc-fcs { type empty; description "ether-aal5-llc-fcs"; } } case ether-aal5-null { leaf ether-aal5-null { type empty; description "ether-aal5-null"; } } case ether-aal5-null-fcs { leaf ether-aal5-null-fcs { type empty; description "ether-aal5-null-fcs"; } } case ethernet { leaf ethernet { type empty; description "ethernet"; } } case ipoa-llc { leaf ipoa-llc { type empty; description "ipoa-llc"; } } case ipoa-null { Chen Expires in 6 months [Page 50] Internet Draft QoS YANG April 20, 2016 leaf ipoa-null { type empty; description "ipoa-null"; } } case pppoa-llc { leaf pppoa-llc { type empty; description "pppoa-llc"; } } case pppoa-null { leaf pppoa-null { type empty; description "pppoa-null"; } } case value { container value { description "value"; leaf value { type uint8 { range "0..255"; } mandatory true; description "value"; } container data-link { description "data-link"; choice data-link { description "data-link"; case atm { leaf atm { type empty; description "atm"; } } case ethernet { leaf ethernet { type empty; description "ethernet"; } } } } Chen Expires in 6 months [Page 51] Internet Draft QoS YANG April 20, 2016 } } } } leaf rate-factor { type uint8 { range "1..100"; } description "rate-factor"; } leaf reserved { type uint8 { range "1..255"; } description "reserved"; } } grouping qos-queue-map-grp { description "qos"; /* List which enter the sub-grouping num-queues-grp */ list num-queues { key "num"; description "num-queues"; leaf num { type uint8 { range "2 | 4 | 8"; } description "num-queues"; } uses num-queues-grp { refine "queue" { must "id < num" { description "A queue's id must be less than number of queues"; } } } } } grouping num-queues-grp { description "num-queues"; list queue { Chen Expires in 6 months [Page 52] Internet Draft QoS YANG April 20, 2016 key "id"; description "queue"; leaf id { type uint8 { range "0..7"; } description "queue"; } leaf-list priority { type uint8 { range "0..7"; } description "priority"; } } } container qos { description "qos"; container class-definitions { description "class-definition"; list class-definition { key "name"; max-elements 14; leaf name { type string; description "qos-class-definition name"; } uses qos-class-definition-grp; description "class-definition"; } } container class-maps { description "class-maps"; list class-map { key "name"; leaf name { type string; description "class-map-name"; } description "class-map"; uses class-map-grp; } } container congestion-avoidance-maps { Chen Expires in 6 months [Page 53] Internet Draft QoS YANG April 20, 2016 description "congestion-avoidance-maps"; list congestion-avoidance-map { key "name"; leaf name { type string; description "congestion-avoidance-map name"; } uses congestion-avoidance-map-grp; description "congestion-avoidance-map"; } } container profiles { description "profile"; list profile { key "name"; uses qos-profile-grp; description "profile"; } } container queue-maps { description "queue-maps"; list queue-map { key "name"; leaf name { type string; description "queue-map-name"; } description "queue-map"; uses qos-queue-map-grp; } } container policies { description "policies"; list policy { key "name"; description "policy"; leaf name { type string; description "name"; } choice policy-type { description "policy-type"; case metering { container metering { presence "metering policy"; description "metering policy"; uses metering-or-policing-grp; } Chen Expires in 6 months [Page 54] Internet Draft QoS YANG April 20, 2016 } case policing { container policing { presence "policing policy"; description "policing policy"; uses metering-or-policing-grp; } } case mdrr { container mdrr { presence "mdrr policy"; description "mdrr policy"; uses mdrr-grp; } } case pwfq { container pwfq { presence "pwfq policy"; description "pwfq policy"; uses pwfq-grp; } } case protocol-rate-limit { container protocol-rate-limit { presence "protocol-rate-limit policy"; description "protocol-rate-limit policy"; uses arp-rate-limit-grp; } } } } } } } 4. Security Consideration TBD. 5. IANA Considerations TBD. 6. Acknowledgments The author thanks Sudhakar Chunduru from Ericsson for answering my questions about QoS. Chen Expires in 6 months [Page 55] Internet Draft QoS YANG April 20, 2016 7. References 7.1. Normative References [RFC6020] Bjorklund, M., Ed., "YANG - A Data Modeling Language for the Network Configuration Protocol (NETCONF)", RFC 6020, DOI 10.17487/RFC6020, October 2010, . [RFC2474] Nichols, K., Blake, S., Baker, F., and D. Black, "Definition of the Differentiated Services Field (DS Field) in the IPv4 and IPv6 Headers", RFC 2474, DOI 10.17487/RFC2474, December 1998, . 7.2. Informative References [RFC2475] Blake, S., Black, D., Carlson, M., Davies, E., Wang, Z., and W. Weiss, "An Architecture for Differentiated Services", RFC 2475, DOI 10.17487/RFC2475, December 1998, . Author's Address I. Chen Ericsson Email: ichen@kuatrotech.com Chen Expires in 6 months [Page 56]