]> git.droids-corp.org - dpdk.git/commitdiff
net/nfb: fix multicast/promiscuous mode switching
authorMartin Spinler <spinler@cesnet.cz>
Tue, 15 Feb 2022 12:55:42 +0000 (13:55 +0100)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 15 Feb 2022 13:53:41 +0000 (14:53 +0100)
In the firmware, the promisc mode overrides the multicast mode.
So when the promisc mode is turned off, driver must check if the
multicast mode was active before and conditionally reactivate it.

Fixes: 6435f9a0ac22 ("net/nfb: add new netcope driver")
Cc: stable@dpdk.org
Signed-off-by: Martin Spinler <spinler@cesnet.cz>
drivers/net/nfb/nfb.h
drivers/net/nfb/nfb_ethdev.c
drivers/net/nfb/nfb_rxmode.c

index 4de9006ac05145222bfa8b58e571bd799f3fdaea..7dc5bd29e44cd2395fd8c18342723021e6220533 100644 (file)
@@ -47,10 +47,6 @@ struct pmd_internals {
 
        char             nfb_dev[PATH_MAX];
        struct nfb_device *nfb;
-       /* Place to remember if filter was promiscuous or filtering by table,
-        * when disabling allmulticast
-        */
-       enum nc_rxmac_mac_filter rx_filter_original;
 };
 
 #endif /* _NFB_H_ */
index 53a98642b3cd2a476d8efcc481ec95ef02002d8a..5d503e131ac515fb240587750b54d65320aba8b9 100644 (file)
@@ -534,7 +534,6 @@ nfb_eth_dev_init(struct rte_eth_dev *dev)
 
        data->promiscuous = nfb_eth_promiscuous_get(dev);
        data->all_multicast = nfb_eth_allmulticast_get(dev);
-       internals->rx_filter_original = data->promiscuous;
 
        dev->data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;
 
index 2d0b613d21edcb039bd7f5013d43fc81d4432ef7..ca6e4d55781a3e4aa07cc5dfe1b9be17c287f186 100644 (file)
@@ -14,8 +14,6 @@ nfb_eth_promiscuous_enable(struct rte_eth_dev *dev)
                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);
@@ -30,16 +28,13 @@ nfb_eth_promiscuous_disable(struct rte_eth_dev *dev)
        struct pmd_internals *internals = (struct pmd_internals *)
                dev->data->dev_private;
        uint16_t i;
+       enum nc_rxmac_mac_filter filter = RXMAC_MAC_FILTER_TABLE_BCAST;
 
-       internals->rx_filter_original = RXMAC_MAC_FILTER_TABLE;
-
-       /* if promisc is not enabled, do nothing */
-       if (!nfb_eth_promiscuous_get(dev))
-               return 0;
+       if (dev->data->all_multicast)
+               filter = RXMAC_MAC_FILTER_TABLE_BCAST_MCAST;
 
        for (i = 0; i < internals->max_rxmac; ++i) {
-               nc_rxmac_mac_filter_enable(internals->rxmac[i],
-                       RXMAC_MAC_FILTER_TABLE);
+               nc_rxmac_mac_filter_enable(internals->rxmac[i], filter);
        }
 
        return 0;
@@ -67,6 +62,8 @@ nfb_eth_allmulticast_enable(struct rte_eth_dev *dev)
                dev->data->dev_private;
 
        uint16_t i;
+       if (dev->data->promiscuous)
+               return 0;
        for (i = 0; i < internals->max_rxmac; ++i) {
                nc_rxmac_mac_filter_enable(internals->rxmac[i],
                        RXMAC_MAC_FILTER_TABLE_BCAST_MCAST);
@@ -83,13 +80,12 @@ nfb_eth_allmulticast_disable(struct rte_eth_dev *dev)
 
        uint16_t i;
 
-       /* if multicast is not enabled do nothing */
-       if (!nfb_eth_allmulticast_get(dev))
+       if (dev->data->promiscuous)
                return 0;
 
        for (i = 0; i < internals->max_rxmac; ++i) {
                nc_rxmac_mac_filter_enable(internals->rxmac[i],
-                       internals->rx_filter_original);
+                       RXMAC_MAC_FILTER_TABLE_BCAST);
        }
 
        return 0;