]> git.droids-corp.org - dpdk.git/commitdiff
net/sfc/base: add API to get currently operating filters
authorIgor Romanov <igor.romanov@oktetlabs.ru>
Mon, 30 Mar 2020 10:25:44 +0000 (11:25 +0100)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 21 Apr 2020 11:57:06 +0000 (13:57 +0200)
Unknown unicast filter creation may fail because of insufficient
permissions on VF. This failure is handled internally in libefx MAC
reconfiguration without any way for a user to know if it happened.
Making the MAC reconfiguration forward error code of filter
reconfiguration would be too destructive to the existing code
that may rely on the function never returning that error.

Add an API for getting the status of current unknown unicast and
all multicast filters since user must know that requested
filters are actually applied.

Signed-off-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
drivers/net/sfc/base/ef10_filter.c
drivers/net/sfc/base/efx.h
drivers/net/sfc/base/efx_impl.h
drivers/net/sfc/base/efx_mac.c
drivers/net/sfc/base/siena_mac.c

index cd75d4856067e7b601449bdb03c7ab7ecbd2fc21..97b449462b30eb835f0259cbb0c4cf3061f316b9 100644 (file)
@@ -1761,6 +1761,7 @@ ef10_filter_remove_all_existing_filters(
        __in                            efx_nic_t *enp)
 {
        ef10_filter_table_t *table = enp->en_filter.ef_ef10_filter_table;
+       efx_port_t *epp = &(enp->en_port);
        unsigned int i;
 
        for (i = 0; i < table->eft_unicst_filter_count; i++) {
@@ -1780,6 +1781,9 @@ ef10_filter_remove_all_existing_filters(
                                table->eft_encap_filter_indexes[i]);
        }
        table->eft_encap_filter_count = 0;
+
+       epp->ep_all_unicst_inserted = B_FALSE;
+       epp->ep_all_mulcst_inserted = B_FALSE;
 }
 
 static                 void
@@ -1812,6 +1816,7 @@ ef10_filter_insert_renew_unicst_filters(
        __out                           boolean_t *all_unicst_inserted)
 {
        ef10_filter_table_t *table = enp->en_filter.ef_ef10_filter_table;
+       efx_port_t *epp = &(enp->en_port);
        efx_rc_t rc;
 
        /*
@@ -1839,6 +1844,7 @@ ef10_filter_insert_renew_unicst_filters(
                                                    filter_flags);
                if (all_unicst_rc == 0) {
                        *all_unicst_inserted = B_TRUE;
+                       epp->ep_all_unicst_inserted = B_TRUE;
                } else if (rc != 0)
                        goto fail1;
        }
@@ -1865,6 +1871,7 @@ ef10_filter_insert_renew_mulcst_filters(
 {
        ef10_filter_table_t *table = enp->en_filter.ef_ef10_filter_table;
        efx_nic_cfg_t *encp = &enp->en_nic_cfg;
+       efx_port_t *epp = &(enp->en_port);
        efx_rc_t rc;
 
        *all_mulcst_inserted = B_FALSE;
@@ -1880,6 +1887,7 @@ ef10_filter_insert_renew_mulcst_filters(
                all_mulcst_rc = ef10_filter_insert_all_multicast(enp,
                                                            filter_flags);
                if (all_mulcst_rc == 0) {
+                       epp->ep_all_mulcst_inserted = B_TRUE;
                        *all_mulcst_inserted = B_TRUE;
                } else {
                        rc = ef10_filter_insert_multicast_list(enp, B_TRUE,
@@ -1907,11 +1915,16 @@ ef10_filter_insert_renew_mulcst_filters(
                                 * by packets matching multiple filters.
                                 */
                                ef10_filter_remove_old(enp);
+                               if (all_unicst_inserted == B_FALSE)
+                                       epp->ep_all_unicst_inserted = B_FALSE;
+                               if (*all_mulcst_inserted == B_FALSE)
+                                       epp->ep_all_mulcst_inserted = B_FALSE;
                        }
 
                        rc = ef10_filter_insert_all_multicast(enp,
                                                            filter_flags);
                        if (rc == 0) {
+                               epp->ep_all_mulcst_inserted = B_TRUE;
                                *all_mulcst_inserted = B_TRUE;
                        } else {
                                rc = ef10_filter_insert_multicast_list(enp,
@@ -1952,6 +1965,7 @@ ef10_filter_reconfigure(
        __in                            uint32_t count)
 {
        efx_nic_cfg_t *encp = &enp->en_nic_cfg;
+       efx_port_t *epp = &(enp->en_port);
        ef10_filter_table_t *table = enp->en_filter.ef_ef10_filter_table;
        efx_filter_flags_t filter_flags;
        unsigned int i;
@@ -2024,6 +2038,10 @@ ef10_filter_reconfigure(
                 * multicast filters.
                 */
                ef10_filter_remove_old(enp);
+               if (all_unicst_inserted == B_FALSE)
+                       epp->ep_all_unicst_inserted = B_FALSE;
+
+               epp->ep_all_mulcst_inserted = B_FALSE;
        }
 
        /* Insert or renew multicast filters */
@@ -2044,6 +2062,10 @@ ef10_filter_reconfigure(
 
        /* Remove old filters which were not renewed */
        ef10_filter_remove_old(enp);
+       if (all_unicst_inserted == B_FALSE)
+               epp->ep_all_unicst_inserted = B_FALSE;
+       if (all_mulcst_inserted == B_FALSE)
+               epp->ep_all_mulcst_inserted = B_FALSE;
 
        /* report if any optional flags were rejected */
        if (((all_unicst != B_FALSE) && (all_unicst_inserted == B_FALSE)) ||
index d94d3c02f798113b43e0c2167255353d175d2907..86733f9317a4a5104af40cbeb9da76ec2ad7fe5a 100644 (file)
@@ -544,6 +544,12 @@ efx_mac_filter_set(
        __in                            boolean_t all_mulcst,
        __in                            boolean_t brdcst);
 
+extern                                 void
+efx_mac_filter_get_all_ucast_mcast(
+       __in                            efx_nic_t *enp,
+       __out                           boolean_t *all_unicst,
+       __out                           boolean_t *all_mulcst);
+
 extern __checkReturn   efx_rc_t
 efx_mac_multicast_list_set(
        __in                            efx_nic_t *enp,
index 9755f4dfd26ed4bcc4464b5d13eadfd9d1e90e11..adad7900f67b0693c318f1671777da2a6d0e5656 100644 (file)
@@ -307,8 +307,10 @@ typedef struct efx_port_s {
        uint8_t                 ep_mac_addr[6];
        efx_link_mode_t         ep_link_mode;
        boolean_t               ep_all_unicst;
+       boolean_t               ep_all_unicst_inserted;
        boolean_t               ep_mulcst;
        boolean_t               ep_all_mulcst;
+       boolean_t               ep_all_mulcst_inserted;
        boolean_t               ep_brdcst;
        unsigned int            ep_fcntl;
        boolean_t               ep_fcntl_autoneg;
index 673bc4f4eef56da16d5dca67b918d359692aaf7f..b13321065a64696135157138ac1eb5e0acf58c3c 100644 (file)
@@ -218,6 +218,21 @@ fail1:
        return (rc);
 }
 
+                                       void
+efx_mac_filter_get_all_ucast_mcast(
+       __in                            efx_nic_t *enp,
+       __out                           boolean_t *all_unicst,
+       __out                           boolean_t *all_mulcst)
+{
+       efx_port_t *epp = &(enp->en_port);
+
+       EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
+       EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PORT);
+
+       *all_unicst = epp->ep_all_unicst_inserted;
+       *all_mulcst = epp->ep_all_mulcst_inserted;
+}
+
        __checkReturn                   efx_rc_t
 efx_mac_drain(
        __in                            efx_nic_t *enp,
index 928dfc340a6192c99b04713ed89a914d66b89768..157d54c38f15c2915dd52806bf39be517ce492e5 100644 (file)
@@ -107,6 +107,7 @@ siena_mac_reconfigure(
                rc = req.emr_rc;
                goto fail1;
        }
+       epp->ep_all_unicst_inserted = epp->ep_all_unicst;
 
        /* Push multicast hash */
 
@@ -158,6 +159,7 @@ siena_mac_reconfigure(
                rc = req.emr_rc;
                goto fail2;
        }
+       epp->ep_all_mulcst_inserted = epp->ep_all_mulcst;
 
        return (0);