<div dir="ltr">Hi Edgar,<div><br></div><div>I wasn't able to reproduce this issue. I ran a little experiment myself, using tc from Mininet to limit bandwidth to 10Mbps per interface. The client with high priority got a bandwidth of 8.41 Mbps, while the client with low priority got a bandwidth of 1.77 Mbps.</div><div><br></div><div>I made a minor change to the 1sw_demo.py script included in the bmv2 repo:</div><div><div>diff --git a/mininet/1sw_demo.py b/mininet/1sw_demo.py</div><div>index 6472c19..eec16af 100755</div><div>--- a/mininet/1sw_demo.py</div><div>+++ b/mininet/1sw_demo.py</div><div>@@ -19,6 +19,7 @@ from <a href="http://mininet.net" target="_blank">mininet.net</a> import Mininet</div><div> from mininet.topo import Topo</div><div> from mininet.log import setLogLevel, info</div><div> from mininet.cli import CLI</div><div>+from mininet.link import TCLink</div><div> </div><div> from p4_mininet import P4Switch, P4Host</div><div> </div><div>@@ -57,7 +58,7 @@ class SingleSwitchTopo(Topo):</div><div>             host = self.addHost('h%d' % (h + 1),</div><div>                                 ip = "10.0.%d.10/24" % h,</div><div>                                 mac = '00:04:00:00:00:%02x' %h)</div><div>-            self.addLink(host, switch)</div><div>+            self.addLink(host, switch, bw=10)</div><div> </div><div> def main():</div><div>     num_hosts = args.num_hosts</div><div>@@ -70,6 +71,7 @@ def main():</div><div>                             num_hosts)</div><div>     net = Mininet(topo = topo,</div><div>                   host = P4Host,</div><div>+                  link=TCLink,</div><div>                   switch = P4Switch,</div><div>                   controller = None)</div><div>     net.start()</div></div><div><br></div><div>I used the attached P4_14 program and the attached commands.txt files. I'm also attaching the bmv2 JSON file so that you don't have to compile the program yourself.</div><div>Here at the commands I used next:</div><div>- sudo python 1sw_demo.py --behavioral-exe <path to simple_switch> --num-hosts 3 --json simple_router.json</div><div>- simple_switch_CLI < commands.txt</div><div><br></div><div>I then started an iperf server on h3 and an iperf client on h1 and h2. Traffic originating from h1 has priority 0 (low-priority) and achieved a significantly lower bandwidth.</div><div>I encourage you to try with my files and see if you observe the same difference in bandwidth. If you don't, it is probably an issue with your P4 program, your CLI commands or the P4 compiler you are using.</div><div><br></div><div>Note that I also compiled bmv2 without the logging macros to ensure that the bmv2 packet processing throughput would not be an issue:</div><div>./configure --disable-elogger --disable-logging-macros 'CFLAGS=-g -O2' 'CXXFLAGS=-g -O2'<br></div><div><br></div><div>I also tried the experiment with 100Mbps interfaces for 60 seconds for the thrill of it, and observed 73 Mbps and 23 Mbps. If I increase the bandwidth to 500Mbps per link, both clients achieve around 200Mbps, but I blame it on my laptop being slow. I don't think the priority queue implementation will give you great results under heavy load.</div><div><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Mar 16, 2018 at 12:40 PM, Costa Molero  Edgar <span dir="ltr"><<a href="mailto:cedgar@ethz.ch" target="_blank">cedgar@ethz.ch</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">



<div style="word-wrap:break-word;line-break:after-white-space">
<div style="word-wrap:break-word;line-break:after-white-space">
I am trying to do some priority queueing with simple switch. 
<div><br>
</div>
<div>I think I did what is needed to enable strict priority queueing in the simple switch, but I do not get what I was expecting:</div>
<div><br>
</div>
<div>1) uncommented in the simple_switch.h the line that enables multiple queues to be added at compile time. (#define SSWITCH_PRIORITY_QUEUEING_ON)</div>
<div>2) Added the intrinsic metadata to v1model.p4</div>
<div><br>
</div>
<div>
<div>    //Priority queueing</div>
<div>    @alias("queueing_metadata.qid"<wbr>)           bit<8>  qid;</div>
<div>    @alias(“intrinsic_metadata.pri<wbr>ority")     bit<3> priority;</div>
</div>
<div><br>
</div>
<div><br>
</div>
<div>3) Testing with a very simple topology:  3 hosts connected to a switch in a star topology, and 2 of them will send to the third host. Using traffic control I set a rate limit of 20 mbps to all the interfaces. </div>
<div><br>
</div>
<div>It the ingress pipe line I just do this very simple thing: (h1 has priority 0, and h2 a priority of 7) </div>
<div>
<pre style="background-color:rgb(255,255,255);font-family:Menlo;font-size:9pt">if (hdr.ipv4.srcAddr == 0x0a000101){<br>    standard_metadata.priority = (bit<3>)0;<br>}<br>else if (hdr.ipv4.srcAddr == 0x0a000102){<br>    standard_metadata.priority = (bit<3>)7;<br>}</pre>
<div><br>
</div>
</div>
<div>At the egress I set the tos field of the IP packet to ID of the queue that was used to verify that indeed the priority queueing was happening.</div>
<div><span style="font-family:Menlo;font-size:9pt;background-color:rgb(255,255,255)"><br>
</span></div>
<div><span style="font-family:Menlo;font-size:9pt;background-color:rgb(255,255,255)">hdr.ipv4.tos = standard_metadata.qid;</span></div>
<div><span style="font-family:Menlo;font-size:9pt;background-color:rgb(255,255,255)"><br>
</span></div>
<div><span style="font-family:Menlo;font-size:9pt;background-color:rgb(255,255,255)">Results:</span></div>
<div><span style="font-family:Menlo;font-size:9pt;background-color:rgb(255,255,255)"><br>
</span></div>
<div><font face="Menlo"><span style="background-color:rgb(255,255,255)">I send two TCP flows with iperf, h1->h3 and h2->h3, both get ~10mbps. Am I doing something wrong? </span></font></div>
<div><font face="Menlo"><span style="background-color:rgb(255,255,255)"><br>
</span></font></div>
<div><font face="Menlo">——-</font></div>
<div><font face="Menlo"><br>
</font></div>
<div><font face="Menlo">I have a second question, I saw that the CLI has a command to set a packets_per_second rate and a queue depth. However they work at a port-level. Is there a way to set that at a per queue-level ? I have been checking
 the source code and the CLI ends up using: </font></div>
<div><font face="Menlo"><br>
</font></div>
<span>int<br>
SimpleSwitch::set_egress_queue<wbr>_rate(int port, const uint64_<wbr>t rate_pps) {<br>
  egress_buffers.set_rate(port, rate_pps);<br>
  return 0;<br>
}</span>
<div><br>
</div>
<div>Which used set_rate from queueing.h</div>
<div><br>
</div>
<div>There you can find that there is a set_rate function with the priority parameter: <span class="m_7915646999722647388m_8407100008483313760pl-k" style="box-sizing:border-box;color:rgb(215,58,73);font-family:SFMono-Regular,Consolas,"Liberation Mono",Menlo,Courier,monospace;font-variant-ligatures:normal;white-space:pre-wrap;background-color:rgb(255,255,255)">void</span><span style="color:rgb(36,41,46);font-family:SFMono-Regular,Consolas,"Liberation Mono",Menlo,Courier,monospace;font-variant-ligatures:normal;white-space:pre-wrap;background-color:rgb(255,255,255)">
</span><span class="m_7915646999722647388m_8407100008483313760pl-en" style="box-sizing:border-box;color:rgb(111,66,193);font-family:SFMono-Regular,Consolas,"Liberation Mono",Menlo,Courier,monospace;font-variant-ligatures:normal;white-space:pre-wrap;background-color:rgb(255,255,255)">set_rate</span><span style="color:rgb(36,41,46);font-family:SFMono-Regular,Consolas,"Liberation Mono",Menlo,Courier,monospace;font-variant-ligatures:normal;white-space:pre-wrap;background-color:rgb(255,255,255)">(</span><span class="m_7915646999722647388m_8407100008483313760pl-c1" style="box-sizing:border-box;color:rgb(0,92,197);font-family:SFMono-Regular,Consolas,"Liberation Mono",Menlo,Courier,monospace;font-variant-ligatures:normal;white-space:pre-wrap;background-color:rgb(255,255,255)">size_t</span><span style="color:rgb(36,41,46);font-family:SFMono-Regular,Consolas,"Liberation Mono",Menlo,Courier,monospace;font-variant-ligatures:normal;white-space:pre-wrap;background-color:rgb(255,255,255)">
 queue_id, </span><span class="m_7915646999722647388m_8407100008483313760pl-c1" style="box-sizing:border-box;color:rgb(0,92,197);font-family:SFMono-Regular,Consolas,"Liberation Mono",Menlo,Courier,monospace;font-variant-ligatures:normal;white-space:pre-wrap;background-color:rgb(255,255,255)">size_t</span><span style="color:rgb(36,41,46);font-family:SFMono-Regular,Consolas,"Liberation Mono",Menlo,Courier,monospace;font-variant-ligatures:normal;white-space:pre-wrap;background-color:rgb(255,255,255)">
 priority, </span><span class="m_7915646999722647388m_8407100008483313760pl-c1" style="box-sizing:border-box;color:rgb(0,92,197);font-family:SFMono-Regular,Consolas,"Liberation Mono",Menlo,Courier,monospace;font-variant-ligatures:normal;white-space:pre-wrap;background-color:rgb(255,255,255)">uint64_t</span><span style="color:rgb(36,41,46);font-family:SFMono-Regular,Consolas,"Liberation Mono",Menlo,Courier,monospace;font-variant-ligatures:normal;white-space:pre-wrap;background-color:rgb(255,255,255)">
 pps). Would it work if I modify the simple_switch.cpp and add a function that uses set_rate with priority? I have seen that you use some autogenerated python code, is it enough compiling again the entire thing to get that?
</span></div>
<div><span><br>
</span><span>I think a good way to go would be to add that a third option in the sswitch_CLI.py in the function do_set_queue_rate.  </span>For example:</div>
<div><span><br>
</span></div>
<div>
<pre style="background-color:rgb(255,255,255);font-family:Menlo;font-size:9pt"><span style="color:#000080;font-weight:bold">def </span>do_set_queue_rate(self, line):<br>    <span style="color:#808080;font-style:italic">"Set rate of one / all egress queue(s): set_queue_rate <rate_pps> [<egress_port>] [<priority>]"<br></span><span style="color:#808080;font-style:italic">    </span>args = line.split()<br>    rate = <span style="color:#000080">int</span>(args[<span style="color:#0000ff">0</span>])<br>    <span style="color:#000080;font-weight:bold">if </span><span style="color:#000080">len</span>(args) > <span style="color:#0000ff">2</span>:<br>        port = <span style="color:#000080">int</span>(args[<span style="color:#0000ff">1</span>])<br>        priority = <span style="color:#000080">int</span>(args[<span style="color:#0000ff">2</span>])<br>        self.sswitch_client.set_egress<wbr>_queue_rate_priority(port, rate, priority)<br>    <span style="color:#000080;font-weight:bold">elif </span><span style="color:#000080">len</span>(args) > <span style="color:#0000ff">1</span>:<br>        port = <span style="color:#000080">int</span>(args[<span style="color:#0000ff">1</span>])<br>        self.sswitch_client.set_egress<wbr>_queue_rate(port, rate)<br>    <span style="color:#000080;font-weight:bold">else</span>:<br>        self.sswitch_client.set_all_eg<wbr>ress_queue_rates(rate)</pre>
<pre style="background-color:rgb(255,255,255);font-family:Menlo;font-size:9pt"><br></pre>
<div><span style="font-family:Menlo">Kind regards,</span></div>
</div>
<div>
<div><font face="Menlo">Edgar</font></div>
<div><span style="background-color:rgb(255,255,255);font-family:Menlo"> </span></div>
<div>
<div><br>
</div>
</div>
<div><br>
</div>
<div>
<div><br>
</div>
</div>
</div>
</div>
</div>

<br>______________________________<wbr>_________________<br>
P4-dev mailing list<br>
<a href="mailto:P4-dev@lists.p4.org" target="_blank">P4-dev@lists.p4.org</a><br>
<a href="http://lists.p4.org/mailman/listinfo/p4-dev_lists.p4.org" rel="noreferrer" target="_blank">http://lists.p4.org/mailman/li<wbr>stinfo/p4-dev_lists.p4.org</a><br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="m_7915646999722647388gmail_signature" data-smartmail="gmail_signature"><div dir="ltr">Antonin<br></div></div>
</div></div>