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:
parent
c9507cd0ca
commit
0517eea761
@ -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. */
|
||||
|
@ -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
|
||||
~~~~~~~~~~~~~~
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
*
|
||||
|
Loading…
x
Reference in New Issue
Block a user