<div dir="ltr">One more quick thought I forgot while typing the previous reply:<div><br></div><div>You could create the two (or more) tables via copy and paste, but with P4_16 you can also create a control with a table defined inside of it, and then instantiate that control multiple times inside your ingress control, and call each instantiation one time.  That causes the P4_16 compiler to effectively do the code duplication for you, and the implementations of each table will always remain identical to each other, if you ever make changes to its one definition in the source code.</div><div><br></div><div>Andy</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr">On Fri, Nov 23, 2018 at 11:44 AM Andy Fingerhut <<a href="mailto:andy.fingerhut@gmail.com">andy.fingerhut@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div dir="ltr">If you don't mind just making two tables with similar names and are otherwise the same in all ways, e.g. including the control plane making the same updates to both, that is a workaround for this limitation.<div><br></div><div>In some high speed ASIC implementations, that is the only way to do it, and it seems that bmv2 and the p4c bmv2 backend inherited that limitation.  See <a href="https://github.com/p4lang/p4c/issues/457" target="_blank">https://github.com/p4lang/p4c/issues/457</a> for some discussion.  The compiler _could_ of course be modified to duplicate the table for you, but it doesn't right now -- you can do it manually as suggested above.</div><div><br></div><div>Andy</div><div><br></div><div><br></div></div></div><br><div class="gmail_quote"><div dir="ltr">On Fri, Nov 23, 2018 at 8:09 AM cs.lev <<a href="mailto:cs.lev@gmx.com" target="_blank">cs.lev@gmx.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Dear All,<br>
<br>
I have run into a simple problem.<br>
I have simple application that parses different header types, e.g.,<br>
ARP, IP, TCP, ICMP.<br>
For specific TCP packets I want to some special forwarding, which<br>
contains some conditions, i.e., as conditions cannot be defined in<br>
actions, I need to implement my conditions in the Ingress control's<br>
apply {} part.<br>
Such condition would be a state of a bit, e.g., if SYN then forward, if<br>
ACK then drop (for simplicity! of course this does not make sense :)).<br>
<br>
On the other hand, to provide working communications, I need to handle<br>
ICMP and ARP packets as well.<br>
<br>
So, what I am doing is that I have a switch with 2 ports, and a<br>
port_forward table, which forwards packets from port 0 to port 1 and<br>
vice versa.<br>
And in the Ingress control's apply part, I have conditions for the<br>
types of the packets, but in essence I would like to apply port_forward<br>
table mulitple times, as I need to pass ARP,ICMP and even the modified<br>
TCP packets as well from one port to the other, however the following<br>
code snippet does not work:<br>
if(hdr.ethernet.isValid())<br>
        {<br>
            if(hdr.arp.isValid())<br>
            {<br>
                port_forward.apply();<br>
            }<br>
            else if(hdr.ipv4.isValid())<br>
            {<br>
                if(hdr.ipv4.protocol == IP_PROTO_ICMP)<br>
                {<br>
                    port_forward.apply();<br>
                }<br>
                if(hdr.ipv4.protocol == IP_PROTO_TCP &&<br>
hdr.tcp.isValid())<br>
                {<br>
                        //do the mumbojumbo with the packets (or this part could also<br>
be done in a separate action)<br>
                        port_forward.apply();<br>
                }<br>
        ...<br>
<br>
<br>
compiler raises the following error:<br>
Program is not supported by this target, because table<br>
MyIngress.port_forward has multiple successors<br>
  table port_forward<br>
<br>
This means for me that one table can only be applied once, however not<br>
just my stupid example would require to 'recirculate packets to already<br>
visited table'. <br>
<br>
Is there any way to resolve my issue? Can I call apply a table several<br>
times if I jump from ingress to egress back-and-forth (I don't know<br>
whether this would even work for jumping back only once).<br>
<br>
Or can I call somehow an action without applying a table (but of course<br>
matching on the input port (for instance in my case) would be known)?<br>
<br>
So far, as a workaround I created the same tables over and over with<br>
different names (e.g., port_forward, arp_forward, icmp_forward) but<br>
fundamentally with the same look (match-action table). At least the<br>
actions can be reused in the tables, so they don't need to be redefined<br>
in a similar way.<br>
<br>
<br>
Thanks,<br>
cs.lev<br>
<br>
<br>
_______________________________________________<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/listinfo/p4-dev_lists.p4.org</a><br>
</blockquote></div>
</blockquote></div>