Dmitry Eremin-Solenikov(lumag) replied on github web page: include/odp/api/spec/packet.h line 74 @@ -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;
Comment: 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_r149687036 updated_at 2017-11-08 14:41:14