muvarov replied on github web page:

include/odp/api/spec/packet.h
line 59
@@ -1140,6 +1179,82 @@ int odp_packet_move_data(odp_packet_t pkt, uint32_t 
dst_offset,
  */
 
 /**
+ * Packet parse parameters
+ */
+typedef struct odp_packet_parse_param_t {
+       /** Protocol header at parse starting point. Valid values for this
+        *  field are: ODP_PROTO_ETH, ODP_PROTO_IPV4, ODP_PROTO_IPV6. */
+       odp_proto_t proto;
+
+       /** Continue parsing until this layer. Must be the same or higher
+        *  layer than the layer of 'proto'. */
+       odp_proto_layer_t layer;


Comment:
it looks like 2 enums are not needed here. odp_proto_layet_t  layer_start; and  
odp_proto_layet_t  layer_end;  and one enum for layers.

> muvarov wrote
> maybe return number of correctly parsed packets? And say that parsing always 
> starts from be beginning of array. 


>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>> +1 since other checksum APIs refer to L3 and L4 rather than specific 
>> protocols. 


>>> Dmitry Eremin-Solenikov(lumag) wrote:
>>> What about just `l3_chksum`, and `l4_chksum`? 


>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>> Now that we have a `param` struct we should have an 
>>>> `odp_packet_parse_param_init()` API as well for completeness.


>>>>> Dmitry Eremin-Solenikov(lumag) wrote:
>>>>> @Bill-Fischofer-Linaro Because it is a parsing error, if lower layer 
>>>>> provides us IP version that does not correspond to the in-packet version. 
>>>>> We should detect that, rather than silently parsing this header.


>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>> I'm not sure why an API named `odp_packet_parse()` needs help here. It's 
>>>>>> purpose, after all, is to parse packets and determining IPv4 vs IPv6 is 
>>>>>> part of that activity. Moreover, the only way an application can inspect 
>>>>>> the IP header is to access it via other ODP API calls, so I don't see 
>>>>>> how asking the application to do this is any better than having the 
>>>>>> `odp_packet_parse()` implementation do this itself. What's the purpose 
>>>>>> of having a parse API in that case since clearly the application could 
>>>>>> parse the entire packet "by hand" as well.


>>>>>>> Dmitry Eremin-Solenikov(lumag) wrote:
>>>>>>> Failure needs to be defined in a more precise way (and maybe for a 
>>>>>>> single packet case). I assume that it means internal ODP error, rather 
>>>>>>> than just packet with wrong headers. What happens in multi-packet case 
>>>>>>> if failure occurs in the middle of parsing?


>>>>>>>> Dmitry Eremin-Solenikov(lumag) wrote:
>>>>>>>> @psavol Also for multi-packet parsing, we can change `proto` to be an 
>>>>>>>> array, allowing applications to easily intermix IPv4 and IPv6 packets.


>>>>>>>>> Dmitry Eremin-Solenikov(lumag) wrote:
>>>>>>>>> @psavol yes. I just wanted to focus on cases, when passing packet 
>>>>>>>>> with wrong protocol is an error. E.g. IPv6 packet inside IPsec packet 
>>>>>>>>> with NH = 4. So it is not a question of selecting proper L3 parser, 
>>>>>>>>> but rather a question of nailing down error/malicious packets.


>>>>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>>>>> It's there to enable application to call parsing in parts - e.g. 
>>>>>>>>>> first up to IP and then continue from L4. But since IP and transport 
>>>>>>>>>> protocols are tied together with pseudo headers, it's cleaner to 
>>>>>>>>>> remove L4 as a starting point. 


>>>>>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>>>>>> First bits of an IP header marks the version. So, it would be 
>>>>>>>>>>> trivial for both app and implementation to read the version from 
>>>>>>>>>>> the data. Common IP define is easier for application when a burst 
>>>>>>>>>>> of packets may contain both v4 and v6 mixed. Application does not 
>>>>>>>>>>> need to sort  packets into two arrays (one for v4 and other for v6) 
>>>>>>>>>>> but just pass the entire array for parsing.
>>>>>>>>>>> 
>>>>>>>>>>> There are three ways to define the enumeration: IP, IPv4+IPv6, 
>>>>>>>>>>> IP+IPv4+IPv6. I'm OK with any of those. IPv4+IPv6 would be a bit 
>>>>>>>>>>> more robust since version information comes from two sources.


>>>>>>>>>>>> Dmitry Eremin-Solenikov(lumag) wrote:
>>>>>>>>>>>> I felt easier to reparse both L3 and L4 headers in IPsec case, 
>>>>>>>>>>>> especially since transport mode ESP can en/decrypt some of L3 
>>>>>>>>>>>> headers in IPv6 case. 


>>>>>>>>>>>>> Dmitry Eremin-Solenikov(lumag) wrote:
>>>>>>>>>>>>> @Bill-Fischofer-Linaro In IPsec case Next Header field will 
>>>>>>>>>>>>> contain 4 for IPv4 and 41 for IPv6.


>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>> That might be overly complicated since until a decrypted tunnel 
>>>>>>>>>>>>>> mode IPsec packet is parsed you don't know whether it's IPv4 or 
>>>>>>>>>>>>>> IPv6. It's parsing that makes that determination.


>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>> @lumag IPsec operating in transport mode is, I'd imagine, the 
>>>>>>>>>>>>>>> main use case here.


>>>>>>>>>>>>>>>> Dmitry Eremin-Solenikov(lumag) wrote:
>>>>>>>>>>>>>>>> What is the usecase for parsing a packet starting from L4 
>>>>>>>>>>>>>>>> header? Also there are several (lots) of other L4 protocols. 
>>>>>>>>>>>>>>>> Do we want to support them all here?


>>>>>>>>>>>>>>>>> Dmitry Eremin-Solenikov(lumag) wrote:
>>>>>>>>>>>>>>>>> Maybe it would be better to split this into separate IPv4 and 
>>>>>>>>>>>>>>>>> IPv6 packets. It would be an error to pass IPv6 packet with 
>>>>>>>>>>>>>>>>> ethtype (or IP tunnel type) being set to IPv4. 


>>>>>>>>>>>>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>>>>>>>>>>>>> A vector of packets is CPU vector instructions friendly.


>>>>>>>>>>>>>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>>>>>>>>>>>>>> The use case is mentioned in log message: parse after 
>>>>>>>>>>>>>>>>>>> decrypt/IP reassembly. Application has recreated an inner 
>>>>>>>>>>>>>>>>>>> packet and needs to parse it before continue. This is 
>>>>>>>>>>>>>>>>>>> inherently SW parse which may be accelerated with CPU 
>>>>>>>>>>>>>>>>>>> vector instructions, etc.


>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>>>>> What's the use case for a multi() form of this API? Might 
>>>>>>>>>>>>>>>>>>>> VPP use it? Perhaps Sachin can comment?


>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>>>>>> We had considered an `odp_packet_parse()` function some 
>>>>>>>>>>>>>>>>>>>>> time back but it was rejected as something that would not 
>>>>>>>>>>>>>>>>>>>>> fit well with hardware parsers. What's changed?


https://github.com/Linaro/odp/pull/273#discussion_r149708399
updated_at 2017-11-08 15:48:42

Reply via email to