[dpdk-dev] [RFC] ethdev: add GRE optional fields to flow API

Adrien Mazarguil adrien.mazarguil at 6wind.com
Tue May 14 11:00:34 CEST 2019


On Tue, May 14, 2019 at 10:34:22AM +0300, Andrew Rybchenko wrote:
> On 5/14/19 10:18 AM, Xiaoyu Min wrote:
> > Add GRE's checksum, key, and sequence field to the
> > struct rte_flow_item_gre in order to match.
> > 
> > Signed-off-by: Xiaoyu Min <jackmin at mellanox.com>
> > ---
> >   lib/librte_ethdev/rte_flow.h | 4 ++++
> >   1 file changed, 4 insertions(+)
> > 
> > diff --git a/lib/librte_ethdev/rte_flow.h b/lib/librte_ethdev/rte_flow.h
> > index 63f84fca65..fb04af3268 100644
> > --- a/lib/librte_ethdev/rte_flow.h
> > +++ b/lib/librte_ethdev/rte_flow.h
> > @@ -847,6 +847,10 @@ struct rte_flow_item_gre {
> >   	 */
> >   	rte_be16_t c_rsvd0_ver;
> >   	rte_be16_t protocol; /**< Protocol type. */
> > +	rte_be16_t checksum; /**< chksum for the header and payload, optional.*/
> > +	rte_be16_t rsvd1; /**< present when C bit is set, optional. */
> > +	rte_be32_t key; /**< application specific key value, optional. */
> > +	rte_be32_t sequence; /**< sequence num for the GRE packet, optional. */
> >   };
> >   /** Default mask for RTE_FLOW_ITEM_TYPE_GRE. */
> 
> What is the purpose to match checksum, reserved and sequence number?

I think it's not really an issue, this structure only describes a packet
header as found on the wire like other pattern items; rte_flow users only
have to provide a mask to select the fields to be matched.

However you can't just modify an existing public structure without going
through the lengthy API/ABI deprecation/versioning process.

The reason these fields were not initially part of rte_flow_item_gre is that
each of them is optional, meaning the GRE header has variable length.
They should be handled through separate objects like IPv6 options (struct
rte_flow_item_ipv6_ext), ARP (struct rte_flow_item_arp_eth_ipv4) or ICMPv6
neighbor discovery (struct rte_flow_item_icmp6_nd_opt), either all together
e.g.:

 RTE_FLOW_ITEM_TYPE_GRE_OPTS

 struct rte_flow_item_gre_opts {
     rte_be16_t checksum; /**< Checksum for GRE header and payload (C bit). */
     rte_be16_t rsvd1; /**< Reserved bits (C bit). */
     rte_be32_t key; /**< Application specific key value (K bit). */
     rte_be32_t sequence; /**< Sequence number for GRE packet (S bit). */
 };

Or separately, since I guess only key matters no need to define the others:

 RTE_FLOW_ITEM_TYPE_GRE_KEY

 struct rte_flow_item_gre_key {
     rte_be32_t key; /**< Application specific key value (K bit). */
 };

In both cases, the default mask for this object should cover "key". Make
sure to update documentation and testpmd in the same patch.

-- 
Adrien Mazarguil
6WIND


More information about the dev mailing list