Bill Fischofer(Bill-Fischofer-Linaro) replied on github web page:

include/odp/api/spec/packet.h
line 83
@@ -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;
+
+       /** Flags to control payload data checks up to the selected parse
+        *  layer. Checksum checking status can be queried for each packet with
+        *  odp_packet_l3_chksum_status() and odp_packet_l4_chksum_status().
+        */
+       union {
+               struct {
+                       /** Check IPv4 header checksum */
+                       uint32_t ipv4_chksum   : 1;
+
+                       /** Check UDP checksum */
+                       uint32_t udp_chksum    : 1;
+
+                       /** Check TCP checksum */
+                       uint32_t tcp_chksum    : 1;
+
+               } check;
+
+               /** All check bits. This can be used to set/clear all flags. */
+               uint32_t all_check;
+       };
+
+} odp_packet_parse_param_t;
+


Comment:
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_r149673523
updated_at 2017-11-08 13:55:56

Reply via email to