<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:"Courier New";}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">Bloaters (and particularly Eric)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I will try to not confuse the list, as this question is about host behaviors rather than middlebox behaviors. Having said that……<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I am playing around with some application code that would benefit from pacing. The example I have in mind is MPEG-DASH style vide, but any type of ABR flow would probably benefit from the scheme I have in mind. I have done some work with
 client based pacing via RWND, but it is very clunky.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I am thinking of having the server tell the kernel the rate at which it wants data delivered to the client. (The client would probably tell the server via an HTTP pragma, but that is a separate can of worms….) So, the HTTP server would
 tell the kernel that it wants to deliver the TCP data at or below a certain max rate. There are currently hooks in sch_fq for the TCP layer to set sk_pacing_rate. It seems that I would need to add another pacing variable and have the data sent at the min of
 q->flow_max_rate, skb->sk->sk_pacing_rate, and this new app_pacing_rate. In other words, the old code<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<pre><span lang="EN"><a href="http://lxr.free-electrons.com/ident?i=rate">rate</a> = q->flow_max_rate;<o:p></o:p></span></pre>
<pre><span lang="EN">if (<a href="http://lxr.free-electrons.com/ident?i=skb">skb</a>->sk)<o:p></o:p></span></pre>
<pre><span lang="EN">   <a href="http://lxr.free-electrons.com/ident?i=rate">rate</a> = <a href="http://lxr.free-electrons.com/ident?i=min">min</a>(<a href="http://lxr.free-electrons.com/ident?i=skb">skb</a>->sk->sk_pacing_rate, <a href="http://lxr.free-electrons.com/ident?i=rate">rate</a>);<o:p></o:p></span></pre>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">would become<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<pre><span lang="EN"><a href="http://lxr.free-electrons.com/ident?i=rate">rate</a> = q->flow_max_rate;<o:p></o:p></span></pre>
<pre><span lang="EN">if (<a href="http://lxr.free-electrons.com/ident?i=skb">skb</a>->sk)<o:p></o:p></span></pre>
<pre><span lang="EN">{<o:p></o:p></span></pre>
<pre><span lang="EN">    <a href="http://lxr.free-electrons.com/ident?i=rate">rate</a> = <a href="http://lxr.free-electrons.com/ident?i=min">min</a>(<a href="http://lxr.free-electrons.com/ident?i=skb">skb</a>->sk->sk_pacing_rate, <a href="http://lxr.free-electrons.com/ident?i=rate">rate</a>);<o:p></o:p></span></pre>
<pre><span lang="EN">    if (skb->sk->app_pacing_rate)<o:p></o:p></span></pre>
<pre><span lang="EN">        rate = (min(skb->sk->app_pacing_rate, rate);<o:p></o:p></span></pre>
<pre><span lang="EN">}       <o:p></o:p></span></pre>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thoughts?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Bill VerSteeg<o:p></o:p></p>
</div>
</body>
</html>