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
