cxgb4: fix wrong ethtool n-tuple rule lookup
The TID returned during successful filter creation is relative to
the region in which the filter is created. Using it directly always
returns Hi Prio/Normal filter region's entry for the first couple of
entries, even though the rule is actually inserted in Hash region.
Fix by analyzing in which region the filter has been inserted and
save the absolute TID to be used for lookup later.
Fixes: db43b30cd8
("cxgb4: add ethtool n-tuple filter deletion")
Signed-off-by: Rahul Lakkireddy <rahul.lakkireddy@chelsio.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
49a10c7b17
Коммит
09427c1915
|
@ -1624,16 +1624,14 @@ static struct filter_entry *cxgb4_get_filter_entry(struct adapter *adap,
|
|||
u32 ftid)
|
||||
{
|
||||
struct tid_info *t = &adap->tids;
|
||||
struct filter_entry *f;
|
||||
|
||||
if (ftid < t->nhpftids)
|
||||
f = &adap->tids.hpftid_tab[ftid];
|
||||
else if (ftid < t->nftids)
|
||||
f = &adap->tids.ftid_tab[ftid - t->nhpftids];
|
||||
else
|
||||
f = lookup_tid(&adap->tids, ftid);
|
||||
if (ftid >= t->hpftid_base && ftid < t->hpftid_base + t->nhpftids)
|
||||
return &t->hpftid_tab[ftid - t->hpftid_base];
|
||||
|
||||
return f;
|
||||
if (ftid >= t->ftid_base && ftid < t->ftid_base + t->nftids)
|
||||
return &t->ftid_tab[ftid - t->ftid_base];
|
||||
|
||||
return lookup_tid(t, ftid);
|
||||
}
|
||||
|
||||
static void cxgb4_fill_filter_rule(struct ethtool_rx_flow_spec *fs,
|
||||
|
@ -1840,6 +1838,11 @@ static int cxgb4_ntuple_del_filter(struct net_device *dev,
|
|||
filter_id = filter_info->loc_array[cmd->fs.location];
|
||||
f = cxgb4_get_filter_entry(adapter, filter_id);
|
||||
|
||||
if (f->fs.prio)
|
||||
filter_id -= adapter->tids.hpftid_base;
|
||||
else if (!f->fs.hash)
|
||||
filter_id -= (adapter->tids.ftid_base - adapter->tids.nhpftids);
|
||||
|
||||
ret = cxgb4_flow_rule_destroy(dev, f->fs.tc_prio, &f->fs, filter_id);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
@ -1899,6 +1902,11 @@ static int cxgb4_ntuple_set_filter(struct net_device *netdev,
|
|||
|
||||
filter_info = &adapter->ethtool_filters->port[pi->port_id];
|
||||
|
||||
if (fs.prio)
|
||||
tid += adapter->tids.hpftid_base;
|
||||
else if (!fs.hash)
|
||||
tid += (adapter->tids.ftid_base - adapter->tids.nhpftids);
|
||||
|
||||
filter_info->loc_array[cmd->fs.location] = tid;
|
||||
set_bit(cmd->fs.location, filter_info->bmap);
|
||||
filter_info->in_use++;
|
||||
|
|
Загрузка…
Ссылка в новой задаче