<div dir="ltr">Hi Peter,<br><div><span style="font-size:12.8000001907349px">Thanks for the feedback! </span>Some suggestions inline:</div><div><br></div><div>> <span style="font-size:12.8000001907349px">Source Address == Destination Address — can be invalid for some protocols</span></div><div><span style="font-size:12.8000001907349px"><br></span></div><div><span style="font-size:12.8000001907349px">You could try using if() conditions in the control flow or XORing the two and confirming the result is 0. The latter suggestion is certainly ugly but just thrown in there for completeness.</span></div><div><br></div><div><span style="font-size:12.8000001907349px">> In IPv4 I’d like to check that if the Don’t Fragment bit is set then the Fragmentation Offset == 0</span><br style="font-size:12.8000001907349px"></div><div><span style="font-size:12.8000001907349px"><br></span></div><div><span style="font-size:12.8000001907349px">Parser transition cases can be masked like TCAM entries, so you should be able to create a state with a branch like this:</span></div><div><br></div><div><span style="font-size:12.8000001907349px">return (ipv4.fragment_offset, ipv4.dont_fragment) {</span></div><div><span style="font-size:12.8000001907349px">   0 mask 1 : proceed_as_normal_state;</span></div><div><span style="font-size:12.8000001907349px">   1 :             proceed_as_normal_state;</span><span style="font-size:12.8000001907349px"><br></span></div><div><span style="font-size:12.8000001907349px">   default :    deal_with_the_error_state;</span><span style="font-size:12.8000001907349px"><br></span></div><div><span style="font-size:12.8000001907349px">}</span></div><div><br></div><div><span style="font-size:12.8000001907349px">> </span><span style="font-size:12.8000001907349px">One option for terminating MPLS is to define a range of special label values. The parser needs to be able to check whether an MPLS label falls into this range.</span></div><div><span style="font-size:12.8000001907349px"><br></span></div><div><span style="font-size:12.8000001907349px">Ah, range matching :) . I suppose the issue is that a parser_value_set (or its future blackbox-defined equivalent) only deals with individual case values, which becomes unfeasible if the range is too large? Masked parser cases at the right priority might sort of get you there, but it's definitely not a general solution. Expressing range matches in the language is something we've been tossing around internally for quite a while, both for the parser and elsewhere. We haven't found a particularly nice way to do it.</span></div><div><span style="font-size:12.8000001907349px"><br></span></div><div><span style="font-size:12.8000001907349px">> </span><span style="font-size:12.8000001907349px">There’s also a payload length check I couldn’t implement.</span></div><div><span style="font-size:12.8000001907349px"><br></span></div><div><span style="font-size:12.8000001907349px">Ah. I'm guessing the issue is calculating the number of bytes after a given header instance in the original packet? That does sound tricky.</span></div><div><span style="font-size:12.8000001907349px"><br></span></div><div><span style="font-size:12.8000001907349px">P4 doesn't provide too many facilities for working with the payload yet, partially because we're assuming it will start off targeting primarily high-performance forwarding elements which are naturally ill-suited for that kind of stuff. I'm not sure what the best way to do perform this check would be. Good food for thought.</span><br></div><div><span style="font-size:12.8000001907349px"><br></span></div><div>Regards,</div><div><span style="font-size:12.8000001907349px">~Leo</span></div><div><span style="font-size:12.8000001907349px"><br></span></div><div><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Aug 10, 2015 at 1:01 PM, Peter Newman (petenewm) <span dir="ltr"><<a href="mailto:petenewm@cisco.com" target="_blank">petenewm@cisco.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I erroneously stated at the last meeting that there were a number of packet validation checks I had been unable to express in P4. This was because I was trying to implement them all in the parser. Clearly some of the checks need to be implemented in the match+action tables.<br>
<br>
I can implement all of the "Address == Constant" checks using match+action but I am still left with a few packet validation checks I haven’t been able to implement:<br>
<br>
Source Address == Destination Address — can be invalid for some protocols<br>
<br>
In IPv4 I’d like to check that if the Don’t Fragment bit is set then the Fragmentation Offset == 0<br>
<br>
One option for terminating MPLS is to define a range of special label values. The parser needs to be able to check whether an MPLS label falls into this range.<br>
<br>
There’s also a payload length check I couldn’t implement.<br>
<br>
—Peter<br>
<br>
<br>
_______________________________________________<br>
P4-design mailing list<br>
<a href="mailto:P4-design@p4.org">P4-design@p4.org</a><br>
Listinfo - <a href="http://mail.p4.org/mailman/listinfo/p4-design_p4.org" rel="noreferrer" target="_blank">http://mail.p4.org/mailman/listinfo/p4-design_p4.org</a><br>
<br>
</blockquote></div><br></div></div>