Dmitry Eremin-Solenikov(lumag) replied on github web page:
include/odp/api/spec/packet.h
line 75
@@ -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:
@psavol ok, agreed
> Petri Savolainen(psavol) wrote:
> This function is different from e.g. enqueue multi, where the destination
> queue may be close to full and that's why only part of events were enqueued.
> Here operation fails due to bad params or internal error.
>
> Anyway, I'll change it to return num processed. It's more flexible.
>> bogdanPricope wrote
>> What about: "When operation fails, metadata of checked layers indicates the
>> error condition."?
>>> bogdanPricope wrote
>>> What about: "Metadata of other layers remains unmodified."?
>>>> Petri Savolainen(psavol) wrote:
>>>> Layer is not enough information for the parser. It needs to know the first
>>>> protocol (e.g. MPLS vs IP) to be able to start the parsing.
>>>>> Dmitry Eremin-Solenikov(lumag) wrote:
>>>>> @psavol `_param_init` seems like an overkill in this case. From my point
>>>>> of view, `param_init` are good for object creation params (where we might
>>>>> not know platform-optimized defaults) but are an overkill for operation
>>>>> functions (we do not have `param_init` for ipsec, crypto, etc operational
>>>>> params).
>>>>>> Petri Savolainen(psavol) wrote:
>>>>>> No, other APIs order checksum checking the same way: per protocol.
>>>>>> Application may be e.g. terminating only UDP and forwarding all others -
>>>>>> so it would be waste to check e.g. TCP checksum.
>>>>>>
>>>>>> typedef union odp_pktin_config_opt_t {
>>>>>> /** Option flags */
>>>>>> struct {
>>>>>> /** Timestamp all packets on packet input */
>>>>>> uint64_t ts_all : 1;
>>>>>>
>>>>>> /** Timestamp (at least) IEEE1588 / PTP packets
>>>>>> * on packet input */
>>>>>> uint64_t ts_ptp : 1;
>>>>>>
>>>>>> /** Check IPv4 header checksum on packet input */
>>>>>> uint64_t ipv4_chksum : 1;
>>>>>>
>>>>>> /** Check UDP checksum on packet input */
>>>>>> uint64_t udp_chksum : 1;
>>>>>>
>>>>>> /** Check TCP checksum on packet input */
>>>>>> uint64_t tcp_chksum : 1;
>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>> Param init on fast path is a bit overkill. However, application could
>>>>>>> call it once and store the result. So, it could avoid extra function
>>>>>>> call for every packet. So, I'll add it.
>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>> `return i;` if we adopt the RC == number of successful packets parsed
>>>>>>>> convention.
>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>> For consistency with other `odp_xxx_multi()` APIs, the RC should
>>>>>>>>> indicate the number of input packets that were successfully
>>>>>>>>> processed.
>>>>>>>>>> muvarov wrote
>>>>>>>>>> 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_r149916437
updated_at 2017-11-09 12:49:44