net/ixgbe: parse flow director filter
[dpdk.git] / drivers / net / ixgbe / ixgbe_ethdev.h
index 83ff9f9..b3f3980 100644 (file)
@@ -167,6 +167,17 @@ struct ixgbe_fdir_filter {
 /* list of fdir filters */
 TAILQ_HEAD(ixgbe_fdir_filter_list, ixgbe_fdir_filter);
 
+struct ixgbe_fdir_rule {
+       struct ixgbe_hw_fdir_mask mask;
+       union ixgbe_atr_input ixgbe_fdir; /* key of fdir filter*/
+       bool b_spec; /* If TRUE, ixgbe_fdir, fdirflags, queue have meaning. */
+       bool b_mask; /* If TRUE, mask has meaning. */
+       enum rte_fdir_mode mode; /* IP, MAC VLAN, Tunnel */
+       uint32_t fdirflags; /* drop or forward */
+       uint32_t soft_id; /* an unique value for this rule */
+       uint8_t queue; /* assigned rx queue */
+};
+
 struct ixgbe_hw_fdir_info {
        struct ixgbe_hw_fdir_mask mask;
        uint8_t     flex_bytes_offset;
@@ -182,6 +193,7 @@ struct ixgbe_hw_fdir_info {
        /* store the pointers of the filters, index is the hash value. */
        struct ixgbe_fdir_filter **hash_map;
        struct rte_hash *hash_handle; /* cuckoo hash handler */
+       bool mask_added; /* If already got mask from consistent filter */
 };
 
 /* structure for interrupt relative data */
@@ -279,6 +291,11 @@ struct ixgbe_ethertype_filter {
        uint16_t ethertype;
        uint32_t etqf;
        uint32_t etqs;
+       /**
+        * If this filter is added by configuration,
+        * it should not be removed.
+        */
+       bool     conf;
 };
 
 /*
@@ -312,6 +329,9 @@ struct ixgbe_l2_tn_info {
        struct ixgbe_l2_tn_filter_list      l2_tn_list;
        struct ixgbe_l2_tn_filter         **hash_map;
        struct rte_hash                    *hash_handle;
+       bool e_tag_en; /* e-tag enabled */
+       bool e_tag_fwd_en; /* e-tag based forwarding enabled */
+       bool e_tag_ether_type; /* ether type for e-tag */
 };
 
 /*
@@ -512,6 +532,10 @@ bool ixgbe_rss_update_sp(enum ixgbe_mac_type mac_type);
  * Flow director function prototypes
  */
 int ixgbe_fdir_configure(struct rte_eth_dev *dev);
+int ixgbe_fdir_set_input_mask(struct rte_eth_dev *dev);
+int ixgbe_fdir_filter_program(struct rte_eth_dev *dev,
+                             struct ixgbe_fdir_rule *rule,
+                             bool del, bool update);
 
 void ixgbe_configure_dcb(struct rte_eth_dev *dev);
 
@@ -538,6 +562,15 @@ uint32_t ixgbe_convert_vm_rx_mask_to_val(uint16_t rx_mask, uint32_t orig_val);
 
 int ixgbe_fdir_ctrl_func(struct rte_eth_dev *dev,
                        enum rte_filter_op filter_op, void *arg);
+void ixgbe_fdir_filter_restore(struct rte_eth_dev *dev);
+int ixgbe_clear_all_fdir_filter(struct rte_eth_dev *dev);
+
+extern const struct rte_flow_ops ixgbe_flow_ops;
+
+void ixgbe_clear_all_ethertype_filter(struct rte_eth_dev *dev);
+void ixgbe_clear_all_ntuple_filter(struct rte_eth_dev *dev);
+void ixgbe_clear_syn_filter(struct rte_eth_dev *dev);
+int ixgbe_clear_all_l2_tn_filter(struct rte_eth_dev *dev);
 
 int ixgbe_disable_sec_tx_path_generic(struct ixgbe_hw *hw);
 
@@ -572,6 +605,8 @@ ixgbe_ethertype_filter_insert(struct ixgbe_filter_info *filter_info,
                                ethertype_filter->etqf;
                        filter_info->ethertype_filters[i].etqs =
                                ethertype_filter->etqs;
+                       filter_info->ethertype_filters[i].conf =
+                               ethertype_filter->conf;
                        return i;
                }
        }
@@ -588,6 +623,7 @@ ixgbe_ethertype_filter_remove(struct ixgbe_filter_info *filter_info,
        filter_info->ethertype_filters[idx].ethertype = 0;
        filter_info->ethertype_filters[idx].etqf = 0;
        filter_info->ethertype_filters[idx].etqs = 0;
+       filter_info->ethertype_filters[idx].etqs = FALSE;
        return idx;
 }