net: mctp: copy skb ext data when fragmenting
[ Upstream commit 1394c1dec1c619a46867ed32791a29695372bff8 ]
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: 67737c4572
("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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
8f39d2e9d8
commit
be50365391
|
@ -6659,6 +6659,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;
|
||||
|
|
|
@ -843,6 +843,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…
Reference in New Issue