X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Ftxgbe%2Ftxgbe_fdir.c;h=6ddb023c09918cc23192c92fe49682ec1d8ad827;hb=29072d593fe4443f8745f648907c876846167d7b;hp=2342cf6810478fb2f6d29ecc3d0ebff5ed10e3de;hpb=08d61139be0a96ae6a513cc4d00ac39d766194ed;p=dpdk.git diff --git a/drivers/net/txgbe/txgbe_fdir.c b/drivers/net/txgbe/txgbe_fdir.c index 2342cf6810..6ddb023c09 100644 --- a/drivers/net/txgbe/txgbe_fdir.c +++ b/drivers/net/txgbe/txgbe_fdir.c @@ -902,6 +902,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 +957,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; +}