mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-16 18:08:20 +00:00
net: mctp: copy skb ext data when fragmenting
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>
This commit is contained in:
parent
9acdc089c0
commit
1394c1dec1
@ -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;
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user