Add the corresponding logics to support the offload of
set IPv6 DSCP action.
Signed-off-by: Chaoyong He <chaoyong.he@corigine.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@corigine.com>
---
doc/guides/nics/features/nfp.ini | 1 +
drivers/net/nfp/nfp_flow.c | 39 +++++++++++++++++++++++++++++++++++++++
2 files changed, 40 insertions(+)
@@ -47,6 +47,7 @@ port_id = Y
set_ipv4_dscp = Y
set_ipv4_dst = Y
set_ipv4_src = Y
+set_ipv6_dscp = Y
set_ipv6_dst = Y
set_ipv6_src = Y
set_mac_dst = Y
@@ -680,6 +680,14 @@ struct nfp_mask_id_entry {
ttl_tos_flag = true;
}
break;
+ case RTE_FLOW_ACTION_TYPE_SET_IPV6_DSCP:
+ PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_SET_IPV6_DSCP detected");
+ if (!tc_hl_flag) {
+ key_ls->act_size +=
+ sizeof(struct nfp_fl_act_set_ipv6_tc_hl_fl);
+ tc_hl_flag = true;
+ }
+ break;
default:
PMD_DRV_LOG(ERR, "Action type %d not supported.", action->type);
return -ENOTSUP;
@@ -1526,6 +1534,29 @@ struct nfp_mask_id_entry {
ttl_tos->reserved = 0;
}
+static void
+nfp_flow_action_set_tc(char *act_data,
+ const struct rte_flow_action *action,
+ bool tc_hl_flag)
+{
+ size_t act_size;
+ struct nfp_fl_act_set_ipv6_tc_hl_fl *tc_hl;
+ const struct rte_flow_action_set_dscp *tos_conf;
+
+ if (tc_hl_flag)
+ tc_hl = (struct nfp_fl_act_set_ipv6_tc_hl_fl *)act_data - 1;
+ else
+ tc_hl = (struct nfp_fl_act_set_ipv6_tc_hl_fl *)act_data;
+
+ act_size = sizeof(struct nfp_fl_act_set_ipv6_tc_hl_fl);
+ tc_hl->head.jump_id = NFP_FL_ACTION_OPCODE_SET_IPV6_TC_HL_FL;
+ tc_hl->head.len_lw = act_size >> NFP_FL_LW_SIZ;
+
+ tos_conf = (const struct rte_flow_action_set_dscp *)action->conf;
+ tc_hl->ipv6_tc = tos_conf->dscp;
+ tc_hl->reserved = 0;
+}
+
static int
nfp_flow_compile_action(__rte_unused struct nfp_flower_representor *representor,
const struct rte_flow_action actions[],
@@ -1676,6 +1707,14 @@ struct nfp_mask_id_entry {
ttl_tos_flag = true;
}
break;
+ case RTE_FLOW_ACTION_TYPE_SET_IPV6_DSCP:
+ PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_SET_IPV6_DSCP");
+ nfp_flow_action_set_tc(position, action, ttl_tos_flag);
+ if (!tc_hl_flag) {
+ position += sizeof(struct nfp_fl_act_set_ipv6_tc_hl_fl);
+ tc_hl_flag = true;
+ }
+ break;
default:
PMD_DRV_LOG(ERR, "Unsupported action type: %d", action->type);
return -ENOTSUP;