diff options
author | Jakub Kicinski <kuba@kernel.org> | 2022-04-08 21:31:32 +0300 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2022-04-10 19:32:12 +0300 |
commit | 465ea73535675ed3eb39e54a3631998f0c64e8d7 (patch) | |
tree | acc2ac7457061c0173f97dea07618d66eb7dc0a6 /net | |
parent | ba13609df18dabf1d892a247201bd3fe38012ff9 (diff) | |
download | linux-465ea73535675ed3eb39e54a3631998f0c64e8d7.tar.xz |
tls: rx: inline consuming the skb at the end of the loop
tls_sw_advance_skb() always consumes the skb at the end of the loop.
To fall here the following must be true:
!async && !is_peek && !retain_skb
retain_skb => !zc && rxm->full_len > len
# but non-full record implies !zc, so above can be simplified as
retain_skb => rxm->full_len > len
!async && !is_peek && !(rxm->full_len > len)
!async && !is_peek && rxm->full_len <= len
tls_sw_advance_skb() returns false if len < rxm->full_len
which can't be true given conditions above.
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/tls/tls_sw.c | 29 |
1 files changed, 5 insertions, 24 deletions
diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c index 5ad0b2505988..3aa8fe1c6e77 100644 --- a/net/tls/tls_sw.c +++ b/net/tls/tls_sw.c @@ -1611,27 +1611,6 @@ int decrypt_skb(struct sock *sk, struct sk_buff *skb, return decrypt_internal(sk, skb, NULL, sgout, &darg); } -static bool tls_sw_advance_skb(struct sock *sk, struct sk_buff *skb, - unsigned int len) -{ - struct tls_context *tls_ctx = tls_get_ctx(sk); - struct tls_sw_context_rx *ctx = tls_sw_ctx_rx(tls_ctx); - struct strp_msg *rxm = strp_msg(skb); - - if (len < rxm->full_len) { - rxm->offset += len; - rxm->full_len -= len; - return false; - } - consume_skb(skb); - - /* Finished with message */ - ctx->recv_pkt = NULL; - __strp_unpause(&ctx->strp); - - return true; -} - static int tls_record_content_type(struct msghdr *msg, struct tls_msg *tlm, u8 *control) { @@ -1894,7 +1873,11 @@ pick_next_record: skb_queue_tail(&ctx->rx_list, skb); ctx->recv_pkt = NULL; __strp_unpause(&ctx->strp); - } else if (tls_sw_advance_skb(sk, skb, chunk)) { + } else { + consume_skb(skb); + ctx->recv_pkt = NULL; + __strp_unpause(&ctx->strp); + /* Return full control message to * userspace before trying to parse * another message type @@ -1902,8 +1885,6 @@ pick_next_record: msg->msg_flags |= MSG_EOR; if (control != TLS_RECORD_TYPE_DATA) goto recv_end; - } else { - break; } } |