<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;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 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.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:"Courier New";}
span.EmailStyle19
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.EmailStyle20
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@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"><span style="color:#1F497D">Oops- I seem to have hit send too quickly. I think
</span><span lang="EN" style="font-size:10.0pt;font-family:"Courier New";color:#333333">setsockopt(sockfd, SOL_SOCKET, SO_MAX_PACING_RATE, &val, sizeof(val))
</span><span style="color:#1F497D">is the call I am looking for. I was looking on an older kernel when I wrote the first note.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Comments still welcome on it use, though.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Bill VerSteeg<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> Bill Ver Steeg (versteb)
<br>
<b>Sent:</b> Monday, April 27, 2015 10:51 AM<br>
<b>To:</b> bloat@lists.bufferbloat.net<br>
<b>Subject:</b> sch_fq and sk->sk_pacing_rate<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<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>