From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by dpdk.org (Postfix) with ESMTP id E2203D072 for ; Thu, 6 Apr 2017 09:15:33 +0200 (CEST) Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga105.fm.intel.com with ESMTP; 06 Apr 2017 00:15:32 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.37,283,1488873600"; d="scan'208";a="85433966" Received: from unknown (HELO dpdk9.sh.intel.com) ([10.239.129.31]) by fmsmga006.fm.intel.com with ESMTP; 06 Apr 2017 00:15:31 -0700 From: Beilei Xing To: jingjing.wu@intel.com Cc: dev@dpdk.org Date: Thu, 6 Apr 2017 15:12:34 +0800 Message-Id: <1491462754-128260-1-git-send-email-beilei.xing@intel.com> X-Mailer: git-send-email 2.5.5 Subject: [dpdk-dev] [PATCH] net/i40e: fix tunnel filter to VF X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 06 Apr 2017 07:15:34 -0000 Failed to destroy tunnel filter rule if the action of the tunnel filter is VF, root cause is the wrong vsi used. Fixes: 5da4939e90fb ("net/i40e: support tunnel filter to VF") Signed-off-by: Beilei Xing --- drivers/net/i40e/i40e_ethdev.c | 11 ++++++++++- drivers/net/i40e/i40e_ethdev.h | 5 +++-- drivers/net/i40e/i40e_flow.c | 10 +++++++++- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index 6810eec..dab1126 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -7220,6 +7220,8 @@ i40e_dev_consistent_tunnel_filter_set(struct i40e_pf *pf, /* Check if there is the filter in SW list */ memset(&check_filter, 0, sizeof(check_filter)); i40e_tunnel_filter_convert(cld_filter, &check_filter); + check_filter.is_to_vf = tunnel_filter->is_to_vf; + check_filter.vf_id = tunnel_filter->vf_id; node = i40e_sw_tunnel_filter_lookup(tunnel_rule, &check_filter.input); if (add && node) { PMD_DRV_LOG(ERR, "Conflict with existing tunnel rules!"); @@ -10631,7 +10633,8 @@ static void i40e_tunnel_filter_restore(struct i40e_pf *pf) { struct i40e_hw *hw = I40E_PF_TO_HW(pf); - struct i40e_vsi *vsi = pf->main_vsi; + struct i40e_vsi *vsi; + struct i40e_pf_vf *vf; struct i40e_tunnel_filter_list *tunnel_list = &pf->tunnel.tunnel_list; struct i40e_tunnel_filter *f; @@ -10639,6 +10642,12 @@ i40e_tunnel_filter_restore(struct i40e_pf *pf) bool big_buffer = 0; TAILQ_FOREACH(f, tunnel_list, rules) { + if (!f->is_to_vf) + vsi = pf->main_vsi; + else { + vf = &pf->vfs[f->vf_id]; + vsi = vf->vsi; + } memset(&cld_filter, 0, sizeof(cld_filter)); ether_addr_copy((struct ether_addr *)&f->input.outer_mac, (struct ether_addr *)&cld_filter.element.outer_mac); diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h index ce2af1b..a1535b0 100644 --- a/drivers/net/i40e/i40e_ethdev.h +++ b/drivers/net/i40e/i40e_ethdev.h @@ -524,12 +524,13 @@ struct i40e_tunnel_filter_input { uint16_t flags; /* Filter type flag */ uint32_t tenant_id; /* Tenant id to match */ uint16_t general_fields[32]; /* Big buffer */ - uint16_t vf_id; /* VF id for tunnel filtering. */ }; struct i40e_tunnel_filter { TAILQ_ENTRY(i40e_tunnel_filter) rules; struct i40e_tunnel_filter_input input; + uint8_t is_to_vf; /* 0 - to PF, 1 - to VF */ + uint16_t vf_id; /* VF id, avaiblable when is_to_vf is 1. */ uint16_t queue; /* Queue assigned to when match */ }; @@ -582,7 +583,7 @@ struct i40e_tunnel_filter_conf { uint32_t tenant_id; /**< Tenant ID to match. VNI, GRE key... */ uint16_t queue_id; /**< Queue assigned to if match. */ uint8_t is_to_vf; /**< 0 - to PF, 1 - to VF */ - uint16_t vf_id; /**< VF id for tunnel filter insertion. */ + uint16_t vf_id; /**< VF id, avaiblable when is_to_vf is 1. */ }; #define I40E_MIRROR_MAX_ENTRIES_PER_RULE 64 diff --git a/drivers/net/i40e/i40e_flow.c b/drivers/net/i40e/i40e_flow.c index 9f541ea..fa76285 100644 --- a/drivers/net/i40e/i40e_flow.c +++ b/drivers/net/i40e/i40e_flow.c @@ -2072,7 +2072,8 @@ i40e_flow_destroy_tunnel_filter(struct i40e_pf *pf, struct i40e_tunnel_filter *filter) { struct i40e_hw *hw = I40E_PF_TO_HW(pf); - struct i40e_vsi *vsi = pf->main_vsi; + struct i40e_vsi *vsi; + struct i40e_pf_vf *vf; struct i40e_aqc_add_rm_cloud_filt_elem_ext cld_filter; struct i40e_tunnel_rule *tunnel_rule = &pf->tunnel; struct i40e_tunnel_filter *node; @@ -2092,6 +2093,13 @@ i40e_flow_destroy_tunnel_filter(struct i40e_pf *pf, filter->input.general_fields, sizeof(cld_filter.general_fields)); + if (!filter->is_to_vf) + vsi = pf->main_vsi; + else { + vf = &pf->vfs[filter->vf_id]; + vsi = vf->vsi; + } + if (((filter->input.flags & I40E_AQC_ADD_CLOUD_FILTER_TEID_MPLSoUDP) == I40E_AQC_ADD_CLOUD_FILTER_TEID_MPLSoUDP) || ((filter->input.flags & I40E_AQC_ADD_CLOUD_FILTER_TEID_MPLSoGRE) == -- 2.5.5