[dpdk-dev] [PATCH] bnxt: Fix bug with duplicate pattern for 5tuple filter
Somnath Kotur
somnath.kotur at broadcom.com
Thu Feb 22 04:01:56 CET 2018
Ferruh,
Sorry, please ignore this patch, think i re-sent an old
one by mistake, sent out the new one now
Thanks
Som
On Wed, Feb 21, 2018 at 4:09 PM, Somnath Kotur
<somnath.kotur at broadcom.com> wrote:
> When user re-issues same 5 tuple filter pattern cmd with different
> destination queue, it would flag it as an existing match.
> However, when deletion on this filter was attempted, it would crash as the
> 'vnic' from which the filter was being removed from would be different.
> Fix by updating the filter in the scenario where there is a pattern match
> and only the destination queue varies.
>
> Signed-off-by: Somnath Kotur <somnath.kotur at broadcom.com>
> ---
> drivers/net/bnxt/bnxt_ethdev.c | 32 +++++++++++++++++++++++---------
> 1 file changed, 23 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
> index 6f8a633..6af1267 100644
> --- a/drivers/net/bnxt/bnxt_ethdev.c
> +++ b/drivers/net/bnxt/bnxt_ethdev.c
> @@ -1953,7 +1953,8 @@ static int bnxt_mtu_set_op(struct rte_eth_dev *eth_dev, uint16_t new_mtu)
>
> static struct bnxt_filter_info*
> bnxt_match_ntuple_filter(struct bnxt *bp,
> - struct bnxt_filter_info *bfilter)
> + struct bnxt_filter_info *bfilter,
> + struct bnxt_vnic_info **mvnic)
> {
> struct bnxt_filter_info *mfilter = NULL;
> int i;
> @@ -1972,8 +1973,11 @@ static int bnxt_mtu_set_op(struct rte_eth_dev *eth_dev, uint16_t new_mtu)
> bfilter->dst_port == mfilter->dst_port &&
> bfilter->dst_port_mask == mfilter->dst_port_mask &&
> bfilter->flags == mfilter->flags &&
> - bfilter->enables == mfilter->enables)
> + bfilter->enables == mfilter->enables) {
> + if (mvnic)
> + *mvnic = vnic;
> return mfilter;
> + }
> }
> }
> return NULL;
> @@ -1985,7 +1989,7 @@ static int bnxt_mtu_set_op(struct rte_eth_dev *eth_dev, uint16_t new_mtu)
> enum rte_filter_op filter_op)
> {
> struct bnxt_filter_info *bfilter, *mfilter, *filter1;
> - struct bnxt_vnic_info *vnic, *vnic0;
> + struct bnxt_vnic_info *vnic, *vnic0, *mvnic;
> int ret;
>
> if (nfilter->flags != RTE_5TUPLE_FLAGS) {
> @@ -2023,12 +2027,22 @@ static int bnxt_mtu_set_op(struct rte_eth_dev *eth_dev, uint16_t new_mtu)
> bfilter->ethertype = 0x800;
> bfilter->enables |= NTUPLE_FLTR_ALLOC_INPUT_EN_ETHERTYPE;
>
> - mfilter = bnxt_match_ntuple_filter(bp, bfilter);
> + mfilter = bnxt_match_ntuple_filter(bp, bfilter, &mvnic);
>
> - if (mfilter != NULL && filter_op == RTE_ETH_FILTER_ADD) {
> - RTE_LOG(ERR, PMD, "filter exists.");
> + if (mfilter != NULL && filter_op == RTE_ETH_FILTER_ADD &&
> + bfilter->dst_id == mfilter->dst_id) {
> + RTE_LOG(ERR, PMD, "filter exists.\n");
> ret = -EEXIST;
> goto free_filter;
> + } else if (mfilter != NULL && filter_op == RTE_ETH_FILTER_ADD &&
> + bfilter->dst_id != mfilter->dst_id) {
> + mfilter->dst_id = vnic->fw_vnic_id;
> + ret = bnxt_hwrm_set_ntuple_filter(bp, mfilter->dst_id, mfilter);
> + STAILQ_REMOVE(&mvnic->filter, mfilter, bnxt_filter_info, next);
> + STAILQ_INSERT_TAIL(&vnic->filter, mfilter, next);
> + RTE_LOG(ERR, PMD, "filter with matching pattern exists.\n");
> + RTE_LOG(ERR, PMD, " Updated it to the new destination queue\n");
> + goto free_filter;
> }
> if (mfilter == NULL && filter_op == RTE_ETH_FILTER_DELETE) {
> RTE_LOG(ERR, PMD, "filter doesn't exist.");
> @@ -2050,11 +2064,11 @@ static int bnxt_mtu_set_op(struct rte_eth_dev *eth_dev, uint16_t new_mtu)
> }
> ret = bnxt_hwrm_clear_ntuple_filter(bp, mfilter);
>
> - STAILQ_REMOVE(&vnic->filter, mfilter, bnxt_filter_info,
> - next);
> + STAILQ_REMOVE(&vnic->filter, mfilter, bnxt_filter_info, next);
> bnxt_free_filter(bp, mfilter);
> - bfilter->fw_l2_filter_id = -1;
> + mfilter->fw_l2_filter_id = -1;
> bnxt_free_filter(bp, bfilter);
> + bfilter->fw_l2_filter_id = -1;
> }
>
> return 0;
> --
> 1.9.1
>
More information about the dev
mailing list