<?xml version="1.1" encoding="US-ASCII"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!ENTITY RFC2119 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml">
]>
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<?rfc strict="yes" ?>
<?rfc toc="yes"?>
<?rfc tocdepth="4"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes" ?>
<?rfc compact="yes" ?>
<?rfc subcompact="no" ?>
<rfc 
    category="info" 
        docName="draft-finzi-priority-switching-scheduler-03"
    ipr="trust200902">
  <!-- category values: std, bcp, info, exp, and historic
     ipr values: full3667, noModification3667, noDerivatives3667
     you can add the attributes updates="NNNN" and obsoletes="NNNN" 
     they will automatically be output with "(if approved)" -->

  <!-- ***** FRONT MATTER ***** -->

  <front>
    <!-- The abbreviated title is used in the page header - it is only necessary if the 
         full title is longer than 39 characters -->

    <title abbrev="Priority Switching Scheduler">Priority Switching Scheduler</title>
   
    <author fullname="Fred Baker" initials="" surname="Baker">
      <organization></organization>
      <address>
        <postal>
        <street></street>
          <city>Santa Barbara</city>
          <region>California</region>
          <code>93117</code>
          <country>USA</country>
        </postal>
        <email>FredBaker.IETF@gmail.com</email>
      </address>
    </author>

    <author fullname="Anais Finzi" initials="" surname="Finzi">
      <organization>TTTech Computertechnik AG</organization>
      <address>
        <postal>
          <street>Schoenbrunner Strasse 7</street>
          <city>Vienna</city>
          <region></region>
          <code>1040</code>
          <country>Austria</country>
        </postal>
        <phone>0043158534340</phone>
        <email>anais.finzi@tttech.com</email>
      </address>
    </author>
    
    <author fullname="Fabrice Frances" initials="" surname="Frances">
      <organization>ISAE-SUPAERO</organization>
      <address>
        <postal>
          <street>10 Avenue Edouard Belin</street>
          <city>Toulouse</city>
          <region></region>
          <code>31400</code>
          <country>France</country>
        </postal>
        <phone></phone>
        <email>fabrice.frances@isae-supaero.fr</email>
      </address>
    </author>

    <author fullname="Nicolas Kuhn" initials="" surname="Kuhn">
      <organization>CNES</organization>
      <address>
        <postal>
          <street>18 Avenue Edouard Belin</street>
          <city>Toulouse</city>
          <region></region>
          <code>31400</code>
          <country>France</country>
        </postal>
        <phone></phone>
        <email>nicolas.kuhn@cnes.fr</email>
      </address>
    </author>

    <author fullname="Emmanuel Lochin" initials="" surname="Lochin">
      <organization>ISAE-SUPAERO</organization>
      <address>
        <postal>
          <street>10 Avenue Edouard Belin</street>
          <city>Toulouse</city>
          <region></region>
          <code>31400</code>
          <country>France</country>
        </postal>
        <phone>0033561338485</phone>
        <email>emmanuel.lochin@isae-supaero.fr</email>
      </address>
    </author>
    
    <author fullname="Ahlem Mifdaoui" initials="" surname="Mifdaoui">
      <organization>ISAE-SUPAERO</organization>
      <address>
        <postal>
          <street>10 Avenue Edouard Belin</street>
          <city>Toulouse</city>
          <region></region>
          <code>31400</code>
          <country>France</country>
        </postal>
        <phone></phone>
        <email>ahlem.mifdaoui@isae-supaero.fr</email>
      </address>
    </author>

  
    <date month="October" year="2018" />

    <!-- If the month and year are both specified and are the current ones, xml2rfc will fill 
         in the current day for you. If only the current year is specified, xml2rfc will fill 
     in the current day and month for you. If the year is not the current one, it is 
     necessary to specify at least a month (xml2rfc assumes day="1" if not specified for the 
     purpose of calculating the expiry date).  With drafts it is normally sufficient to 
     specify just the year. -->

    <!-- Meta-data Declarations -->

    <area>Transport</area>

    <workgroup>Internet Engineering Task Force</workgroup>

    <!-- WG name at the upperleft corner of the doc,
         IETF is fine for individual submissions.  
     If this element is not present, the default is "Network Working Group",
         which is used by the RFC Editor as a nod to the history of the IETF. -->

    <keyword>template</keyword>

    <!-- Keywords will be incorporated into HTML output
         files in a meta tag but they have no effect on text or nroff
         output. If you submit your draft to the RFC Editor, the
         keywords will be used for the search (denoted C) engine. -->

        <!-- ######################################################-->
        <!-- ######################################################-->
        <!-- Head of the document -->
        <!-- ######################################################--> 
        <!-- ######################################################--> 

    <abstract>
        <t>We detail the implementation of a network rate scheduler based on both a packet-based implementation of the generalized processor sharing (GPS) and a strict priority policies. This credit based scheduler called Priority Switching Scheduler (PSS), inherits from the standard Strict Priority Scheduler (SP) but dynamically changes the priority of one or several queues. Usual scheduling architectures often combine rate schedulers with SP to implement DiffServ service classes. Furthermore, usual implementations of rate scheduler schemes (such as WRR, DRR, ...) do not allow to efficiently guarantee the capacity dedicated to both AF and DF DiffServ classes as they mostly provide soft bounds. This means excessive margin is used to ensure the capacity requested and this impacts the number of additional users that could be accepted in the network. PSS allows a more predictable output rate per traffic class and is a one fit all scheme allowing to enable both SP and rate scheduling policies within a single algorithm.</t>
    </abstract>
  </front>

<middle>

<section anchor="sec:introduction" title="Introduction">

     <section anchor="subsec:intro_context_motiv" title="Context and Motivation">
     
		 <t>To enable DiffServ traffic classes and share the capacity offered by a link, many schedulers have been developed such as Strict Priority, Weighted Fair Queuing, Weighted Round Robin or Deficit Round Robin. In the context of a core network router architecture aiming at managing various kind of traffic classes, scheduling architectures require to combine a Strict Priority (to handle real-time traffic) and a rate scheduler (WFQ, WRR, ... to handle non-real time traffic) as proposed in <xref target="RFC5865"></xref>. For all these solutions, the output rate of a given queue often depends on the amount of traffic managed by other queues. PSS aims at reducing the uncertainty of the output rate of selected queues, we call them in the following controlled queues. Additionally, compared to previous cited schemes, the scheduling scheme proposed is simpler to implement as PSS allows to both enable Strict Priority and Fair Queuing services; is more flexible following the wide possibilities offered by this setting; and does not require a virtual clock as for instance, WFQ.</t>
     </section>

     <section anchor="subsec:intro_glossary" title="Definitions and Acronyms">

     <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in <xref target="RFC2119">RFC&nbsp;2119</xref>.
	   <list style="symbols">
				<t>AF: Assured Forwarding;</t>
				<t>BLS: Burst Limiting Shaper;</t>
				<t>DRR: Deficit Round Robin</t>
				<t>DF: Default Forwarding;</t>
				<t>EF: Expedited Forwarding;</t>
				<t>PSS: Priority Switching Scheduler;</t>
        <t>QoS: Quality-of-Service;</t>
				<t>FQ: Fair Queuing</t>
				<t>SP: Strict Priority</t>
				<t>WFQ: Weighted Fair Queuing</t>
				<t>WRR: Weighted Round Robin</t>
	   </list></t>	
     </section>

     <section anchor="subsec:intro_PSS_nutshell" title="Priority Switching Scheduler in a nutshell"> 
    
     <figure anchor="fig:nutshell" title="PSS in a nutshell">
     <artwork  type="ascii-art">
                                          _____________________
                                         | p_low[i]  p_high[i] |
                                   ------|_____________________|
                         sets()    |               ^
                          _________|__             |
PSS controlled           |         |  |            | selects()
    queue i ------------>|  p[i]=  v  |            |
                         |            |        credit[i]
                  .      |      .     |            ^
                  .      |      .     |            | updates()
                  .      |      .     |            |
non-active               |            |------------------> output 
PSS queue j ------------>|    p[j]    |                    traffic
                         |            | 
                  .      |      .     | 
                  .      |      .     | 
                  .      |      .     | 
                         |____________|
                       Priority Scheduler
    </artwork>
    </figure>

		<t>As illustrated in <xref target="fig:nutshell"></xref>, the principle of PSS is based on the use of credit counters (detailed in the following) to change the priority of one or several queues. Each controlled queue i is characterized by a current priority state p[i], which can takes two priority values: {p_high[i], p_low[i]} where p_high[i] the highest priority value and p_low[i] the lowest. This idea follows a proposal made by the TSN Task group named <xref target="BLS">Burst Limiting Shaper</xref>. For each controlled queue i, each current priority p[i] changes between p_low[i] and p_high[i] depending on the associated credit counter credit[i]. Then a Priority Scheduler is used for the dequeuing process, i.e., among the queues with available traffic, the first packet of the queue with the highest priority is dequeued.</t>

    <t>The main idea is that changing the priorities adds fairness to the Priority Scheduler. Depending on the credit counter parameters, the amount of capacity available to a controlled queue is bounded between a minimum and a maximum value. Consequently, good parameterization is very important to prevent starvation of lower priority queues.</t>

    <t>The service obtained for the controlled queue with the switching priority is more predictable and corresponds to the minimum between a desired capacity and the residual capacity left by higher priorities. The impact of the input traffic sporadicity from higher classes is thus transfered to non-active PSS queues with a lower priority.</t>

    <t>Finally, PSS offers much flexibility as both i) controlled queues with a guaranteed capacity (when two priorities are set), ii) and queues scheduled with a simple Priority Scheduler (when only one priority is set) can conjointly be enabled.</t>
    </section>
</section>  

<section anchor="sec:p_s_s" title="Priority Switching Scheduler">

    <section anchor="subsec:Specification" title="Specification">

		<t>For the sake of clarity and to ease the understanding of the PSS algorithm, we consider the case where only one queue is a controlled queue. This corresponds to three traffic classes EF, AF and DF where AF is the controlled queue as shown in Figure <xref target="fig:pss3"></xref>.</t>

    <figure anchor="fig:pss3" title="PSS with three traffic classes">
    <artwork type="ascii-art">
               queues    priority   ___
              ________             |   \ 
       EF--->|________|-----{1}----+    \ 
                                   |     \ 
              ________             |      \
       AF--->|________|-----{2,4}--+  PSS  --->
                                   |      /
              ________             |     /
       DF--->|________|-----{3}----+    /
                                   |___/
     </artwork>
     </figure>

     <t>As previously explained, the PSS algorithm defines for the controlled queue a low priority denoted p_low, and a high priority denoted p_high associated to a credit counter denoted credit, which manages the priority switching. Considering Figure <xref target="fig:pss3"></xref>, the priority p[AF] of the controlled queue AF will be switched between two priorities where p_high[AF] = 2 and p_low[AF] = 4. The generalisation of PSS algorithm to n controlled queues is given in <xref target="subsec:Implementation"></xref>.</t>
		
	   <t>Then, each credit counter is defined by:
        <list style="symbols">
        <t>a minimum level: 0;</t>
        <t>a maximum level: LM;</t>
        <t>a resume level: LR such as 0 &le; LR &lt; LR;</t>
        <t>a reserved capacity: BW;</t>
        <t>an idle slope: I_idle = C * BW, where C is the link output capacity;</t>
        <t>a sending slope: I_send = C - I_idle;</t>
     </list></t>

     <t>The available capacity (denoted C) is mostly impacted by the guaranteed capacity BW. Hence, BW should be set to the desired capacity plus a margin taking into account the additional packet due to non-preemption as explained below:</t>

     <t>the value of LM can negatively impact on the guaranteed available capacity. The maximum level determines the size of the maximum sending windows, i.e, the maximum uninterrupted transmission time of the controlled queue packets before a priority switching. The impact of the non-preemption is as a function of the value of LM. The smaller the LM, the larger the impact of the non-preemption is. For example, if the number of packets varies between 4 and 5, the variation of the output traffic is around 25% (i.e. going from 4 to 5 corresponds to a 25% increase). If the number of packets sent varies between 50 and 51, the variation of the output traffic is around 2%.</t>

     <t> The credit allows to keep track of the packets transmission. However, keeping track the transmission raises an issue in two cases: when the credit is saturated at LM or at 0. In both cases, packets are transmitted without gained or consumed credit. Nevertheless, the resume level can be used to decrease the times when the credit is saturated at 0. If the resume level LR is 0, then as soon as the credit reaches 0, the priority is switched and the credit saturates at 0 due to the non-preemption of the current packet. On the contrary, if LR &gt; 0, then during the transmission of the non-preempted packet, the credit keeps on decreasing before reaching 0 as illustrated in <xref target="fig:behav"></xref>.</t>

    <t> Hence, the proposed value for LR is Lmax * BW, with Lmax the maximum packet size of the controlled queue. With this value, there is no credit saturation at 0 due to non-preemption.</t>

    <t>A similar parameter setting is described in  <xref target="Globecom17"></xref>, to transform WRR parameter into PSS parameters, also in the case of a three classes DiffServ architecture.</t> 

    <t>The priority change depends on the credit counter as follows:
            <list style="symbols">
            <t> initially, the credit counter starts at 0;</t>
            <t> the change of priority p[i] of controlled queue i occurs in two cases:
                <list style="symbols">
                <t> if p[i] is currently set to p_high[i] and credit[i] reaches LM;</t>
                <t> if p[i] is currently set to p_low[i] and credit[i] reaches LR;</t>
                </list></t>
            <t> when a packet of the controlled queue is transmitted, the credit increases (is consumed) with a rate I_send, else the credit decreases (is gained) with a rate I_idle;</t>
            <t> when the credit reaches LM, it remains at this level until the end of the transmission of the current packet (if any);</t>
            <t> when the credit reaches LR and the transmission of the current packet is finished, in the abscence of new packets to transmit in the controlled queue, it keeps decreasing at the rate I_idle until it reaches 0. Finally, the credit remains to 0 until the start of the transmission of a new packet.</t>
        </list></t>

        <t><xref target="fig:behav"></xref> and <xref target="fig:behav2"></xref> give two examples of credit and priority changes of a given queue. First, <xref target="fig:behav"></xref> gives an example when the controlled queue sends its traffic continuously until the priority changes (this traffic is represented with @ below the x-axis of this figure). Then, the credit reaches LM and the last packet is transmitted although the priority have changed. Other traffic is thus sent (represented by o) uninterruptedly until the priority changes back. <xref target="fig:behav2"></xref> illustrates a more complex behaviour. First, this figure shows when a packet with a priority higher than p_high[i] is available, this packet is sent before the traffic of queue i. Secondly, when no traffic with a priority lower than p_low[i] is available, then traffic of queue i can be sent. This highlights the non-blocking nature of PSS and that p[i] = p_high[i] (resp. p[i] = p_low[i]) does not necessarily mean that traffic of queue i is being sent (resp. not being sent).</t>
        
				<figure anchor="fig:behav" title="First example of queue credit evolution and priority switching.">
        <artwork  type="ascii-art">
      ^ credit     
      |         |                   |         
      | p_high  |       p_low       |  p_high
  LM  |- - - - -++++++- - - - - - - |- - - -+++
      |        +|    |+             |      +  
      |I_send + |    |  +  I_idle   |     +   
      |      +  |    |    +         |    +   
      |     +   |    |      +       |   +     
      |    +    |    |        +     |  +     
      |   +     |    |          +   | +      
  LR  |  +      |    |            + |+        
  0   |-+- - - -|- - |- - - - - - - +- - - - - >
                     |              |          time 
      @@@@@@@@@@@@@@@@oooooooooooooo@@@@@@@@@@

      @ controlled queue traffic  
      o other traffic
        </artwork>
        </figure>

        <figure anchor="fig:behav2" title="Second example of queue credit evolution and priority switching.">
        <artwork  type="ascii-art">
      ^ credit     
      |                        |         
      |         p_high         |     p_low
  LM  + - - - - - - - - - - - -++++ - - - - - - -+ 
      |                       +|  |+           +      
      |               ++     + |  |  +       +          
      |              + | +  +  |  |    +   +        
      |     ++      +  |   +   |  |      +
      |    +|  +   +   |   |   |  |      |
      |   + |     +    |   |   |  |      |     
  LR  +--+--|-----|----|---|---|--|------|-------       
  0   +-+- -| - - |- - |- -|- -|- |- - - |- - - - >
            |     |    |   |      |      |        time 
      @@@@@@oooooo@@@@@oooo@@@@@@@@oooooo@@@@@@@

      @ controlled queue traffic  
      o other traffic
        </artwork>
        </figure>
        
				<t> Finally, for the dequeuing process, a Priority Scheduler selects the appropriate packet using the current priority value values. In other words, among the queues with packets enqueued, the first packet of the queue with the highest priority is dequeued (usual principle of SP).</t>
    </section>
    
		<section anchor="subsec:Implementation_simple" title="Implementation with three traffic classes and one controlled queue">

    <t>The new dequeuing algorithm is presented in the PSS Algorithm in <xref target="fig:algo3"></xref> and consists in a modification of the standard SP. The credit of the controlled queue and the dequeuing timer denoted timerDQ are initialized to zero. The initial priority is set to the highest value p_high. First, we compute the difference between the current time and the time stored in timerDQ (line #3). The duration dtime represents the time elapsed since the last credit update, during which no packet from the controlled queue was sent, we call this the idle time. Then, if dtime &gt; 0, the credit is updated by removing the credit gained during the idle time that just occurred (lines #4 and #5). Next, timerDQ is set to the current time to keep track of the last time the credit was updated (line #6). If the credit reaches LR, the priority changes to its high value (lines #7 and #8). Then, with the updated priorities, SP algorithm performs as usual: each queue is checked for dequeuing, highest priority first (lines #12 and #13). When the queue selected is the controlled queue, the credit expected to be consumed is added to the credit variable (line #16). The time taken for the packet to be dequeued is added to the variable timerDQ (line #17) so the transmission time of the packet will not be taken into account in the idle time dtime (line #3). If the credit reaches LM, the priority changes to its low value (lines #18 and #19). Finally, the packet is dequeued (line #22).</t>

    <figure anchor="fig:algo3" title="PSS algorithm">
    <artwork  type="ascii-art">
Inputs: credit, timerDQ, C, LM, LR, BW, p_high, p_low
 1   currentTime = getCurrentTime()
 3   dtime = currentTime - timerDQ
 4      if dtime &gt; 0 then:
 5         credit = max(credit - dtime * C * BW, 0)
 6         timerDQ = currentTime
 7         if credit &lt; LR and p = p_low then: 
 8            p = p_high
 9         end if
10      end if
11   end for
12   for each priority level, highest first do:
13      if length(queue[i]) &gt; 0 then:
15         if queue[i] is the controlled queue then:
16            credit = 
                min(LM, credit + size(head(queue[i])) * (1 - BW))
17            timerDQ = currentTime + size(head(queue[i]))/C
18            if credit &gt;= LM and p = p_high then:
19               p = p_low           
20            end if         
21         end if
22         dequeue(head(queue[i]))
23         break
24      end if      
25   end for    
    </artwork>
    </figure>

<t>PSS algorithm implements the following functions:
    <list style="symbols">  
			<t>getCurrentTime() uses a timer to return the current time;</t>
			<t>length(q) returns the length of the queue q;</t>
      <t>head(q) returns the first packet of queue q;</t>
      <t>size(f) returns the size of packet f;</t>
      <t>dequeue(f) activates the dequeing event of packet f.</t>
    </list></t>
</section>

    <section anchor="subsec:Implementation" title="Implementation with n controlled queues">
    
		<t>The algorithm can be updated to support n controlled queues. In this context, the credits of each queue i must be stored in the table creditList[i]. Each controlled queue i has its own dequeuing timer stored in the table timerDQList[i]. Likewise for each controlled queue, LM[i], LR[i], BW[i], p_low[i] and p_high[i] are respectively stored in LMList[i], LRList[i], BWList[i], p_lowList[i] and p_highList[i]. A controlled queue i is characterized by p_lowList[i] &gt; p_highList[i] (as priority 0 is the highest priority for SP). The current priority of a controlled queue is stored in p[i]. Each controlled queue must have distinct priorities.</t>
		<t>As an example, Figure <xref target="fig:pssn"></xref> extends Figure <xref target="fig:pss3"></xref> to n controlled queues.</t>


    <figure anchor="fig:pssn" title="PSS with three traffic classes">
    <artwork type="ascii-art">
                     queues      prio     ___
                    ________             |   \ 
    Admitted EF--->|________|-----{1}----+    \ 
                                         |     \ 
                    ________             |      \ 
  Unadmitted EF--->|________|-----{2}----+       \ 
                                         |        \ 
                    ________             |         \
             AF1-->|________|-----{3,6}--+  PSS     --->
                                         |         /
                    ________             |        /
             AF2-->|________|-----{4,7}--+       /
                                         |      /
                    ________             |     /
             DF--->|________|-----{5}----+    /
                                         |___/
     </artwork>
     </figure>

<figure anchor="fig:algo" title="PSS algorithm">
    <artwork  type="ascii-art">
Inputs: creditList[], timerDQList[], C, LMList[], LRList[], 
        BWList[],p_highList[], p_lowList[]
 1   for each queue i with p_highList[i] &lt; p_lowList[i] do:
 2      currentTime = getCurrentTime()
 3      dtime = currentTime - timerDQList[i]
 4      if dtime &gt;0 then:
 5         creditList[i] = 
             max(creditList[i] - dtime * C * BWList[i], 0)
 6         timerDQList[i] = currentTime
 7         if credit[i] &lt; LRList[i] and p[i] = p_lowList[i] then: 
 8            p[i] = p_highList[i]
 9         end if
10      end if
11   end for
12   for each priority level pl, highest first do:
13      if length(queue(pl)) &gt; 0 then:
14         i = queue(pl)
15         if p_highList[i] &lt; p_lowList[i] then:
16            creditList[i] = 
                min(LMList[i], 
                creditList[i] + size(head(i)) * (1 - BWList[i]))
17            timerDQList[i] = currentTime + size(head(i))/C
18            if creditList[i] &gt;= LMList[i] 
                  and p[i] = p_highList[i] then:
19               p[i] = p_lowList[i]           
20            end if         
21         end if
22         dequeue(head(i))
23         break
24      end if      
25   end for    
    </artwork>
</figure>

<t> The general PSS algorithm also implements the following function:
    <list style="symbols">  
      <t> queue(pl) returns the queue i associated to priority pl.</t>
    </list></t>
    </section>
</section>


<section anchor="sec:application" title="Usecase: benefit of using PSS in a Diffserv core network">
    <section anchor="subsec:motivation" title="Motivation">

        <t>The DiffServ architecture defined in <xref target="RFC4594"></xref> and <xref target="RFC2475"></xref> proposes a scalable mean to deliver IP quality of service (QoS) based on handling traffic aggregates. This architecture follows the philosophy that complexity should be delegated to the network edges while simple functionalities should be located in the core network. Thus, core devices only perform differentiated aggregate treatments based on the marking set by edge devices.</t>


    <t>Keeping aside policing mechanisms that might enable edge devices in this architecture, a DiffServ stateless core network is often used to differentiate time-constrained UDP traffic (e.g. VoIP or VoD) and TCP bulk data transfer from all the remaining best-effort (BE) traffic called default traffic (DF). The Expedited Forwarding (EF) class is used to carry UDP traffic coming from time-constrained applications (VoIP, Command/Control, ...); the Assured Forwarding (AF) class deals with elastic traffic as defined in <xref target="RFC4594"></xref> (data transfer, updating process, ...) while all other remaining traffic is classified inside the default (DF) best-effort class.</t>
    

        <t>The first and best service is provided to EF as the priority scheduler attributes the highest priority to this class. The second service is called assured service and is built on top of the AF class where elastic traffic such as TCP traffic, is intended to achieve a minimum level of throughput. Usually, the minimum assured throughput is given according to a negotiated profile with the client. The throughput increases as long as there are available resources and decreases when congestion occurs. As a matter of fact, a simple priority scheduler is insufficient to implement the AF service. TCP traffic increases until reaching the capacity of the bottleneck due to its opportunistic nature of fetching the full remaining capacity. In particular, this behaviour could lead to starve the DF class. </t>

    <t>To prevent a starvation and ensure to both DF and AF a minimum service rate, the router architecture proposed in <xref target="RFC5865"></xref> uses a rate scheduler between AF and DF classes to share the residual capacity left by the EF class. Nevertheless, one drawback of using a rate scheduler is the high impact of EF traffic on AF and DF. Indeed, the residual capacity shared by AF and DF classes is directly impacted by the EF traffic variation. As a consequence, the AF and DF class services are difficult to predict in terms of available capacity and latency. To overcome these limitations and make AF service more predictable, we propose here to use the newly defined Priority Switching Scheduler (PSS).</t>
				
		<t><xref target="fig:new_archi"></xref> shows an example of the Data Plane Priority core network router presented in <xref target="RFC5865"></xref> modified with a PSS. The EF queues have the highest priorities to offer the best service to real-time traffic. The priority changes set the AF priorities either higher (3,4) or lower (6,7) than CS0 (5), leading to capacity sharing (CS0 refers to Class Selector codepoints 0 and is usually refered to DF as explained in <xref target="RFC7657"></xref>). Another example with only 3 queues is described in <xref target="Globecom17"></xref>. Thank to the increase predictability, for the same minimum guaranteed rate, the PSS reserves a lower percentage of the capacity than a rate scheduler. This leaves more remaining capacity that can be guaranteed to other users. </t>

<figure anchor="fig:new_archi" title="PSS applied to Data Plane Priority (we borrow the syntax from RCF5865)">
       <artwork type="ascii-art">
                      prio             ___
                                      |   \ 
 Admitted EF------{p[AEF] = 1}--------+    \ 
                                      |     \ 
                                      |      \ 
 Unadmitted EF----{p[UEF] = 2}--------+       \ 
                                      |        \ 
                                      |         \
 AF1--{p_high[AF1]=3, p_low[AF1]= 6}--+  PSS     --->
                                      |         /
                                      |        /
 AF2--{p_high[AF2]=4, p_low[AF2]= 7}--+       /
                                      |      /
                                      |     /
 CS0------------{p[CS0] = 5}----------+    /
                                      |___/
    </artwork>
        </figure>
    </section>
    <section anchor="subsec:intro_new_service" title="New service offered">

        <t>The new service we seek to obtain is: 
            <list style="symbols">
                <t>for EF, the full capacity of the output link;</t>
                <t>for AF the minimum between a desired capacity and the residual capacity left by EF;</t>
        <!--. The residual capacity left to AF and DF by EF is the capacity of the output link minus the EF input rate-->
                <t>for DF (CS0), the residual capacity left by EF and AF.</t>
            </list></t>

<t>As a result, the AF class has a more predictable available capacity, while the unpredictability is reported on the DF class. With good parametrization, both classes also have a minimum rate ensured. Parameterization and simulations results concerning the use of a similar scheme for core network scheduling are available in <xref target="Globecom17"></xref></t>
    </section>
</section>

<section anchor="sec:security" title="Security Considerations">
<!--See <xref target="RFC3552">RFC 3552</xref> for a guide.-->
<t>There are no specific security exposure with PSS that would extend those inherent in default FIFO queuing or in static priority scheduling systems. However, following the DiffServ usecase proposed in this memo and in particular the illustration of the integration of PSS as a possible implementation of the architecture proposed in <xref target="RFC5865"></xref>, most of the security considerations from <xref target="RFC5865"></xref> and more generally from the differentiated services architecture described in <xref target="RFC2475"></xref> still hold.</t>
</section>

<section anchor="sec:ack" title="Acknowledgements">
<t>This document was the result of collaboration and discussion among a large number of people. In particular the authors wish to thank David Black, Ruediger Geib, Vincent Roca for reviewing this draft and Victor Perrier for the TUN/TAP implementation of PSS. At last but not least, a very special thanks to Fred Baker for his help.
</t></section>


</middle>

    <!--  *****BACK MATTER ***** -->
    <back>
    <!-- References split into informative and normative -->
    <!-- There are 2 ways to insert reference entries from the citation libraries:
    1. define an ENTITY at the top, and use "ampersand character"RFC2629; here (as shown)
    2. simply use a PI "less than character"?rfc include="reference.RFC.2119.xml"?> here
    (for I-Ds: include="reference.I-D.narten-iana-considerations-rfc2434bis.xml")

    Both are cited textually in the same manner: by using xref elements.
    If you use the PI option, xml2rfc will, by default, try to find included files in the same
    directory as the including file. You can also define the XML_LIBRARY environment variable
    with a value containing a set of directories to search.  These can be either in the local
    filing system or remote ones accessed by http (http://domain/dir/... ).-->

<references title="Normative References">
&RFC2119;
</references>
<references title="Informative References">
	<?rfc include="reference.RFC.2475.xml"?> 
	<?rfc include="reference.RFC.4594.xml"?> 
	<?rfc include="reference.RFC.5865.xml"?>
	<?rfc include="reference.RFC.7657.xml"?>
	<reference anchor="Globecom17" target="http://oatao.univ-toulouse.fr/18448/">
		<front>
		    <title>Improving RFC5865 Core Network Scheduling with a Burst Limiting Shaper</title>
		    <author initials="A" surname="Finzi" fullname="Anais"></author>
 		    <author initials="E" surname="Lochin" fullname="Emmanuel"></author>	
 		    <author initials="A" surname="Mifdaoui" fullname="Ahlem"></author>
 		    <author initials="F" surname="Frances" fullname="Fabrice"></author>	        
		    <date  year="2017" />
		</front>
		<seriesInfo name="Globecom" value="" />
	</reference>
	<reference anchor="BLS">
		<front>
		    <title>Traffic Shaper for Control Data Traffic (CDT)</title>
		    <author initials="F-J" surname="Gotz" fullname="Franz-Josef"></author>
		    <date  year="2012" />
		</front>
		<seriesInfo name="IEEE 802 AVB Meeting" value="" />
	</reference>
</references>
	<!--  <references title="Informative References">
        	<?rfc include="reference.I-D.irtf-nwcrg-network-coding-taxonomy.xml"?>
	</references>-->
	</back>
</rfc>
