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