Hi,

Sorry I clicked send way too early in the previous mail :)

We can optimize the odp_packet_parse_flags_t struct to support
both  layered parsing and individual parsing by the following way.

I believe this might be useful for both application and implementation.

typedef struct odp_packet_parse_flags_t {
    union {
        uint8_t l2_all;
        struct {
                   uint8_t eth:1;       /**< See odp_packet_has_eth() */
                   uint8_t jumbo:1;     /**< See odp_packet_has_jumbo() */
                   uint8_t vlan:1;      /**< See odp_packet_has_vlan() */
                   uint8_t vlan_qinq:1; /**< See odp_packet_has_vlan_qinq() */
        };
    };
    union {
        uint8_t l2_all;
        struct {
            uint8_t arp:1;       /**< See odp_packet_has_arp() */
            uint8_t ipv4:1;      /**< See odp_packet_has_ipv4() */
            uint8_t ipv6:1;      /**< See odp_packet_has_ipv6() */
            uint8_t ipfrag:1;    /**< See odp_packet_has_ipfrag() */
            uint8_t ipopt:1;     /**< See odp_packet_has_ipopt() */
            uint8_t ipsec:1;     /**< See odp_packet_has_ipsec() */
        };
    };
    union {
        uint8_t l4_all;
        struct {
            uint8_t udp:1;       /**< See odp_packet_has_udp() */
            uint8_t tcp:1;       /**< See odp_packet_has_tcp() */
            uint8_t sctp:1;      /**< See odp_packet_has_sctp() */
            uint8_t icmp:1;      /**< See odp_packet_has_icmp() */
        };
    };
} odp_packet_parse_flags_t;

Regards,
Bala

On 29 April 2015 at 12:46, Bala Manoharan <bala.manoha...@linaro.org> wrote:
> Hi,
>
> We can optimize the odp_packet_parse_flags_t in the following way to
> handle the layered approach for parsing
>
> +typedef struct odp_packet_parse_flags_t {
>
> +       uint32_t eth:1;       /**< See odp_packet_has_eth() */
> +       uint32_t jumbo:1;     /**< See odp_packet_has_jumbo() */
> +       uint32_t vlan:1;      /**< See odp_packet_has_vlan() */
> +       uint32_t vlan_qinq:1; /**< See odp_packet_has_vlan_qinq() */
> +       uint32_t arp:1;       /**< See odp_packet_has_arp() */
> +       uint32_t ipv4:1;      /**< See odp_packet_has_ipv4() */
> +       uint32_t ipv6:1;      /**< See odp_packet_has_ipv6() */
> +       uint32_t ipfrag:1;    /**< See odp_packet_has_ipfrag() */
> +       uint32_t ipopt:1;     /**< See odp_packet_has_ipopt() */
> +       uint32_t ipsec:1;     /**< See odp_packet_has_ipsec() */
> +       uint32_t udp:1;       /**< See odp_packet_has_udp() */
> +       uint32_t tcp:1;       /**< See odp_packet_has_tcp() */
> +       uint32_t sctp:1;      /**< See odp_packet_has_sctp() */
> +       uint32_t icmp:1;      /**< See odp_packet_has_icmp() */
> +
> +       uint32_t _reserved1:18; /**< Reserved. Do not use. */
> +} odp_packet_parse_flags_t;
>
> On 29 April 2015 at 12:15, Savolainen, Petri (Nokia - FI/Espoo)
> <petri.savolai...@nokia.com> wrote:
>> It's (v2) on the list (since last Thu):
>>
>> [lng-odp] [API-NEXT PATCH v2 4/5] api: packet_io: added parse mode
>>
>>
>> -Petri
>>
>>
>>> -----Original Message-----
>>> From: ext Zoltan Kiss [mailto:zoltan.k...@linaro.org]
>>> Sent: Tuesday, April 28, 2015 9:17 PM
>>> To: Savolainen, Petri (Nokia - FI/Espoo); lng-odp@lists.linaro.org
>>> Subject: Re: [lng-odp] [PATCH API-NEXT 4/5] api: packet_io: added parse
>>> mode
>>>
>>>
>>>
>>> On 28/04/15 08:09, Savolainen, Petri (Nokia - FI/Espoo) wrote:
>>> > Hi Zoltan,
>>> >
>>> > You should implement the latest version of the patch, which has only
>>> ALL/NONE defined. We can leave SELECTED for later.
>>> Ok, but where is that version? I could only find this one.
>>>
>>> >
>>> > Briefly about SELECTED. The idea is that the application lists all
>>> odp_packet_has_xxx() calls that it will call during packet processing.
>>> Implementation can use that information to optimize parser functionality,
>>> if it can. So, application is not telling to implementation what to do or
>>> how to do it, but what information application is expecting from packets.
>>> If application lies (indicates that it will not call xxx, but still calls
>>> it), results are undefined.
>>> >
>>> > -Petri
>>> >
>>> >
>>> >> -----Original Message-----
>>> >> From: ext Zoltan Kiss [mailto:zoltan.k...@linaro.org]
>>> >> Sent: Monday, April 27, 2015 8:29 PM
>>> >> To: Savolainen, Petri (Nokia - FI/Espoo); lng-odp@lists.linaro.org
>>> >> Subject: Re: [lng-odp] [PATCH API-NEXT 4/5] api: packet_io: added parse
>>> >> mode
>>> >>
>>> >>
>>> >>
>>> >> On 20/04/15 13:10, Petri Savolainen wrote:
>>> >>> Application can indicate which packet parsing results it is
>>> >>> interested in (all, none or selected).
>>> >>>
>>> >>> Signed-off-by: Petri Savolainen <petri.savolai...@nokia.com>
>>> >>> ---
>>> >>>    include/odp/api/packet_flags.h | 26 ++++++++++++++++++++++++++
>>> >>>    include/odp/api/packet_io.h    | 19 +++++++++++++++++++
>>> >>>    2 files changed, 45 insertions(+)
>>> >>>
>>> >>> diff --git a/include/odp/api/packet_flags.h
>>> >> b/include/odp/api/packet_flags.h
>>> >>> index bfbcc94..9444fdc 100644
>>> >>> --- a/include/odp/api/packet_flags.h
>>> >>> +++ b/include/odp/api/packet_flags.h
>>> >>> @@ -26,6 +26,32 @@ extern "C" {
>>> >>>     *  @{
>>> >>>     */
>>> >>>
>>> >>> +
>>> >>> +/**
>>> >>> + * Packet input parsing flags
>>> >>> + *
>>> >>> + * Each flag represents a parser output. See parser output functions
>>> >> for
>>> >>> + * details.
>>> >>
>>> >> Now that I implement this for linux-generic, I realized this is
>>> >> ambiguous: does disabling a lower layer's parsing means that the parser
>>> >> stops looking into upper layers? Even if their parsing is enabled?
>>> >> E.g. if (jumbo == 0 && ipv4 == 1), we won't parse the ethernet header
>>> if
>>> >> it's a jumbo frame, that's fine. But do we continue to look into the
>>> >> rest of the packet for the IPv4 header?
>>> >> I would say no, but it should be mentioned here explicitly.
>>> >>
>>> >>> + */
>>> >>> +typedef struct odp_packet_parse_flags_t {
>>> >>> + uint32_t eth:1;       /**< See odp_packet_has_eth() */
>>> >>> + uint32_t jumbo:1;     /**< See odp_packet_has_jumbo() */
>>> >>> + uint32_t vlan:1;      /**< See odp_packet_has_vlan() */
>>> >>> + uint32_t vlan_qinq:1; /**< See odp_packet_has_vlan_qinq() */
>>> >>> + uint32_t arp:1;       /**< See odp_packet_has_arp() */
>>> >>> + uint32_t ipv4:1;      /**< See odp_packet_has_ipv4() */
>>> >>> + uint32_t ipv6:1;      /**< See odp_packet_has_ipv6() */
>>> >>> + uint32_t ipfrag:1;    /**< See odp_packet_has_ipfrag() */
>>> >>> + uint32_t ipopt:1;     /**< See odp_packet_has_ipopt() */
>>> >>> + uint32_t ipsec:1;     /**< See odp_packet_has_ipsec() */
>>> >>> + uint32_t udp:1;       /**< See odp_packet_has_udp() */
>>> >>> + uint32_t tcp:1;       /**< See odp_packet_has_tcp() */
>>> >>> + uint32_t sctp:1;      /**< See odp_packet_has_sctp() */
>>> >>> + uint32_t icmp:1;      /**< See odp_packet_has_icmp() */
>>> >>> +
>>> >>> + uint32_t _reserved1:18; /**< Reserved. Do not use. */
>>> >>> +} odp_packet_parse_flags_t;
>>> >>> +
>>> >>>    /**
>>> >>>     * Check for packet errors
>>> >>>     *
>>> >>> diff --git a/include/odp/api/packet_io.h b/include/odp/api/packet_io.h
>>> >>> index 77c207e..97f79ee 100644
>>> >>> --- a/include/odp/api/packet_io.h
>>> >>> +++ b/include/odp/api/packet_io.h
>>> >>> @@ -18,6 +18,8 @@
>>> >>>    extern "C" {
>>> >>>    #endif
>>> >>>
>>> >>> +#include <odp/packet_flags.h>
>>> >>> +
>>> >>>    /** @defgroup odp_packet_io ODP PACKET IO
>>> >>>     *  Operations on a packet.
>>> >>>     *  @{
>>> >>> @@ -58,6 +60,19 @@ enum odp_pktio_input_mode {
>>> >>>    };
>>> >>>
>>> >>>    /**
>>> >>> + * Packet parsing mode
>>> >>> + */
>>> >>> +enum odp_pktio_parse_mode {
>>> >>> + /** Parse all protocols */
>>> >>> + ODP_PKTIN_PARSE_ALL = 0,
>>> >>> + /** Parsing not needed */
>>> >>> + ODP_PKTIN_PARSE_NONE,
>>> >>> + /** Parsing can be limited to the flags set in
>>> >>> +     odp_packet_parse_flags_t */
>>> >>> + ODP_PKTIN_PARSE_SELECTED
>>> >>> +};
>>> >>> +
>>> >>> +/**
>>> >>>     * Packet IO parameters
>>> >>>     *
>>> >>>     * In minimum, user must select the input mode. Use 0 for defaults.
>>> >> Initialize
>>> >>> @@ -66,6 +81,10 @@ enum odp_pktio_input_mode {
>>> >>>    typedef struct odp_pktio_param_t {
>>> >>>           /** Packet input mode */
>>> >>>           enum odp_pktio_input_mode in_mode;
>>> >>> + /** Packet parse mode */
>>> >>> + enum odp_pktio_parse_mode parse_mode;
>>> >>> + /** Parse selection when parse_mode is ODP_PKTIN_PARSE_SELECTED */
>>> >>> + odp_packet_parse_flags_t parse;
>>> >>>    } odp_pktio_param_t;
>>> >>>
>>> >>>    /**
>>> >>>
>> _______________________________________________
>> lng-odp mailing list
>> lng-odp@lists.linaro.org
>> https://lists.linaro.org/mailman/listinfo/lng-odp
_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to