]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net/sched: cls_flower: remove unions from fl_flow_key
authorCedric Jehasse <cedric.jehasse@luminex.be>
Wed, 11 Mar 2026 10:46:18 +0000 (11:46 +0100)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 17 Mar 2026 09:35:20 +0000 (10:35 +0100)
When creating a flower classifier with an ipv4 address the
flow_dissector has both FLOW_DISSECTOR_KEY_IPV4_ADDRS and
FLOW_DISSECTOR_KEY_IPV6_ADDRS bits set in used_keys.
This happens because ipv4/ipv6 fields are a union and
FL_KEY_SET_IF_MASKED() will interpret either being set as both.

Removing the unions fixes this behavior without needing special handling
for union fields.

Example of a command that caused FLOW_DISSECTOR_KEY_IPV4_ADDRS and
FLOW_DISSECTOR_KEY_IPV6_ADDRS to be set:
tc filter add dev p1 ingress protocol ip flower skip_sw \
    dst_ip 224.0.1.129 action trap

Signed-off-by: Cedric Jehasse <cedric.jehasse@luminex.be>
Link: https://patch.msgid.link/20260311-net-next-mv88e6xxx-tcam-v8-1-32dd5ba30002@luminex.be
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
net/sched/cls_flower.c

index 26070c892305d01c5300af3c71ccc4d5089c74a1..88f8a32fab2b404c22bbdcf9320a2a409525027a 100644 (file)
@@ -59,18 +59,14 @@ struct fl_flow_key {
        struct flow_dissector_key_eth_addrs eth;
        struct flow_dissector_key_vlan vlan;
        struct flow_dissector_key_vlan cvlan;
-       union {
-               struct flow_dissector_key_ipv4_addrs ipv4;
-               struct flow_dissector_key_ipv6_addrs ipv6;
-       };
+       struct flow_dissector_key_ipv4_addrs ipv4;
+       struct flow_dissector_key_ipv6_addrs ipv6;
        struct flow_dissector_key_ports tp;
        struct flow_dissector_key_icmp icmp;
        struct flow_dissector_key_arp arp;
        struct flow_dissector_key_keyid enc_key_id;
-       union {
-               struct flow_dissector_key_ipv4_addrs enc_ipv4;
-               struct flow_dissector_key_ipv6_addrs enc_ipv6;
-       };
+       struct flow_dissector_key_ipv4_addrs enc_ipv4;
+       struct flow_dissector_key_ipv6_addrs enc_ipv6;
        struct flow_dissector_key_ports enc_tp;
        struct flow_dissector_key_mpls mpls;
        struct flow_dissector_key_tcp tcp;