* [PATCH net-next 1/2] net: extract port range fields from fl_flow_key
@ 2022-07-07 8:35 Maksym Glubokiy
2022-07-07 8:35 ` [PATCH net-next 2/2] net: prestera: add support for port range filters Maksym Glubokiy
2022-07-08 0:56 ` [PATCH net-next 1/2] net: extract port range fields from fl_flow_key Jakub Kicinski
0 siblings, 2 replies; 3+ messages in thread
From: Maksym Glubokiy @ 2022-07-07 8:35 UTC (permalink / raw)
To: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Jamal Hadi Salim, Cong Wang, Jiri Pirko
Cc: Maksym Glubokiy, Volodymyr Mytnyk, netdev, linux-kernel
So it can be used for port range filter offloading.
Co-developed-by: Volodymyr Mytnyk <volodymyr.mytnyk@plvision.eu>
Signed-off-by: Volodymyr Mytnyk <volodymyr.mytnyk@plvision.eu>
Signed-off-by: Maksym Glubokiy <maksym.glubokiy@plvision.eu>
---
include/net/flow_dissector.h | 16 ++++++++++++++++
include/net/flow_offload.h | 6 ++++++
net/core/flow_offload.c | 7 +++++++
net/sched/cls_flower.c | 8 +-------
4 files changed, 30 insertions(+), 7 deletions(-)
diff --git a/include/net/flow_dissector.h b/include/net/flow_dissector.h
index a4c6057c7097..6341505d0838 100644
--- a/include/net/flow_dissector.h
+++ b/include/net/flow_dissector.h
@@ -178,6 +178,22 @@ struct flow_dissector_key_ports {
};
};
+/**
+ * flow_dissector_key_ports_range:
+ * tp: port number from packet
+ * tp_min: min port number in range
+ * tp_max: max port number in range
+ */
+struct flow_dissector_key_ports_range {
+ union {
+ struct flow_dissector_key_ports tp;
+ struct {
+ struct flow_dissector_key_ports tp_min;
+ struct flow_dissector_key_ports tp_max;
+ };
+ };
+};
+
/**
* flow_dissector_key_icmp:
* type: ICMP type
diff --git a/include/net/flow_offload.h b/include/net/flow_offload.h
index 6484095a8c01..c53c3d2d5800 100644
--- a/include/net/flow_offload.h
+++ b/include/net/flow_offload.h
@@ -48,6 +48,10 @@ struct flow_match_ports {
struct flow_dissector_key_ports *key, *mask;
};
+struct flow_match_ports_range {
+ struct flow_dissector_key_ports_range *key, *mask;
+};
+
struct flow_match_icmp {
struct flow_dissector_key_icmp *key, *mask;
};
@@ -94,6 +98,8 @@ void flow_rule_match_ip(const struct flow_rule *rule,
struct flow_match_ip *out);
void flow_rule_match_ports(const struct flow_rule *rule,
struct flow_match_ports *out);
+void flow_rule_match_ports_range(const struct flow_rule *rule,
+ struct flow_match_ports_range *out);
void flow_rule_match_tcp(const struct flow_rule *rule,
struct flow_match_tcp *out);
void flow_rule_match_icmp(const struct flow_rule *rule,
diff --git a/net/core/flow_offload.c b/net/core/flow_offload.c
index 929f6379a279..0d3075d3c8fb 100644
--- a/net/core/flow_offload.c
+++ b/net/core/flow_offload.c
@@ -125,6 +125,13 @@ void flow_rule_match_ports(const struct flow_rule *rule,
}
EXPORT_SYMBOL(flow_rule_match_ports);
+void flow_rule_match_ports_range(const struct flow_rule *rule,
+ struct flow_match_ports_range *out)
+{
+ FLOW_DISSECTOR_MATCH(rule, FLOW_DISSECTOR_KEY_PORTS_RANGE, out);
+}
+EXPORT_SYMBOL(flow_rule_match_ports_range);
+
void flow_rule_match_tcp(const struct flow_rule *rule,
struct flow_match_tcp *out)
{
diff --git a/net/sched/cls_flower.c b/net/sched/cls_flower.c
index dcca70144dff..1a1e34480b7e 100644
--- a/net/sched/cls_flower.c
+++ b/net/sched/cls_flower.c
@@ -63,13 +63,7 @@ struct fl_flow_key {
struct flow_dissector_key_ip ip;
struct flow_dissector_key_ip enc_ip;
struct flow_dissector_key_enc_opts enc_opts;
- union {
- struct flow_dissector_key_ports tp;
- struct {
- struct flow_dissector_key_ports tp_min;
- struct flow_dissector_key_ports tp_max;
- };
- } tp_range;
+ struct flow_dissector_key_ports_range tp_range;
struct flow_dissector_key_ct ct;
struct flow_dissector_key_hash hash;
struct flow_dissector_key_num_of_vlans num_of_vlans;
--
2.25.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH net-next 2/2] net: prestera: add support for port range filters
2022-07-07 8:35 [PATCH net-next 1/2] net: extract port range fields from fl_flow_key Maksym Glubokiy
@ 2022-07-07 8:35 ` Maksym Glubokiy
2022-07-08 0:56 ` [PATCH net-next 1/2] net: extract port range fields from fl_flow_key Jakub Kicinski
1 sibling, 0 replies; 3+ messages in thread
From: Maksym Glubokiy @ 2022-07-07 8:35 UTC (permalink / raw)
To: Taras Chornyi, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni
Cc: Maksym Glubokiy, Volodymyr Mytnyk, netdev, linux-kernel
This adds support for port-range rules:
$ tc qdisc add ... clsact
$ tc filter add ... flower ... src_port <PMIN>-<PMAX> ...
Co-developed-by: Volodymyr Mytnyk <volodymyr.mytnyk@plvision.eu>
Signed-off-by: Volodymyr Mytnyk <volodymyr.mytnyk@plvision.eu>
Signed-off-by: Maksym Glubokiy <maksym.glubokiy@plvision.eu>
---
.../marvell/prestera/prestera_flower.c | 24 +++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/drivers/net/ethernet/marvell/prestera/prestera_flower.c b/drivers/net/ethernet/marvell/prestera/prestera_flower.c
index a54748ac6541..652aa95e65ac 100644
--- a/drivers/net/ethernet/marvell/prestera/prestera_flower.c
+++ b/drivers/net/ethernet/marvell/prestera/prestera_flower.c
@@ -202,6 +202,7 @@ static int prestera_flower_parse(struct prestera_flow_block *block,
BIT(FLOW_DISSECTOR_KEY_IPV6_ADDRS) |
BIT(FLOW_DISSECTOR_KEY_ICMP) |
BIT(FLOW_DISSECTOR_KEY_PORTS) |
+ BIT(FLOW_DISSECTOR_KEY_PORTS_RANGE) |
BIT(FLOW_DISSECTOR_KEY_VLAN))) {
NL_SET_ERR_MSG_MOD(f->common.extack, "Unsupported key");
return -EOPNOTSUPP;
@@ -301,6 +302,29 @@ static int prestera_flower_parse(struct prestera_flow_block *block,
rule_match_set(r_match->mask, L4_PORT_DST, match.mask->dst);
}
+ if (flow_rule_match_key(f_rule, FLOW_DISSECTOR_KEY_PORTS_RANGE)) {
+ struct flow_match_ports_range match;
+ __be32 tp_key, tp_mask;
+
+ flow_rule_match_ports_range(f_rule, &match);
+
+ /* src port range (min, max) */
+ tp_key = htonl(ntohs(match.key->tp_min.src) |
+ (ntohs(match.key->tp_max.src) << 16));
+ tp_mask = htonl(ntohs(match.mask->tp_min.src) |
+ (ntohs(match.mask->tp_max.src) << 16));
+ rule_match_set(r_match->key, L4_PORT_RANGE_SRC, tp_key);
+ rule_match_set(r_match->mask, L4_PORT_RANGE_SRC, tp_mask);
+
+ /* dst port range (min, max) */
+ tp_key = htonl(ntohs(match.key->tp_min.dst) |
+ (ntohs(match.key->tp_max.dst) << 16));
+ tp_mask = htonl(ntohs(match.mask->tp_min.dst) |
+ (ntohs(match.mask->tp_max.dst) << 16));
+ rule_match_set(r_match->key, L4_PORT_RANGE_DST, tp_key);
+ rule_match_set(r_match->mask, L4_PORT_RANGE_DST, tp_mask);
+ }
+
if (flow_rule_match_key(f_rule, FLOW_DISSECTOR_KEY_VLAN)) {
struct flow_match_vlan match;
--
2.25.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH net-next 1/2] net: extract port range fields from fl_flow_key
2022-07-07 8:35 [PATCH net-next 1/2] net: extract port range fields from fl_flow_key Maksym Glubokiy
2022-07-07 8:35 ` [PATCH net-next 2/2] net: prestera: add support for port range filters Maksym Glubokiy
@ 2022-07-08 0:56 ` Jakub Kicinski
1 sibling, 0 replies; 3+ messages in thread
From: Jakub Kicinski @ 2022-07-08 0:56 UTC (permalink / raw)
To: Maksym Glubokiy
Cc: David S. Miller, Eric Dumazet, Paolo Abeni, Jamal Hadi Salim,
Cong Wang, Jiri Pirko, Volodymyr Mytnyk, netdev, linux-kernel
On Thu, 7 Jul 2022 11:35:38 +0300 Maksym Glubokiy wrote:
> +/**
> + * flow_dissector_key_ports_range:
> + * tp: port number from packet
> + * tp_min: min port number in range
> + * tp_max: max port number in range
> + */
This is not valid kdoc, please see
Documentation/doc-guide/kernel-doc.rst
> +struct flow_dissector_key_ports_range {
> + union {
> + struct flow_dissector_key_ports tp;
> + struct {
> + struct flow_dissector_key_ports tp_min;
> + struct flow_dissector_key_ports tp_max;
> + };
> + };
> +};
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2022-07-08 0:56 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-07 8:35 [PATCH net-next 1/2] net: extract port range fields from fl_flow_key Maksym Glubokiy
2022-07-07 8:35 ` [PATCH net-next 2/2] net: prestera: add support for port range filters Maksym Glubokiy
2022-07-08 0:56 ` [PATCH net-next 1/2] net: extract port range fields from fl_flow_key Jakub Kicinski
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).