Add the support of offload of set IPv4 DSCP action.
Signed-off-by: Chaoyong He <[email protected]>
Reviewed-by: Louis Peens <[email protected]>
---
lib/netdev-offload-dpdk.c | 21 ++++++++++++++++++---
1 file changed, 18 insertions(+), 3 deletions(-)
diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c
index 44a2be9..2054693 100644
--- a/lib/netdev-offload-dpdk.c
+++ b/lib/netdev-offload-dpdk.c
@@ -769,6 +769,14 @@ dump_flow_action(struct ds *s, struct ds *s_extra,
IP_ARGS(set_ipv4->ipv4_addr));
}
ds_put_cstr(s, "/ ");
+ } else if (actions->type == RTE_FLOW_ACTION_TYPE_SET_IPV4_DSCP) {
+ const struct rte_flow_action_set_dscp *set_dscp = actions->conf;
+
+ ds_put_cstr(s, "set_dscp ");
+ if (set_dscp) {
+ ds_put_format(s, "dscp_value %d ", set_dscp->dscp);
+ }
+ ds_put_cstr(s, "/ ");
} else if (actions->type == RTE_FLOW_ACTION_TYPE_SET_TTL) {
const struct rte_flow_action_set_ttl *set_ttl = actions->conf;
@@ -1812,7 +1820,8 @@ add_output_action(struct netdev *netdev,
static int
add_set_flow_action__(struct flow_actions *actions,
const void *value, void *mask,
- const size_t size, const int attr)
+ const size_t size, const int attr,
+ bool dscp_flag)
{
void *spec;
@@ -1823,7 +1832,7 @@ add_set_flow_action__(struct flow_actions *actions,
if (is_all_zeros(mask, size)) {
return 0;
}
- if (!is_all_ones(mask, size)) {
+ if (!dscp_flag && !is_all_ones(mask, size)) {
VLOG_DBG_RL(&rl, "Partial mask is not supported");
return -1;
}
@@ -1848,6 +1857,8 @@ BUILD_ASSERT_DECL(sizeof(struct rte_flow_action_set_ipv4)
==
MEMBER_SIZEOF(struct ovs_key_ipv4, ipv4_src));
BUILD_ASSERT_DECL(sizeof(struct rte_flow_action_set_ipv4) ==
MEMBER_SIZEOF(struct ovs_key_ipv4, ipv4_dst));
+BUILD_ASSERT_DECL(sizeof(struct rte_flow_action_set_dscp) ==
+ MEMBER_SIZEOF(struct ovs_key_ipv4, ipv4_tos));
BUILD_ASSERT_DECL(sizeof(struct rte_flow_action_set_ttl) ==
MEMBER_SIZEOF(struct ovs_key_ipv4, ipv4_ttl));
BUILD_ASSERT_DECL(sizeof(struct rte_flow_action_set_ipv6) ==
@@ -1873,11 +1884,14 @@ parse_set_actions(struct flow_actions *actions,
{
const struct nlattr *sa;
unsigned int sleft;
+ bool dscp_flag = false;
#define add_set_flow_action(field, type) \
+ if (type == RTE_FLOW_ACTION_TYPE_SET_IPV4_DSCP) \
+ dscp_flag = true; \
if (add_set_flow_action__(actions, &key->field, \
mask ? CONST_CAST(void *, &mask->field) : NULL, \
- sizeof key->field, type)) { \
+ sizeof key->field, type, dscp_flag)) { \
return -1; \
}
@@ -1899,6 +1913,7 @@ parse_set_actions(struct flow_actions *actions,
add_set_flow_action(ipv4_src, RTE_FLOW_ACTION_TYPE_SET_IPV4_SRC);
add_set_flow_action(ipv4_dst, RTE_FLOW_ACTION_TYPE_SET_IPV4_DST);
+ add_set_flow_action(ipv4_tos, RTE_FLOW_ACTION_TYPE_SET_IPV4_DSCP);
add_set_flow_action(ipv4_ttl, RTE_FLOW_ACTION_TYPE_SET_TTL);
if (mask && !is_all_zeros(mask, sizeof *mask)) {
--
1.8.3.1
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev