ethdev: update modify field flow action

The generic modify field flow action introduced in [1] has
some issues related to the immediate source operand:

  - immediate source can be presented either as an unsigned
    64-bit integer or pointer to data pattern in memory.
    There was no explicit pointer field defined in the union.

  - the byte ordering for 64-bit integer was not specified.
    Many fields have shorter lengths and byte ordering
    is crucial.

  - how the bit offset is applied to the immediate source
    field was not defined and documented.

  - 64-bit integer size is not enough to provide IPv6
    addresses.

In order to cover the issues and exclude any ambiguities
the following is done:

  - introduce the explicit pointer field
    in rte_flow_action_modify_data structure

  - replace the 64-bit unsigned integer with 16-byte array

  - update the modify field flow action documentation

Appropriate deprecation notice has been removed.

[1] commit 73b68f4c54 ("ethdev: introduce generic modify flow action")

Signed-off-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
Acked-by: Ori Kam <orika@nvidia.com>
Acked-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
This commit is contained in:
Viacheslav Ovsiienko 2021-10-13 21:45:12 +03:00 committed by Ferruh Yigit
parent 1179f05cc9
commit 14fc81aed7
4 changed files with 42 additions and 9 deletions

View File

@ -2959,6 +2959,22 @@ a packet to any other part of it.
``value`` sets an immediate value to be used as a source or points to a
location of the value in memory. It is used instead of ``level`` and ``offset``
for ``RTE_FLOW_FIELD_VALUE`` and ``RTE_FLOW_FIELD_POINTER`` respectively.
The data in memory should be presented exactly in the same byte order and
length as in the relevant flow item, i.e. data for field with type
``RTE_FLOW_FIELD_MAC_DST`` should follow the conventions of ``dst`` field
in ``rte_flow_item_eth`` structure, with type ``RTE_FLOW_FIELD_IPV6_SRC`` -
``rte_flow_item_ipv6`` conventions, and so on. If the field size is larger than
16 bytes the pattern can be provided as pointer only.
The bitfield extracted from the memory being applied as second operation
parameter is defined by action width and by the destination field offset.
Application should provide the data in immediate value memory (either as
buffer or by pointer) exactly as item field without any applied explicit offset,
and destination packet field (with specified width and bit offset) will be
replaced by immediate source bits from the same bit offset. For example,
to replace the third byte of MAC address with value 0x85, application should
specify destination width as 8, destination offset as 16, and provide immediate
value as sequence of bytes {xxx, xxx, 0x85, xxx, xxx, xxx}.
.. _table_rte_flow_action_modify_field:
@ -2989,7 +3005,13 @@ for ``RTE_FLOW_FIELD_VALUE`` and ``RTE_FLOW_FIELD_POINTER`` respectively.
+---------------+----------------------------------------------------------+
| ``offset`` | number of bits to skip at the beginning |
+---------------+----------------------------------------------------------+
| ``value`` | immediate value or a pointer to this value |
| ``value`` | immediate value buffer (source field only, not |
| | applicable to destination) for RTE_FLOW_FIELD_VALUE |
| | field type |
+---------------+----------------------------------------------------------+
| ``pvalue`` | pointer to immediate value data (source field only, not |
| | applicable to destination) for RTE_FLOW_FIELD_POINTER |
| | field type |
+---------------+----------------------------------------------------------+
Action: ``CONNTRACK``

View File

@ -120,10 +120,6 @@ Deprecation Notices
* ethdev: Announce moving from dedicated modify function for each field,
to using the general ``rte_flow_modify_field`` action.
* ethdev: The struct ``rte_flow_action_modify_data`` will be modified
to support modifying fields larger than 64 bits.
In addition, documentation will be updated to clarify byte order.
* ethdev: The flow API matching pattern structures, ``struct rte_flow_item_*``,
should start with relevant protocol header.
Some matching pattern structures implements this by duplicating protocol header

View File

@ -307,6 +307,13 @@ API Changes
* ethdev: Deprecated the use of attributes ``ingress`` / ``egress`` combined
with ``transfer``. See items ``PORT_REPRESENTOR``, ``REPRESENTED_PORT``.
* ethdev: ``rte_flow_action_modify_data`` structure updated, immediate data
array is extended, data pointer field is explicitly added to union, the
action behavior is defined in more strict fashion and documentation updated.
The immediate value behavior has been changed, the entire immediate field
should be provided, and offset for immediate source bitfield is assigned
from destination one.
* cryptodev: The API rte_cryptodev_pmd_is_valid_dev is modified to
rte_cryptodev_is_valid_dev as it can be used by the application as
well as PMD to check whether the device is valid or not.

View File

@ -3358,10 +3358,18 @@ struct rte_flow_action_modify_data {
uint32_t offset;
};
/**
* Immediate value for RTE_FLOW_FIELD_VALUE or
* memory address for RTE_FLOW_FIELD_POINTER.
* Immediate value for RTE_FLOW_FIELD_VALUE, presented in the
* same byte order and length as in relevant rte_flow_item_xxx.
* The immediate source bitfield offset is inherited from
* the destination's one.
*/
uint64_t value;
uint8_t value[16];
/**
* Memory address for RTE_FLOW_FIELD_POINTER, memory layout
* should be the same as for relevant field in the
* rte_flow_item_xxx structure.
*/
void *pvalue;
};
};
@ -3381,7 +3389,7 @@ enum rte_flow_modify_op {
* RTE_FLOW_ACTION_TYPE_MODIFY_FIELD
*
* Modify a destination header field according to the specified
* operation. Another packet field can be used as a source as well
* operation. Another field of the packet can be used as a source as well
* as tag, mark, metadata, immediate value or a pointer to it.
*/
struct rte_flow_action_modify_field {