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_VXLAN_DECAP,
ACTION_NVGRE_ENCAP, ACTION_NVGRE_ENCAP,
ACTION_NVGRE_DECAP, 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. */ /** Maximum size for pattern in struct rte_flow_item_raw. */
@ -816,6 +824,10 @@ static const enum index next_action[] = {
ACTION_VXLAN_DECAP, ACTION_VXLAN_DECAP,
ACTION_NVGRE_ENCAP, ACTION_NVGRE_ENCAP,
ACTION_NVGRE_DECAP, ACTION_NVGRE_DECAP,
ACTION_SET_IPV4_SRC,
ACTION_SET_IPV4_DST,
ACTION_SET_IPV6_SRC,
ACTION_SET_IPV6_DST,
ZERO, ZERO,
}; };
@ -918,6 +930,30 @@ static const enum index action_of_push_mpls[] = {
ZERO, 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[] = { static const enum index action_jump[] = {
ACTION_JUMP_GROUP, ACTION_JUMP_GROUP,
ACTION_NEXT, ACTION_NEXT,
@ -2470,6 +2506,74 @@ static const struct token token_list[] = {
.next = NEXT(NEXT_ENTRY(ACTION_NEXT)), .next = NEXT(NEXT_ENTRY(ACTION_NEXT)),
.call = parse_vc, .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. */ /** 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. 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 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 that was created outside of DPDK's own page allocator, and using that
memory natively with any other DPDK library or data structure. 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** * **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: 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 - ``nvgre_decap``: Performs a decapsulation action by stripping all headers of
the NVGRE tunnel network overlay from the matched flow. 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 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(VXLAN_DECAP, 0),
MK_FLOW_ACTION(NVGRE_ENCAP, sizeof(struct rte_flow_action_vxlan_encap)), MK_FLOW_ACTION(NVGRE_ENCAP, sizeof(struct rte_flow_action_vxlan_encap)),
MK_FLOW_ACTION(NVGRE_DECAP, 0), 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 static int

View File

@ -1506,6 +1506,46 @@ enum rte_flow_action_type {
* error. * error.
*/ */
RTE_FLOW_ACTION_TYPE_NVGRE_DECAP, 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; 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. * Definition of a single action.
* *