net: mctp: copy skb ext data when fragmenting
authorJeremy Kerr <jk@codeconstruct.com.au>
Mon, 19 Feb 2024 09:51:54 +0000 (17:51 +0800)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 22 Feb 2024 12:32:55 +0000 (13:32 +0100)
If we're fragmenting on local output, the original packet may contain
ext data for the MCTP flows. We'll want this in the resulting fragment
skbs too.

So, do a skb_ext_copy() in the fragmentation path, and implement the
MCTP-specific parts of an ext copy operation.

Fixes: 67737c457281 ("mctp: Pass flow data & flow release events to drivers")
Reported-by: Jian Zhang <zhangjian.3032@bytedance.com>
Signed-off-by: Jeremy Kerr <jk@codeconstruct.com.au>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
net/core/skbuff.c
net/mctp/route.c

index b9de3ee65ae6439725237f07e0d05c02e7c90cb4..1f918e602bc4f61fc09aa7308f9c47e8cacae47b 100644 (file)
@@ -6849,6 +6849,14 @@ static struct skb_ext *skb_ext_maybe_cow(struct skb_ext *old,
                for (i = 0; i < sp->len; i++)
                        xfrm_state_hold(sp->xvec[i]);
        }
+#endif
+#ifdef CONFIG_MCTP_FLOWS
+       if (old_active & (1 << SKB_EXT_MCTP)) {
+               struct mctp_flow *flow = skb_ext_get_ptr(old, SKB_EXT_MCTP);
+
+               if (flow->key)
+                       refcount_inc(&flow->key->refs);
+       }
 #endif
        __skb_ext_put(old);
        return new;
index 28648a7ec866664bfe35a28c51d34026bb6201cf..34e5131135093d65f7c6dd495542a56b5a62206f 100644 (file)
@@ -905,6 +905,9 @@ static int mctp_do_fragment_route(struct mctp_route *rt, struct sk_buff *skb,
                /* copy message payload */
                skb_copy_bits(skb, pos, skb_transport_header(skb2), size);
 
+               /* we need to copy the extensions, for MCTP flow data */
+               skb_ext_copy(skb2, skb);
+
                /* do route */
                rc = rt->output(rt, skb2);
                if (rc)