<div dir="ltr">Please see inline<div class="gmail_extra"><br><div class="gmail_quote">On Tue, Apr 18, 2017 at 6:44 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:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Hello Antonin:</div><div><br></div><div>Thanks for the fix. But it still fail after I update it.</div><div><br></div><div>But I make some change in <span style="font-size:12.8px">p4c-bm</span>(<a href="https://github.com/p4lang/p4c-bm/blob/master/p4c_bm/gen_json.py#L1137" target="_blank">https://github.com/p<wbr>4lang/p4c-bm/blob/master/p4c_b<wbr>m/gen_json.py#L1137</a>). </div><div>I change it to " if is_stack_ref(call_idx, arg_idx, primitive_name): ", then it works.</div></div></blockquote><div><br></div><div>This is not normal. I tested it this morning one more time. Maybe it would help if you sent your P4 program and primitives.json file.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><br></div><div>( Does it mean that I am using the version that has been abandoned? If yes, what is the affect if I keep using this version?) </div></div></blockquote><div><br></div><div>That would explain it, but based on your P4 snippets in this thread, you are not using p4v1.1. Also it would require you to pass --p4v1.1 as a command-line flag to p4c-bmv2 and I think you'd know if you were doing that...</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><br></div><div>After it work:</div><div>I try to access the header_instance in header_stack.</div><div><br></div><div><span class=""><div><font color="#274e13">class pattern_match : public ActionPrimitive<HeaderStack &> {</font></div></span><div><div><font color="#274e13">    void operator ()(HeaderStack &data) {</font></div><div><font color="#274e13">        BMLOG_DEBUG("Header num : {}\n", data.get_count()  );</font></div><div><font color="#274e13">        BMLOG_DEBUG("Header instance valid : {}\n", (data.get_next()).is_valid()  );</font></div></div><div><font color="#274e13">    }</font></div><div><font color="#274e13">}</font></div><div><br></div><div>the result :</div><div>> Header num : 17<br></div><div>> Header instance valid : false </div></div><div><br></div><div>I want to know why I can't access the header_instance. </div></div></blockquote><div><br></div><div>the "next" element in a header stack is never valid by definition...</div><div>here get_next() returns the 18th element in the stack, which is not valid</div><div>you can use get_last() to access the last valid element in the stack (in this case the 17th element). You can also loop through the valid elements:</div><div>for (size_t i = 0; i < data.get_count(); i++) {</div><div>  auto &hdr_instance = <a href="http://data.at">data.at</a>(i);</div><div>  assert(hdr_instance.is_valid())'</div><div>}</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div><br></div><div><br></div><div>I used to combine the header_instance to metadata in parser. </div><div>But it can't access instance in parser too(it can only extract). </div><div>And I know that it can't have loop in tables or actions. </div><div>Are there other suggestions to combine the header_instances before I pass it to function(then I can avoid using header_stack)?</div></div></div></blockquote><div><br></div><div>I don't understand the question.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div> </div></div><div><br></div><div>more little question:</div><div>I just installed p4c-bm and bmv2 before, and everything works fine.</div><div>Do I must install the p4-hlir? </div></div></blockquote><div><br></div><div>p4-hlir is installed automatically when you install p4c-bm. However, since I pushed an update to p4-hlir yesterday, you probably need to remove the old p4-hlir you have installed and install the latest version.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><span class=""><div><br></div><div>Thanks you so much.</div><div><br></div><div>Best regards,</div><div>Abbie</div></span></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Apr 18, 2017 at 2:38 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">There is somewhat of a hack in p4-hlir to support P4_14 header stacks. This had been fixed for the P4 v1.1 support, but this version of the language has been abandoned :(<div>Anyway the hack was such that only the push & pop primitives were able to support header stacks in their parameter list.</div><div>I pushed a fix to p4-hlir (<a href="https://github.com/p4lang/p4-hlir/" target="_blank">https://github.com/p4lang/p4-<wbr>hlir/</a>) and p4c-bm (<a href="https://github.com/p4lang/p4c-bm" target="_blank">https://github.com/p4lang/p4c<wbr>-bm</a>). I suggest that you update both and try again. Your approach looks correct to me, so it should work once you update.<br><div class="gmail_extra"><div><div class="m_6410489866563375862h5"><br><div class="gmail_quote">On Sat, Apr 15, 2017 at 5:35 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"><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_payload<wbr>);</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_mat<wbr>ch);</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/action<wbr>s.h:337: T bm::ActionParam::to(bm::Action<wbr>EngineState*) 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><span class="m_6410489866563375862m_-3263997499423071831gmail-"><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></span></div><div class="m_6410489866563375862m_-3263997499423071831gmail-HOEnZb"><div class="m_6410489866563375862m_-3263997499423071831gmail-h5"><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:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);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>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><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/pri<wbr>mitives.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.c<wbr>pp</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/p<wbr>4lang/p4-hlir/blob/master/p4_h<wbr>lir/frontend/primitives.json</a></div><span><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_6410489866563375862m_-3263997499423071831gmail-m_-7812824312754684204m_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_6410489866563375862m_-3263997499423071831gmail-m_-7812824312754684204m_1283579813390150051gmail-m_-7547308493840937651gmail-pl-pds" style="box-sizing:border-box">"</span>type<span class="m_6410489866563375862m_-3263997499423071831gmail-m_-7812824312754684204m_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_6410489866563375862m_-3263997499423071831gmail-m_-7812824312754684204m_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_6410489866563375862m_-3263997499423071831gmail-m_-7812824312754684204m_1283579813390150051gmail-m_-7547308493840937651gmail-pl-pds" style="box-sizing:border-box">"</span>field<span class="m_6410489866563375862m_-3263997499423071831gmail-m_-7812824312754684204m_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_6410489866563375862m_-3263997499423071831gmail-m_-7812824312754684204m_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_6410489866563375862m_-3263997499423071831gmail-m_-7812824312754684204m_1283579813390150051gmail-m_-7547308493840937651gmail-pl-pds" style="box-sizing:border-box">"</span>int<span class="m_6410489866563375862m_-3263997499423071831gmail-m_-7812824312754684204m_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_6410489866563375862m_-3263997499423071831gmail-m_-7812824312754684204m_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_6410489866563375862m_-3263997499423071831gmail-m_-7812824312754684204m_1283579813390150051gmail-m_-7547308493840937651gmail-pl-pds" style="box-sizing:border-box">"</span>table_entry_data<span class="m_6410489866563375862m_-3263997499423071831gmail-m_-7812824312754684204m_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_6410489866563375862m_-3263997499423071831gmail-m_-7812824312754684204m_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_6410489866563375862m_-3263997499423071831gmail-m_-7812824312754684204m_1283579813390150051gmail-m_-7547308493840937651gmail-pl-pds" style="box-sizing:border-box">"</span>data_width<span class="m_6410489866563375862m_-3263997499423071831gmail-m_-7812824312754684204m_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_6410489866563375862m_-3263997499423071831gmail-m_-7812824312754684204m_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_6410489866563375862m_-3263997499423071831gmail-m_-7812824312754684204m_1283579813390150051gmail-m_-7547308493840937651gmail-pl-pds" style="box-sizing:border-box">"</span>dst<span class="m_6410489866563375862m_-3263997499423071831gmail-m_-7812824312754684204m_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(stand<wbr>ard_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="m_6410489866563375862m_-3263997499423071831gmail-m_-7812824312754684204h5"><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_6410489866563375862m_-3263997499423071831gmail-m_-7812824312754684204m_1283579813390150051gmail-HOEnZb"><div class="m_6410489866563375862m_-3263997499423071831gmail-m_-7812824312754684204m_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_6410489866563375862m_-3263997499423071831gmail-m_-7812824312754684204m_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_6410489866563375862m_-3263997499423071831gmail-m_-7812824312754684204m_1283579813390150051gmail-m_-7547308493840937651m_5573565048717147501HOEnZb"><div class="m_6410489866563375862m_-3263997499423071831gmail-m_-7812824312754684204m_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_6410489866563375862m_-3263997499423071831gmail-m_-7812824312754684204m_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_6410489866563375862m_-3263997499423071831gmail-m_-7812824312754684204m_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_6410489866563375862m_-3263997499423071831gmail-m_-7812824312754684204m_1283579813390150051gmail-m_-7547308493840937651HOEnZb"><font color="#888888">-- <br><div class="m_6410489866563375862m_-3263997499423071831gmail-m_-7812824312754684204m_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="m_6410489866563375862m_-3263997499423071831gmail-m_-7812824312754684204HOEnZb"><font color="#888888"><br><br clear="all"><div><br></div>-- <br><div class="m_6410489866563375862m_-3263997499423071831gmail-m_-7812824312754684204m_1283579813390150051gmail_signature"><div dir="ltr">Antonin<br></div></div>
</font></span></div></div>
</blockquote></div><br></div>
</div></div></blockquote></div><br><br clear="all"><div><br></div></div></div><span class="m_6410489866563375862HOEnZb"><font color="#888888">-- <br><div class="m_6410489866563375862m_-3263997499423071831gmail_signature"><div dir="ltr">Antonin<br></div></div>
</font></span></div></div></div>
</blockquote></div><br></div>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr">Antonin<br></div></div>
</div></div>