On 16 April 2015 at 15:37, Ola Liljedahl <[email protected]> wrote:

>
> On 16 April 2015 at 14:33, Savolainen, Petri (Nokia - FI/Espoo) <
> [email protected]> wrote:
>
>> Hi,
>>
>> I think this should be typed (as bit field) and part of the
>> odp_pktio_param_t params that I introduced in patch "api: packet_io: added
>> odp_pktio_param_t". I could rework those patches and add it there.
>>
>> Something like this,
>>
>> typedef struct odp_pktio_input_flags_t {
>>         struct {
>>                 uint64_t eth:1;
>>                 uint64_t jumbo:1;
>>                 uint64_t vlan:1;
>>                 ...
>>
>>                 uint64_t _reserved:27;
>>         };
>> } odp_pktio_input_flags_t;
>>
> Do we really need to be able to specify what parsing to do to this level
> of detail? An implementation cannot efficiently check these all of these
> flags, the code would be drowning in conditionals. Why not specify whether
> parsing should be done for (or stop at) for layer-2, layer-3 and layer-4
> (or not at all)? The functions in packet_flags.h must be associated with
> one of these levels.
>

Of course a (SW) parser implementation could aggregate the specific bit
flags and compute the corresponding parsing levels and use that when
deciding how far into the packet to parse.


>
>>
>>
>> typedef struct odp_pktio_param_t {
>>         /** Packet input mode */
>>         enum odp_pktio_input_mode in_mode;
>>         /** Packet input parser flags */
>>         odp_pktio_input_flags_t flags;
>> } odp_pktio_param_t;
>>
>>
>> odp_pktio_t odp_pktio_open(const char *dev, odp_pool_t pool,
>>                            const odp_pktio_param_t *param);
>>
>>
>> -Petri
>>
>>
>> > -----Original Message-----
>> > From: lng-odp [mailto:[email protected]] On Behalf Of
>> ext
>> > Zoltan Kiss
>> > Sent: Wednesday, April 15, 2015 7:01 PM
>> > To: [email protected]
>> > Subject: [lng-odp] [RFC API-NEXT PATCH] packet_io: add bitmap to specify
>> > what level of parsing needed
>> >
>> > odp_pktio_open() will have a 32 bit bitmask to specify what kind of
>> header
>> > parsing is required by the application.
>> >
>> > Signed-off-by: Zoltan Kiss <[email protected]>
>> > ---
>> >  include/odp/api/packet_flags.h | 49
>> > ++++++++++++++++++++++++++++++++++++++++++
>> >  include/odp/api/packet_io.h    | 14 ++++++++----
>> >  2 files changed, 59 insertions(+), 4 deletions(-)
>> >
>> > diff --git a/include/odp/api/packet_flags.h
>> > b/include/odp/api/packet_flags.h
>> > index b1e179e..467d4f1 100644
>> > --- a/include/odp/api/packet_flags.h
>> > +++ b/include/odp/api/packet_flags.h
>> > @@ -327,6 +327,55 @@ void odp_packet_has_sctp_set(odp_packet_t pkt, int
>> > val);
>> >  void odp_packet_has_icmp_set(odp_packet_t pkt, int val);
>> >
>> >  /**
>> > + * Shift values for enum odp_packet_parse. Has to be updated together
>> > with
>> > + * odp_packet_parse_e type. The parameter passed to odp_pktio_open is a
>> > 32 bit
>> > + * mask.
>> > + */
>> > +typedef enum odp_packet_parse_shift {
>> > +  ODP_PARSE_SHIFT_ETH,
>> > +  ODP_PARSE_SHIFT_JUMBO,
>> > +  ODP_PARSE_SHIFT_VLAN,
>> > +  ODP_PARSE_SHIFT_VLAN_QINQ,
>> > +  ODP_PARSE_SHIFT_ARP,
>> > +  ODP_PARSE_SHIFT_IPV4,
>> > +  ODP_PARSE_SHIFT_IPV6,
>> > +  ODP_PARSE_SHIFT_IPFRAG,
>> > +  ODP_PARSE_SHIFT_IPOPT,
>> > +  ODP_PARSE_SHIFT_IPSEC,
>> > +  ODP_PARSE_SHIFT_UDP,
>> > +  ODP_PARSE_SHIFT_TCP,
>> > +  ODP_PARSE_SHIFT_SCTP,
>> > +  ODP_PARSE_SHIFT_ICMP,
>> > +  ODP_PARSE_SHIFT_MAX = 31
>> > +} odp_packet_parse_shift_e;
>> > +
>> > +#define ODP_PARSE(FIELD) ODP_PARSE_##FIELD = (ODP_PARSE_SHIFT_##FIELD
>> <<
>> > 1)
>> > +
>> > +/**
>> > + * Values to be used when calling odp_pktio_open. The parser_mask
>> > parameter has
>> > + * to be one or more of these values joined with bitwise OR. Or one of
>> > the two
>> > + * special values: ODP_PARSE_NONE or ODP_PARSE_ALL.
>> > + * Has to be updated together with odp_packet_parse_shift_e
>> > + */
>> > +typedef enum odp_packet_parse {
>> > +  ODP_PARSE_NONE = 0,                /* The application don't want any
>> parsing */
>> > +  ODP_PARSE(ETH),            /* Parse Ethernet header */
>> > +  ODP_PARSE(JUMBO),          /* Parse Ethernet header if a jumbo frame
>> */
>> > +  ODP_PARSE(VLAN),           /* Parse VLAN header */
>> > +  ODP_PARSE(VLAN_QINQ),              /* Parse VLAN QinQ header */
>> > +  ODP_PARSE(ARP),            /* Parse ARP header */
>> > +  ODP_PARSE(IPV4),           /* Parse IPv4 header */
>> > +  ODP_PARSE(IPV6),           /* Parse IPv6 header */
>> > +  ODP_PARSE(IPFRAG),         /* Parse IPv4 header if fragmented */
>> > +  ODP_PARSE(IPOPT),          /* Parse IP options */
>> > +  ODP_PARSE(IPSEC),          /* Parse IPsec header */
>> > +  ODP_PARSE(UDP),            /* Parse UDP header */
>> > +  ODP_PARSE(TCP),            /* Parse TCP header */
>> > +  ODP_PARSE(SCTP),           /* Parse SCTP header */
>> > +  ODP_PARSE(ICMP),           /* Parse ICMP header */
>> > +  ODP_PARSE_ALL = UINT32_MAX /* The application wants full parsing */
>> > +} odp_packet_parse_e;
>> > +/**
>> >   * @}
>> >   */
>> >
>> > diff --git a/include/odp/api/packet_io.h b/include/odp/api/packet_io.h
>> > index 6d31aeb..8c989f3 100644
>> > --- a/include/odp/api/packet_io.h
>> > +++ b/include/odp/api/packet_io.h
>> > @@ -51,9 +51,14 @@ extern "C" {
>> >   * open device will fail, returning ODP_PKTIO_INVALID with errno set.
>> >   * odp_pktio_lookup() may be used to obtain a handle to an already open
>> > device.
>> >   *
>> > - * @param dev    Packet IO device name
>> > - * @param pool   Pool from which to allocate buffers for storing
>> packets
>> > - *               received over this packet IO
>> > + * @param dev           Packet IO device name
>> > + * @param pool          Pool from which to allocate buffers for storing
>> > packets
>> > + *                      received over this packet IO
>> > + * @param parsing_mask  Mask to request parsing. Must be one or more
>> > ODP_PARSE_*
>> > + *                      value joined with bitwise OR to request
>> > particular
>> > + *                      fields to be parsed. Or one of two special
>> > values:
>> > + *                      ODP_PARSE_NONE or ODP_PARSE_ALL. See
>> > odp_packet_parse_e
>> > + *                      in packet_flags.h for more details
>> >   *
>> >   * @return ODP packet IO handle
>> >   * @retval ODP_PKTIO_INVALID on failure
>> > @@ -62,7 +67,8 @@ extern "C" {
>> >   *    device used for testing. Usually it's loop back
>> >   *    interface.
>> >   */
>> > -odp_pktio_t odp_pktio_open(const char *dev, odp_pool_t pool);
>> > +odp_pktio_t odp_pktio_open(const char *dev, odp_pool_t pool,
>> > +                        uint32_t parsing_mask);
>> >
>> >  /**
>> >   * Close an ODP packet IO instance
>> > --
>> > 1.9.1
>> >
>> > _______________________________________________
>> > lng-odp mailing list
>> > [email protected]
>> > https://lists.linaro.org/mailman/listinfo/lng-odp
>> _______________________________________________
>> lng-odp mailing list
>> [email protected]
>> https://lists.linaro.org/mailman/listinfo/lng-odp
>>
>
>
_______________________________________________
lng-odp mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to