ethdev: add flow API actions to modify IP addresses

Add actions:
- SET_IPV4_SRC - set a new IPv4 source address.
- SET_IPV4_DST - set a new IPv4 destination address.
- SET_IPV6_SRC - set a new IPv6 source address.
- SET_IPV6_DST - set a new IPv6 destination address.

Original work by Shagun Agrawal

Signed-off-by: Rahul Lakkireddy <rahul.lakkireddy@chelsio.com>
Acked-by: Xiaoyu Min <jackmin@mellanox.com>
Acked-by: Andrew Rybchenko <arybchenko@solarflare.com>
This commit is contained in:
Rahul Lakkireddy 2018-10-09 14:14:36 +05:30 committed by Ferruh Yigit
parent c9507cd0ca
commit 0517eea761
6 changed files with 279 additions and 0 deletions

View File

@ -243,6 +243,14 @@ enum index {
ACTION_VXLAN_DECAP,
ACTION_NVGRE_ENCAP,
ACTION_NVGRE_DECAP,
ACTION_SET_IPV4_SRC,
ACTION_SET_IPV4_SRC_IPV4_SRC,
ACTION_SET_IPV4_DST,
ACTION_SET_IPV4_DST_IPV4_DST,
ACTION_SET_IPV6_SRC,
ACTION_SET_IPV6_SRC_IPV6_SRC,
ACTION_SET_IPV6_DST,
ACTION_SET_IPV6_DST_IPV6_DST,
};
/** Maximum size for pattern in struct rte_flow_item_raw. */
@ -816,6 +824,10 @@ static const enum index next_action[] = {
ACTION_VXLAN_DECAP,
ACTION_NVGRE_ENCAP,
ACTION_NVGRE_DECAP,
ACTION_SET_IPV4_SRC,
ACTION_SET_IPV4_DST,
ACTION_SET_IPV6_SRC,
ACTION_SET_IPV6_DST,
ZERO,
};
@ -918,6 +930,30 @@ static const enum index action_of_push_mpls[] = {
ZERO,
};
static const enum index action_set_ipv4_src[] = {
ACTION_SET_IPV4_SRC_IPV4_SRC,
ACTION_NEXT,
ZERO,
};
static const enum index action_set_ipv4_dst[] = {
ACTION_SET_IPV4_DST_IPV4_DST,
ACTION_NEXT,
ZERO,
};
static const enum index action_set_ipv6_src[] = {
ACTION_SET_IPV6_SRC_IPV6_SRC,
ACTION_NEXT,
ZERO,
};
static const enum index action_set_ipv6_dst[] = {
ACTION_SET_IPV6_DST_IPV6_DST,
ACTION_NEXT,
ZERO,
};
static const enum index action_jump[] = {
ACTION_JUMP_GROUP,
ACTION_NEXT,
@ -2470,6 +2506,74 @@ static const struct token token_list[] = {
.next = NEXT(NEXT_ENTRY(ACTION_NEXT)),
.call = parse_vc,
},
[ACTION_SET_IPV4_SRC] = {
.name = "set_ipv4_src",
.help = "Set a new IPv4 source address in the outermost"
" IPv4 header",
.priv = PRIV_ACTION(SET_IPV4_SRC,
sizeof(struct rte_flow_action_set_ipv4)),
.next = NEXT(action_set_ipv4_src),
.call = parse_vc,
},
[ACTION_SET_IPV4_SRC_IPV4_SRC] = {
.name = "ipv4_addr",
.help = "new IPv4 source address to set",
.next = NEXT(action_set_ipv4_src, NEXT_ENTRY(IPV4_ADDR)),
.args = ARGS(ARGS_ENTRY_HTON
(struct rte_flow_action_set_ipv4, ipv4_addr)),
.call = parse_vc_conf,
},
[ACTION_SET_IPV4_DST] = {
.name = "set_ipv4_dst",
.help = "Set a new IPv4 destination address in the outermost"
" IPv4 header",
.priv = PRIV_ACTION(SET_IPV4_DST,
sizeof(struct rte_flow_action_set_ipv4)),
.next = NEXT(action_set_ipv4_dst),
.call = parse_vc,
},
[ACTION_SET_IPV4_DST_IPV4_DST] = {
.name = "ipv4_addr",
.help = "new IPv4 destination address to set",
.next = NEXT(action_set_ipv4_dst, NEXT_ENTRY(IPV4_ADDR)),
.args = ARGS(ARGS_ENTRY_HTON
(struct rte_flow_action_set_ipv4, ipv4_addr)),
.call = parse_vc_conf,
},
[ACTION_SET_IPV6_SRC] = {
.name = "set_ipv6_src",
.help = "Set a new IPv6 source address in the outermost"
" IPv6 header",
.priv = PRIV_ACTION(SET_IPV6_SRC,
sizeof(struct rte_flow_action_set_ipv6)),
.next = NEXT(action_set_ipv6_src),
.call = parse_vc,
},
[ACTION_SET_IPV6_SRC_IPV6_SRC] = {
.name = "ipv6_addr",
.help = "new IPv6 source address to set",
.next = NEXT(action_set_ipv6_src, NEXT_ENTRY(IPV6_ADDR)),
.args = ARGS(ARGS_ENTRY_HTON
(struct rte_flow_action_set_ipv6, ipv6_addr)),
.call = parse_vc_conf,
},
[ACTION_SET_IPV6_DST] = {
.name = "set_ipv6_dst",
.help = "Set a new IPv6 destination address in the outermost"
" IPv6 header",
.priv = PRIV_ACTION(SET_IPV6_DST,
sizeof(struct rte_flow_action_set_ipv6)),
.next = NEXT(action_set_ipv6_dst),
.call = parse_vc,
},
[ACTION_SET_IPV6_DST_IPV6_DST] = {
.name = "ipv6_addr",
.help = "new IPv6 destination address to set",
.next = NEXT(action_set_ipv6_dst, NEXT_ENTRY(IPV6_ADDR)),
.args = ARGS(ARGS_ENTRY_HTON
(struct rte_flow_action_set_ipv6, ipv6_addr)),
.call = parse_vc_conf,
},
};
/** Remove and return last entry from argument stack. */

View File

@ -2076,6 +2076,78 @@ RTE_FLOW_ERROR_TYPE_ACTION error should be returned.
This action modifies the payload of matched flows.
Action: ``SET_IPV4_SRC``
^^^^^^^^^^^^^^^^^^^^^^^^
Set a new IPv4 source address in the outermost IPv4 header.
It must be used with a valid RTE_FLOW_ITEM_TYPE_IPV4 flow pattern item.
Otherwise, RTE_FLOW_ERROR_TYPE_ACTION error will be returned.
.. _table_rte_flow_action_set_ipv4_src:
.. table:: SET_IPV4_SRC
+-----------------------------------------+
| Field | Value |
+===============+=========================+
| ``ipv4_addr`` | new IPv4 source address |
+---------------+-------------------------+
Action: ``SET_IPV4_DST``
^^^^^^^^^^^^^^^^^^^^^^^^
Set a new IPv4 destination address in the outermost IPv4 header.
It must be used with a valid RTE_FLOW_ITEM_TYPE_IPV4 flow pattern item.
Otherwise, RTE_FLOW_ERROR_TYPE_ACTION error will be returned.
.. _table_rte_flow_action_set_ipv4_dst:
.. table:: SET_IPV4_DST
+---------------+------------------------------+
| Field | Value |
+===============+==============================+
| ``ipv4_addr`` | new IPv4 destination address |
+---------------+------------------------------+
Action: ``SET_IPV6_SRC``
^^^^^^^^^^^^^^^^^^^^^^^^
Set a new IPv6 source address in the outermost IPv6 header.
It must be used with a valid RTE_FLOW_ITEM_TYPE_IPV6 flow pattern item.
Otherwise, RTE_FLOW_ERROR_TYPE_ACTION error will be returned.
.. _table_rte_flow_action_set_ipv6_src:
.. table:: SET_IPV6_SRC
+---------------+-------------------------+
| Field | Value |
+===============+=========================+
| ``ipv6_addr`` | new IPv6 source address |
+---------------+-------------------------+
Action: ``SET_IPV6_DST``
^^^^^^^^^^^^^^^^^^^^^^^^
Set a new IPv6 destination address in the outermost IPv6 header.
It must be used with a valid RTE_FLOW_ITEM_TYPE_IPV6 flow pattern item.
Otherwise, RTE_FLOW_ERROR_TYPE_ACTION error will be returned.
.. _table_rte_flow_action_set_ipv6_dst:
.. table:: SET_IPV6_DST
+---------------+------------------------------+
| Field | Value |
+===============+==============================+
| ``ipv6_addr`` | new IPv6 destination address |
+---------------+------------------------------+
Negative types
~~~~~~~~~~~~~~

View File

@ -60,6 +60,13 @@ New Features
memory that was created outside of DPDK's own page allocator, and using that
memory natively with any other DPDK library or data structure.
* **Added new Flow API actions to rewrite fields in packet headers.**
Added new Flow API actions to:
* Modify source and destination IP addresses in the outermost IPv4/IPv6
headers.
* **Add support to offload more flow match and actions for CXGBE PMD**
Flow API support has been enhanced for CXGBE Poll Mode Driver to offload:

View File

@ -3704,6 +3704,24 @@ This section lists supported actions and their attributes, if any.
- ``nvgre_decap``: Performs a decapsulation action by stripping all headers of
the NVGRE tunnel network overlay from the matched flow.
- ``set_ipv4_src``: Set a new IPv4 source address in the outermost IPv4 header.
- ``ipv4_addr``: New IPv4 source address.
- ``set_ipv4_dst``: Set a new IPv4 destination address in the outermost IPv4
header.
- ``ipv4_addr``: New IPv4 destination address.
- ``set_ipv6_src``: Set a new IPv6 source address in the outermost IPv6 header.
- ``ipv6_addr``: New IPv6 source address.
- ``set_ipv6_dst``: Set a new IPv6 destination address in the outermost IPv6
header.
- ``ipv6_addr``: New IPv6 destination address.
Destroying flow rules
~~~~~~~~~~~~~~~~~~~~~

View File

@ -123,6 +123,14 @@ static const struct rte_flow_desc_data rte_flow_desc_action[] = {
MK_FLOW_ACTION(VXLAN_DECAP, 0),
MK_FLOW_ACTION(NVGRE_ENCAP, sizeof(struct rte_flow_action_vxlan_encap)),
MK_FLOW_ACTION(NVGRE_DECAP, 0),
MK_FLOW_ACTION(SET_IPV4_SRC,
sizeof(struct rte_flow_action_set_ipv4)),
MK_FLOW_ACTION(SET_IPV4_DST,
sizeof(struct rte_flow_action_set_ipv4)),
MK_FLOW_ACTION(SET_IPV6_SRC,
sizeof(struct rte_flow_action_set_ipv6)),
MK_FLOW_ACTION(SET_IPV6_DST,
sizeof(struct rte_flow_action_set_ipv6)),
};
static int

View File

@ -1506,6 +1506,46 @@ enum rte_flow_action_type {
* error.
*/
RTE_FLOW_ACTION_TYPE_NVGRE_DECAP,
/**
* Modify IPv4 source address in the outermost IPv4 header.
*
* If flow pattern does not define a valid RTE_FLOW_ITEM_TYPE_IPV4,
* then the PMD should return a RTE_FLOW_ERROR_TYPE_ACTION error.
*
* See struct rte_flow_action_set_ipv4.
*/
RTE_FLOW_ACTION_TYPE_SET_IPV4_SRC,
/**
* Modify IPv4 destination address in the outermost IPv4 header.
*
* If flow pattern does not define a valid RTE_FLOW_ITEM_TYPE_IPV4,
* then the PMD should return a RTE_FLOW_ERROR_TYPE_ACTION error.
*
* See struct rte_flow_action_set_ipv4.
*/
RTE_FLOW_ACTION_TYPE_SET_IPV4_DST,
/**
* Modify IPv6 source address in the outermost IPv6 header.
*
* If flow pattern does not define a valid RTE_FLOW_ITEM_TYPE_IPV6,
* then the PMD should return a RTE_FLOW_ERROR_TYPE_ACTION error.
*
* See struct rte_flow_action_set_ipv6.
*/
RTE_FLOW_ACTION_TYPE_SET_IPV6_SRC,
/**
* Modify IPv6 destination address in the outermost IPv6 header.
*
* If flow pattern does not define a valid RTE_FLOW_ITEM_TYPE_IPV6,
* then the PMD should return a RTE_FLOW_ERROR_TYPE_ACTION error.
*
* See struct rte_flow_action_set_ipv6.
*/
RTE_FLOW_ACTION_TYPE_SET_IPV6_DST,
};
/**
@ -1869,6 +1909,36 @@ struct rte_flow_action_nvgre_encap {
struct rte_flow_item *definition;
};
/**
* @warning
* @b EXPERIMENTAL: this structure may change without prior notice
*
* RTE_FLOW_ACTION_TYPE_SET_IPV4_SRC
* RTE_FLOW_ACTION_TYPE_SET_IPV4_DST
*
* Allows modification of IPv4 source (RTE_FLOW_ACTION_TYPE_SET_IPV4_SRC)
* and destination address (RTE_FLOW_ACTION_TYPE_SET_IPV4_DST) in the
* specified outermost IPv4 header.
*/
struct rte_flow_action_set_ipv4 {
rte_be32_t ipv4_addr;
};
/**
* @warning
* @b EXPERIMENTAL: this structure may change without prior notice
*
* RTE_FLOW_ACTION_TYPE_SET_IPV6_SRC
* RTE_FLOW_ACTION_TYPE_SET_IPV6_DST
*
* Allows modification of IPv6 source (RTE_FLOW_ACTION_TYPE_SET_IPV6_SRC)
* and destination address (RTE_FLOW_ACTION_TYPE_SET_IPV6_DST) in the
* specified outermost IPv6 header.
*/
struct rte_flow_action_set_ipv6 {
uint8_t ipv6_addr[16];
};
/*
* Definition of a single action.
*