net/sfc: support represented port flow item
Add support for item REPRESENTED_PORT to match on traffic entering the embedded switch from 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
79b28b4920
commit
0fb3e8a910
@ -53,6 +53,7 @@ port_id = Y
|
||||
port_representor = Y
|
||||
pppoed = Y
|
||||
pppoes = Y
|
||||
represented_port = Y
|
||||
tcp = Y
|
||||
udp = Y
|
||||
vf = Y
|
||||
|
@ -194,6 +194,8 @@ Supported pattern items (***transfer*** rules):
|
||||
|
||||
- PORT_REPRESENTOR (cannot repeat; conflicts with other traffic source items)
|
||||
|
||||
- REPRESENTED_PORT (cannot repeat; conflicts with other traffic source items)
|
||||
|
||||
- PORT_ID (cannot repeat; conflicts with other traffic source items)
|
||||
|
||||
- PHY_PORT (cannot repeat; conflicts with other traffic source items)
|
||||
|
@ -1333,9 +1333,9 @@ sfc_mae_rule_parse_item_port_id(const struct rte_flow_item *item,
|
||||
}
|
||||
|
||||
static int
|
||||
sfc_mae_rule_parse_item_port_representor(const struct rte_flow_item *item,
|
||||
struct sfc_flow_parse_ctx *ctx,
|
||||
struct rte_flow_error *error)
|
||||
sfc_mae_rule_parse_item_ethdev_based(const struct rte_flow_item *item,
|
||||
struct sfc_flow_parse_ctx *ctx,
|
||||
struct rte_flow_error *error)
|
||||
{
|
||||
struct sfc_mae_parse_ctx *ctx_mae = ctx->mae;
|
||||
const struct rte_flow_item_ethdev supp_mask = {
|
||||
@ -1363,20 +1363,38 @@ sfc_mae_rule_parse_item_port_representor(const struct rte_flow_item *item,
|
||||
if (mask->port_id != supp_mask.port_id) {
|
||||
return rte_flow_error_set(error, EINVAL,
|
||||
RTE_FLOW_ERROR_TYPE_ITEM, item,
|
||||
"Bad mask in the PORT_REPRESENTOR pattern item");
|
||||
"Bad mask in the ethdev-based pattern item");
|
||||
}
|
||||
|
||||
/* If "spec" is not set, could be any port ID */
|
||||
if (spec == NULL)
|
||||
return 0;
|
||||
|
||||
rc = sfc_mae_switch_get_ethdev_mport(
|
||||
ctx_mae->sa->mae.switch_domain_id,
|
||||
spec->port_id, &mport_sel);
|
||||
if (rc != 0) {
|
||||
return rte_flow_error_set(error, rc,
|
||||
switch (item->type) {
|
||||
case RTE_FLOW_ITEM_TYPE_PORT_REPRESENTOR:
|
||||
rc = sfc_mae_switch_get_ethdev_mport(
|
||||
ctx_mae->sa->mae.switch_domain_id,
|
||||
spec->port_id, &mport_sel);
|
||||
if (rc != 0) {
|
||||
return rte_flow_error_set(error, rc,
|
||||
RTE_FLOW_ERROR_TYPE_ITEM, item,
|
||||
"Can't get m-port for the given ethdev");
|
||||
}
|
||||
break;
|
||||
case RTE_FLOW_ITEM_TYPE_REPRESENTED_PORT:
|
||||
rc = sfc_mae_switch_get_entity_mport(
|
||||
ctx_mae->sa->mae.switch_domain_id,
|
||||
spec->port_id, &mport_sel);
|
||||
if (rc != 0) {
|
||||
return rte_flow_error_set(error, rc,
|
||||
RTE_FLOW_ERROR_TYPE_ITEM, item,
|
||||
"Can't get m-port for the given ethdev");
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return rte_flow_error_set(error, EINVAL,
|
||||
RTE_FLOW_ERROR_TYPE_ITEM, item,
|
||||
"Can't get m-port for the given ethdev");
|
||||
"Unsupported ethdev-based flow item");
|
||||
}
|
||||
|
||||
rc = efx_mae_match_spec_mport_set(ctx_mae->match_spec,
|
||||
@ -2329,7 +2347,19 @@ static const struct sfc_flow_item sfc_flow_items[] = {
|
||||
.prev_layer = SFC_FLOW_ITEM_ANY_LAYER,
|
||||
.layer = SFC_FLOW_ITEM_ANY_LAYER,
|
||||
.ctx_type = SFC_FLOW_PARSE_CTX_MAE,
|
||||
.parse = sfc_mae_rule_parse_item_port_representor,
|
||||
.parse = sfc_mae_rule_parse_item_ethdev_based,
|
||||
},
|
||||
{
|
||||
.type = RTE_FLOW_ITEM_TYPE_REPRESENTED_PORT,
|
||||
.name = "REPRESENTED_PORT",
|
||||
/*
|
||||
* In terms of RTE flow, this item is a META one,
|
||||
* and its position in the pattern is don't care.
|
||||
*/
|
||||
.prev_layer = SFC_FLOW_ITEM_ANY_LAYER,
|
||||
.layer = SFC_FLOW_ITEM_ANY_LAYER,
|
||||
.ctx_type = SFC_FLOW_PARSE_CTX_MAE,
|
||||
.parse = sfc_mae_rule_parse_item_ethdev_based,
|
||||
},
|
||||
{
|
||||
.type = RTE_FLOW_ITEM_TYPE_PHY_PORT,
|
||||
|
@ -567,6 +567,35 @@ sfc_mae_switch_get_ethdev_mport(uint16_t switch_domain_id,
|
||||
return rc;
|
||||
}
|
||||
|
||||
int
|
||||
sfc_mae_switch_get_entity_mport(uint16_t switch_domain_id,
|
||||
uint16_t ethdev_port_id,
|
||||
efx_mport_sel_t *mport_sel)
|
||||
{
|
||||
static struct sfc_mae_switch_port *port;
|
||||
int rc;
|
||||
|
||||
rte_spinlock_lock(&sfc_mae_switch.lock);
|
||||
rc = sfc_mae_find_switch_port_by_ethdev(switch_domain_id,
|
||||
ethdev_port_id, &port);
|
||||
if (rc != 0)
|
||||
goto unlock;
|
||||
|
||||
if (port->type == SFC_MAE_SWITCH_PORT_INDEPENDENT &&
|
||||
!port->data.indep.mae_admin) {
|
||||
/* See sfc_mae_assign_entity_mport() */
|
||||
rc = ENOTSUP;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
*mport_sel = port->entity_mport;
|
||||
|
||||
unlock:
|
||||
rte_spinlock_unlock(&sfc_mae_switch.lock);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
int
|
||||
sfc_mae_switch_port_id_by_entity(uint16_t switch_domain_id,
|
||||
const efx_mport_sel_t *entity_mportp,
|
||||
|
@ -106,6 +106,10 @@ int sfc_mae_switch_get_ethdev_mport(uint16_t switch_domain_id,
|
||||
uint16_t ethdev_port_id,
|
||||
efx_mport_sel_t *mport_sel);
|
||||
|
||||
int sfc_mae_switch_get_entity_mport(uint16_t switch_domain_id,
|
||||
uint16_t ethdev_port_id,
|
||||
efx_mport_sel_t *mport_sel);
|
||||
|
||||
int sfc_mae_switch_port_id_by_entity(uint16_t switch_domain_id,
|
||||
const efx_mport_sel_t *entity_mportp,
|
||||
enum sfc_mae_switch_port_type type,
|
||||
|
Loading…
Reference in New Issue
Block a user