<div dir="ltr"><div><div>Hi Swaroop,<br><br></div>Thanks for reporting this behavior. Could you confirm that this happens when you run "./run_demo.bash" in p4factory/targets/simple_router?<br></div><div>When you run this script, a log file should be generated under /tmp/: p4ns.s1.log. Could you send it to me?<br></div><div>It may be some bad state after a switch instance was not killed properly. You may want to run the following 3 commands and see if it solves it:<br></div><div>- redis-cli FLUSHALL<br></div><div>- sudo killall behavioral-model<br></div><div>- sudo mn -c<br><br></div><div>Thanks,<br><br></div><div>Antonin<br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Aug 18, 2015 at 1:12 PM, Swaroop Thool <span dir="ltr"><<a href="mailto:swaroopthool1991@outlook.com" target="_blank">swaroopthool1991@outlook.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


<div><div dir="ltr"><br>Hi Antonin,<br><br>1) When I try to run demo of simple_router as stated under integrating with mininet: <a href="https://github.com/p4lang/p4factory" target="_blank"></a><a href="https://github.com/p4lang/p4factory" target="_blank"></a><a href="https://github.com/p4lang/p4factory" target="_blank"></a><a href="https://github.com/p4lang/p4factory" target="_blank"></a><a href="https://github.com/p4lang/p4factory" target="_blank"></a><a href="https://github.com/p4lang/p4factory" target="_blank">https://github.com/p4lang/p4factory</a>  <br> I get <i><font style="font-size:10pt" size="2">thrift.transport.TTransport.TTransportException: Could not connect to localhost:22222 </font>. </i>Also when I ping under mininet suddenly I get <font style="font-size:10pt" size="2"><i>Disconnected: Ethernet Network </i></font>message<i> .</i> I was only able to run this demo once and now its not going the same way. <br><font style="font-size:12pt" size="3"><br></font><br><font style="font-size:12pt" size="3">2) Same message </font><font style="font-size:12pt" size="3"><i>: <font style="font-size:10pt" size="2">Could not connect to localhost:22222 </font></i>occurs when I try to start CLI for simple_router by below command inside targets/simple_router$ because I want to see table contents in another terminal: </font><br><br><font style="font-size:12pt" size="3"><i>python ../../cli/pd_cli.py -p simple_router -i p4_pd_rpc.simple_router -s of-tests/pd_thrift:../../submodules/oft-infra -c localhost:22222</i></font><br><br><font style="font-size:12pt" size="3">This may be because I have not run the above question 1.<br><br>3) I want to check value updated for my register whether its right or not? Which is the best way to do that? Is that through API for table or have another API? <br><br><br>Thanks,<br>Swaroop<br></font><br><br><div><hr>Date: Thu, 13 Aug 2015 13:06:30 -0700<div><div class="h5"><br>Subject: Re: [P4-dev] Doubts Regarding use of Register<br>From: <a href="mailto:antonin@barefootnetworks.com" target="_blank">antonin@barefootnetworks.com</a><br>To: <a href="mailto:swaroopthool1991@outlook.com" target="_blank">swaroopthool1991@outlook.com</a><br>CC: <a href="mailto:p4-dev@p4.org" target="_blank">p4-dev@p4.org</a><br><br><div dir="ltr"><div><div><div><div><div><div><div><div><div>The locations have to come from somewhere. I don't see how you can do this without a table that looks like this:<br><br></div>table flow_locations {<br></div>  reads {<br></div>    ipv4.dstAddr: exact;<br>    ...<br>  }<br></div>  actions {<br></div>    set_locations;<br></div>    drop;<br>  }<br>}<br><br></div>action set_locations(locA, locB, locC) {<br></div>  modify_field(metaA.location, locA);<br>  ...<br></div>  // why not write to the registers here?<br><div><div>}<br><br></div><div>This table effectively maps flows to your register locations. Now maybe at some point, while processing a flow you need to retrieve the register values for <b>another</b> (previous) flow. In this case you need to have a second table like this one:<br><br></div><div>table retrieve_flow_locations {<br></div><div>  reads {<br></div><div>    flow_meta.ipv4_dstAddr: exact;<br>    ...<br>  }<br></div><div>  actions {<br></div><div>    set_locations;<br></div><div>    no_op;<br>  }<br>}<br><br></div><div>Now of course you need to populate flow_meta.ipv4_dstAddr before applying this table (you can see flow_meta as your flow lookup key).<br></div><div>The 2 tables (flow_locations and retrieve_flow_locations) are exactly the same in content (populated by you through the control plane). However they have to be 2 different P4 tables because 1) P4 does not let you apply the same table with a different key 2) our compiler rejects multiple invocations of the same table.<br><br></div><div>Personally I find the above a little bit convoluted. But that's the best I can do. I don't really understand to what end you need to retrieve flow information for a given flow while you are processing a different flow.<br><br></div><div>If all you are concerned about is making sure that packets belonging to the same flow always map to the same register indices, then it is pretty simple and pretty common, and you only need the first table (ignore the second table, retrieve_flow_locations).<br><br><br></div><div>Now for your second question:<br></div><div>You are running this command from the wrong directory. This command works specifically for the simple_router target and is supposed to run from targets/simple_router. If you have a target called <i>AAA</i> running and you want to connect to the CLI, you should go to targets/<i>AAA</i> and use the following:<br><br>python ../../cli/pd_cli.py -p <i>AAA</i> -i p4_pd_rpc.<i>AAA</i> -s of-tests/pd_thrift:../../submodules/oft-infra -c localhost:22222<br></div><div>(the port value is likely to be different, most likely 9090)<br><br></div><div>Best,<br><br></div><div>Antonin<br></div></div></div><div><br><div>On Thu, Aug 13, 2015 at 8:48 AM, Swaroop Thool <span dir="ltr"><<a href="mailto:swaroopthool1991@outlook.com" target="_blank">swaroopthool1991@outlook.com</a>></span> wrote:<br><blockquote style="border-left:1px #ccc solid;padding-left:1ex">


<div><div dir="ltr">Hi Antonin,<br><br>Thank for your reply and sorry for my unclear question and annoying you as I am new in p4.<br><br>I have:<br><br>register r1 {  // THERE ARE 3 SUCH ARRAYS R1,R2,R3<br>    width : 16;<br>    instance_count : 500;   //single array of size 500 <br>}<br><br>I am considering array r1 of register of size 500. And there are total 3 such arrays say, r1,r2,r3.<br>If I store 3 different values corresponding to 1st input (like 1st IP address) at location r1[10], r2[20], r3[30] using metadata fields (manipulation/transfer) where, my metadata is like temporary structure having fields as location and value as:<br><br>header_type temp_metadata_t {  //THERE ARE 3 INSTANCES OF THIS FOR EACH R1, R2, R3<br>  fields{     <br>      location : 16;<br>      value : 10; }<br>}<br><br>Again storing 3 different values corresponding to 2nd input (like 2nd IP address) at location r1[50], r2[60], r3[70] and so on for different number of inputs. Now I want to know what is the value at location "r1[10], r2[20], r3[30] " which should be corresponding to same input as stated above(here its 1st input). As I am using temp_metadata_t for value and location manipulation which puts my values in r1,r2,r3 and gets refreshed with new one as I proceed further. I dont have record to get values from location r1[10], r2[20], r3[30] belonging to 1st input. <br>Can I create table with run-time entries for this 3 values combination and use something like pointer? I dont know how to do this.<br><br>Also, how to view table entries? I tried the below to start CLI  <br><pre>: ~/p4factory/cli$ ./pd_cli.py -p simple_router -s of-tests/pd_thrift:../../submodules/oft-infra -c localhost:22222<br><br><br>but gets error:<br>./pd_cli.py: line 15: import: command not found<br>./pd_cli.py: line 16: import: command not found<br>./pd_cli.py: line 17: import: command not found<br>./pd_cli.py: line 18: import: command not found<br>./pd_cli.py: line 19: import: command not found<br>./pd_cli.py: line 20: import: command not found<br>./pd_cli.py: line 21: import: command not found<br>./pd_cli.py: line 24: import: command not found<br>./pd_cli.py: line 27: syntax error near unexpected token `('<br>./pd_cli.py: line 27: `class PdCli(cmd.Cmd):'<br><br><br>Thanks,<br>Swaroop<br></pre><br><br><div><hr>Date: Thu, 13 Aug 2015 06:59:53 -0700<div><div><br>Subject: Re: [P4-dev] Doubts Regarding use of Register<br>From: <a href="mailto:antonin@barefootnetworks.com" target="_blank">antonin@barefootnetworks.com</a><br>To: <a href="mailto:swaroopthool1991@outlook.com" target="_blank">swaroopthool1991@outlook.com</a><br>CC: <a href="mailto:p4-dev@p4.org" target="_blank">p4-dev@p4.org</a><br><br><div dir="ltr"><div>Hi Swaroop,<br><br></div>Please see inline<br><div><div><div><br><div>On Wed, Aug 12, 2015 at 9:10 AM, Swaroop Thool <span dir="ltr"><<a href="mailto:swaroopthool1991@outlook.com" target="_blank">swaroopthool1991@outlook.com</a>></span> wrote:<br><blockquote style="border-left:1px #ccc solid;padding-left:1ex">


<div><div dir="ltr">Hi Antonin,<br><br>Thank you for your reply. <br><br>1) Furthermore, few basic operations implemented in many languages making it difficult to implement in P4.<br><br>Is there way in P4 where I can keep record of values for particular flow/input.<br>For example, I have stored 3 values of 1st input(like 1st IP address) in 3 different register arrays(one in each) through metadata field transfer. And again stored 3 values of 2nd input(like another IP address) in those 3 different register arrays but at different locations. Again for next 3rd input and so on. <br>Issue here is that ALL those values are in 3 register arrays and now I want to pick only that 3 values of 1st input. As metadata values are overwritten with latest values which cant rescue me. How to collect this 3 values of each input when register array almost becomes full or when inputs are stopped? If this is not the way, can I create run-time instances of metadatas for each new input which will hold values of that particular input/flow? But again here how can I refer to 1st flow metadatas after few flows?    <br></div></div></blockquote><div><br></div><div>I am sorry but it is very difficult for me to understand what you are trying to achieve here. I don't understand how you are filling your register arrays (like a queue?), what you are putting there, how you want to use it later...? If you can give some pseudo-code, I may be able to help you better.<br></div><div> </div><blockquote style="border-left:1px #ccc solid;padding-left:1ex"><div><div dir="ltr"><br>2)Is there any print statement in P4? <br></div></div></blockquote><div><br></div><div>That would not mean much, given that a) P4 is not a purely imperative language b) it is targeted at many kinds of target switches, including hardware ones.<br></div><div>a) Where would you be able to print exactly? Only in actions, control flow, some parts of the parse states?<br></div><div>b) Where would your message go?<br></div><div>Also, user strings are not supported in P4, which kind of makes it difficult.<br></div><div>In a nutshell, I don't think this belongs into standard P4. If you are writing P4 programs specifically for a software switch, you may be able to extend the P4 language with print statements that will be interpreted by your backend. But that would require modifying the frontend of the compiler (parser, hlir).<br><br></div><div>We are working on a P4 debugger which will interact with the p4lang software switch. This debugger would let you step through a P4 program and print information about fields / metadata as you go. It will not be ready to be released for a while though.<br></div><div> </div><blockquote style="border-left:1px #ccc solid;padding-left:1ex"><div><div dir="ltr"><br>3)Are there any comparison statement among values (e.g  max, min) ?<br></div></div></blockquote><div><br></div><div>I think it is in the works.<br><br><br></div><div>Best,<br><br></div><div>Antonin<br></div><div> </div><blockquote style="border-left:1px #ccc solid;padding-left:1ex"><div><div dir="ltr"><br><br>Thanks,<br>Swaroop<br><br><br><br><div><hr>Date: Mon, 10 Aug 2015 08:31:32 -0700<div><div><br>Subject: Re: [P4-dev] Doubts Regarding use of Register<br>From: <a href="mailto:antonin@barefootnetworks.com" target="_blank">antonin@barefootnetworks.com</a><br>To: <a href="mailto:swaroopthool1991@outlook.com" target="_blank">swaroopthool1991@outlook.com</a><br>CC: <a href="mailto:p4-dev@p4.org" target="_blank">p4-dev@p4.org</a><br><br><div dir="ltr"><div><div><div><div><div><div>Hi Swaroop,<br><br></div>Sorry I sent you the wrong link, here is the correct one: <a href="https://github.com/p4lang/p4-hlir/blob/master/p4_hlir/frontend/primitives.json#L61" target="_blank">https://github.com/p4lang/p4-hlir/blob/master/p4_hlir/frontend/primitives.json#L61</a><br><br></div>As for your questions:<br><br></div>1) <i>myfield</i> is independent of the register, it should be a (any) header field / metadata field. Using the register name here will result in an error.<br><br></div>2) Please submit an issue here: <a href="https://github.com/p4lang/p4c-behavioral/issues" target="_blank">https://github.com/p4lang/p4c-behavioral/issues</a> for the Python error you are seeing. You can just avoid using 'static' in your P4 program for now. I am pretty sure this attribute is ignored by the behavioral-model anyway.<br><br></div>Thanks,<br><br></div>Antonin<br></div><div><br><div>On Mon, Aug 10, 2015 at 8:07 AM, Swaroop Thool <span dir="ltr"><<a href="mailto:swaroopthool1991@outlook.com" target="_blank">swaroopthool1991@outlook.com</a>></span> wrote:<br><blockquote style="border-left:1px #ccc solid;padding-left:1ex">


<div><div dir="ltr">Hi Antonin,<br><br>Thanks for the reply. <br>When I used the lines mentioned by you:<br><br><div>register_read(<i>myfield</i>, r, runTimeValueofOtherMetadata); <i><br></i></div><div>add_to_field(<i>myfield</i>, 0x01);<br></div>register_write(r, runTimeValueofOtherMetadata, <i>myfield</i>); <br><br>Which <i>"</i><i><i>myfield</i>" actually here related to register r ? Can I use different field reference(e.g. some metadata field ref) instead of it?<br><br></i><br>I was not getting compile error at start.It compiled for few lines however, later I got error stated as follows:<br><br><i>/home/swaroop/p4-other/p4factory/submodules/p4c-behavioral/p4c_bm/shell.py p4src/sample.p4 --gen-dir=/home/swaroop/p4-other/p4factory/targets/sample/build//bm/ --thrift --public-inc-path=/home/swaroop/p4-other/p4factory/targets/sample/build//inc/p4_sim --p4-prefix=sample<br>WARNING: No error rule is defined for exclusive state 'pragma'<br>WARNING: Token 'DIVIDE' defined, but not used<br>WARNING: Token 'PPHASH' defined, but not used<br>WARNING: Token 'MOD' defined, but not used<br>WARNING: There are 3 unused tokens<br>parsing successful<br>Semantic warning: action 'no_op' is not reachable and will be removed<br>semantic checking successful<br>Header type standard_metadata_t not byte-aligned, adding padding<br>validating:  True<br>validating:  True<br>validating:  True<br>validating:  True<br>Generating files in directory /home/swaroop/p4-other/p4factory/targets/sample/build/bm<br>total phv length (in bytes): 124<br>Traceback (most recent call last):<br>  File "/home/swaroop/p4-other/p4factory/submodules/p4c-behavioral/p4c_bm/shell.py", line 130, in <module><br>    main()<br>  File "/home/swaroop/p4-other/p4factory/submodules/p4c-behavioral/p4c_bm/shell.py", line 124, in main<br>    dump_yaml = args.dump_yaml)<br>  File "/home/swaroop/p4-other/p4factory/submodules/p4c-behavioral/p4c_bm/smart.py", line 1141, in render_dict_create<br>    render_dict_populate_registers(render_dict, hlir)<br>  File "/home/swaroop/p4-other/p4factory/submodules/p4c-behavioral/p4c_bm/smart.py", line 1076, in render_dict_populate_registers<br>    r_info["binding"] = ("static", table)<br>UnboundLocalError: local variable 'table' referenced before assignment<br>make: *** [/home/swaroop/p4-other/p4factory/targets/sample/build//inc/p4_sim/rmt.h] Error 1<br><br><br>P.S: Repository by the Link is not accessible </i><br><a href="https://github.com/barefootnetworks/p4-hlir/blob/master/p4_hlir/frontend/primitives.json#L61" target="_blank"></a><a href="https://github.com/barefootnetworks/p4-hlir/blob/master/p4_hlir/frontend/primitives.json#L61" target="_blank">https://github.com/barefootnetworks/p4-hlir/blob/master/p4_hlir/frontend/primitives.json#L61</a><br><br><br>Thanks,<br>Swaroop <br><br><div><hr>Date: Wed, 5 Aug 2015 14:29:07 -0700<br>Subject: Re: [P4-dev] Doubts Regarding use of Register<br>From: <a href="mailto:antonin@barefootnetworks.com" target="_blank">antonin@barefootnetworks.com</a><br>To: <a href="mailto:swaroopthool1991@outlook.com" target="_blank">swaroopthool1991@outlook.com</a><br>CC: <a href="mailto:p4-dev@p4.org" target="_blank">p4-dev@p4.org</a><div><div><br><br><div dir="ltr"><div>Hi Swaroop,<br><br></div>Thanks for your interest. I will give more details inline. However the basic answer to all your questions is that P4 registers are almost not supported at all (yet) in the behavioral model software switch. Some stateful operations are supported, but differe from what is in the spec.<br><div><br><div>On Wed, Aug 5, 2015 at 12:08 PM, Swaroop Thool <span dir="ltr"><<a href="mailto:swaroopthool1991@outlook.com" target="_blank">swaroopthool1991@outlook.com</a>></span> wrote:<br><blockquote style="border-left:1px #ccc solid;padding-left:1ex">


<div><div dir="ltr">


<div dir="ltr"><font style="font-size:12pt" face="Calibri" size="3"><span style="font-size:12pt"><span dir="ltr">Hi all ,<br>

<br>

Thanks for the answers. Few more questions:<br>

If I write-<br>

       register r {<br>

            width : 9;<br>

            static : table_which_invokes_register;<br>

            instance_count : 500;<br>

            attributes : saturating; }<br>

<br>

1) If I create register array of 500(cells) as above, is it like 1-D array whose location can be read/write? How to access that because I am getting syntax error when I used modify_field(). What is the proper syntax if I want to put some value at run-time generated location of array, say 50?<br></span></span></font></div></div></div></blockquote><div><br></div><div>You can do this, just not with modify_field(). You need to use register_read() and register_write(), which are described here: <a href="https://github.com/barefootnetworks/p4-hlir/blob/master/p4_hlir/frontend/primitives.json#L61" target="_blank">https://github.com/barefootnetworks/p4-hlir/blob/master/p4_hlir/frontend/primitives.json#L61</a><br></div><div>Something like this should work in an action:<br></div><div>register_read(<i>my_field</i>, r, 50);<br></div><div>add_to_field(<i>my_field</i>, 0xaba);<br></div><div>register_write(r, 50, <i>my_field</i>);<br></div><div>As you can see you can read / write a register, and once the value is in a field, you can do arithmetic on it. However you cannot operate directly on the register (for now).<br></div><div> </div><blockquote style="border-left:1px #ccc solid;padding-left:1ex"><div><div dir="ltr"><div dir="ltr"><font style="font-size:12pt" face="Calibri" size="3"><span style="font-size:12pt"><span dir="ltr"></span></span></font><br><font style="font-size:12pt" face="Calibri" size="3"><span style="font-size:12pt"><span dir="ltr"><font style="font-size:12pt" face="Calibri" size="3"><span style="font-size:12pt"><span dir="ltr">2) Further extension to above,How can I store value 1 at location say, 50 in register array of 500
 created above and later increment value 1 to 2 when same location is 
encountered and maintain those values?<br></span></span></font></span></span></font></div></div></div></blockquote><div><br></div><div>I guess the above answers your question?<br></div><div> </div><blockquote style="border-left:1px #ccc solid;padding-left:1ex"><div><div dir="ltr"><div dir="ltr"><font style="font-size:12pt" face="Calibri" size="3"><span style="font-size:12pt"><span dir="ltr"><font style="font-size:12pt" face="Calibri" size="3"><span style="font-size:12pt"><span dir="ltr"><br></span></span></font>

3)What is layout declaration(instead of width declaration) means which require header_type_name?<br></span></span></font></div></div></div></blockquote><div><br></div><div>It is a convenient way of accessing register values using field names, no more. Let's say I have the following code:<br><br></div><div>header_type my_header_type {<br></div><div>  fields {<br></div><div>    fA: 16;<br></div><div>    fB: 32;<br></div><div>    fC: 16;<br>  }<br>}<br><br></div><div>register r2 {<br></div><div>  layout: my_header_type;<br></div><div>  instance_count: 100;<br></div><div>}<br><br></div><div>Then each cell in your register would be 64-bit wide. You would be able to write things like this: r2[50].fB<br></div><div>So it is just a way to give "meaning" to the bits in a register cell.<br></div><div>However this is NOT supported in the p4lang software switch.<br></div><div> </div><blockquote style="border-left:1px #ccc solid;padding-left:1ex"><div><div dir="ltr"><div dir="ltr"><font style="font-size:12pt" face="Calibri" size="3"><span style="font-size:12pt"><span dir="ltr"><br>

4) If I create metadata for a packet to copy some value into its field, 
will value get updated with new one for another packet when same 
metadata is used for example : modify_field (metadata, somevalue) ?</span></span></font><font style="font-size:12pt" face="Calibri" size="3"><span style="font-size:12pt"><span dir="ltr"><font style="font-size:12pt" face="Calibri" size="3"><span style="font-size:12pt"><span dir="ltr">If yes, 
then how to maintain value of individual packets as I dont want to loose that values ? <br></span></span></font></span></span></font></div></div></div></blockquote><div><br></div><div>registers will let you maintain state, the value of metadata will be overwritten with each new packet<br></div><div> </div><blockquote style="border-left:1px #ccc solid;padding-left:1ex"><div><div dir="ltr"><div dir="ltr"><font style="font-size:12pt" face="Calibri" size="3"><span style="font-size:12pt"><span dir="ltr"><font style="font-size:12pt" face="Calibri" size="3"><span style="font-size:12pt"><span dir="ltr"><br>5)OR </span></span></font>should I use add_field() in above. What is the difference between both? <br></span></span></font></div></div></div></blockquote><div><br></div><div>I don't see how this relates to 4)<br><br><br></div><div>Also since you are using it in your code, I need to point out that attributes (e.g. saturating) are not supported in the switch yet.<br><br></div><div>Best,<br><br></div><div>Antonin<br></div><div> </div><blockquote style="border-left:1px #ccc solid;padding-left:1ex"><div><div dir="ltr"><div dir="ltr"><font style="font-size:12pt" face="Calibri" size="3"><span style="font-size:12pt"><span dir="ltr"><br>

<br>

Thanks,<br>

Swaroop</span></span></font></div>
                                          </div></div>
<br>_______________________________________________<br>
P4-dev mailing list<br>
<a href="mailto:P4-dev@p4.org" target="_blank">P4-dev@p4.org</a><br>
Listinfo - <a href="http://mail.p4.org/mailman/listinfo/p4-dev_p4.org" rel="noreferrer" target="_blank">http://mail.p4.org/mailman/listinfo/p4-dev_p4.org</a><br>
Archives - <a href="http://mail.p4.org/pipermail/p4-dev_p4.org/" rel="noreferrer" target="_blank">http://mail.p4.org/pipermail/p4-dev_p4.org/</a><br></blockquote></div><br><br clear="all"><br>-- <br><div><div dir="ltr">Antonin<br></div></div>
</div></div></div></div></div>                                      </div></div>
</blockquote></div><br><br clear="all"><br>-- <br><div><div dir="ltr">Antonin<br></div></div>
</div></div></div></div>                                          </div></div>
</blockquote></div><br><br clear="all"><br>-- <br><div><div dir="ltr">Antonin<br></div></div>
</div></div></div></div></div></div></div>                                      </div></div>
</blockquote></div><br><br clear="all"><br>-- <br><div><div dir="ltr">Antonin<br></div></div>
</div></div></div></div>                                          </div></div>
</blockquote></div><br><br clear="all"><br>-- <br><div class="gmail_signature"><div dir="ltr">Antonin<br></div></div>
</div>