[dpdk-dev] [PATCH v4 10/10] vdpa/sfc: set a multicast filter during vDPA init

Vijay Srivastava vijay.srivastava at xilinx.com
Wed Nov 3 14:57:54 CET 2021


From: Vijay Kumar Srivastava <vsrivast at xilinx.com>

Insert unknown multicast filter to allow IPv6 neighbor discovery

Signed-off-by: Vijay Kumar Srivastava <vsrivast at xilinx.com>
Acked-by: Andrew Rybchenko <andrew.rybchenko at oktetlabs.ru>
Reviewed-by: Chenbo Xia <chenbo.xia at intel.com>
---
v4:
* Improved line usage by rearranging function params.

 drivers/vdpa/sfc/sfc_vdpa.h        |  3 ++-
 drivers/vdpa/sfc/sfc_vdpa_filter.c | 20 +++++++++++++++++---
 2 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/drivers/vdpa/sfc/sfc_vdpa.h b/drivers/vdpa/sfc/sfc_vdpa.h
index 81fc39d..080f2d6 100644
--- a/drivers/vdpa/sfc/sfc_vdpa.h
+++ b/drivers/vdpa/sfc/sfc_vdpa.h
@@ -21,7 +21,7 @@
 #define SFC_VDPA_DEFAULT_MCDI_IOVA		0x200000000000
 
 /* Broadcast & Unicast MAC filters are supported */
-#define SFC_MAX_SUPPORTED_FILTERS		2
+#define SFC_MAX_SUPPORTED_FILTERS		3
 
 /*
  * Get function-local index of the associated VI from the
@@ -32,6 +32,7 @@
 enum sfc_vdpa_filter_type {
 	SFC_VDPA_BCAST_MAC_FILTER = 0,
 	SFC_VDPA_UCAST_MAC_FILTER = 1,
+	SFC_VDPA_MCAST_DST_FILTER = 2,
 	SFC_VDPA_FILTER_NTYPE
 };
 
diff --git a/drivers/vdpa/sfc/sfc_vdpa_filter.c b/drivers/vdpa/sfc/sfc_vdpa_filter.c
index 9687278..4c133aa 100644
--- a/drivers/vdpa/sfc/sfc_vdpa_filter.c
+++ b/drivers/vdpa/sfc/sfc_vdpa_filter.c
@@ -39,8 +39,12 @@
 	spec->efs_flags = EFX_FILTER_FLAG_RX;
 	spec->efs_dmaq_id = qid;
 
-	rc = efx_filter_spec_set_eth_local(spec, EFX_FILTER_SPEC_VID_UNSPEC,
-					   eth_addr);
+	if (eth_addr == NULL)
+		rc = efx_filter_spec_set_mc_def(spec);
+	else
+		rc = efx_filter_spec_set_eth_local(spec,
+						   EFX_FILTER_SPEC_VID_UNSPEC,
+						   eth_addr);
 	if (rc != 0)
 		return rc;
 
@@ -103,8 +107,18 @@ int sfc_vdpa_filter_config(struct sfc_vdpa_ops_data *ops_data)
 	rc = sfc_vdpa_set_mac_filter(nic, spec, qid,
 				     ucast_eth_addr.addr_bytes);
 	if (rc != 0)
+		sfc_vdpa_err(sva, "unicast MAC filter insertion failed: %s",
+			     rte_strerror(rc));
+	else
+		sva->filters.filter_cnt++;
+
+	sfc_vdpa_log_init(sva, "insert unknown mcast filter");
+	spec = &sva->filters.spec[SFC_VDPA_MCAST_DST_FILTER];
+
+	rc = sfc_vdpa_set_mac_filter(nic, spec, qid, NULL);
+	if (rc != 0)
 		sfc_vdpa_err(sva,
-			     "unicast MAC filter insertion failed: %s",
+			     "mcast filter insertion failed: %s",
 			     rte_strerror(rc));
 	else
 		sva->filters.filter_cnt++;
-- 
1.8.3.1



More information about the dev mailing list