> -----Original Message----- > From: Xing, Beilei <beilei.x...@intel.com> > Sent: Friday, January 1, 2021 12:04 PM > To: Guo, Jia <jia....@intel.com>; dev@dpdk.org > Cc: Xing, Beilei <beilei.x...@intel.com>; sta...@dpdk.org; Sun, Chenmin > <chenmin....@intel.com> > Subject: [PATCH v3] net/i40e: fix flex payload rule conflict issue > > From: Beilei Xing <beilei.x...@intel.com> > > With the following commands, the second flow can't be created successfully. > > 1. flow create 0 ingress pattern eth / ipv4 / udp / > raw relative is 1 pattern is 0102030405 / end > actions drop / end > 2. flow destroy 0 rule 0 > 3. flow create 0 ingress pattern eth / ipv4 / udp / > raw relative is 1 pattern is 010203040506 / end > actions drop / end > > The root cause is that a flag for flex pit isn't reset. > > Fixes: 6ced3dd72f5f ("net/i40e: support flexible payload parsing for FDIR") > Cc: sta...@dpdk.org > > Reported-by: Chenmin Sun<chenmin....@intel.com> > Signed-off-by: Beilei Xing <beilei.x...@intel.com> > --- > > v3 changes: > - Add flow count for flexible payload flow. > v2 changeds: > - Add fix line. > > drivers/net/i40e/i40e_ethdev.h | 3 +++ > drivers/net/i40e/i40e_fdir.c | 16 ++++++++++++++-- > drivers/net/i40e/i40e_flow.c | 4 ++++ > 3 files changed, 21 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/i40e/i40e_ethdev.h > b/drivers/net/i40e/i40e_ethdev.h index 696c5aaf7e..aac226999c 100644 > --- a/drivers/net/i40e/i40e_ethdev.h > +++ b/drivers/net/i40e/i40e_ethdev.h > @@ -636,6 +636,7 @@ struct i40e_fdir_flow_ext { > bool is_udp; /* ipv4|ipv6 udp flow */ > enum i40e_flxpld_layer_idx layer_idx; > struct i40e_fdir_flex_pit flex_pit[I40E_MAX_FLXPLD_LAYER * > I40E_MAX_FLXPLD_FIED]; > + bool is_flex_flow; > }; > > /* A structure used to define the input for a flow director filter entry */ > @@ > -784,6 +785,8 @@ struct i40e_fdir_info { > bool flex_mask_flag[I40E_FILTER_PCTYPE_MAX]; > > bool inset_flag[I40E_FILTER_PCTYPE_MAX]; /* Mark if input set is set > */ > + > + uint32_t flex_flow_count[I40E_MAX_FLXPLD_LAYER]; > }; > > /* Ethertype filter number HW supports */ diff --git > a/drivers/net/i40e/i40e_fdir.c b/drivers/net/i40e/i40e_fdir.c index > 50c0eee9f2..4400b607c8 100644 > --- a/drivers/net/i40e/i40e_fdir.c > +++ b/drivers/net/i40e/i40e_fdir.c > @@ -355,6 +355,7 @@ i40e_init_flx_pld(struct i40e_pf *pf) > I40E_PRTQF_FLX_PIT(index + 1), 0x0000FC29);/*non- > used*/ > I40E_WRITE_REG(hw, > I40E_PRTQF_FLX_PIT(index + 2), 0x0000FC2A);/*non- > used*/ > + pf->fdir.flex_pit_flag[i] = 0; > } > > /* initialize the masks */ > @@ -1513,8 +1514,6 @@ i40e_flow_set_fdir_flex_pit(struct i40e_pf *pf, > I40E_WRITE_REG(hw, I40E_PRTQF_FLX_PIT(field_idx), > flx_pit); > min_next_off++; > } > - > - pf->fdir.flex_pit_flag[layer_idx] = 1; > } > > static int > @@ -1738,6 +1737,8 @@ i40e_flow_add_del_fdir_filter(struct rte_eth_dev > *dev, > fdir_info->fdir_guarantee_free_space > 0) > wait_status = false; > } else { > + layer_idx = filter->input.flow_ext.layer_idx; > +
Assume that flow_ext.layer_idx should be assign to the layer_idx at the condition of " (!filter->input.flow_ext.customized_pctype) ", right? > node = i40e_sw_fdir_filter_lookup(fdir_info, > &check_filter.fdir.input); > if (!node) { > @@ -1785,6 +1786,17 @@ i40e_flow_add_del_fdir_filter(struct rte_eth_dev > *dev, > goto error_op; > } > > + if (filter->input.flow_ext.is_flex_flow) { > + if (add) { > + fdir_info->flex_flow_count[layer_idx]++; > + pf->fdir.flex_pit_flag[layer_idx] = 1; > + } else { > + fdir_info->flex_flow_count[layer_idx]--; > + if (!fdir_info->flex_flow_count[layer_idx]) > + pf->fdir.flex_pit_flag[layer_idx] = 0; > + } > + } > + > if (add) { > fdir_info->fdir_actual_cnt++; > if (fdir_info->fdir_invalprio == 1 && diff --git > a/drivers/net/i40e/i40e_flow.c b/drivers/net/i40e/i40e_flow.c index > b09ff6590d..bbd666b7a0 100644 > --- a/drivers/net/i40e/i40e_flow.c > +++ b/drivers/net/i40e/i40e_flow.c > @@ -3069,6 +3069,7 @@ i40e_flow_parse_fdir_pattern(struct rte_eth_dev > *dev, > &flex_pit, sizeof(struct i40e_fdir_flex_pit)); > filter->input.flow_ext.layer_idx = layer_idx; > filter->input.flow_ext.raw_id = raw_id; > + filter->input.flow_ext.is_flex_flow = true; > break; > case RTE_FLOW_ITEM_TYPE_VF: > vf_spec = item->spec; > @@ -5515,6 +5516,9 @@ i40e_flow_flush_fdir_filter(struct i40e_pf *pf) > pf->fdir.flex_mask_flag[pctype] = 0; > } > > + for (i = 0; i < I40E_MAX_FLXPLD_LAYER; i++) > + pf->fdir.flex_pit_flag[i] = 0; > + > /* Disable FDIR processing as all FDIR rules are now flushed > */ > i40e_fdir_rx_proc_enable(dev, 0); > } > -- > 2.26.2