net/i40e: fix tunnel filter to VF
Failed to destroy tunnel filter rule if the action of
the tunnel filter is VF, root cause is the wrong vsi
used.
Fixes: c50474f31e
("net/i40e: support tunnel filter to VF")
Signed-off-by: Beilei Xing <beilei.xing@intel.com>
Acked-by: Bernard Iremonger <bernard.iremonger@intel.com>
This commit is contained in:
parent
1e846151cf
commit
ab5169a6c2
@ -7221,6 +7221,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!");
|
||||
@ -10632,7 +10634,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;
|
||||
@ -10640,6 +10643,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);
|
||||
|
@ -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
|
||||
|
@ -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) ==
|
||||
|
Loading…
Reference in New Issue
Block a user