<div dir="ltr">Hi Chang,<div><br></div><div>As Vlad mentioned, one can't implement complex computing functions -- such as encryption, decryption, pattern matching, or string manipulation -- in P4, and that's by design. P4 is a language to describe packet-forwarding logic, and we intend to keep it that way.</div><div><br></div><div>That said, we also understand P4 programmers sometimes will need to "consume" complex computing functions if they are already made available in the processing pipeline. The P4-design working group has been working to offer such extensibility of P4 without bloating the P4 language. The extern type -- introduced in P4_14 v1.1 spec (<a href="http://p4.org/spec/">http://p4.org/spec/</a>) -- offers such extensibility. I believe some P4 target providers could expose a few C-library functions at the P4 level as "extern" types. But such extern types will most likely be supported only on those special types of targets. </div><div><br></div><div>-- Chang (Kim)</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Aug 24, 2016 at 2:55 AM, Vladimir Gurevich <span dir="ltr"><<a href="mailto:vladimir.gurevich@barefootnetworks.com" target="_blank">vladimir.gurevich@barefootnetworks.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Hello Chang,<br></div><div><br></div><div>In terms of regular arithmetic, most implementations do support more primitives than just add() and add_to_field(), mandated by the spec. For example, subtraction is also supported as well as a normal set of bitwise logical operations, such as bit_and(), bit_or() , etc. The current specification draft (v.1.1) also allows using expressions in modify_field(). The freely available compiler (p4c-bm) also supports expressions.</div><div><br></div><div>In terms of more complex/specialized functions (such as string compare you mentioned in your email), you have to be more careful. I'll start by reminding you that P4 is not a general-purpose programming language. It was specifically designed for describing packet processing in high-speed pipelines and thus has a fairly limited number of primitives that we know can be efficiently implemented (particularly in hardware). For that same reason, interfacing with C is not a goal of the language -- in the majority of real-world situations, P4 programs are not going to be run on general-purpose CPU to begin with and thus there will be no C libraries to link to.</div><div><br></div><div>Having said that, there are software implementations (such as the BMv2-simple_switch behavioral model) that can be relatively easily extended by adding new P4 primitives, implemented as C functions. Note, though, that programs using them will not be portable to other systems unless they somehow implement these primitives. Ideally, you should create a separate target (i.e. my_switch instead of simple_switch) to avoid confusion and incompatibilities, though it is not strictly required.</div><div><br></div><div>If you search this list, you'll see a couple of threads that explain how this can be done. </div><div><br></div><div>Happy hacking,</div><div>Vladimir</div><div class="gmail_extra"><br><div class="gmail_quote"><div><div class="h5">On Mon, Aug 22, 2016 at 10:36 PM, Chang Liu <span dir="ltr"><<a href="mailto:gaustin909@gmail.com" target="_blank">gaustin909@gmail.com</a>></span> wrote:<br></div></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div class="h5"><div dir="ltr">Hi, everybody,<div><br></div><div>I am a P4 newbie and I have a simple question about P4: It seems to me that doing arbitrary arithmetic operations or string comparisons is not well supported in P4 (correct me if I am wrong). So is it possible in P4 to call external C library functions? </div><div><br></div><div>Thanks for your help in advance.</div><div><br></div><div>Best</div><span><font color="#888888"><div>Chang<br><div><br></div><div><br></div></div></font></span></div>
<br></div></div>______________________________<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><span class="HOEnZb"><font color="#888888"><br></font></span></blockquote></div><span class="HOEnZb"><font color="#888888"><br><br clear="all"><div><br></div>-- <br><div data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><font size="4"><b>Vladimir Gurevich</b></font></div><div><font size="4"><b><br></b></font></div><div><font size="4"><b>Barefoot Networks</b></font></div><div><b><font size="2">Technical Lead, Customer Engineering</font></b></div><div><font size="2">Email: <a href="mailto:vag@barefootnetworks.com" target="_blank">vag@barefootnetworks.com</a></font></div><div><font size="2">Phone: <a href="tel:%28408%29%20833-4505" value="+14088334505" target="_blank">(408) 833-4505</a></font></div><div><br></div></div></div></div></div>
</font></span></div></div>
<br>______________________________<wbr>_________________<br>
P4-dev mailing list<br>
<a href="mailto:P4-dev@lists.p4.org">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/<wbr>listinfo/p4-dev_lists.p4.org</a><br></blockquote></div><br></div>