[2/3] net/sfc: allow ports without MAE privilege

Message ID 20211015064903.3302489-3-andrew.rybchenko@oktetlabs.ru (mailing list archive)
State Accepted, archived
Delegated to: Ferruh Yigit
Headers
Series net/sfc: support transfer rule proxy |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Andrew Rybchenko Oct. 15, 2021, 6:49 a.m. UTC
  From: Viacheslav Galaktionov <viacheslav.galaktionov@oktetlabs.ru>

Register unprivileged ports in the switch domain registry in order to
allow redirecting traffic to them.

Differentiate between different levels of MAE support, update all MAE
status checks.

Signed-off-by: Viacheslav Galaktionov <viacheslav.galaktionov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/net/sfc/sfc_ethdev.c | 11 +++---
 drivers/net/sfc/sfc_flow.c   |  2 +-
 drivers/net/sfc/sfc_mae.c    | 73 +++++++++++++++++++++---------------
 drivers/net/sfc/sfc_mae.h    |  3 +-
 4 files changed, 51 insertions(+), 38 deletions(-)
  

Patch

diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index 8ec56a9ed5..43fb34dffa 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -187,7 +187,8 @@  sfc_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 	dev_info->dev_capa = RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP |
 			     RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP;
 
-	if (mae->status == SFC_MAE_STATUS_SUPPORTED) {
+	if (mae->status == SFC_MAE_STATUS_SUPPORTED ||
+	    mae->status == SFC_MAE_STATUS_ADMIN) {
 		dev_info->switch_info.name = dev->device->driver->name;
 		dev_info->switch_info.domain_id = mae->switch_domain_id;
 		dev_info->switch_info.port_id = mae->switch_port_id;
@@ -2252,7 +2253,7 @@  sfc_representor_info_get(struct rte_eth_dev *dev,
 
 	sfc_adapter_lock(sa);
 
-	if (sa->mae.status != SFC_MAE_STATUS_SUPPORTED) {
+	if (sa->mae.status != SFC_MAE_STATUS_ADMIN) {
 		sfc_adapter_unlock(sa);
 		return -ENOTSUP;
 	}
@@ -2698,7 +2699,7 @@  sfc_parse_switch_mode(struct sfc_adapter *sa, bool has_representors)
 		goto fail_kvargs;
 
 	if (switch_mode == NULL) {
-		sa->switchdev = encp->enc_mae_supported &&
+		sa->switchdev = encp->enc_mae_admin &&
 				(!encp->enc_datapath_cap_evb ||
 				 has_representors);
 	} else if (strcasecmp(switch_mode, SFC_KVARG_SWITCH_MODE_LEGACY) == 0) {
@@ -2833,9 +2834,9 @@  sfc_eth_dev_init(struct rte_eth_dev *dev, void *init_params)
 	if (rc != 0)
 		goto fail_attach;
 
-	if (sa->switchdev && sa->mae.status != SFC_MAE_STATUS_SUPPORTED) {
+	if (sa->switchdev && sa->mae.status != SFC_MAE_STATUS_ADMIN) {
 		sfc_err(sa,
-			"failed to enable switchdev mode without MAE support");
+			"failed to enable switchdev mode without admin MAE privilege");
 		rc = ENOTSUP;
 		goto fail_switchdev_no_mae;
 	}
diff --git a/drivers/net/sfc/sfc_flow.c b/drivers/net/sfc/sfc_flow.c
index 81b9923644..d57235f358 100644
--- a/drivers/net/sfc/sfc_flow.c
+++ b/drivers/net/sfc/sfc_flow.c
@@ -1275,7 +1275,7 @@  sfc_flow_parse_attr(struct sfc_adapter *sa,
 		spec_filter->template.efs_rss_context = EFX_RSS_CONTEXT_DEFAULT;
 		spec_filter->template.efs_priority = EFX_FILTER_PRI_MANUAL;
 	} else {
-		if (mae->status != SFC_MAE_STATUS_SUPPORTED) {
+		if (mae->status != SFC_MAE_STATUS_ADMIN) {
 			rte_flow_error_set(error, ENOTSUP,
 					   RTE_FLOW_ERROR_TYPE_ATTR_TRANSFER,
 					   attr, "Transfer is not supported");
diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c
index 4c5c7b776f..6a1385283b 100644
--- a/drivers/net/sfc/sfc_mae.c
+++ b/drivers/net/sfc/sfc_mae.c
@@ -197,23 +197,25 @@  sfc_mae_attach(struct sfc_adapter *sa)
 		return 0;
 	}
 
-	sfc_log_init(sa, "init MAE");
-	rc = efx_mae_init(sa->nic);
-	if (rc != 0)
-		goto fail_mae_init;
+	if (encp->enc_mae_admin) {
+		sfc_log_init(sa, "init MAE");
+		rc = efx_mae_init(sa->nic);
+		if (rc != 0)
+			goto fail_mae_init;
 
-	sfc_log_init(sa, "get MAE limits");
-	rc = efx_mae_get_limits(sa->nic, &limits);
-	if (rc != 0)
-		goto fail_mae_get_limits;
+		sfc_log_init(sa, "get MAE limits");
+		rc = efx_mae_get_limits(sa->nic, &limits);
+		if (rc != 0)
+			goto fail_mae_get_limits;
 
-	sfc_log_init(sa, "init MAE counter registry");
-	rc = sfc_mae_counter_registry_init(&mae->counter_registry,
-					   limits.eml_max_n_counters);
-	if (rc != 0) {
-		sfc_err(sa, "failed to init MAE counters registry for %u entries: %s",
-			limits.eml_max_n_counters, rte_strerror(rc));
-		goto fail_counter_registry_init;
+		sfc_log_init(sa, "init MAE counter registry");
+		rc = sfc_mae_counter_registry_init(&mae->counter_registry,
+						   limits.eml_max_n_counters);
+		if (rc != 0) {
+			sfc_err(sa, "failed to init MAE counters registry for %u entries: %s",
+				limits.eml_max_n_counters, rte_strerror(rc));
+			goto fail_counter_registry_init;
+		}
 	}
 
 	sfc_log_init(sa, "assign entity MPORT");
@@ -238,21 +240,28 @@  sfc_mae_attach(struct sfc_adapter *sa)
 	if (rc != 0)
 		goto fail_mae_assign_switch_port;
 
-	sfc_log_init(sa, "allocate encap. header bounce buffer");
-	bounce_eh->buf_size = limits.eml_encap_header_size_limit;
-	bounce_eh->buf = rte_malloc("sfc_mae_bounce_eh",
-				    bounce_eh->buf_size, 0);
-	if (bounce_eh->buf == NULL)
-		goto fail_mae_alloc_bounce_eh;
-
-	mae->status = SFC_MAE_STATUS_SUPPORTED;
-	mae->nb_outer_rule_prios_max = limits.eml_max_n_outer_prios;
-	mae->nb_action_rule_prios_max = limits.eml_max_n_action_prios;
-	mae->encap_types_supported = limits.eml_encap_types_supported;
+	if (encp->enc_mae_admin) {
+		sfc_log_init(sa, "allocate encap. header bounce buffer");
+		bounce_eh->buf_size = limits.eml_encap_header_size_limit;
+		bounce_eh->buf = rte_malloc("sfc_mae_bounce_eh",
+					    bounce_eh->buf_size, 0);
+		if (bounce_eh->buf == NULL)
+			goto fail_mae_alloc_bounce_eh;
+
+		mae->nb_outer_rule_prios_max = limits.eml_max_n_outer_prios;
+		mae->nb_action_rule_prios_max = limits.eml_max_n_action_prios;
+		mae->encap_types_supported = limits.eml_encap_types_supported;
+	}
+
 	TAILQ_INIT(&mae->outer_rules);
 	TAILQ_INIT(&mae->encap_headers);
 	TAILQ_INIT(&mae->action_sets);
 
+	if (encp->enc_mae_admin)
+		mae->status = SFC_MAE_STATUS_ADMIN;
+	else
+		mae->status = SFC_MAE_STATUS_SUPPORTED;
+
 	sfc_log_init(sa, "done");
 
 	return 0;
@@ -261,11 +270,13 @@  sfc_mae_attach(struct sfc_adapter *sa)
 fail_mae_assign_switch_port:
 fail_mae_assign_switch_domain:
 fail_mae_assign_entity_mport:
-	sfc_mae_counter_registry_fini(&mae->counter_registry);
+	if (encp->enc_mae_admin)
+		sfc_mae_counter_registry_fini(&mae->counter_registry);
 
 fail_counter_registry_init:
 fail_mae_get_limits:
-	efx_mae_fini(sa->nic);
+	if (encp->enc_mae_admin)
+		efx_mae_fini(sa->nic);
 
 fail_mae_init:
 	sfc_log_init(sa, "failed %d", rc);
@@ -284,7 +295,7 @@  sfc_mae_detach(struct sfc_adapter *sa)
 	mae->nb_action_rule_prios_max = 0;
 	mae->status = SFC_MAE_STATUS_UNKNOWN;
 
-	if (status_prev != SFC_MAE_STATUS_SUPPORTED)
+	if (status_prev != SFC_MAE_STATUS_ADMIN)
 		return;
 
 	rte_free(mae->bounce_eh.buf);
@@ -4036,9 +4047,9 @@  sfc_mae_switchdev_init(struct sfc_adapter *sa)
 		return 0;
 	}
 
-	if (mae->status != SFC_MAE_STATUS_SUPPORTED) {
+	if (mae->status != SFC_MAE_STATUS_ADMIN) {
 		rc = ENOTSUP;
-		sfc_err(sa, "failed to init switchdev - no MAE support");
+		sfc_err(sa, "failed to init switchdev - no admin MAE privilege");
 		goto fail_no_mae;
 	}
 
diff --git a/drivers/net/sfc/sfc_mae.h b/drivers/net/sfc/sfc_mae.h
index 6c1a5bfee7..23dcf1e482 100644
--- a/drivers/net/sfc/sfc_mae.h
+++ b/drivers/net/sfc/sfc_mae.h
@@ -88,7 +88,8 @@  TAILQ_HEAD(sfc_mae_action_sets, sfc_mae_action_set);
 enum sfc_mae_status {
 	SFC_MAE_STATUS_UNKNOWN = 0,
 	SFC_MAE_STATUS_UNSUPPORTED,
-	SFC_MAE_STATUS_SUPPORTED
+	SFC_MAE_STATUS_SUPPORTED,
+	SFC_MAE_STATUS_ADMIN,
 };
 
 /*