<div dir="ltr"><div><div>Hello Antonin :</div><div><br></div><div>Thanks for your reply. It's really clear to me.</div><div><br></div><div>But I face another question.</div><div><br></div><div><div>I want to extract the host_name of dns packet, my idea is :</div><div><br></div><div>1. Store them into a header stack. (in parser) </div><div><br></div></div><div><font color="#274e13">header_type one_byte_payload_t {</font></div><div><font color="#274e13">    fields {</font></div><div><font color="#274e13">      data : 8;</font></div><div><font color="#274e13">    }</font></div><div><font color="#274e13">}</font></div></div><div><font color="#274e13"><br></font></div><div><font color="#274e13">header one_byte_payload_t one_byte_payload[32];<br></font></div><div><font color="#274e13"><br></font></div><div><font color="#274e13">parser parse_dns_payload {<br></font></div><div><font color="#274e13">    extract(one_byte_payload[next]<wbr>);</font></div><div><font color="#274e13">    return select(latest.data){</font></div><div><font color="#274e13">       0x00: ingress;</font></div><div><font color="#274e13">       default: parse_dns_payload;</font></div><div><font color="#274e13">    }</font></div><div><font color="#274e13">}</font></div><div><font color="#274e13"><br></font></div><div>2. Pass the header stack to an function and do pattern matching. (in action)</div><div><br></div><div><font color="#274e13">pattern_match(one_byte_<wbr>payload);</font><br></div><div><br></div><div><div><font color="#274e13">class pattern_match : public ActionPrimitive<HeaderStack &> {</font></div><div><font color="#274e13">  void operator ()(HeaderStack &pattern) {</font></div><div><font color="#274e13">    BMLOG_DEBUG("size :{}\n", pattern.get_count() );</font></div><div><font color="#274e13">  }</font></div><div><font color="#274e13">}</font></div></div><div><font color="#274e13"><br></font></div><div><font color="#274e13"><div>REGISTER_PRIMITIVE(pattern_match);</div></font></div><div><br></div><div>But after I call my own primitive function :</div><div><br></div><div>the log file ( p4s.s1.log ) has error messages: <br></div><div>lt-simple_switch: ../../include/bm/bm_sim/<wbr>actions.h:337: T bm::ActionParam::to(bm::<wbr>ActionEngineState*) const [with T = bm::HeaderStack&]: Assertion `tag == ActionParam::HEADER_STACK' failed.</div><div><br></div><div>(I have <span style="font-size:12.8px">added my primitive description to</span> primitives.json too.)</div><div>I guess something happened on type "HeaderStack".</div><div>Even though I copy the "pop" function and rename to another function, the error still happened.</div><div><br></div><div><div style="font-size:12.8px">Thanks you so much.</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><div style="font-size:12.8px">Best regards,</div><div style="font-size:12.8px">Abbie</div></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Apr 12, 2017 at 12:42 AM, Antonin Bas <span dir="ltr"><<a href="mailto:antonin@barefootnetworks.com" target="_blank">antonin@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">Hi,<div><br></div><div>Please see inline</div><div class="gmail_extra"><br><div class="gmail_quote"><span class="">On Tue, Apr 11, 2017 at 12:41 AM, yunchen chang <span dir="ltr"><<a href="mailto:y2924uki@gmail.com" target="_blank">y2924uki@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Hi Antonin:<div><br></div><div>Thanks for your reply.</div><div><br></div><div>I have another questions about <span style="font-size:12.8px">primitives function.</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">1) Can I call any C++ functions? (like string compare etc) </span></div></div></blockquote><div><br></div></span><div>Yes, why not? You can write any C++ code.</div><span class=""><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 dir="ltr"><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">2) This</span><span style="font-size:12.8px"> </span><a href="https://github.com/p4lang/p4c-bm/blob/master/p4c_bm/primitives.json" style="font-size:12.8px" target="_blank">https://github.com/p4lang<wbr>/p4c-bm/blob/master/p4c_bm/<wbr>primitives.json</a> is uesd by p4 compiler to know the functions it have, am I right? But why there are only few functions in this file? Primitive functions of simple_switch (<a href="https://github.com/p4lang/behavioral-model/blob/master/targets/simple_switch/primitives.cpp" target="_blank">https://github.com/p4lang/beh<wbr>avioral-model/blob/master/targ<wbr>ets/simple_switch/primitives.<wbr>cpp</a>) don't need to be known by compiler?</div></div></blockquote><div><br></div></span><div>The standard primitives which are described in the P4_14 spec are in a different location: <a href="https://github.com/p4lang/p4-hlir/blob/master/p4_hlir/frontend/primitives.json" target="_blank">https://github.com/<wbr>p4lang/p4-hlir/blob/master/p4_<wbr>hlir/frontend/primitives.json</a></div><span class=""><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 dir="ltr"><div><br></div><div>3) Because I only see<span style="font-size:12.8px"> </span><a href="https://github.com/p4lang/p4c-bm/blob/master/p4c_bm/primitives.json" style="font-size:12.8px" target="_blank">https://github.com/p4lang/<wbr>p4c-bm/blob/master/p4c_bm/prim<wbr>itives.json</a> this code. I want to know what the format of <span style="color:rgb(24,54,145);font-family:sfmono-regular,consolas,"liberation mono",menlo,courier,monospace;font-size:12px;white-space:pre-wrap">properties: types and </span><span style="color:rgb(24,54,145);font-family:sfmono-regular,consolas,"liberation mono",menlo,courier,monospace;font-size:12px;white-space:pre-wrap">data_width </span>means. </div><div>For example : <span style="color:rgb(24,54,145);font-family:sfmono-regular,consolas,"liberation mono",menlo,courier,monospace;font-size:12px;white-space:pre-wrap">modify_field_rng_uniform</span><span style="color:rgb(24,54,145);font-family:sfmono-regular,consolas,"liberation mono",menlo,courier,monospace;font-size:12px;white-space:pre-wrap"> </span>: </div><div><span class="m_1283579813390150051gmail-m_-7547308493840937651gmail-pl-s" style="box-sizing:border-box;color:rgb(24,54,145);font-family:sfmono-regular,consolas,"liberation mono",menlo,courier,monospace;font-size:12px;white-space:pre-wrap"><span class="m_1283579813390150051gmail-m_-7547308493840937651gmail-pl-pds" style="box-sizing:border-box">"</span>type<span class="m_1283579813390150051gmail-m_-7547308493840937651gmail-pl-pds" style="box-sizing:border-box">"</span></span><span style="color:rgb(36,41,46);font-family:sfmono-regular,consolas,"liberation mono",menlo,courier,monospace;font-size:12px;white-space:pre-wrap"> : [</span><span class="m_1283579813390150051gmail-m_-7547308493840937651gmail-pl-s" style="box-sizing:border-box;color:rgb(24,54,145);font-family:sfmono-regular,consolas,"liberation mono",menlo,courier,monospace;font-size:12px;white-space:pre-wrap"><span class="m_1283579813390150051gmail-m_-7547308493840937651gmail-pl-pds" style="box-sizing:border-box">"</span>field<span class="m_1283579813390150051gmail-m_-7547308493840937651gmail-pl-pds" style="box-sizing:border-box">"</span></span><span style="color:rgb(36,41,46);font-family:sfmono-regular,consolas,"liberation mono",menlo,courier,monospace;font-size:12px;white-space:pre-wrap">, </span><span class="m_1283579813390150051gmail-m_-7547308493840937651gmail-pl-s" style="box-sizing:border-box;color:rgb(24,54,145);font-family:sfmono-regular,consolas,"liberation mono",menlo,courier,monospace;font-size:12px;white-space:pre-wrap"><span class="m_1283579813390150051gmail-m_-7547308493840937651gmail-pl-pds" style="box-sizing:border-box">"</span>int<span class="m_1283579813390150051gmail-m_-7547308493840937651gmail-pl-pds" style="box-sizing:border-box">"</span></span><span style="color:rgb(36,41,46);font-family:sfmono-regular,consolas,"liberation mono",menlo,courier,monospace;font-size:12px;white-space:pre-wrap">, </span><span class="m_1283579813390150051gmail-m_-7547308493840937651gmail-pl-s" style="box-sizing:border-box;color:rgb(24,54,145);font-family:sfmono-regular,consolas,"liberation mono",menlo,courier,monospace;font-size:12px;white-space:pre-wrap"><span class="m_1283579813390150051gmail-m_-7547308493840937651gmail-pl-pds" style="box-sizing:border-box">"</span>table_entry_data<span class="m_1283579813390150051gmail-m_-7547308493840937651gmail-pl-pds" style="box-sizing:border-box">"</span></span><span style="color:rgb(36,41,46);font-family:sfmono-regular,consolas,"liberation mono",menlo,courier,monospace;font-size:12px;white-space:pre-wrap">]</span></div><div><span style="color:rgb(36,41,46);font-family:sfmono-regular,consolas,"liberation mono",menlo,courier,monospace;font-size:12px;white-space:pre-wrap">and </span><span class="m_1283579813390150051gmail-m_-7547308493840937651gmail-pl-s" style="box-sizing:border-box;color:rgb(24,54,145);font-family:sfmono-regular,consolas,"liberation mono",menlo,courier,monospace;font-size:12px;white-space:pre-wrap"><span class="m_1283579813390150051gmail-m_-7547308493840937651gmail-pl-pds" style="box-sizing:border-box">"</span>data_width<span class="m_1283579813390150051gmail-m_-7547308493840937651gmail-pl-pds" style="box-sizing:border-box">"</span></span><span style="color:rgb(36,41,46);font-family:sfmono-regular,consolas,"liberation mono",menlo,courier,monospace;font-size:12px;white-space:pre-wrap"> : </span><span class="m_1283579813390150051gmail-m_-7547308493840937651gmail-pl-s" style="box-sizing:border-box;color:rgb(24,54,145);font-family:sfmono-regular,consolas,"liberation mono",menlo,courier,monospace;font-size:12px;white-space:pre-wrap"><span class="m_1283579813390150051gmail-m_-7547308493840937651gmail-pl-pds" style="box-sizing:border-box">"</span>dst<span class="m_1283579813390150051gmail-m_-7547308493840937651gmail-pl-pds" style="box-sizing:border-box">" </span></span></div><div>Are there any documents explain the information?<br></div></div></blockquote><div><br></div></span><div>No document, just available examples.</div><div>In "type" you can list the acceptable types for a given parameter. Accepted values are "field", "int" (for an literal constant), "table_entry_data" (for integral values that come from action data), "header_instance", "register", "counter", "meter",...</div><div>"data_width" is only required for parameters for which "table_entry_data" is a possible type. This is needed to allocate the appropriate memory for tables. It can either be an integer value, the name of another parameter (which cannot itself be of type "table_entry_data") or a field reference.</div><div>In the case of "modify_field_rng_uniform" for example, parameters "begin" and "end" can either be literal constants, field references or table action data ("table_entry_data"). In the case where "begin" (or "end") comes from table action data, the number of bits we allocate for it in a table entry is determined by the bitwidth of the "dst" parameter, which is a field reference.</div><div>In the following code:</div><div>table t_set_port {</div><div>    reads { ... }</div><div>    actions { set_port; }</div><div>}</div><div>action set_port(b, e) {</div><div>  modify_field_rng_uniform(<wbr>standard_metadata.egress_spec /* 9 bit by definition */, b, e);</div><div>}</div><div>Both "b" and "e" come from action data. They are assumed to be 9-bit, based on the width for standard_metadata.egress_spec. This is different from P4_16, where types for action parameters are explicit.</div><div><div class="h5"><div><br></div><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 dir="ltr"><div></div><div><br></div><div>Thanks you so much.</div><div><br></div><div><div style="font-size:12.8px">Best regards,</div><div style="font-size:12.8px">Abbie</div></div></div><div class="m_1283579813390150051gmail-HOEnZb"><div class="m_1283579813390150051gmail-h5"><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Apr 7, 2017 at 2:52 AM, Antonin Bas <span dir="ltr"><<a href="mailto:antonin@barefootnetworks.com" target="_blank">antonin@barefootnetworks.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Hi,<div><br></div><div>Yes you can add your code to primitives.cpp. There are many examples you can look at so this shouldn't be too hard. Don't forget to call the REGISTER_PRIMITIVE macro. Note that after you modify the simple_switch code, it will not be the "standard" simple_switch any more. It will be your own version of it, which supports one extra primitive.</div><div><br></div><div>In order to have the p4c-bm compiler support your new primitive, you will need to add your primitive description to <a href="https://github.com/p4lang/p4c-bm/blob/master/p4c_bm/primitives.json" target="_blank">https://github.com/p4lang/p<wbr>4c-bm/blob/master/p4c_bm/primi<wbr>tives.json</a>. Once again, there are many examples there that you can look at, but if you need help you can send an email to the list.</div><div><br></div><div>Finally, I just want to stress out what Andy already said. Just because it runs on bmv2 simple_switch doesn't mean it will run on other P4-programmable targets.</div><div><br></div><div>Thanks,</div><div><br></div><div>Antonin</div></div><div class="gmail_extra"><div><div class="m_1283579813390150051gmail-m_-7547308493840937651h5"><br><div class="gmail_quote">On Thu, Apr 6, 2017 at 1:01 AM, yunchen chang <span dir="ltr"><<a href="mailto:y2924uki@gmail.com" target="_blank">y2924uki@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Hello Andy,<div><br></div><div>Thanks for your response.</div><div><br></div><div>1) I am using mininet(simple_switch.cpp) to be my environment, </div><div>    so I want to know where should I implement my C/C++ code? (<span style="font-size:12.8px">primitives.cpp?</span>)</div><div><br></div><div>2) Is there anything I should pay special attention to? ( like: restrictions of compiler )</div><span><div><br></div><div><div style="font-size:12.8px">Thank you.</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">Best regards,</div><div style="font-size:12.8px">Abbie</div></div></span></div><div class="m_1283579813390150051gmail-m_-7547308493840937651m_5573565048717147501HOEnZb"><div class="m_1283579813390150051gmail-m_-7547308493840937651m_5573565048717147501h5"><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Apr 3, 2017 at 8:35 AM, Andy Fingerhut <span dir="ltr"><<a href="mailto:andy.fingerhut@gmail.com" target="_blank">andy.fingerhut@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">The P4 language is focused on parsing and manipulating packet headers, not payloads.<div><br></div><div>One could write a custom extension that could search for patterns in a payload, but it would be non-portable, and would have to be implemented in a target-specific language, e.g. C/C++ for a software model, Verilog for an ASIC or FPGA, etc.  It would be similar to having a library written in assembler and calling it from C, with the assembler implemented anew for each target processor.</div><div><br></div><div>Andy</div></div><div class="gmail_extra"><br><div class="gmail_quote"><div><div class="m_1283579813390150051gmail-m_-7547308493840937651m_5573565048717147501m_6169122823075557203h5">On Mon, Mar 27, 2017 at 9:13 AM, yunchen chang <span dir="ltr"><<a href="mailto:y2924uki@gmail.com" target="_blank">y2924uki@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="m_1283579813390150051gmail-m_-7547308493840937651m_5573565048717147501m_6169122823075557203h5"><div dir="ltr"><div>Hello everyone,</div><div><br></div><div>I am doing an experiment for DPI in P4.</div><div>(detect packet label in data plane, not in controller)</div><div><br></div><div>I need some complex funtcions like lookup the host name of payload.</div><div>Example:</div><div>host_name: <a href="http://tw.yahoo.com" target="_blank">tw.yahoo.com</a></div><div>mtach_key: .yahoo.</div><div><br></div><div>I plan to write function in "primitives.cpp" at first.</div><div><br></div><div>But after I read this posted : [<a href="http://lists.p4.org/pipermail/p4-dev_lists.p4.org/2016-August/000449.html" target="_blank">http://lists.p4.org/pipermail<wbr>/p4-dev_lists.p4.org/2016-Augu<wbr>st/000449.html</a>], it pointed that P4 can't implement "pattern matching".</div><div><br></div><div>I want to know is there any solution in current P4?</div><div>(or any suggestion)</div><div><br></div><div>Thank you.</div><div><br></div><div>Best regards,</div><div>Abbie</div></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><br></blockquote></div><br></div>
</blockquote></div><br></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></div></div><span class="m_1283579813390150051gmail-m_-7547308493840937651HOEnZb"><font color="#888888">-- <br><div class="m_1283579813390150051gmail-m_-7547308493840937651m_5573565048717147501gmail_signature"><div dir="ltr">Antonin<br></div></div>
</font></span></div>
</blockquote></div><br></div>
</div></div></blockquote></div></div></div><span class="HOEnZb"><font color="#888888"><br><br clear="all"><div><br></div>-- <br><div class="m_1283579813390150051gmail_signature"><div dir="ltr">Antonin<br></div></div>
</font></span></div></div>
</blockquote></div><br></div>