Skip to content

Commit

Permalink
tls: rx: strp: factor out copying skb data
Browse files Browse the repository at this point in the history
[ Upstream commit c1c607b ]

We'll need to copy input skbs individually in the next patch.
Factor that code out (without assuming we're copying a full record).

Tested-by: Shai Amiram <samiram@nvidia.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Reviewed-by: Simon Horman <simon.horman@corigine.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Stable-dep-of: eca9bfa ("tls: rx: strp: preserve decryption status of skbs when needed")
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
kuba-moo authored and gregkh committed Jun 5, 2023
1 parent 52a89de commit ba93977
Showing 1 changed file with 23 additions and 10 deletions.
33 changes: 23 additions & 10 deletions net/tls/tls_strp.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,31 +34,44 @@ static void tls_strp_anchor_free(struct tls_strparser *strp)
strp->anchor = NULL;
}

/* Create a new skb with the contents of input copied to its page frags */
static struct sk_buff *tls_strp_msg_make_copy(struct tls_strparser *strp)
static struct sk_buff *
tls_strp_skb_copy(struct tls_strparser *strp, struct sk_buff *in_skb,
int offset, int len)
{
struct strp_msg *rxm;
struct sk_buff *skb;
int i, err, offset;
int i, err;

skb = alloc_skb_with_frags(0, strp->stm.full_len, TLS_PAGE_ORDER,
skb = alloc_skb_with_frags(0, len, TLS_PAGE_ORDER,
&err, strp->sk->sk_allocation);
if (!skb)
return NULL;

offset = strp->stm.offset;
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];

WARN_ON_ONCE(skb_copy_bits(strp->anchor, offset,
WARN_ON_ONCE(skb_copy_bits(in_skb, offset,
skb_frag_address(frag),
skb_frag_size(frag)));
offset += skb_frag_size(frag);
}

skb->len = strp->stm.full_len;
skb->data_len = strp->stm.full_len;
skb_copy_header(skb, strp->anchor);
skb->len = len;
skb->data_len = len;
skb_copy_header(skb, in_skb);
return skb;
}

/* Create a new skb with the contents of input copied to its page frags */
static struct sk_buff *tls_strp_msg_make_copy(struct tls_strparser *strp)
{
struct strp_msg *rxm;
struct sk_buff *skb;

skb = tls_strp_skb_copy(strp, strp->anchor, strp->stm.offset,
strp->stm.full_len);
if (!skb)
return NULL;

rxm = strp_msg(skb);
rxm->offset = 0;
return skb;
Expand Down

0 comments on commit ba93977

Please sign in to comment.