net/af_packet: remove timestamp from packet status
[dpdk.git] / drivers / net / txgbe / txgbe_fdir.c
index 2342cf6..8abb862 100644 (file)
@@ -1,5 +1,6 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2015-2020
+ * Copyright(c) 2015-2020 Beijing WangXun Technology Co., Ltd.
+ * Copyright(c) 2010-2017 Intel Corporation
  */
 
 #include <stdio.h>
@@ -164,18 +165,6 @@ configure_fdir_flags(const struct rte_fdir_conf *conf,
        return 0;
 }
 
-static inline uint32_t
-reverse_fdir_bmks(uint16_t hi_dword, uint16_t lo_dword)
-{
-       uint32_t mask = hi_dword << 16;
-
-       mask |= lo_dword;
-       mask = ((mask & 0x55555555) << 1) | ((mask & 0xAAAAAAAA) >> 1);
-       mask = ((mask & 0x33333333) << 2) | ((mask & 0xCCCCCCCC) >> 2);
-       mask = ((mask & 0x0F0F0F0F) << 4) | ((mask & 0xF0F0F0F0) >> 4);
-       return ((mask & 0x00FF00FF) << 8) | ((mask & 0xFF00FF00) >> 8);
-}
-
 int
 txgbe_fdir_set_input_mask(struct rte_eth_dev *dev)
 {
@@ -212,9 +201,9 @@ txgbe_fdir_set_input_mask(struct rte_eth_dev *dev)
        /* TBD: don't support encapsulation yet */
        wr32(hw, TXGBE_FDIRMSK, fdirm);
 
-       /* store the TCP/UDP port masks, bit reversed from port layout */
-       fdirtcpm = reverse_fdir_bmks(rte_be_to_cpu_16(info->mask.dst_port_mask),
-                       rte_be_to_cpu_16(info->mask.src_port_mask));
+       /* store the TCP/UDP port masks */
+       fdirtcpm = rte_be_to_cpu_16(info->mask.dst_port_mask) << 16;
+       fdirtcpm |= rte_be_to_cpu_16(info->mask.src_port_mask);
 
        /* write all the same so that UDP, TCP and SCTP use the same mask
         * (little-endian)
@@ -902,6 +891,27 @@ txgbe_fdir_filter_program(struct rte_eth_dev *dev,
        return err;
 }
 
+static int
+txgbe_fdir_flush(struct rte_eth_dev *dev)
+{
+       struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
+       struct txgbe_hw_fdir_info *info = TXGBE_DEV_FDIR(dev);
+       int ret;
+
+       ret = txgbe_reinit_fdir_tables(hw);
+       if (ret < 0) {
+               PMD_INIT_LOG(ERR, "Failed to re-initialize FD table.");
+               return ret;
+       }
+
+       info->f_add = 0;
+       info->f_remove = 0;
+       info->add = 0;
+       info->remove = 0;
+
+       return ret;
+}
+
 /* restore flow director filter */
 void
 txgbe_fdir_filter_restore(struct rte_eth_dev *dev)
@@ -936,3 +946,29 @@ txgbe_fdir_filter_restore(struct rte_eth_dev *dev)
        }
 }
 
+/* remove all the flow director filters */
+int
+txgbe_clear_all_fdir_filter(struct rte_eth_dev *dev)
+{
+       struct txgbe_hw_fdir_info *fdir_info = TXGBE_DEV_FDIR(dev);
+       struct txgbe_fdir_filter *fdir_filter;
+       struct txgbe_fdir_filter *filter_flag;
+       int ret = 0;
+
+       /* flush flow director */
+       rte_hash_reset(fdir_info->hash_handle);
+       memset(fdir_info->hash_map, 0,
+              sizeof(struct txgbe_fdir_filter *) * TXGBE_MAX_FDIR_FILTER_NUM);
+       filter_flag = TAILQ_FIRST(&fdir_info->fdir_list);
+       while ((fdir_filter = TAILQ_FIRST(&fdir_info->fdir_list))) {
+               TAILQ_REMOVE(&fdir_info->fdir_list,
+                            fdir_filter,
+                            entries);
+               rte_free(fdir_filter);
+       }
+
+       if (filter_flag != NULL)
+               ret = txgbe_fdir_flush(dev);
+
+       return ret;
+}