Skip to content

Commit

Permalink
net: dsa: refactor matchall mirred action to separate function
Browse files Browse the repository at this point in the history
Make room for other actions for the matchall filter by keeping the
mirred argument parsing self-contained in its own function.

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Vladimir Oltean authored and David S. Miller committed Mar 30, 2020
1 parent c9a7fe1 commit e13c207
Showing 1 changed file with 40 additions and 30 deletions.
70 changes: 40 additions & 30 deletions net/dsa/slave.c
Original file line number Diff line number Diff line change
Expand Up @@ -842,63 +842,73 @@ dsa_slave_mall_tc_entry_find(struct net_device *dev, unsigned long cookie)
return NULL;
}

static int dsa_slave_add_cls_matchall(struct net_device *dev,
struct tc_cls_matchall_offload *cls,
bool ingress)
static int
dsa_slave_add_cls_matchall_mirred(struct net_device *dev,
struct tc_cls_matchall_offload *cls,
bool ingress)
{
struct dsa_port *dp = dsa_slave_to_port(dev);
struct dsa_slave_priv *p = netdev_priv(dev);
struct dsa_mall_mirror_tc_entry *mirror;
struct dsa_mall_tc_entry *mall_tc_entry;
__be16 protocol = cls->common.protocol;
struct dsa_switch *ds = dp->ds;
struct flow_action_entry *act;
struct dsa_port *to_dp;
int err = -EOPNOTSUPP;
int err;

act = &cls->rule->action.entries[0];

if (!ds->ops->port_mirror_add)
return err;

if (!flow_offload_has_one_action(&cls->rule->action))
return err;
if (!act->dev)
return -EINVAL;

if (!flow_action_basic_hw_stats_check(&cls->rule->action,
cls->common.extack))
return err;

act = &cls->rule->action.entries[0];

if (act->id == FLOW_ACTION_MIRRED && protocol == htons(ETH_P_ALL)) {
struct dsa_mall_mirror_tc_entry *mirror;
if (!dsa_slave_dev_check(act->dev))
return -EOPNOTSUPP;

if (!act->dev)
return -EINVAL;
mall_tc_entry = kzalloc(sizeof(*mall_tc_entry), GFP_KERNEL);
if (!mall_tc_entry)
return -ENOMEM;

if (!dsa_slave_dev_check(act->dev))
return -EOPNOTSUPP;
mall_tc_entry->cookie = cls->cookie;
mall_tc_entry->type = DSA_PORT_MALL_MIRROR;
mirror = &mall_tc_entry->mirror;

mall_tc_entry = kzalloc(sizeof(*mall_tc_entry), GFP_KERNEL);
if (!mall_tc_entry)
return -ENOMEM;
to_dp = dsa_slave_to_port(act->dev);

mall_tc_entry->cookie = cls->cookie;
mall_tc_entry->type = DSA_PORT_MALL_MIRROR;
mirror = &mall_tc_entry->mirror;
mirror->to_local_port = to_dp->index;
mirror->ingress = ingress;

to_dp = dsa_slave_to_port(act->dev);
err = ds->ops->port_mirror_add(ds, dp->index, mirror, ingress);
if (err) {
kfree(mall_tc_entry);
return err;
}

mirror->to_local_port = to_dp->index;
mirror->ingress = ingress;
list_add_tail(&mall_tc_entry->list, &p->mall_tc_list);

err = ds->ops->port_mirror_add(ds, dp->index, mirror, ingress);
if (err) {
kfree(mall_tc_entry);
return err;
}
return err;
}

list_add_tail(&mall_tc_entry->list, &p->mall_tc_list);
}
static int dsa_slave_add_cls_matchall(struct net_device *dev,
struct tc_cls_matchall_offload *cls,
bool ingress)
{
int err = -EOPNOTSUPP;

return 0;
if (cls->common.protocol == htons(ETH_P_ALL) &&
flow_offload_has_one_action(&cls->rule->action) &&
cls->rule->action.entries[0].id == FLOW_ACTION_MIRRED)
err = dsa_slave_add_cls_matchall_mirred(dev, cls, ingress);

return err;
}

static void dsa_slave_del_cls_matchall(struct net_device *dev,
Expand Down

0 comments on commit e13c207

Please sign in to comment.