net/nfp: support MAC source flow action

Add the corresponding data structure and logics, to support
the offload of set source MAC action.

Signed-off-by: Chaoyong He <chaoyong.he@corigine.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@corigine.com>
This commit is contained in:
Chaoyong He 2022-10-21 16:01:51 +08:00 committed by Ferruh Yigit
parent cdb4743541
commit 4f69831545
3 changed files with 75 additions and 0 deletions

View File

@ -40,3 +40,4 @@ vlan = Y
count = Y
drop = Y
port_id = Y
set_mac_src = Y

View File

@ -335,6 +335,33 @@ struct nfp_fl_act_output {
rte_be32_t port;
};
/*
* ETH
* 3 2 1
* 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | - |opcode | - |jump_id| - |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | eth_dst_47_16_mask |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | eth_dst_15_0_mask | eth_src_47_32_mask |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | eth_src_31_0_mask |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | eth_dst_47_16 |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | eth_dst_15_0 | eth_src_47_32 |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | eth_src_31_0 |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
struct nfp_fl_act_set_eth {
struct nfp_fl_act_head head;
rte_be16_t reserved;
uint8_t eth_addr_mask[RTE_ETHER_ADDR_LEN * 2];
uint8_t eth_addr[RTE_ETHER_ADDR_LEN * 2];
};
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);

View File

@ -561,6 +561,7 @@ nfp_flow_key_layers_calculate_actions(const struct rte_flow_action actions[],
struct nfp_fl_key_ls *key_ls)
{
int ret = 0;
bool mac_set_flag = false;
const struct rte_flow_action *action;
for (action = actions; action->type != RTE_FLOW_ACTION_TYPE_END; ++action) {
@ -585,6 +586,13 @@ nfp_flow_key_layers_calculate_actions(const struct rte_flow_action actions[],
PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_PORT_ID detected");
key_ls->act_size += sizeof(struct nfp_fl_act_output);
break;
case RTE_FLOW_ACTION_TYPE_SET_MAC_SRC:
PMD_DRV_LOG(DEBUG, "RTE_FLOW_ACTION_TYPE_SET_MAC_SRC detected");
if (!mac_set_flag) {
key_ls->act_size += sizeof(struct nfp_fl_act_set_eth);
mac_set_flag = true;
}
break;
default:
PMD_DRV_LOG(ERR, "Action type %d not supported.", action->type);
return -ENOTSUP;
@ -1203,6 +1211,36 @@ nfp_flow_action_output(char *act_data,
return 0;
}
static void
nfp_flow_action_set_mac(char *act_data,
const struct rte_flow_action *action,
bool mac_src_flag,
bool mac_set_flag)
{
size_t act_size;
struct nfp_fl_act_set_eth *set_eth;
const struct rte_flow_action_set_mac *set_mac;
if (mac_set_flag)
set_eth = (struct nfp_fl_act_set_eth *)act_data - 1;
else
set_eth = (struct nfp_fl_act_set_eth *)act_data;
act_size = sizeof(struct nfp_fl_act_set_eth);
set_eth->head.jump_id = NFP_FL_ACTION_OPCODE_SET_ETHERNET;
set_eth->head.len_lw = act_size >> NFP_FL_LW_SIZ;
set_eth->reserved = 0;
set_mac = (const struct rte_flow_action_set_mac *)action->conf;
if (mac_src_flag) {
rte_memcpy(&set_eth->eth_addr[RTE_ETHER_ADDR_LEN],
set_mac->mac_addr, RTE_ETHER_ADDR_LEN);
} else {
rte_memcpy(&set_eth->eth_addr[0],
set_mac->mac_addr, RTE_ETHER_ADDR_LEN);
}
}
static int
nfp_flow_compile_action(__rte_unused struct nfp_flower_representor *representor,
const struct rte_flow_action actions[],
@ -1212,6 +1250,7 @@ nfp_flow_compile_action(__rte_unused struct nfp_flower_representor *representor,
char *position;
char *action_data;
bool drop_flag = false;
bool mac_set_flag = false;
uint32_t total_actions = 0;
const struct rte_flow_action *action;
struct nfp_fl_rule_metadata *nfp_flow_meta;
@ -1242,6 +1281,14 @@ nfp_flow_compile_action(__rte_unused struct nfp_flower_representor *representor,
position += sizeof(struct nfp_fl_act_output);
break;
case RTE_FLOW_ACTION_TYPE_SET_MAC_SRC:
PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_SET_MAC_SRC");
nfp_flow_action_set_mac(position, action, true, mac_set_flag);
if (!mac_set_flag) {
position += sizeof(struct nfp_fl_act_set_eth);
mac_set_flag = true;
}
break;
default:
PMD_DRV_LOG(ERR, "Unsupported action type: %d", action->type);
return -ENOTSUP;