Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 166fa538 authored by Guillaume Nault's avatar Guillaume Nault Committed by Greg Kroah-Hartman
Browse files

cls_flower: Add extack support for src and dst port range options



[ Upstream commit bd7d4c12819b60b161939bc2f43053955d24d0df ]

Pass extack down to fl_set_key_port_range() and set message on error.

Both the min and max ports would qualify as invalid attributes here.
Report the min one as invalid, as it's probably what makes the most
sense from a user point of view.

Signed-off-by: default avatarGuillaume Nault <gnault@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Stable-dep-of: d3f87278bcb8 ("net/sched: flower: Ensure both minimum and maximum ports are specified")
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent aadca5f0
Loading
Loading
Loading
Loading
+18 −8
Original line number Diff line number Diff line
@@ -719,7 +719,8 @@ static void fl_set_key_val(struct nlattr **tb,
}

static int fl_set_key_port_range(struct nlattr **tb, struct fl_flow_key *key,
				 struct fl_flow_key *mask)
				 struct fl_flow_key *mask,
				 struct netlink_ext_ack *extack)
{
	fl_set_key_val(tb, &key->tp_range.tp_min.dst,
		       TCA_FLOWER_KEY_PORT_DST_MIN, &mask->tp_range.tp_min.dst,
@@ -734,13 +735,22 @@ static int fl_set_key_port_range(struct nlattr **tb, struct fl_flow_key *key,
		       TCA_FLOWER_KEY_PORT_SRC_MAX, &mask->tp_range.tp_max.src,
		       TCA_FLOWER_UNSPEC, sizeof(key->tp_range.tp_max.src));

	if ((mask->tp_range.tp_min.dst && mask->tp_range.tp_max.dst &&
	if (mask->tp_range.tp_min.dst && mask->tp_range.tp_max.dst &&
	    htons(key->tp_range.tp_max.dst) <=
		 htons(key->tp_range.tp_min.dst)) ||
	    (mask->tp_range.tp_min.src && mask->tp_range.tp_max.src &&
	    htons(key->tp_range.tp_min.dst)) {
		NL_SET_ERR_MSG_ATTR(extack,
				    tb[TCA_FLOWER_KEY_PORT_DST_MIN],
				    "Invalid destination port range (min must be strictly smaller than max)");
		return -EINVAL;
	}
	if (mask->tp_range.tp_min.src && mask->tp_range.tp_max.src &&
	    htons(key->tp_range.tp_max.src) <=
		 htons(key->tp_range.tp_min.src)))
	    htons(key->tp_range.tp_min.src)) {
		NL_SET_ERR_MSG_ATTR(extack,
				    tb[TCA_FLOWER_KEY_PORT_SRC_MIN],
				    "Invalid source port range (min must be strictly smaller than max)");
		return -EINVAL;
	}

	return 0;
}
@@ -1211,7 +1221,7 @@ static int fl_set_key(struct net *net, struct nlattr **tb,
	if (key->basic.ip_proto == IPPROTO_TCP ||
	    key->basic.ip_proto == IPPROTO_UDP ||
	    key->basic.ip_proto == IPPROTO_SCTP) {
		ret = fl_set_key_port_range(tb, key, mask);
		ret = fl_set_key_port_range(tb, key, mask, extack);
		if (ret)
			return ret;
	}