#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
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
};
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;
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++;