Commit 09427c19 authored by Rahul Lakkireddy's avatar Rahul Lakkireddy Committed by David S. Miller

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: db43b30c ("cxgb4: add ethtool n-tuple filter deletion")
Signed-off-by: default avatarRahul Lakkireddy <rahul.lakkireddy@chelsio.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 49a10c7b
...@@ -1624,16 +1624,14 @@ static struct filter_entry *cxgb4_get_filter_entry(struct adapter *adap, ...@@ -1624,16 +1624,14 @@ static struct filter_entry *cxgb4_get_filter_entry(struct adapter *adap,
u32 ftid) u32 ftid)
{ {
struct tid_info *t = &adap->tids; struct tid_info *t = &adap->tids;
struct filter_entry *f;
if (ftid < t->nhpftids) if (ftid >= t->hpftid_base && ftid < t->hpftid_base + t->nhpftids)
f = &adap->tids.hpftid_tab[ftid]; return &t->hpftid_tab[ftid - t->hpftid_base];
else if (ftid < t->nftids)
f = &adap->tids.ftid_tab[ftid - t->nhpftids]; if (ftid >= t->ftid_base && ftid < t->ftid_base + t->nftids)
else return &t->ftid_tab[ftid - t->ftid_base];
f = lookup_tid(&adap->tids, ftid);
return f; return lookup_tid(t, ftid);
} }
static void cxgb4_fill_filter_rule(struct ethtool_rx_flow_spec *fs, 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, ...@@ -1840,6 +1838,11 @@ static int cxgb4_ntuple_del_filter(struct net_device *dev,
filter_id = filter_info->loc_array[cmd->fs.location]; filter_id = filter_info->loc_array[cmd->fs.location];
f = cxgb4_get_filter_entry(adapter, filter_id); 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); ret = cxgb4_flow_rule_destroy(dev, f->fs.tc_prio, &f->fs, filter_id);
if (ret) if (ret)
goto err; goto err;
...@@ -1899,6 +1902,11 @@ static int cxgb4_ntuple_set_filter(struct net_device *netdev, ...@@ -1899,6 +1902,11 @@ static int cxgb4_ntuple_set_filter(struct net_device *netdev,
filter_info = &adapter->ethtool_filters->port[pi->port_id]; 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; filter_info->loc_array[cmd->fs.location] = tid;
set_bit(cmd->fs.location, filter_info->bmap); set_bit(cmd->fs.location, filter_info->bmap);
filter_info->in_use++; filter_info->in_use++;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment