> IP Reassembly is a costly operation if it is done in software. > The operation becomes even more costlier if IP fragmants are encrypted. > However, if it is offloaded to HW, it can considerably save application > cycles. > > Hence, a new offload RTE_ETH_RX_OFFLOAD_IP_REASSEMBLY is introduced in > ethdev for devices which can attempt reassembly of packets in hardware. > rte_eth_dev_info is updated with the reassembly capabilities which a device > can support. > > 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 ol_flags can be updated. > This is updated in a subsequent patch. > > Signed-off-by: Akhil Goyal <gak...@marvell.com> > --- > doc/guides/nics/features.rst | 12 ++++++++++++ > lib/ethdev/rte_ethdev.c | 1 + > lib/ethdev/rte_ethdev.h | 32 +++++++++++++++++++++++++++++++- > 3 files changed, 44 insertions(+), 1 deletion(-) > > diff --git a/doc/guides/nics/features.rst b/doc/guides/nics/features.rst > index 27be2d2576..1dfdee9602 100644 > --- a/doc/guides/nics/features.rst > +++ b/doc/guides/nics/features.rst > @@ -602,6 +602,18 @@ Supports inner packet L4 checksum. > > ``tx_offload_capa,tx_queue_offload_capa:RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM``. > > > +.. _nic_features_ip_reassembly: > + > +IP reassembly > +------------- > + > +Supports IP reassembly in hardware. > + > +* **[uses] rte_eth_rxconf,rte_eth_rxmode**: > ``offloads:RTE_ETH_RX_OFFLOAD_IP_REASSEMBLY``. > +* **[provides] mbuf**: > ``mbuf.ol_flags:RTE_MBUF_F_RX_IP_REASSEMBLY_INCOMPLETE``. > +* **[provides] rte_eth_dev_info**: ``reass_capa``. > + > + > .. _nic_features_shared_rx_queue: > > Shared Rx queue > diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c > index a1d475a292..d9a03f12f9 100644 > --- a/lib/ethdev/rte_ethdev.c > +++ b/lib/ethdev/rte_ethdev.c > @@ -126,6 +126,7 @@ static const struct { > RTE_RX_OFFLOAD_BIT2STR(OUTER_UDP_CKSUM), > RTE_RX_OFFLOAD_BIT2STR(RSS_HASH), > RTE_RX_OFFLOAD_BIT2STR(BUFFER_SPLIT), > + RTE_RX_OFFLOAD_BIT2STR(IP_REASSEMBLY), > }; > > #undef RTE_RX_OFFLOAD_BIT2STR > diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h > index fa299c8ad7..11427b2e4d 100644 > --- a/lib/ethdev/rte_ethdev.h > +++ b/lib/ethdev/rte_ethdev.h > @@ -1586,6 +1586,7 @@ struct rte_eth_conf { > #define RTE_ETH_RX_OFFLOAD_RSS_HASH RTE_BIT64(19) > #define DEV_RX_OFFLOAD_RSS_HASH RTE_ETH_RX_OFFLOAD_RSS_HASH > #define RTE_ETH_RX_OFFLOAD_BUFFER_SPLIT RTE_BIT64(20) > +#define RTE_ETH_RX_OFFLOAD_IP_REASSEMBLY RTE_BIT64(21) > > #define RTE_ETH_RX_OFFLOAD_CHECKSUM (RTE_ETH_RX_OFFLOAD_IPV4_CKSUM | \ > RTE_ETH_RX_OFFLOAD_UDP_CKSUM | \ > @@ -1781,6 +1782,33 @@ enum rte_eth_representor_type { > RTE_ETH_REPRESENTOR_PF, /**< representor of Physical Function. */ > }; > > +/* Flag to offload IP reassembly for IPv4 packets. */ > +#define RTE_ETH_DEV_REASSEMBLY_F_IPV4 (RTE_BIT32(0)) > +/* Flag to offload IP reassembly for IPv6 packets. */ > +#define RTE_ETH_DEV_REASSEMBLY_F_IPV6 (RTE_BIT32(1)) > +/** > + * @warning > + * @b EXPERIMENTAL: this structure may change without prior notice. > + * > + * A structure used to set IP reassembly configuration. > + * > + * If RTE_ETH_RX_OFFLOAD_IP_REASSEMBLY flag is set in offloads field, > + * the PMD will attempt IP reassembly for the received packets as per > + * properties defined in this structure: > + * > + */ > +struct rte_eth_ip_reass_params { > + /** Maximum time in ms which PMD can wait for other fragments. */ > + uint32_t reass_timeout; > + /** Maximum number of fragments that can be reassembled. */ > + uint16_t max_frags; > + /** > + * Flags to enable reassembly of packet types - > + * RTE_ETH_DEV_REASSEMBLY_F_xxx. > + */ > + uint16_t flags; > +}; > + > /** > * A structure used to retrieve the contextual information of > * an Ethernet device, such as the controlling driver of the > @@ -1841,8 +1869,10 @@ struct rte_eth_dev_info { > * embedded managed interconnect/switch. > */ > struct rte_eth_switch_info switch_info; > + /** IP reassembly offload capabilities that a device can support. */ > + struct rte_eth_ip_reass_params reass_capa; > > - uint64_t reserved_64s[2]; /**< Reserved for future fields */ > + uint64_t reserved_64s[1]; /**< Reserved for future fields */ > void *reserved_ptrs[2]; /**< Reserved for future fields */ > }; > > --
Acked-by: Konstantin Ananyev <konstantin.anan...@intel.com> > 2.25.1