[PATCH 21/32] net/sssnic: add allmulticast and promiscuous ops
wanry at 3snic.com
wanry at 3snic.com
Tue Aug 29 09:58:18 CEST 2023
From: Renyong Wan <wanry at 3snic.com>
Signed-off-by: Steven Song <steven.song at 3snic.com>
Signed-off-by: Renyong Wan <wanry at 3snic.com>
---
doc/guides/nics/features/sssnic.ini | 2 +
drivers/net/sssnic/sssnic_ethdev.c | 72 +++++++++++++++++++++++++++++
2 files changed, 74 insertions(+)
diff --git a/doc/guides/nics/features/sssnic.ini b/doc/guides/nics/features/sssnic.ini
index e3b8166629..359834ce4c 100644
--- a/doc/guides/nics/features/sssnic.ini
+++ b/doc/guides/nics/features/sssnic.ini
@@ -8,6 +8,8 @@ Link status = Y
Link status event = Y
Queue start/stop = Y
Rx interrupt = Y
+Promiscuous mode = Y
+Allmulticast mode = Y
Unicast MAC filter = Y
Multicast MAC filter = Y
Linux = Y
diff --git a/drivers/net/sssnic/sssnic_ethdev.c b/drivers/net/sssnic/sssnic_ethdev.c
index d1dfaeecc3..242a1bfb92 100644
--- a/drivers/net/sssnic/sssnic_ethdev.c
+++ b/drivers/net/sssnic/sssnic_ethdev.c
@@ -653,6 +653,74 @@ sssnic_ethdev_reset(struct rte_eth_dev *ethdev)
return 0;
}
+static int
+sssnic_ethdev_allmulticast_enable(struct rte_eth_dev *ethdev)
+{
+ struct sssnic_netdev *netdev = SSSNIC_ETHDEV_PRIVATE(ethdev);
+ uint32_t rx_mode;
+ int ret;
+
+ rx_mode = netdev->rx_mode | SSSNIC_ETHDEV_RX_ALL_MCAST;
+ ret = sssnic_ethdev_rx_mode_set(ethdev, rx_mode);
+ if (ret != 0) {
+ PMD_DRV_LOG(ERR, "Failed to set rx_mode: %x", rx_mode);
+ return ret;
+ }
+
+ return 0;
+}
+
+static int
+sssnic_ethdev_allmulticast_disable(struct rte_eth_dev *ethdev)
+{
+ struct sssnic_netdev *netdev = SSSNIC_ETHDEV_PRIVATE(ethdev);
+ uint32_t rx_mode;
+ int ret;
+
+ rx_mode = netdev->rx_mode & (~SSSNIC_ETHDEV_RX_ALL_MCAST);
+ ret = sssnic_ethdev_rx_mode_set(ethdev, rx_mode);
+ if (ret != 0) {
+ PMD_DRV_LOG(ERR, "Failed to set rx_mode: %x", rx_mode);
+ return ret;
+ }
+
+ return 0;
+}
+
+static int
+sssnic_ethdev_promiscuous_enable(struct rte_eth_dev *ethdev)
+{
+ struct sssnic_netdev *netdev = SSSNIC_ETHDEV_PRIVATE(ethdev);
+ uint32_t rx_mode;
+ int ret;
+
+ rx_mode = netdev->rx_mode | SSSNIC_ETHDEV_RX_PROMISC;
+ ret = sssnic_ethdev_rx_mode_set(ethdev, rx_mode);
+ if (ret != 0) {
+ PMD_DRV_LOG(ERR, "Failed to set rx_mode: %x", rx_mode);
+ return ret;
+ }
+
+ return 0;
+}
+
+static int
+sssnic_ethdev_promiscuous_disable(struct rte_eth_dev *ethdev)
+{
+ struct sssnic_netdev *netdev = SSSNIC_ETHDEV_PRIVATE(ethdev);
+ uint32_t rx_mode;
+ int ret;
+
+ rx_mode = netdev->rx_mode & (~SSSNIC_ETHDEV_RX_PROMISC);
+ ret = sssnic_ethdev_rx_mode_set(ethdev, rx_mode);
+ if (ret != 0) {
+ PMD_DRV_LOG(ERR, "Failed to set rx_mode: %x", rx_mode);
+ return ret;
+ }
+
+ return 0;
+}
+
static const struct eth_dev_ops sssnic_ethdev_ops = {
.dev_start = sssnic_ethdev_start,
.dev_stop = sssnic_ethdev_stop,
@@ -677,6 +745,10 @@ static const struct eth_dev_ops sssnic_ethdev_ops = {
.tx_queue_stop = sssnic_ethdev_tx_queue_stop,
.rx_queue_intr_enable = sssnic_ethdev_rx_queue_intr_enable,
.rx_queue_intr_disable = sssnic_ethdev_rx_queue_intr_disable,
+ .allmulticast_enable = sssnic_ethdev_allmulticast_enable,
+ .allmulticast_disable = sssnic_ethdev_allmulticast_disable,
+ .promiscuous_enable = sssnic_ethdev_promiscuous_enable,
+ .promiscuous_disable = sssnic_ethdev_promiscuous_disable,
};
static int
--
2.27.0
More information about the dev
mailing list