<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1252">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">
Leo,
<div><br>
</div>
<div>I hadnít thought of XORing the two addresses. Its not ugly at all ó Iím sure itís what weíd do in the hardware.</div>
<div><br>
</div>
<div>I agree with you about the parser transition. However Iím unwilling to spend a whole parse cycle to perform this check in what will probably turn out to be the critical path. I think I could achieve it if I move a whole load of non-critical path junk out
 of my ipv4 parse state into its own parse state and then just duplicate everything that remains in the manner you suggest as ď<font size="2">proceed_as_normal_state.Ē Iíd rather increase the number of entries in the TCAM than the depth of the longest path
 in the parse graph.</font></div>
<div><br>
</div>
<div>I feel like Iím doing the job of an optimizing compiler manually.</div>
<div><br>
</div>
<div>Thanks</div>
<div><br>
</div>
<div>óPeter</div>
<div><br>
<div>
<div>On Aug 10, 2015, at 4:25 PM, Leo Alterman <<a href="mailto:leo@barefootnetworks.com">leo@barefootnetworks.com</a>> wrote:</div>
<br class="Apple-interchange-newline">
<div>
<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>
</div>
</div>
<br>
</div>
</body>
</html>