summaryrefslogtreecommitdiffstats
path: root/src/seastar/dpdk/drivers/net/nfb/nfb_rxmode.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/seastar/dpdk/drivers/net/nfb/nfb_rxmode.c')
-rw-r--r--src/seastar/dpdk/drivers/net/nfb/nfb_rxmode.c100
1 files changed, 100 insertions, 0 deletions
diff --git a/src/seastar/dpdk/drivers/net/nfb/nfb_rxmode.c b/src/seastar/dpdk/drivers/net/nfb/nfb_rxmode.c
new file mode 100644
index 000000000..97bfcb238
--- /dev/null
+++ b/src/seastar/dpdk/drivers/net/nfb/nfb_rxmode.c
@@ -0,0 +1,100 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2019 Cesnet
+ * Copyright(c) 2019 Netcope Technologies, a.s. <info@netcope.com>
+ * All rights reserved.
+ */
+
+#include "nfb_rxmode.h"
+#include "nfb.h"
+
+void
+nfb_eth_promiscuous_enable(struct rte_eth_dev *dev)
+{
+ struct pmd_internals *internals = (struct pmd_internals *)
+ dev->data->dev_private;
+ uint16_t i;
+
+ internals->rx_filter_original = RXMAC_MAC_FILTER_PROMISCUOUS;
+
+ for (i = 0; i < internals->max_rxmac; ++i) {
+ nc_rxmac_mac_filter_enable(internals->rxmac[i],
+ RXMAC_MAC_FILTER_PROMISCUOUS);
+ }
+}
+
+void
+nfb_eth_promiscuous_disable(struct rte_eth_dev *dev)
+{
+ struct pmd_internals *internals = (struct pmd_internals *)
+ dev->data->dev_private;
+ uint16_t i;
+
+ internals->rx_filter_original = RXMAC_MAC_FILTER_TABLE;
+
+ /* if promisc is not enabled, do nothing */
+ if (!nfb_eth_promiscuous_get(dev))
+ return;
+
+ for (i = 0; i < internals->max_rxmac; ++i) {
+ nc_rxmac_mac_filter_enable(internals->rxmac[i],
+ RXMAC_MAC_FILTER_TABLE);
+ }
+}
+
+int
+nfb_eth_promiscuous_get(struct rte_eth_dev *dev)
+{
+ struct pmd_internals *internals = (struct pmd_internals *)
+ dev->data->dev_private;
+
+ struct nc_rxmac_status status;
+ status.mac_filter = RXMAC_MAC_FILTER_PROMISCUOUS;
+
+ nc_rxmac_read_status(internals->rxmac[0], &status);
+
+ return (status.mac_filter == RXMAC_MAC_FILTER_PROMISCUOUS);
+}
+
+void
+nfb_eth_allmulticast_enable(struct rte_eth_dev *dev)
+{
+ struct pmd_internals *internals = (struct pmd_internals *)
+ dev->data->dev_private;
+
+ uint16_t i;
+ for (i = 0; i < internals->max_rxmac; ++i) {
+ nc_rxmac_mac_filter_enable(internals->rxmac[i],
+ RXMAC_MAC_FILTER_TABLE_BCAST_MCAST);
+ }
+}
+
+void
+nfb_eth_allmulticast_disable(struct rte_eth_dev *dev)
+{
+ struct pmd_internals *internals = (struct pmd_internals *)
+ dev->data->dev_private;
+
+ uint16_t i;
+
+ /* if multicast is not enabled do nothing */
+ if (!nfb_eth_allmulticast_get(dev))
+ return;
+
+ for (i = 0; i < internals->max_rxmac; ++i) {
+ nc_rxmac_mac_filter_enable(internals->rxmac[i],
+ internals->rx_filter_original);
+ }
+}
+
+int
+nfb_eth_allmulticast_get(struct rte_eth_dev *dev)
+{
+ struct pmd_internals *internals = (struct pmd_internals *)
+ dev->data->dev_private;
+
+ struct nc_rxmac_status status;
+ status.mac_filter = RXMAC_MAC_FILTER_PROMISCUOUS;
+ nc_rxmac_read_status(internals->rxmac[0], &status);
+
+ return (status.mac_filter == RXMAC_MAC_FILTER_TABLE_BCAST_MCAST);
+}