@@ -770,6 +770,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;
@@ -1813,7 +1821,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;
@@ -1824,7 +1833,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;
}
@@ -1849,6 +1858,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) ==
@@ -1874,11 +1885,16 @@ parse_set_actions(struct flow_actions *actions,
{
const struct nlattr *sa;
unsigned int sleft;
+ bool dscp_flag;
#define add_set_flow_action(field, type) \
+ dscp_flag = false; \
+ 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; \
}
@@ -1900,6 +1916,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)) {