net/sfc: support port representor related flow actions
Add support for actions PORT_REPRESENTOR and REPRESENTED_PORT. The former should be used instead of ambiguous PORT_ID. The latter sends traffic to the entity represented by the given ethdev (network port or VF). Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru> Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
This commit is contained in:
parent
0fb3e8a910
commit
46c6714ffd
@ -73,6 +73,8 @@ of_set_vlan_vid = Y
|
||||
pf = Y
|
||||
phy_port = Y
|
||||
port_id = Y
|
||||
port_representor = Y
|
||||
represented_port = Y
|
||||
queue = Y
|
||||
rss = Y
|
||||
vf = Y
|
||||
|
@ -248,6 +248,10 @@ Supported actions (***transfer*** rules):
|
||||
|
||||
- VF
|
||||
|
||||
- PORT_REPRESENTOR
|
||||
|
||||
- REPRESENTED_PORT
|
||||
|
||||
- PORT_ID
|
||||
|
||||
- COUNT
|
||||
|
@ -3488,6 +3488,58 @@ sfc_mae_rule_parse_action_port_id(struct sfc_adapter *sa,
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int
|
||||
sfc_mae_rule_parse_action_port_representor(struct sfc_adapter *sa,
|
||||
const struct rte_flow_action_ethdev *conf,
|
||||
efx_mae_actions_t *spec)
|
||||
{
|
||||
struct sfc_mae *mae = &sa->mae;
|
||||
efx_mport_sel_t mport;
|
||||
int rc;
|
||||
|
||||
rc = sfc_mae_switch_get_ethdev_mport(mae->switch_domain_id,
|
||||
conf->port_id, &mport);
|
||||
if (rc != 0) {
|
||||
sfc_err(sa, "failed to get m-port for the given ethdev (port_id=%u): %s",
|
||||
conf->port_id, strerror(rc));
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = efx_mae_action_set_populate_deliver(spec, &mport);
|
||||
if (rc != 0) {
|
||||
sfc_err(sa, "failed to request action DELIVER with m-port selector 0x%08x: %s",
|
||||
mport.sel, strerror(rc));
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int
|
||||
sfc_mae_rule_parse_action_represented_port(struct sfc_adapter *sa,
|
||||
const struct rte_flow_action_ethdev *conf,
|
||||
efx_mae_actions_t *spec)
|
||||
{
|
||||
struct sfc_mae *mae = &sa->mae;
|
||||
efx_mport_sel_t mport;
|
||||
int rc;
|
||||
|
||||
rc = sfc_mae_switch_get_entity_mport(mae->switch_domain_id,
|
||||
conf->port_id, &mport);
|
||||
if (rc != 0) {
|
||||
sfc_err(sa, "failed to get m-port for the given ethdev (port_id=%u): %s",
|
||||
conf->port_id, strerror(rc));
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = efx_mae_action_set_populate_deliver(spec, &mport);
|
||||
if (rc != 0) {
|
||||
sfc_err(sa, "failed to request action DELIVER with m-port selector 0x%08x: %s",
|
||||
mport.sel, strerror(rc));
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static const char * const action_names[] = {
|
||||
[RTE_FLOW_ACTION_TYPE_VXLAN_DECAP] = "VXLAN_DECAP",
|
||||
[RTE_FLOW_ACTION_TYPE_OF_POP_VLAN] = "OF_POP_VLAN",
|
||||
@ -3501,6 +3553,8 @@ static const char * const action_names[] = {
|
||||
[RTE_FLOW_ACTION_TYPE_PF] = "PF",
|
||||
[RTE_FLOW_ACTION_TYPE_VF] = "VF",
|
||||
[RTE_FLOW_ACTION_TYPE_PORT_ID] = "PORT_ID",
|
||||
[RTE_FLOW_ACTION_TYPE_PORT_REPRESENTOR] = "PORT_REPRESENTOR",
|
||||
[RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT] = "REPRESENTED_PORT",
|
||||
[RTE_FLOW_ACTION_TYPE_DROP] = "DROP",
|
||||
[RTE_FLOW_ACTION_TYPE_JUMP] = "JUMP",
|
||||
};
|
||||
@ -3609,6 +3663,18 @@ sfc_mae_rule_parse_action(struct sfc_adapter *sa,
|
||||
bundle->actions_mask);
|
||||
rc = sfc_mae_rule_parse_action_port_id(sa, action->conf, spec);
|
||||
break;
|
||||
case RTE_FLOW_ACTION_TYPE_PORT_REPRESENTOR:
|
||||
SFC_BUILD_SET_OVERFLOW(RTE_FLOW_ACTION_TYPE_PORT_REPRESENTOR,
|
||||
bundle->actions_mask);
|
||||
rc = sfc_mae_rule_parse_action_port_representor(sa,
|
||||
action->conf, spec);
|
||||
break;
|
||||
case RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT:
|
||||
SFC_BUILD_SET_OVERFLOW(RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT,
|
||||
bundle->actions_mask);
|
||||
rc = sfc_mae_rule_parse_action_represented_port(sa,
|
||||
action->conf, spec);
|
||||
break;
|
||||
case RTE_FLOW_ACTION_TYPE_DROP:
|
||||
SFC_BUILD_SET_OVERFLOW(RTE_FLOW_ACTION_TYPE_DROP,
|
||||
bundle->actions_mask);
|
||||
|
Loading…
x
Reference in New Issue
Block a user