On 12/10/2023 8:30 AM, Ori Kam wrote: > When offloading rules with the encap action, the HW may calculate entropy > based on the encap protocol. > Each HW can implement a different algorithm. >
Hi Ori, Can you please provide more details what this 'entropy' is used for, what is the usecase? > When the application receives packets that should have been > encaped by the HW, but didn't reach this stage yet (for example TCP SYN > packets), > then when encap is done in SW, application must apply > the same entropy calculation algorithm. >> Using the new API application can request the PMD to calculate the > value as if the packet passed in the HW. > So is this new API a datapath API? Is the intention that application call this API per packet that is missing 'entropy' information? > Signed-off-by: Ori Kam <or...@nvidia.com> > --- > lib/ethdev/rte_flow.h | 49 +++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 49 insertions(+) > > diff --git a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h > index affdc8121b..3989b089dd 100644 > --- a/lib/ethdev/rte_flow.h > +++ b/lib/ethdev/rte_flow.h > @@ -6753,6 +6753,55 @@ rte_flow_calc_table_hash(uint16_t port_id, const > struct rte_flow_template_table > const struct rte_flow_item pattern[], uint8_t > pattern_template_index, > uint32_t *hash, struct rte_flow_error *error); > > +/** > + * @warning > + * @b EXPERIMENTAL: this API may change without prior notice. > + * > + * Destination field type for the entropy calculation. > + * > + * @see function rte_flow_calc_encap_entropy > + */ > +enum rte_flow_entropy_dest { > + /* Calculate entropy placed in UDP source port field. */ > + RTE_FLOW_ENTROPY_DEST_UDP_SRC_PORT, > + /* Calculate entropy placed in NVGRE flow ID field. */ > + RTE_FLOW_ENTROPY_DEST_NVGRE_FLOW_ID, > +}; > + > +/** > + * @warning > + * @b EXPERIMENTAL: this API may change without prior notice. > + * > + * Calculate the entropy generated by the HW for a given pattern, > + * when encapsulation flow action is executed. > + * > + * @param[in] port_id > + * Port identifier of Ethernet device. > + * @param[in] pattern > + * The values to be used in the entropy calculation. > + * @param[in] dest_field > + * Type of destination field for entropy calculation. > + * @param[out] entropy > + * Used to return the calculated entropy. It will be written in network > order, > + * so entropy[0] is the MSB. > + * The number of bytes is based on the destination field type. > Is the size same as field size in the 'dest_field'? Like for 'RTE_FLOW_ENTROPY_DEST_UDP_SRC_PORT' is it two bytes? > + * @param[out] error > + * Perform verbose error reporting if not NULL. > + * PMDs initialize this structure in case of error only. > + * > + * @return > + * - (0) if success. > + * - (-ENODEV) if *port_id* invalid. > + * - (-ENOTSUP) if underlying device does not support this functionality. > + * - (-EINVAL) if *pattern* doesn't hold enough information to calculate > the entropy > + * or the dest is not supported. > + */ > +__rte_experimental > +int > +rte_flow_calc_encap_entropy(uint16_t port_id, const struct rte_flow_item > pattern[], > + enum rte_flow_entropy_dest dest_field, uint8_t > *entropy, > + struct rte_flow_error *error); > + > #ifdef __cplusplus > } > #endif