* [PATCH v6 1/4] net/ice: add support for setting promisc by DCF
2022-03-02 6:30 [PATCH v6 0/4] ice repr functions by DCF Ke Zhang
@ 2022-03-02 6:30 ` Ke Zhang
2022-03-02 9:14 ` David Marchand
2022-03-02 6:30 ` [PATCH v6 2/4] net/ice: add support for display/reset stats " Ke Zhang
` (2 subsequent siblings)
3 siblings, 1 reply; 6+ messages in thread
From: Ke Zhang @ 2022-03-02 6:30 UTC (permalink / raw)
To: dev, qiming.yang, qi.z.zhang; +Cc: Yiding Zhou, Ke Zhang
From: Yiding Zhou <yidingx.zhou@intel.com>
allow to enable/disable VFs promisc mode over VF0.
this feature need to update ice kernel driver (newer than v1.8.0)
Signed-off-by: Yiding Zhou <yidingx.zhou@intel.com>
Signed-off-by: Ke Zhang <ke1x.zhang@intel.com>
---
drivers/net/ice/ice_dcf_vf_representor.c | 56 +++++++++++++++++-------
1 file changed, 39 insertions(+), 17 deletions(-)
diff --git a/drivers/net/ice/ice_dcf_vf_representor.c b/drivers/net/ice/ice_dcf_vf_representor.c
index b9fcfc80ad..781282f68c 100644
--- a/drivers/net/ice/ice_dcf_vf_representor.c
+++ b/drivers/net/ice/ice_dcf_vf_representor.c
@@ -10,6 +10,20 @@
#include "ice_dcf_ethdev.h"
#include "ice_rxtx.h"
+static __rte_always_inline struct ice_dcf_hw *
+ice_dcf_vf_repr_hw(struct ice_dcf_vf_repr *repr)
+{
+ struct ice_dcf_adapter *dcf_adapter =
+ repr->dcf_eth_dev->data->dev_private;
+
+ if (!dcf_adapter) {
+ PMD_DRV_LOG(ERR, "DCF for VF representor has been released\n");
+ return NULL;
+ }
+
+ return &dcf_adapter->real_hw;
+}
+
static uint16_t
ice_dcf_vf_repr_rx_burst(__rte_unused void *rxq,
__rte_unused struct rte_mbuf **rx_pkts,
@@ -78,15 +92,36 @@ ice_dcf_vf_repr_tx_queue_setup(__rte_unused struct rte_eth_dev *dev,
}
static int
-ice_dcf_vf_repr_promiscuous_enable(__rte_unused struct rte_eth_dev *ethdev)
+ice_dcf_vf_repr_promiscuous_enable(struct rte_eth_dev *ethdev)
{
- return 0;
+ struct ice_dcf_vf_repr *repr = ethdev->data->dev_private;
+ struct dcf_virtchnl_cmd args;
+ struct virtchnl_promisc_info promisc;
+ struct ice_dcf_hw *hw = ice_dcf_vf_repr_hw(repr);
+ memset(&args, 0, sizeof(args));
+ args.v_op = VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE;
+ promisc.flags = 0;
+ promisc.vsi_id = hw->vf_vsi_map[repr->vf_id] & ~VIRTCHNL_DCF_VF_VSI_VALID;
+ promisc.flags |= FLAG_VF_UNICAST_PROMISC;
+ args.req_msg = (uint8_t *)&promisc;
+ args.req_msglen = sizeof(promisc);
+ return ice_dcf_execute_virtchnl_cmd(hw, &args);
}
static int
-ice_dcf_vf_repr_promiscuous_disable(__rte_unused struct rte_eth_dev *ethdev)
+ice_dcf_vf_repr_promiscuous_disable(struct rte_eth_dev *ethdev)
{
- return 0;
+ struct ice_dcf_vf_repr *repr = ethdev->data->dev_private;
+ struct dcf_virtchnl_cmd args;
+ struct virtchnl_promisc_info promisc;
+ struct ice_dcf_hw *hw = ice_dcf_vf_repr_hw(repr);
+ memset(&args, 0, sizeof(args));
+ args.v_op = VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE;
+ promisc.flags = 0;
+ promisc.vsi_id = hw->vf_vsi_map[repr->vf_id] & ~VIRTCHNL_DCF_VF_VSI_VALID;
+ args.req_msg = (uint8_t *)&promisc;
+ args.req_msglen = sizeof(promisc);
+ return ice_dcf_execute_virtchnl_cmd(hw, &args);
}
static int
@@ -108,19 +143,6 @@ ice_dcf_vf_repr_link_update(__rte_unused struct rte_eth_dev *ethdev,
return 0;
}
-static __rte_always_inline struct ice_dcf_hw *
-ice_dcf_vf_repr_hw(struct ice_dcf_vf_repr *repr)
-{
- struct ice_dcf_adapter *dcf_adapter =
- repr->dcf_eth_dev->data->dev_private;
-
- if (!dcf_adapter) {
- PMD_DRV_LOG(ERR, "DCF for VF representor has been released\n");
- return NULL;
- }
-
- return &dcf_adapter->real_hw;
-}
static int
ice_dcf_vf_repr_dev_info_get(struct rte_eth_dev *dev,
--
2.25.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v6 1/4] net/ice: add support for setting promisc by DCF
2022-03-02 6:30 ` [PATCH v6 1/4] net/ice: add support for setting promisc " Ke Zhang
@ 2022-03-02 9:14 ` David Marchand
0 siblings, 0 replies; 6+ messages in thread
From: David Marchand @ 2022-03-02 9:14 UTC (permalink / raw)
To: Ke Zhang
Cc: dev, Qiming Yang, Qi Zhang, Yiding Zhou, Yigit, Ferruh, Maxime Coquelin
On Wed, Mar 2, 2022 at 7:35 AM Ke Zhang <ke1x.zhang@intel.com> wrote:
>
> From: Yiding Zhou <yidingx.zhou@intel.com>
>
> allow to enable/disable VFs promisc mode over VF0.
> this feature need to update ice kernel driver (newer than v1.8.0)
I guess v1.8.0 is about the out of tree driver Intel maintains.
If so, please state it clearly.
I had a quick look but I can't find a released v1.8.0 driver.
Is this series aimed at v22.03 or for later dpdk release?
About upstream kernel, is there plans to make it work in the future?
Were non regression tests passed with upstream?
Thanks.
--
David Marchand
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v6 2/4] net/ice: add support for display/reset stats by DCF
2022-03-02 6:30 [PATCH v6 0/4] ice repr functions by DCF Ke Zhang
2022-03-02 6:30 ` [PATCH v6 1/4] net/ice: add support for setting promisc " Ke Zhang
@ 2022-03-02 6:30 ` Ke Zhang
2022-03-02 6:30 ` [PATCH v6 3/4] net/ice: add support for add/remove mac addr " Ke Zhang
2022-03-02 6:30 ` [PATCH v6 4/4] net/ice: add support to configure the VLAN filter " Ke Zhang
3 siblings, 0 replies; 6+ messages in thread
From: Ke Zhang @ 2022-03-02 6:30 UTC (permalink / raw)
To: dev, qiming.yang, qi.z.zhang; +Cc: Ke Zhang
allow to display/reset VFs stats over VF0.
this feature need to update ice kernel driver (newer than v1.8.0)
Signed-off-by: Ke Zhang <ke1x.zhang@intel.com>
---
drivers/net/ice/ice_dcf_vf_representor.c | 129 +++++++++++++++++++++++
1 file changed, 129 insertions(+)
diff --git a/drivers/net/ice/ice_dcf_vf_representor.c b/drivers/net/ice/ice_dcf_vf_representor.c
index 781282f68c..765f5d4c95 100644
--- a/drivers/net/ice/ice_dcf_vf_representor.c
+++ b/drivers/net/ice/ice_dcf_vf_representor.c
@@ -10,6 +10,10 @@
#include "ice_dcf_ethdev.h"
#include "ice_rxtx.h"
+#define ICE_DCF_REPR_32_BIT_WIDTH (CHAR_BIT * 4)
+#define ICE_DCF_REPR_48_BIT_WIDTH (CHAR_BIT * 6)
+#define ICE_DCF_REPR_48_BIT_MASK RTE_LEN2MASK(ICE_DCF_REPR_48_BIT_WIDTH, uint64_t)
+
static __rte_always_inline struct ice_dcf_hw *
ice_dcf_vf_repr_hw(struct ice_dcf_vf_repr *repr)
{
@@ -409,6 +413,129 @@ ice_dcf_vf_repr_vlan_tpid_set(struct rte_eth_dev *dev,
return 0;
}
+static int
+ice_dcf_repr_query_stats(struct ice_dcf_hw *hw,
+ uint16_t vf_id, struct virtchnl_eth_stats *pstats)
+{
+ struct virtchnl_queue_select q_stats;
+ struct dcf_virtchnl_cmd args;
+ int err;
+
+ memset(&q_stats, 0, sizeof(q_stats));
+ q_stats.vsi_id = hw->vf_vsi_map[vf_id] & ~VIRTCHNL_DCF_VF_VSI_VALID;
+
+ args.v_op = VIRTCHNL_OP_GET_STATS;
+ args.req_msg = (uint8_t *)&q_stats;
+ args.req_msglen = sizeof(q_stats);
+ args.rsp_msglen = sizeof(struct virtchnl_eth_stats);
+ args.rsp_msgbuf = (uint8_t *)pstats;
+ args.rsp_buflen = sizeof(struct virtchnl_eth_stats);
+
+ err = ice_dcf_execute_virtchnl_cmd(hw, &args);
+ if (err) {
+ PMD_DRV_LOG(ERR, "fail to execute command OP_GET_STATS");
+ return err;
+ }
+
+ return 0;
+}
+
+static int
+ice_dcf_vf_repr_stats_reset(struct rte_eth_dev *dev)
+{
+ struct ice_dcf_vf_repr *repr = dev->data->dev_private;
+ struct ice_dcf_hw *hw = ice_dcf_vf_repr_hw(repr);
+ struct virtchnl_eth_stats pstats;
+ int ret;
+
+ if (hw->resetting)
+ return 0;
+
+ /* read stat values to clear hardware registers */
+ ret = ice_dcf_repr_query_stats(hw, repr->vf_id, &pstats);
+ if (ret != 0)
+ return ret;
+
+ /* set stats offset base on current values */
+ hw->eth_stats_offset = pstats;
+
+ return 0;
+}
+
+static void
+ice_dcf_stat_update_48(uint64_t *offset, uint64_t *stat)
+{
+ if (*stat >= *offset)
+ *stat = *stat - *offset;
+ else
+ *stat = (uint64_t)((*stat +
+ ((uint64_t)1 << ICE_DCF_REPR_48_BIT_WIDTH)) - *offset);
+
+ *stat &= ICE_DCF_REPR_48_BIT_MASK;
+}
+
+static void
+ice_dcf_stat_update_32(uint64_t *offset, uint64_t *stat)
+{
+ if (*stat >= *offset)
+ *stat = (uint64_t)(*stat - *offset);
+ else
+ *stat = (uint64_t)((*stat +
+ ((uint64_t)1 << ICE_DCF_REPR_32_BIT_WIDTH)) - *offset);
+}
+
+static void
+ice_dcf_update_stats(struct ice_dcf_hw *hw, struct virtchnl_eth_stats *nes)
+{
+ struct virtchnl_eth_stats *oes = &hw->eth_stats_offset;
+
+ ice_dcf_stat_update_48(&oes->rx_bytes, &nes->rx_bytes);
+ ice_dcf_stat_update_48(&oes->rx_unicast, &nes->rx_unicast);
+ ice_dcf_stat_update_48(&oes->rx_multicast, &nes->rx_multicast);
+ ice_dcf_stat_update_48(&oes->rx_broadcast, &nes->rx_broadcast);
+ ice_dcf_stat_update_32(&oes->rx_discards, &nes->rx_discards);
+ ice_dcf_stat_update_48(&oes->tx_bytes, &nes->tx_bytes);
+ ice_dcf_stat_update_48(&oes->tx_unicast, &nes->tx_unicast);
+ ice_dcf_stat_update_48(&oes->tx_multicast, &nes->tx_multicast);
+ ice_dcf_stat_update_48(&oes->tx_broadcast, &nes->tx_broadcast);
+ ice_dcf_stat_update_32(&oes->tx_errors, &nes->tx_errors);
+ ice_dcf_stat_update_32(&oes->tx_discards, &nes->tx_discards);
+}
+
+static int
+ice_dcf_vf_repr_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
+{
+ struct ice_dcf_vf_repr *repr = dev->data->dev_private;
+ struct ice_dcf_hw *hw = ice_dcf_vf_repr_hw(repr);
+ struct virtchnl_eth_stats pstats;
+ int ret;
+
+ if (hw->resetting) {
+ PMD_DRV_LOG(ERR,
+ "The DCF has been reset by PF, please reinit first");
+ return -EIO;
+ }
+
+ ret = ice_dcf_repr_query_stats(hw, repr->vf_id, &pstats);
+ if (ret == 0) {
+ uint8_t crc_stats_len = (dev->data->dev_conf.rxmode.offloads &
+ RTE_ETH_RX_OFFLOAD_KEEP_CRC) ? 0 :
+ RTE_ETHER_CRC_LEN;
+ ice_dcf_update_stats(hw, &pstats);
+ stats->ipackets = pstats.rx_unicast + pstats.rx_multicast +
+ pstats.rx_broadcast - pstats.rx_discards;
+ stats->opackets = pstats.tx_broadcast + pstats.tx_multicast +
+ pstats.tx_unicast;
+ stats->imissed = pstats.rx_discards;
+ stats->oerrors = pstats.tx_errors + pstats.tx_discards;
+ stats->ibytes = pstats.rx_bytes;
+ stats->ibytes -= stats->ipackets * crc_stats_len;
+ stats->obytes = pstats.tx_bytes;
+ } else {
+ PMD_DRV_LOG(ERR, "Get statistics failed, ret:%d", ret);
+ }
+ return ret;
+}
static const struct eth_dev_ops ice_dcf_vf_repr_dev_ops = {
.dev_configure = ice_dcf_vf_repr_dev_configure,
.dev_start = ice_dcf_vf_repr_dev_start,
@@ -425,6 +552,8 @@ static const struct eth_dev_ops ice_dcf_vf_repr_dev_ops = {
.vlan_offload_set = ice_dcf_vf_repr_vlan_offload_set,
.vlan_pvid_set = ice_dcf_vf_repr_vlan_pvid_set,
.vlan_tpid_set = ice_dcf_vf_repr_vlan_tpid_set,
+ .stats_reset = ice_dcf_vf_repr_stats_reset,
+ .stats_get = ice_dcf_vf_repr_stats_get,
};
int
--
2.25.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v6 3/4] net/ice: add support for add/remove mac addr by DCF
2022-03-02 6:30 [PATCH v6 0/4] ice repr functions by DCF Ke Zhang
2022-03-02 6:30 ` [PATCH v6 1/4] net/ice: add support for setting promisc " Ke Zhang
2022-03-02 6:30 ` [PATCH v6 2/4] net/ice: add support for display/reset stats " Ke Zhang
@ 2022-03-02 6:30 ` Ke Zhang
2022-03-02 6:30 ` [PATCH v6 4/4] net/ice: add support to configure the VLAN filter " Ke Zhang
3 siblings, 0 replies; 6+ messages in thread
From: Ke Zhang @ 2022-03-02 6:30 UTC (permalink / raw)
To: dev, qiming.yang, qi.z.zhang; +Cc: Ke Zhang
allow to add/remove VF's mac addr over VF0.
this feature need to update ice kernel driver (newer than v1.8.0)
Signed-off-by: Ke Zhang <ke1x.zhang@intel.com>
---
drivers/net/ice/ice_dcf_ethdev.h | 1 +
drivers/net/ice/ice_dcf_vf_representor.c | 81 +++++++++++++++++++++++-
2 files changed, 81 insertions(+), 1 deletion(-)
diff --git a/drivers/net/ice/ice_dcf_ethdev.h b/drivers/net/ice/ice_dcf_ethdev.h
index 11a1305038..ea5c020d61 100644
--- a/drivers/net/ice/ice_dcf_ethdev.h
+++ b/drivers/net/ice/ice_dcf_ethdev.h
@@ -50,6 +50,7 @@ struct ice_dcf_vf_repr {
struct rte_ether_addr mac_addr;
uint16_t switch_domain_id;
uint16_t vf_id;
+ uint16_t mac_num; /* Number of MAC addresses */
struct ice_dcf_vlan outer_vlan_info; /* DCF always handle outer VLAN */
};
diff --git a/drivers/net/ice/ice_dcf_vf_representor.c b/drivers/net/ice/ice_dcf_vf_representor.c
index 765f5d4c95..8a387461c4 100644
--- a/drivers/net/ice/ice_dcf_vf_representor.c
+++ b/drivers/net/ice/ice_dcf_vf_representor.c
@@ -159,7 +159,7 @@ ice_dcf_vf_repr_dev_info_get(struct rte_eth_dev *dev,
return -EIO;
dev_info->device = dev->device;
- dev_info->max_mac_addrs = 1;
+ dev_info->max_mac_addrs = ICE_NUM_MACADDR_MAX;
dev_info->max_rx_queues = dcf_hw->vsi_res->num_queue_pairs;
dev_info->max_tx_queues = dcf_hw->vsi_res->num_queue_pairs;
dev_info->min_rx_bufsize = ICE_BUF_SIZE_MIN;
@@ -536,6 +536,82 @@ ice_dcf_vf_repr_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
}
return ret;
}
+static int
+ice_dcf_repr_add_del_eth_addr(struct ice_dcf_hw *hw,
+ uint16_t vf_id,
+ struct rte_ether_addr *addr,
+ bool add, uint8_t type)
+{
+ struct virtchnl_ether_addr_list *list;
+ struct dcf_virtchnl_cmd args;
+ uint8_t cmd_buffer[sizeof(struct virtchnl_ether_addr_list) +
+ sizeof(struct virtchnl_ether_addr)];
+ int err;
+
+ list = (struct virtchnl_ether_addr_list *)cmd_buffer;
+ list->vsi_id = hw->vf_vsi_map[vf_id] & ~VIRTCHNL_DCF_VF_VSI_VALID;
+ list->num_elements = 1;
+ list->list[0].type = type;
+ rte_memcpy(list->list[0].addr, addr->addr_bytes,
+ sizeof(addr->addr_bytes));
+
+ args.v_op = add ? VIRTCHNL_OP_ADD_ETH_ADDR : VIRTCHNL_OP_DEL_ETH_ADDR;
+ args.req_msg = cmd_buffer;
+ args.req_msglen = sizeof(cmd_buffer);
+
+ err = ice_dcf_execute_virtchnl_cmd(hw, &args);
+ if (err) {
+ PMD_DRV_LOG(ERR, "Fail to execute command %s",
+ add ? "OP_ADD_ETH_ADDR" : "OP_DEL_ETH_ADDR");
+ return err;
+ }
+
+ return 0;
+}
+
+static int
+ice_dcf_vf_repr_add_mac_addr(struct rte_eth_dev *dev, struct rte_ether_addr *addr,
+ __rte_unused uint32_t index,
+ __rte_unused uint32_t pool)
+{
+ struct ice_dcf_vf_repr *repr = dev->data->dev_private;
+ struct ice_dcf_hw *hw = ice_dcf_vf_repr_hw(repr);
+ int err;
+
+ if (rte_is_zero_ether_addr(addr)) {
+ PMD_DRV_LOG(ERR, "Invalid Ethernet Address");
+ return -EINVAL;
+ }
+
+ err = ice_dcf_repr_add_del_eth_addr(hw, repr->vf_id, addr, true, VIRTCHNL_ETHER_ADDR_EXTRA);
+ if (err) {
+ PMD_DRV_LOG(ERR, "fail to add MAC address");
+ return -EIO;
+ }
+
+ repr->mac_num++;
+
+ return 0;
+}
+
+static void
+ice_dcf_vf_repr_del_mac_addr(struct rte_eth_dev *dev, uint32_t index)
+{
+ struct ice_dcf_vf_repr *repr = dev->data->dev_private;
+ struct ice_dcf_hw *hw = ice_dcf_vf_repr_hw(repr);
+ struct rte_ether_addr *addr;
+ int err;
+
+ addr = &dev->data->mac_addrs[index];
+
+ err = ice_dcf_repr_add_del_eth_addr(hw, repr->vf_id, addr,
+ false, VIRTCHNL_ETHER_ADDR_EXTRA);
+ if (err)
+ PMD_DRV_LOG(ERR, "fail to del MAC address");
+
+ repr->mac_num--;
+}
+
static const struct eth_dev_ops ice_dcf_vf_repr_dev_ops = {
.dev_configure = ice_dcf_vf_repr_dev_configure,
.dev_start = ice_dcf_vf_repr_dev_start,
@@ -554,6 +630,8 @@ static const struct eth_dev_ops ice_dcf_vf_repr_dev_ops = {
.vlan_tpid_set = ice_dcf_vf_repr_vlan_tpid_set,
.stats_reset = ice_dcf_vf_repr_stats_reset,
.stats_get = ice_dcf_vf_repr_stats_get,
+ .mac_addr_add = ice_dcf_vf_repr_add_mac_addr,
+ .mac_addr_remove = ice_dcf_vf_repr_del_mac_addr,
};
int
@@ -568,6 +646,7 @@ ice_dcf_vf_repr_init(struct rte_eth_dev *vf_rep_eth_dev, void *init_param)
repr->outer_vlan_info.port_vlan_ena = false;
repr->outer_vlan_info.stripping_ena = false;
repr->outer_vlan_info.tpid = RTE_ETHER_TYPE_VLAN;
+ repr->mac_num = 1;
vf_rep_eth_dev->dev_ops = &ice_dcf_vf_repr_dev_ops;
--
2.25.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v6 4/4] net/ice: add support to configure the VLAN filter by DCF
2022-03-02 6:30 [PATCH v6 0/4] ice repr functions by DCF Ke Zhang
` (2 preceding siblings ...)
2022-03-02 6:30 ` [PATCH v6 3/4] net/ice: add support for add/remove mac addr " Ke Zhang
@ 2022-03-02 6:30 ` Ke Zhang
3 siblings, 0 replies; 6+ messages in thread
From: Ke Zhang @ 2022-03-02 6:30 UTC (permalink / raw)
To: dev, qiming.yang, qi.z.zhang; +Cc: Ke Zhang
allow to configure the VLAN filter over VF0.
this feature need to update ice kernel driver (newer than v1.8.0)
Signed-off-by: Ke Zhang <ke1x.zhang@intel.com>
---
drivers/net/ice/ice_dcf_vf_representor.c | 51 ++++++++++++++++++++++++
1 file changed, 51 insertions(+)
diff --git a/drivers/net/ice/ice_dcf_vf_representor.c b/drivers/net/ice/ice_dcf_vf_representor.c
index 8a387461c4..eca2710735 100644
--- a/drivers/net/ice/ice_dcf_vf_representor.c
+++ b/drivers/net/ice/ice_dcf_vf_representor.c
@@ -612,6 +612,56 @@ ice_dcf_vf_repr_del_mac_addr(struct rte_eth_dev *dev, uint32_t index)
repr->mac_num--;
}
+static int
+ice_dcf_add_del_vlan_v2(struct rte_eth_dev *dev, uint16_t vlanid, bool add)
+{
+ struct ice_dcf_vf_repr *repr = dev->data->dev_private;
+ struct ice_dcf_hw *hw = ice_dcf_vf_repr_hw(repr);
+ struct virtchnl_vlan_filter_list_v2 vlan_filter;
+ struct dcf_virtchnl_cmd args;
+ struct virtchnl_vlan *vlan_setting;
+ int err;
+
+ vlan_setting = &vlan_filter.filters[0].outer;
+ memset(&vlan_filter, 0, sizeof(vlan_filter));
+ vlan_filter.vport_id = hw->vf_vsi_map[repr->vf_id] & ~VIRTCHNL_DCF_VF_VSI_VALID;
+ vlan_filter.num_elements = 1;
+ vlan_setting->tpid = RTE_ETHER_TYPE_VLAN;
+ vlan_setting->tci = vlanid;
+
+ memset(&args, 0, sizeof(args));
+ args.v_op = add ? VIRTCHNL_OP_ADD_VLAN_V2 : VIRTCHNL_OP_DEL_VLAN_V2;
+ args.req_msg = (uint8_t *)&vlan_filter;
+ args.req_msglen = sizeof(vlan_filter);
+
+ err = ice_dcf_execute_virtchnl_cmd(hw, &args);
+ if (err) {
+ PMD_DRV_LOG(ERR, "Fail to execute command %s",
+ add ? "OP_ADD_ETH_ADDR" : "OP_DEL_ETH_ADDR");
+ return err;
+ }
+ return 0;
+}
+
+static int
+ice_dcf_vf_repr_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)
+{
+ struct ice_dcf_vf_repr *repr = dev->data->dev_private;
+ int err;
+
+ if (!ice_dcf_vlan_offload_ena(repr)) {
+ PMD_DRV_LOG(ERR, "It is not VLAN_V2");
+ return -ENOTSUP;
+ }
+
+ err = ice_dcf_add_del_vlan_v2(dev, vlan_id, on);
+ if (err) {
+ PMD_DRV_LOG(ERR, "Failed to set vlan filter, err:%d", err);
+ return -ENOTSUP;
+ }
+ return 0;
+}
+
static const struct eth_dev_ops ice_dcf_vf_repr_dev_ops = {
.dev_configure = ice_dcf_vf_repr_dev_configure,
.dev_start = ice_dcf_vf_repr_dev_start,
@@ -632,6 +682,7 @@ static const struct eth_dev_ops ice_dcf_vf_repr_dev_ops = {
.stats_get = ice_dcf_vf_repr_stats_get,
.mac_addr_add = ice_dcf_vf_repr_add_mac_addr,
.mac_addr_remove = ice_dcf_vf_repr_del_mac_addr,
+ .vlan_filter_set = ice_dcf_vf_repr_vlan_filter_set,
};
int
--
2.25.1
^ permalink raw reply [flat|nested] 6+ messages in thread