net/hinic: check memory allocations in flow creation
[dpdk.git] / drivers / net / hinic / hinic_pmd_flow.c
index cc0744d..503a32f 100644 (file)
@@ -1900,6 +1900,8 @@ void hinic_free_fdir_filter(struct hinic_nic_dev *nic_dev)
 {
        (void)hinic_set_fdir_filter(nic_dev->hwdev, 0, 0, 0, false);
 
+       (void)hinic_set_fdir_tcam_rule_filter(nic_dev->hwdev, false);
+
        (void)hinic_clear_fdir_tcam(nic_dev->hwdev, TCAM_PKT_BGP_DPORT);
 
        (void)hinic_clear_fdir_tcam(nic_dev->hwdev, TCAM_PKT_BGP_SPORT);
@@ -2801,6 +2803,15 @@ static int hinic_add_tcam_filter(struct rte_eth_dev *dev,
                                                fdir_tcam_rule->index);
                        return rc;
                }
+
+               rc = hinic_set_fdir_tcam_rule_filter(nic_dev->hwdev, true);
+               if (rc && rc != HINIC_MGMT_CMD_UNSUPPORTED) {
+                       (void)hinic_set_fdir_filter(nic_dev->hwdev, 0, 0, 0,
+                                               false);
+                       (void)hinic_del_tcam_rule(nic_dev->hwdev,
+                                               fdir_tcam_rule->index);
+                       return rc;
+               }
        }
 
        TAILQ_INSERT_TAIL(&tcam_info->tcam_list, tcam_filter, entries);
@@ -2966,6 +2977,10 @@ static struct rte_flow *hinic_flow_create(struct rte_eth_dev *dev,
                if (!ret) {
                        ntuple_filter_ptr = rte_zmalloc("hinic_ntuple_filter",
                                sizeof(struct hinic_ntuple_filter_ele), 0);
+                       if (ntuple_filter_ptr == NULL) {
+                               PMD_DRV_LOG(ERR, "Failed to allocate ntuple_filter_ptr");
+                               goto out;
+                       }
                        rte_memcpy(&ntuple_filter_ptr->filter_info,
                                   &ntuple_filter,
                                   sizeof(struct rte_eth_ntuple_filter));
@@ -2992,6 +3007,10 @@ static struct rte_flow *hinic_flow_create(struct rte_eth_dev *dev,
                        ethertype_filter_ptr =
                                rte_zmalloc("hinic_ethertype_filter",
                                sizeof(struct hinic_ethertype_filter_ele), 0);
+                       if (ethertype_filter_ptr == NULL) {
+                               PMD_DRV_LOG(ERR, "Failed to allocate ethertype_filter_ptr");
+                               goto out;
+                       }
                        rte_memcpy(&ethertype_filter_ptr->filter_info,
                                &ethertype_filter,
                                sizeof(struct rte_eth_ethertype_filter));
@@ -3025,6 +3044,10 @@ static struct rte_flow *hinic_flow_create(struct rte_eth_dev *dev,
                if (!ret) {
                        fdir_rule_ptr = rte_zmalloc("hinic_fdir_rule",
                                sizeof(struct hinic_fdir_rule_ele), 0);
+                       if (fdir_rule_ptr == NULL) {
+                               PMD_DRV_LOG(ERR, "Failed to allocate fdir_rule_ptr");
+                               goto out;
+                       }
                        rte_memcpy(&fdir_rule_ptr->filter_info, &fdir_rule,
                                sizeof(struct hinic_fdir_rule));
                        TAILQ_INSERT_TAIL(&nic_dev->filter_fdir_rule_list,
@@ -3197,6 +3220,8 @@ static void hinic_clear_all_fdir_filter(struct rte_eth_dev *dev)
 
        (void)hinic_set_fdir_filter(nic_dev->hwdev, 0, 0, 0, false);
 
+       (void)hinic_set_fdir_tcam_rule_filter(nic_dev->hwdev, false);
+
        (void)hinic_flush_tcam_rule(nic_dev->hwdev);
 }