1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2020-2021 Xilinx, Inc.
7 #include <rte_kvargs.h>
14 sfc_vdpa_get_eth_addr(const char *key __rte_unused,
15 const char *value, void *extra_args)
17 struct rte_ether_addr *mac_addr = extra_args;
19 if (value == NULL || extra_args == NULL)
22 /* Convert string with Ethernet address to an ether_addr */
23 rte_ether_unformat_addr(value, mac_addr);
29 sfc_vdpa_set_mac_filter(efx_nic_t *nic, efx_filter_spec_t *spec,
30 int qid, uint8_t *eth_addr)
34 if (nic == NULL || spec == NULL)
37 spec->efs_priority = EFX_FILTER_PRI_MANUAL;
38 spec->efs_flags = EFX_FILTER_FLAG_RX;
39 spec->efs_dmaq_id = qid;
41 rc = efx_filter_spec_set_eth_local(spec, EFX_FILTER_SPEC_VID_UNSPEC,
46 rc = efx_filter_insert(nic, spec);
53 int sfc_vdpa_filter_config(struct sfc_vdpa_ops_data *ops_data)
58 struct rte_ether_addr bcast_eth_addr;
59 struct rte_ether_addr ucast_eth_addr;
60 struct sfc_vdpa_adapter *sva = ops_data->dev_handle;
61 efx_filter_spec_t *spec;
63 sfc_vdpa_log_init(sva, "entry");
67 sfc_vdpa_log_init(sva, "process kvarg");
69 /* skip MAC filter configuration if mac address is not provided */
70 if (rte_kvargs_count(sva->kvargs, SFC_VDPA_MAC_ADDR) == 0) {
72 "MAC address is not provided, skipping MAC Filter Config");
76 rc = rte_kvargs_process(sva->kvargs, SFC_VDPA_MAC_ADDR,
77 &sfc_vdpa_get_eth_addr,
82 /* create filters on the base queue */
83 qid = SFC_VDPA_GET_VI_INDEX(0);
85 sfc_vdpa_log_init(sva, "insert broadcast mac filter");
87 EFX_MAC_BROADCAST_ADDR_SET(bcast_eth_addr.addr_bytes);
88 spec = &sva->filters.spec[SFC_VDPA_BCAST_MAC_FILTER];
90 rc = sfc_vdpa_set_mac_filter(nic, spec, qid,
91 bcast_eth_addr.addr_bytes);
93 sfc_vdpa_err(ops_data->dev_handle,
94 "broadcast MAC filter insertion failed: %s",
97 sva->filters.filter_cnt++;
99 sfc_vdpa_log_init(sva, "insert unicast mac filter");
100 spec = &sva->filters.spec[SFC_VDPA_UCAST_MAC_FILTER];
102 rc = sfc_vdpa_set_mac_filter(nic, spec, qid,
103 ucast_eth_addr.addr_bytes);
106 "unicast MAC filter insertion failed: %s",
109 sva->filters.filter_cnt++;
111 sfc_vdpa_log_init(sva, "done");
116 int sfc_vdpa_filter_remove(struct sfc_vdpa_ops_data *ops_data)
119 struct sfc_vdpa_adapter *sva = ops_data->dev_handle;
124 for (i = 0; i < sva->filters.filter_cnt; i++) {
125 rc = efx_filter_remove(nic, &(sva->filters.spec[i]));
128 "remove HW filter failed for entry %d: %s",
129 i, rte_strerror(rc));
132 sva->filters.filter_cnt = 0;