net/failsafe: use ownership mechanism for slaves
[dpdk.git] / drivers / net / i40e / i40e_ethdev.c
index 9626c6a..33cdf0c 100644 (file)
@@ -16,7 +16,7 @@
 #include <rte_pci.h>
 #include <rte_bus_pci.h>
 #include <rte_ether.h>
-#include <rte_ethdev.h>
+#include <rte_ethdev_driver.h>
 #include <rte_ethdev_pci.h>
 #include <rte_memzone.h>
 #include <rte_malloc.h>
@@ -7188,11 +7188,13 @@ i40e_dev_tunnel_filter_set(struct i40e_pf *pf,
        node = i40e_sw_tunnel_filter_lookup(tunnel_rule, &check_filter.input);
        if (add && node) {
                PMD_DRV_LOG(ERR, "Conflict with existing tunnel rules!");
+               rte_free(cld_filter);
                return -EINVAL;
        }
 
        if (!add && !node) {
                PMD_DRV_LOG(ERR, "There's no corresponding tunnel filter!");
+               rte_free(cld_filter);
                return -EINVAL;
        }
 
@@ -7201,16 +7203,26 @@ i40e_dev_tunnel_filter_set(struct i40e_pf *pf,
                                        vsi->seid, &cld_filter->element, 1);
                if (ret < 0) {
                        PMD_DRV_LOG(ERR, "Failed to add a tunnel filter.");
+                       rte_free(cld_filter);
                        return -ENOTSUP;
                }
                tunnel = rte_zmalloc("tunnel_filter", sizeof(*tunnel), 0);
+               if (tunnel == NULL) {
+                       PMD_DRV_LOG(ERR, "Failed to alloc memory.");
+                       rte_free(cld_filter);
+                       return -ENOMEM;
+               }
+
                rte_memcpy(tunnel, &check_filter, sizeof(check_filter));
                ret = i40e_sw_tunnel_filter_insert(pf, tunnel);
+               if (ret < 0)
+                       rte_free(tunnel);
        } else {
                ret = i40e_aq_remove_cloud_filters(hw, vsi->seid,
                                                   &cld_filter->element, 1);
                if (ret < 0) {
                        PMD_DRV_LOG(ERR, "Failed to delete a tunnel filter.");
+                       rte_free(cld_filter);
                        return -ENOTSUP;
                }
                ret = i40e_sw_tunnel_filter_del(pf, &node->input);
@@ -7639,6 +7651,7 @@ i40e_dev_consistent_tunnel_filter_set(struct i40e_pf *pf,
        else {
                if (tunnel_filter->vf_id >= pf->vf_num) {
                        PMD_DRV_LOG(ERR, "Invalid argument.");
+                       rte_free(cld_filter);
                        return -EINVAL;
                }
                vf = &pf->vfs[tunnel_filter->vf_id];
@@ -7653,11 +7666,13 @@ i40e_dev_consistent_tunnel_filter_set(struct i40e_pf *pf,
        node = i40e_sw_tunnel_filter_lookup(tunnel_rule, &check_filter.input);
        if (add && node) {
                PMD_DRV_LOG(ERR, "Conflict with existing tunnel rules!");
+               rte_free(cld_filter);
                return -EINVAL;
        }
 
        if (!add && !node) {
                PMD_DRV_LOG(ERR, "There's no corresponding tunnel filter!");
+               rte_free(cld_filter);
                return -EINVAL;
        }
 
@@ -7670,11 +7685,20 @@ i40e_dev_consistent_tunnel_filter_set(struct i40e_pf *pf,
                                        vsi->seid, &cld_filter->element, 1);
                if (ret < 0) {
                        PMD_DRV_LOG(ERR, "Failed to add a tunnel filter.");
+                       rte_free(cld_filter);
                        return -ENOTSUP;
                }
                tunnel = rte_zmalloc("tunnel_filter", sizeof(*tunnel), 0);
+               if (tunnel == NULL) {
+                       PMD_DRV_LOG(ERR, "Failed to alloc memory.");
+                       rte_free(cld_filter);
+                       return -ENOMEM;
+               }
+
                rte_memcpy(tunnel, &check_filter, sizeof(check_filter));
                ret = i40e_sw_tunnel_filter_insert(pf, tunnel);
+               if (ret < 0)
+                       rte_free(tunnel);
        } else {
                if (big_buffer)
                        ret = i40e_aq_remove_cloud_filters_big_buffer(
@@ -7684,6 +7708,7 @@ i40e_dev_consistent_tunnel_filter_set(struct i40e_pf *pf,
                                                   &cld_filter->element, 1);
                if (ret < 0) {
                        PMD_DRV_LOG(ERR, "Failed to delete a tunnel filter.");
+                       rte_free(cld_filter);
                        return -ENOTSUP;
                }
                ret = i40e_sw_tunnel_filter_del(pf, &node->input);
@@ -8137,14 +8162,17 @@ i40e_get_hash_filter_global_config(struct i40e_hw *hw,
                (reg & I40E_GLQF_CTL_HTOEP_MASK) ? "Toeplitz" : "Simple XOR");
 
        /*
-        * We work only with lowest 32 bits which is not correct, but to work
-        * properly the valid_bit_mask size should be increased up to 64 bits
-        * and this will brake ABI. This modification will be done in next
-        * release
+        * As i40e supports less than 64 flow types, only first 64 bits need to
+        * be checked.
         */
-       g_cfg->valid_bit_mask[0] = (uint32_t)adapter->flow_types_mask;
+       for (i = 1; i < RTE_SYM_HASH_MASK_ARRAY_SIZE; i++) {
+               g_cfg->valid_bit_mask[i] = 0ULL;
+               g_cfg->sym_hash_enable_mask[i] = 0ULL;
+       }
 
-       for (i = RTE_ETH_FLOW_UNKNOWN + 1; i < UINT32_BIT; i++) {
+       g_cfg->valid_bit_mask[0] = adapter->flow_types_mask;
+
+       for (i = RTE_ETH_FLOW_UNKNOWN + 1; i < UINT64_BIT; i++) {
                if (!adapter->pctypes_tbl[i])
                        continue;
                for (j = I40E_FILTER_PCTYPE_INVALID + 1;
@@ -8153,7 +8181,7 @@ i40e_get_hash_filter_global_config(struct i40e_hw *hw,
                                reg = i40e_read_rx_ctl(hw, I40E_GLQF_HSYM(j));
                                if (reg & I40E_GLQF_HSYM_SYMH_ENA_MASK) {
                                        g_cfg->sym_hash_enable_mask[0] |=
-                                                               (1UL << i);
+                                                               (1ULL << i);
                                }
                        }
                }
@@ -8167,7 +8195,7 @@ i40e_hash_global_config_check(const struct i40e_adapter *adapter,
                              const struct rte_eth_hash_global_conf *g_cfg)
 {
        uint32_t i;
-       uint32_t mask0, i40e_mask = adapter->flow_types_mask;
+       uint64_t mask0, i40e_mask = adapter->flow_types_mask;
 
        if (g_cfg->hash_func != RTE_ETH_HASH_FUNCTION_TOEPLITZ &&
                g_cfg->hash_func != RTE_ETH_HASH_FUNCTION_SIMPLE_XOR &&
@@ -8178,7 +8206,7 @@ i40e_hash_global_config_check(const struct i40e_adapter *adapter,
        }
 
        /*
-        * As i40e supports less than 32 flow types, only first 32 bits need to
+        * As i40e supports less than 64 flow types, only first 64 bits need to
         * be checked.
         */
        mask0 = g_cfg->valid_bit_mask[0];
@@ -8214,23 +8242,20 @@ i40e_set_hash_filter_global_config(struct i40e_hw *hw,
        int ret;
        uint16_t i, j;
        uint32_t reg;
-       /*
-        * We work only with lowest 32 bits which is not correct, but to work
-        * properly the valid_bit_mask size should be increased up to 64 bits
-        * and this will brake ABI. This modification will be done in next
-        * release
-        */
-       uint32_t mask0 = g_cfg->valid_bit_mask[0] &
-                                       (uint32_t)adapter->flow_types_mask;
+       uint64_t mask0 = g_cfg->valid_bit_mask[0] & adapter->flow_types_mask;
 
        /* Check the input parameters */
        ret = i40e_hash_global_config_check(adapter, g_cfg);
        if (ret < 0)
                return ret;
 
-       for (i = RTE_ETH_FLOW_UNKNOWN + 1; mask0 && i < UINT32_BIT; i++) {
+       /*
+        * As i40e supports less than 64 flow types, only first 64 bits need to
+        * be configured.
+        */
+       for (i = RTE_ETH_FLOW_UNKNOWN + 1; mask0 && i < UINT64_BIT; i++) {
                if (mask0 & (1UL << i)) {
-                       reg = (g_cfg->sym_hash_enable_mask[0] & (1UL << i)) ?
+                       reg = (g_cfg->sym_hash_enable_mask[0] & (1ULL << i)) ?
                                        I40E_GLQF_HSYM_SYMH_ENA_MASK : 0;
 
                        for (j = I40E_FILTER_PCTYPE_INVALID + 1;
@@ -9295,9 +9320,16 @@ i40e_ethertype_filter_set(struct i40e_pf *pf,
        if (add) {
                ethertype_filter = rte_zmalloc("ethertype_filter",
                                       sizeof(*ethertype_filter), 0);
+               if (ethertype_filter == NULL) {
+                       PMD_DRV_LOG(ERR, "Failed to alloc memory.");
+                       return -ENOMEM;
+               }
+
                rte_memcpy(ethertype_filter, &check_filter,
                           sizeof(check_filter));
                ret = i40e_sw_ethertype_filter_insert(pf, ethertype_filter);
+               if (ret < 0)
+                       rte_free(ethertype_filter);
        } else {
                ret = i40e_sw_ethertype_filter_del(pf, &node->input);
        }
@@ -11326,87 +11358,104 @@ i40e_update_customized_ptype(struct rte_eth_dev *dev, uint8_t *pkg,
                                        continue;
                                memset(name, 0, sizeof(name));
                                strcpy(name, proto[n].name);
-                               if (!strncmp(name, "PPPOE", 5))
+                               if (!strncasecmp(name, "PPPOE", 5))
                                        ptype_mapping[i].sw_ptype |=
                                                RTE_PTYPE_L2_ETHER_PPPOE;
-                               else if (!strncmp(name, "OIPV4", 5)) {
+                               else if (!strncasecmp(name, "IPV4FRAG", 8) &&
+                                        !in_tunnel) {
                                        ptype_mapping[i].sw_ptype |=
                                                RTE_PTYPE_L3_IPV4_EXT_UNKNOWN;
-                                       in_tunnel = true;
-                               } else if (!strncmp(name, "IPV4", 4) &&
-                                          !in_tunnel)
                                        ptype_mapping[i].sw_ptype |=
-                                               RTE_PTYPE_L3_IPV4_EXT_UNKNOWN;
-                               else if (!strncmp(name, "IPV4FRAG", 8) &&
-                                        in_tunnel) {
+                                               RTE_PTYPE_L4_FRAG;
+                               } else if (!strncasecmp(name, "IPV4FRAG", 8) &&
+                                          in_tunnel) {
                                        ptype_mapping[i].sw_ptype |=
                                            RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN;
                                        ptype_mapping[i].sw_ptype |=
                                                RTE_PTYPE_INNER_L4_FRAG;
-                               } else if (!strncmp(name, "IPV4", 4) &&
-                                          in_tunnel)
-                                       ptype_mapping[i].sw_ptype |=
-                                           RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN;
-                               else if (!strncmp(name, "OIPV6", 5)) {
+                               } else if (!strncasecmp(name, "OIPV4", 5)) {
                                        ptype_mapping[i].sw_ptype |=
-                                               RTE_PTYPE_L3_IPV6_EXT_UNKNOWN;
+                                               RTE_PTYPE_L3_IPV4_EXT_UNKNOWN;
                                        in_tunnel = true;
-                               } else if (!strncmp(name, "IPV6", 4) &&
+                               } else if (!strncasecmp(name, "IPV4", 4) &&
                                           !in_tunnel)
+                                       ptype_mapping[i].sw_ptype |=
+                                               RTE_PTYPE_L3_IPV4_EXT_UNKNOWN;
+                               else if (!strncasecmp(name, "IPV4", 4) &&
+                                        in_tunnel)
+                                       ptype_mapping[i].sw_ptype |=
+                                           RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN;
+                               else if (!strncasecmp(name, "IPV6FRAG", 8) &&
+                                        !in_tunnel) {
                                        ptype_mapping[i].sw_ptype |=
                                                RTE_PTYPE_L3_IPV6_EXT_UNKNOWN;
-                               else if (!strncmp(name, "IPV6FRAG", 8) &&
-                                        in_tunnel) {
+                                       ptype_mapping[i].sw_ptype |=
+                                               RTE_PTYPE_L4_FRAG;
+                               } else if (!strncasecmp(name, "IPV6FRAG", 8) &&
+                                          in_tunnel) {
                                        ptype_mapping[i].sw_ptype |=
                                            RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN;
                                        ptype_mapping[i].sw_ptype |=
                                                RTE_PTYPE_INNER_L4_FRAG;
-                               } else if (!strncmp(name, "IPV6", 4) &&
-                                          in_tunnel)
+                               } else if (!strncasecmp(name, "OIPV6", 5)) {
+                                       ptype_mapping[i].sw_ptype |=
+                                               RTE_PTYPE_L3_IPV6_EXT_UNKNOWN;
+                                       in_tunnel = true;
+                               } else if (!strncasecmp(name, "IPV6", 4) &&
+                                          !in_tunnel)
+                                       ptype_mapping[i].sw_ptype |=
+                                               RTE_PTYPE_L3_IPV6_EXT_UNKNOWN;
+                               else if (!strncasecmp(name, "IPV6", 4) &&
+                                        in_tunnel)
                                        ptype_mapping[i].sw_ptype |=
                                            RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN;
-                               else if (!strncmp(name, "UDP", 3) && !in_tunnel)
+                               else if (!strncasecmp(name, "UDP", 3) &&
+                                        !in_tunnel)
                                        ptype_mapping[i].sw_ptype |=
                                                RTE_PTYPE_L4_UDP;
-                               else if (!strncmp(name, "UDP", 3) && in_tunnel)
+                               else if (!strncasecmp(name, "UDP", 3) &&
+                                        in_tunnel)
                                        ptype_mapping[i].sw_ptype |=
                                                RTE_PTYPE_INNER_L4_UDP;
-                               else if (!strncmp(name, "TCP", 3) && !in_tunnel)
+                               else if (!strncasecmp(name, "TCP", 3) &&
+                                        !in_tunnel)
                                        ptype_mapping[i].sw_ptype |=
                                                RTE_PTYPE_L4_TCP;
-                               else if (!strncmp(name, "TCP", 3) && in_tunnel)
+                               else if (!strncasecmp(name, "TCP", 3) &&
+                                        in_tunnel)
                                        ptype_mapping[i].sw_ptype |=
                                                RTE_PTYPE_INNER_L4_TCP;
-                               else if (!strncmp(name, "SCTP", 4) &&
+                               else if (!strncasecmp(name, "SCTP", 4) &&
                                         !in_tunnel)
                                        ptype_mapping[i].sw_ptype |=
                                                RTE_PTYPE_L4_SCTP;
-                               else if (!strncmp(name, "SCTP", 4) && in_tunnel)
+                               else if (!strncasecmp(name, "SCTP", 4) &&
+                                        in_tunnel)
                                        ptype_mapping[i].sw_ptype |=
                                                RTE_PTYPE_INNER_L4_SCTP;
-                               else if ((!strncmp(name, "ICMP", 4) ||
-                                         !strncmp(name, "ICMPV6", 6)) &&
+                               else if ((!strncasecmp(name, "ICMP", 4) ||
+                                         !strncasecmp(name, "ICMPV6", 6)) &&
                                         !in_tunnel)
                                        ptype_mapping[i].sw_ptype |=
                                                RTE_PTYPE_L4_ICMP;
-                               else if ((!strncmp(name, "ICMP", 4) ||
-                                         !strncmp(name, "ICMPV6", 6)) &&
+                               else if ((!strncasecmp(name, "ICMP", 4) ||
+                                         !strncasecmp(name, "ICMPV6", 6)) &&
                                         in_tunnel)
                                        ptype_mapping[i].sw_ptype |=
                                                RTE_PTYPE_INNER_L4_ICMP;
-                               else if (!strncmp(name, "GTPC", 4)) {
+                               else if (!strncasecmp(name, "GTPC", 4)) {
                                        ptype_mapping[i].sw_ptype |=
                                                RTE_PTYPE_TUNNEL_GTPC;
                                        in_tunnel = true;
-                               } else if (!strncmp(name, "GTPU", 4)) {
+                               } else if (!strncasecmp(name, "GTPU", 4)) {
                                        ptype_mapping[i].sw_ptype |=
                                                RTE_PTYPE_TUNNEL_GTPU;
                                        in_tunnel = true;
-                               } else if (!strncmp(name, "GRENAT", 6)) {
+                               } else if (!strncasecmp(name, "GRENAT", 6)) {
                                        ptype_mapping[i].sw_ptype |=
                                                RTE_PTYPE_TUNNEL_GRENAT;
                                        in_tunnel = true;
-                               } else if (!strncmp(name, "L2TPv2CTL", 9)) {
+                               } else if (!strncasecmp(name, "L2TPV2CTL", 9)) {
                                        ptype_mapping[i].sw_ptype |=
                                                RTE_PTYPE_TUNNEL_L2TP;
                                        in_tunnel = true;
@@ -11676,10 +11725,10 @@ RTE_INIT(i40e_init_log);
 static void
 i40e_init_log(void)
 {
-       i40e_logtype_init = rte_log_register("pmd.i40e.init");
+       i40e_logtype_init = rte_log_register("pmd.net.i40e.init");
        if (i40e_logtype_init >= 0)
                rte_log_set_level(i40e_logtype_init, RTE_LOG_NOTICE);
-       i40e_logtype_driver = rte_log_register("pmd.i40e.driver");
+       i40e_logtype_driver = rte_log_register("pmd.net.i40e.driver");
        if (i40e_logtype_driver >= 0)
                rte_log_set_level(i40e_logtype_driver, RTE_LOG_NOTICE);
 }