[v6,18/27] net/nfp: support push VLAN flow action
Checks
Commit Message
Add the corresponding data structure and logics, to support
the offload of push_vlan 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 | 3 ++
drivers/net/nfp/flower/nfp_flower_cmsg.h | 7 ++++
drivers/net/nfp/nfp_flow.c | 60 ++++++++++++++++++++++++++++++++
3 files changed, 70 insertions(+)
@@ -40,6 +40,9 @@ vlan = Y
count = Y
drop = Y
of_pop_vlan = Y
+of_push_vlan = Y
+of_set_vlan_pcp = Y
+of_set_vlan_vid = Y
port_id = Y
set_mac_dst = Y
set_mac_src = Y
@@ -367,6 +367,13 @@ struct nfp_fl_act_pop_vlan {
rte_be16_t reserved;
};
+struct nfp_fl_act_push_vlan {
+ struct nfp_fl_act_head head;
+ rte_be16_t reserved;
+ rte_be16_t vlan_tpid;
+ rte_be16_t vlan_tci;
+};
+
int nfp_flower_cmsg_mac_repr(struct nfp_app_fw_flower *app_fw_flower);
int nfp_flower_cmsg_repr_reify(struct nfp_app_fw_flower *app_fw_flower,
struct nfp_flower_representor *repr);
@@ -604,6 +604,16 @@ struct nfp_mask_id_entry {
PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_OF_POP_VLAN detected");
key_ls->act_size += sizeof(struct nfp_fl_act_pop_vlan);
break;
+ case RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN:
+ PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN detected");
+ key_ls->act_size += sizeof(struct nfp_fl_act_push_vlan);
+ break;
+ case RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_VID:
+ PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_VID detected");
+ break;
+ case RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_PCP:
+ PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_PCP detected");
+ break;
default:
PMD_DRV_LOG(ERR, "Action type %d not supported.", action->type);
return -ENOTSUP;
@@ -1269,6 +1279,39 @@ struct nfp_mask_id_entry {
}
static int
+nfp_flow_action_push_vlan(char *act_data,
+ const struct rte_flow_action *action)
+{
+ size_t act_size;
+ struct nfp_fl_act_push_vlan *push_vlan;
+ const struct rte_flow_action_of_push_vlan *push_vlan_conf;
+ const struct rte_flow_action_of_set_vlan_pcp *vlan_pcp_conf;
+ const struct rte_flow_action_of_set_vlan_vid *vlan_vid_conf;
+
+ if (((action + 1)->type != RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_PCP) ||
+ ((action + 2)->type != RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_VID))
+ return -EINVAL;
+
+ act_size = sizeof(struct nfp_fl_act_push_vlan);
+ push_vlan = (struct nfp_fl_act_push_vlan *)act_data;
+ push_vlan->head.jump_id = NFP_FL_ACTION_OPCODE_PUSH_VLAN;
+ push_vlan->head.len_lw = act_size >> NFP_FL_LW_SIZ;
+ push_vlan->reserved = 0;
+
+ push_vlan_conf = (const struct rte_flow_action_of_push_vlan *)
+ action->conf;
+ vlan_pcp_conf = (const struct rte_flow_action_of_set_vlan_pcp *)
+ (action + 1)->conf;
+ vlan_vid_conf = (const struct rte_flow_action_of_set_vlan_vid *)
+ (action + 2)->conf;
+ push_vlan->vlan_tpid = push_vlan_conf->ethertype;
+ push_vlan->vlan_tci = ((vlan_pcp_conf->vlan_pcp & 0x07) << 13) |
+ (vlan_vid_conf->vlan_vid & 0x0fff);
+
+ return 0;
+}
+
+static int
nfp_flow_compile_action(__rte_unused struct nfp_flower_representor *representor,
const struct rte_flow_action actions[],
struct rte_flow *nfp_flow)
@@ -1329,6 +1372,23 @@ struct nfp_mask_id_entry {
nfp_flow_action_pop_vlan(position, nfp_flow_meta);
position += sizeof(struct nfp_fl_act_pop_vlan);
break;
+ case RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN:
+ PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN");
+ ret = nfp_flow_action_push_vlan(position, action);
+ if (ret != 0) {
+ PMD_DRV_LOG(ERR, "Failed when process"
+ " RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN");
+ return ret;
+ }
+
+ /*
+ * RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_PCP and
+ * RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_VID
+ * have also been processed.
+ */
+ action += 2;
+ position += sizeof(struct nfp_fl_act_push_vlan);
+ break;
default:
PMD_DRV_LOG(ERR, "Unsupported action type: %d", action->type);
return -ENOTSUP;