Cc  myself

> -----Original Message-----
> From: dev <dev-boun...@dpdk.org> On Behalf Of Xu, Rosen
> Sent: Wednesday, September 08, 2021 14:34
> To: Akhil Goyal <gak...@marvell.com>; dev@dpdk.org
> Cc: ano...@marvell.com; Nicolau, Radu <radu.nico...@intel.com>; Doherty,
> Declan <declan.dohe...@intel.com>; hemant.agra...@nxp.com;
> ma...@nvidia.com; Ananyev, Konstantin <konstantin.anan...@intel.com>;
> tho...@monjalon.net; adwiv...@marvell.com; Yigit, Ferruh
> <ferruh.yi...@intel.com>; andrew.rybche...@oktetlabs.ru
> Subject: Re: [dpdk-dev] [PATCH] RFC: ethdev: add reassembly offload
> 
> Hi,
> 
> > -----Original Message-----
> > From: dev <dev-boun...@dpdk.org> On Behalf Of Akhil Goyal
> > Sent: Monday, August 23, 2021 18:03
> > To: dev@dpdk.org
> > Cc: ano...@marvell.com; Nicolau, Radu <radu.nico...@intel.com>;
> > Doherty, Declan <declan.dohe...@intel.com>; hemant.agra...@nxp.com;
> > ma...@nvidia.com; Ananyev, Konstantin
> <konstantin.anan...@intel.com>;
> > tho...@monjalon.net; adwiv...@marvell.com; Yigit, Ferruh
> > <ferruh.yi...@intel.com>; andrew.rybche...@oktetlabs.ru; Akhil Goyal
> > <gak...@marvell.com>
> > Subject: [dpdk-dev] [PATCH] RFC: ethdev: add reassembly offload
> >
> > Reassembly is a costly operation if it is done in software, however,
> > if it is offloaded to HW, it can considerably save application cycles.
> > The operation becomes even more costlier if IP fragmants are encrypted.
> >
> > To resolve above two issues, a new offload
> DEV_RX_OFFLOAD_REASSEMBLY
> > is introduced in ethdev for devices which can attempt reassembly of
> > packets in hardware.
> > rte_eth_dev_info is added with the reassembly capabilities which a
> > device can support.
> > Now, if IP fragments are encrypted, reassembly can also be attempted
> > while doing inline IPsec processing.
> > This is controlled by a flag in rte_security_ipsec_sa_options to
> > enable reassembly of encrypted IP fragments in the inline path.
> >
> > The resulting reassembled packet would be a typical segmented mbuf in
> > case of success.
> >
> > And if reassembly of fragments is failed or is incomplete (if
> > fragments do not come before the reass_timeout), the mbuf is updated
> > with an ol_flag PKT_RX_REASSEMBLY_INCOMPLETE and mbuf is returned
> as
> > is. Now application may decide the fate of the packet to wait more for
> > fragments to come or drop.
> >
> > Signed-off-by: Akhil Goyal <gak...@marvell.com>
> > ---
> >  lib/ethdev/rte_ethdev.c     |  1 +
> >  lib/ethdev/rte_ethdev.h     | 18 +++++++++++++++++-
> >  lib/mbuf/rte_mbuf_core.h    |  3 ++-
> >  lib/security/rte_security.h | 10 ++++++++++
> >  4 files changed, 30 insertions(+), 2 deletions(-)
> >
> > diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c index
> > 9d95cd11e1..1ab3a093cf 100644
> > --- a/lib/ethdev/rte_ethdev.c
> > +++ b/lib/ethdev/rte_ethdev.c
> > @@ -119,6 +119,7 @@ static const struct {
> >     RTE_RX_OFFLOAD_BIT2STR(VLAN_FILTER),
> >     RTE_RX_OFFLOAD_BIT2STR(VLAN_EXTEND),
> >     RTE_RX_OFFLOAD_BIT2STR(JUMBO_FRAME),
> > +   RTE_RX_OFFLOAD_BIT2STR(REASSEMBLY),
> >     RTE_RX_OFFLOAD_BIT2STR(SCATTER),
> >     RTE_RX_OFFLOAD_BIT2STR(TIMESTAMP),
> >     RTE_RX_OFFLOAD_BIT2STR(SECURITY),
> > diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h index
> > d2b27c351f..e89a4dc1eb 100644
> > --- a/lib/ethdev/rte_ethdev.h
> > +++ b/lib/ethdev/rte_ethdev.h
> > @@ -1360,6 +1360,7 @@ struct rte_eth_conf {
> >  #define DEV_RX_OFFLOAD_VLAN_FILTER 0x00000200
> >  #define DEV_RX_OFFLOAD_VLAN_EXTEND 0x00000400
> >  #define DEV_RX_OFFLOAD_JUMBO_FRAME 0x00000800
> > +#define DEV_RX_OFFLOAD_REASSEMBLY  0x00001000
> >  #define DEV_RX_OFFLOAD_SCATTER             0x00002000
> >  /**
> >   * Timestamp is set by the driver in
> > RTE_MBUF_DYNFIELD_TIMESTAMP_NAME @@ -1477,6 +1478,20 @@
> struct
> > rte_eth_dev_portconf {
> >   */
> >  #define RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID
> >     (UINT16_MAX)
> >
> > +/**
> > + * Reassembly capabilities that a device can support.
> > + * The device which can support reassembly offload should set
> > + * DEV_RX_OFFLOAD_REASSEMBLY
> > + */
> > +struct rte_eth_reass_capa {
> > +   /** Maximum time in ns that a fragment can wait for further
> > fragments */
> > +   uint64_t reass_timeout;
> > +   /** Maximum number of fragments that device can reassemble */
> > +   uint16_t max_frags;
> > +   /** Reserved for future capabilities */
> > +   uint16_t reserved[3];
> > +};
> 
> IP reassembly occurs at the final recipient of the message, NIC attempts to
> do it has a fer challenges. The reason is that having NICs need to worry about
> reassembling fragments would increase their complexity, so most likely it
> only can handle range length of datagrams. Seems rte_eth_reass_capa miss
> the max original datagrams length which NIC can support, this features is
> better to be negotiated between NIC and SW as well.
> 
> >  /**
> >   * Ethernet device associated switch information
> >   */
> > @@ -1582,8 +1597,9 @@ struct rte_eth_dev_info {
> >      * embedded managed interconnect/switch.
> >      */
> >     struct rte_eth_switch_info switch_info;
> > +   /* Reassembly capabilities of a device for reassembly offload */
> > +   struct rte_eth_reass_capa reass_capa;
> >
> > -   uint64_t reserved_64s[2]; /**< Reserved for future fields */
> >     void *reserved_ptrs[2];   /**< Reserved for future fields */
> >  };
> >
> > diff --git a/lib/mbuf/rte_mbuf_core.h b/lib/mbuf/rte_mbuf_core.h index
> > bb38d7f581..cea25c87f7 100644
> > --- a/lib/mbuf/rte_mbuf_core.h
> > +++ b/lib/mbuf/rte_mbuf_core.h
> > @@ -200,10 +200,11 @@ extern "C" {
> >  #define PKT_RX_OUTER_L4_CKSUM_BAD  (1ULL << 21)
> >  #define PKT_RX_OUTER_L4_CKSUM_GOOD (1ULL << 22)
> >  #define PKT_RX_OUTER_L4_CKSUM_INVALID      ((1ULL << 21) | (1ULL
> << 22))
> > +#define PKT_RX_REASSEMBLY_INCOMPLETE       (1ULL << 23)
> >
> >  /* add new RX flags here, don't forget to update PKT_FIRST_FREE */
> >
> > -#define PKT_FIRST_FREE (1ULL << 23)
> > +#define PKT_FIRST_FREE (1ULL << 24)
> >  #define PKT_LAST_FREE (1ULL << 40)
> >
> >  /* add new TX flags here, don't forget to update PKT_LAST_FREE  */
> > diff --git a/lib/security/rte_security.h b/lib/security/rte_security.h
> > index
> > 88d31de0a6..364eeb5cd4 100644
> > --- a/lib/security/rte_security.h
> > +++ b/lib/security/rte_security.h
> > @@ -181,6 +181,16 @@ struct rte_security_ipsec_sa_options {
> >      * * 0: Disable per session security statistics collection for this SA.
> >      */
> >     uint32_t stats : 1;
> > +
> > +   /** Enable reassembly on incoming packets.
> > +    *
> > +    * * 1: Enable driver to try reassembly of encrypted IP packets for
> > +    *      this SA, if supported by the driver. This feature will work
> > +    *      only if rx_offload DEV_RX_OFFLOAD_REASSEMBLY is set in
> > +    *      inline ethernet device.
> > +    * * 0: Disable reassembly of packets (default).
> > +    */
> > +   uint32_t reass_en : 1;
> >  };
> >
> >  /** IPSec security association direction */
> > --
> > 2.25.1

Reply via email to