net/sfc: do not allow flow rules to refer to VF representors

VF representors do not own dedicated m-ports and thus cannot
be referred to as traffic endpoints in flow items or actions.

Fixes: a62ec90522 ("net/sfc: add port representors infrastructure")
Fixes: f55b61cec9 ("net/sfc: support port representor flow item")

Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
This commit is contained in:
Ivan Malov 2021-10-25 14:04:09 +03:00 committed by Ferruh Yigit
parent ec4e11d41d
commit b7b7b9f800

View File

@ -512,7 +512,7 @@ sfc_mae_clear_switch_port(uint16_t switch_domain_id,
static int static int
sfc_mae_find_switch_port_by_ethdev(uint16_t switch_domain_id, sfc_mae_find_switch_port_by_ethdev(uint16_t switch_domain_id,
uint16_t ethdev_port_id, uint16_t ethdev_port_id,
efx_mport_sel_t *mport_sel) struct sfc_mae_switch_port **switch_port)
{ {
struct sfc_mae_switch_domain *domain; struct sfc_mae_switch_domain *domain;
struct sfc_mae_switch_port *port; struct sfc_mae_switch_port *port;
@ -528,7 +528,7 @@ sfc_mae_find_switch_port_by_ethdev(uint16_t switch_domain_id,
TAILQ_FOREACH(port, &domain->ports, switch_domain_ports) { TAILQ_FOREACH(port, &domain->ports, switch_domain_ports) {
if (port->ethdev_port_id == ethdev_port_id) { if (port->ethdev_port_id == ethdev_port_id) {
*mport_sel = port->ethdev_mport; *switch_port = port;
return 0; return 0;
} }
} }
@ -541,11 +541,27 @@ sfc_mae_switch_port_by_ethdev(uint16_t switch_domain_id,
uint16_t ethdev_port_id, uint16_t ethdev_port_id,
efx_mport_sel_t *mport_sel) efx_mport_sel_t *mport_sel)
{ {
struct sfc_mae_switch_port *port;
int rc; int rc;
rte_spinlock_lock(&sfc_mae_switch.lock); rte_spinlock_lock(&sfc_mae_switch.lock);
rc = sfc_mae_find_switch_port_by_ethdev(switch_domain_id, rc = sfc_mae_find_switch_port_by_ethdev(switch_domain_id,
ethdev_port_id, mport_sel); ethdev_port_id, &port);
if (rc != 0)
goto unlock;
if (port->type != SFC_MAE_SWITCH_PORT_INDEPENDENT) {
/*
* The ethdev is a "VF representor". It does not own
* a dedicated m-port suitable for use in flow rules.
*/
rc = ENOTSUP;
goto unlock;
}
*mport_sel = port->ethdev_mport;
unlock:
rte_spinlock_unlock(&sfc_mae_switch.lock); rte_spinlock_unlock(&sfc_mae_switch.lock);
return rc; return rc;