FAILED: patch "[PATCH] net/sched: flow_dissector: Fix matching on zone id for" failed to apply to 5.15-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 5.15-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 3849595866166b23bf6a0cb9ff87e06423167f67 Mon Sep 17 00:00:00 2001
From: Paul Blakey <[email protected]>
Date: Tue, 14 Dec 2021 19:24:34 +0200
Subject: [PATCH] net/sched: flow_dissector: Fix matching on zone id for
invalid conns
If ct rejects a flow, it removes the conntrack info from the skb. act_ct sets the post_ct variable so the dissector will see this case as an +tracked +invalid state, but the zone id is lost with the conntrack info.
To restore the zone id on such cases, set the last executed zone, via the tc control block, when passing ct, and read it back in the dissector if there is no ct info on the skb (invalid connection).
include/linux/skbuff.h +1 -1
@@ -1380,7 +1380,7 @@ skb_flow_dissect_ct(const struct sk_buff *skb,struct flow_dissector *flow_dissector, void *target_container, u16 *ctinfo_map, size_t mapsize, - bool post_ct); + bool post_ct, u16 zone); void skb_flow_dissect_tunnel_info(const struct sk_buff *skb, struct flow_dissector *flow_dissector,
include/net/pkt_sched.h +1 -0
@@ -198,6 +198,7 @@ struct tc_skb_cb {u16 mru;bool post_ct; +u16 zone;/* Only valid if post_ct = true */ };static inline struct tc_skb_cb *tc_skb_cb (const struct sk_buff *skb)
net/core/flow_dissector.c +2 -1
@@ -238,7 +238,7 @@ void skb_flow_dissect_ct(const struct sk_buff *skb, struct flow_dissector *flow_dissector, void *target_container, u16 *ctinfo_map, - size_t mapsize, bool post_ct) + size_t mapsize, bool post_ct, u16 zone) { #if IS_ENABLED(CONFIG_NF_CONNTRACK) struct flow_dissector_key_ct *key;
@@ -260,6 +260,7 @@ skb_flow_dissect_ct(const struct sk_buff *skb,if (!ct) { key->ct_state =TCA_FLOWER_KEY_CT_FLAGS_TRACKED |TCA_FLOWER_KEY_CT_FLAGS_INVALID ; + key->ct_zone = zone;return ; }
net/sched/act_ct.c +1 -0
@@ -1049,6 +1049,7 @@ static int tcf_ct_act(struct sk_buff *skb, const struct tc_action *a,skb_push_rcsum (skb, nh_ofs);tc_skb_cb (skb)->post_ct = true; +tc_skb_cb (skb)->zone = p->zone; out_clear:if (defrag)qdisc_skb_cb (skb)->pkt_len = skb->len;
net/sched/cls_flower.c +2 -1
@@ -311,6 +311,7 @@ static int fl_classify(struct sk_buff *skb, const struct tcf_proto *tp, {struct cls_fl_head *head =rcu_dereference_bh (tp->root);bool post_ct =tc_skb_cb (skb)->post_ct; +u16 zone =tc_skb_cb (skb)->zone;struct fl_flow_key skb_key;struct fl_flow_mask *mask;struct cls_fl_filter *f;
@@ -328,7 +329,7 @@ static int fl_classify(struct sk_buff *skb, const struct tcf_proto *tp,skb_flow_dissect_ct (skb, &mask->dissector, &skb_key, fl_ct_info_to_flower_map,ARRAY_SIZE (fl_ct_info_to_flower_map), - post_ct); + post_ct, zone);skb_flow_dissect_hash (skb, &mask->dissector, &skb_key);skb_flow_dissect (skb, &mask->dissector, &skb_key,FLOW_DISSECTOR_F_STOP_BEFORE_ENCAP );