]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net: extract port range fields from fl_flow_key
authorMaksym Glubokiy <maksym.glubokiy@plvision.eu>
Mon, 11 Jul 2022 15:09:07 +0000 (18:09 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Mar 2025 11:50:52 +0000 (12:50 +0100)
[ Upstream commit 83d85bb069152b790caad905fa53e6d50cd3734d ]

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>
Signed-off-by: David S. Miller <davem@davemloft.net>
Stable-dep-of: 3e5796862c69 ("flow_dissector: Fix handling of mixed port and port-range keys")
Signed-off-by: Sasha Levin <sashal@kernel.org>
include/net/flow_dissector.h
include/net/flow_offload.h
net/core/flow_offload.c
net/sched/cls_flower.c

index c8d1c5e187e4b844d067d7ccbb17959d5867d15a..8d0d0cf93a785a4ef50059a44d20f6a533211a0d 100644 (file)
@@ -178,6 +178,22 @@ struct flow_dissector_key_ports {
        };
 };
 
+/**
+ * struct 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
index 7a2b0223a02c74ad7a6e4a4ba3bf61557b9521a9..41f8dcd3505c120c54ae5cbcc83342c6f3128393 100644 (file)
@@ -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,
index fb11103fa8afcd477c3a50c1275674caceb3960f..d8f19f4080f4a3c3a129b4a560ebf139d7ddcf31 100644 (file)
@@ -104,6 +104,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)
 {
index 057612c97a3728a78ac222184a544959c90be5a0..35842b51a24e27bba8cf2b81b9f70e19eae9e0fe 100644 (file)
@@ -62,13 +62,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;
 } __aligned(BITS_PER_LONG / 8); /* Ensure that we can do comparisons as longs. */