Commit e13c2075 authored by Vladimir Oltean's avatar Vladimir Oltean Committed by David S. Miller
Browse files

net: dsa: refactor matchall mirred action to separate function



Make room for other actions for the matchall filter by keeping the
mirred argument parsing self-contained in its own function.

Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c9a7fe12
Loading
Loading
Loading
Loading
+40 −30
Original line number Diff line number Diff line
@@ -842,24 +842,27 @@ 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,
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))
@@ -867,12 +870,6 @@ static int dsa_slave_add_cls_matchall(struct net_device *dev,

	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 (!act->dev)
			return -EINVAL;

	if (!dsa_slave_dev_check(act->dev))
		return -EOPNOTSUPP;

@@ -896,9 +893,22 @@ static int dsa_slave_add_cls_matchall(struct net_device *dev,
	}

	list_add_tail(&mall_tc_entry->list, &p->mall_tc_list);

	return err;
}

	return 0;
static int dsa_slave_add_cls_matchall(struct net_device *dev,
				      struct tc_cls_matchall_offload *cls,
				      bool ingress)
{
	int err = -EOPNOTSUPP;

	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,