diff options
Diffstat (limited to 'net/tls/tls_sw.c')
| -rw-r--r-- | net/tls/tls_sw.c | 31 | 
1 files changed, 25 insertions, 6 deletions
diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c index daac9fd4be7e..d17135369980 100644 --- a/net/tls/tls_sw.c +++ b/net/tls/tls_sw.c @@ -1054,7 +1054,7 @@ static int tls_sw_sendmsg_locked(struct sock *sk, struct msghdr *msg,  			if (ret == -EINPROGRESS)  				num_async++;  			else if (ret != -EAGAIN) -				goto send_end; +				goto end;  		}  	} @@ -1112,8 +1112,11 @@ alloc_encrypted:  				goto send_end;  			tls_ctx->pending_open_record_frags = true; -			if (sk_msg_full(msg_pl)) +			if (sk_msg_full(msg_pl)) {  				full_record = true; +				sk_msg_trim(sk, msg_en, +					    msg_pl->sg.size + prot->overhead_size); +			}  			if (full_record || eor)  				goto copied; @@ -1149,6 +1152,13 @@ alloc_encrypted:  				} else if (ret != -EAGAIN)  					goto send_end;  			} + +			/* Transmit if any encryptions have completed */ +			if (test_and_clear_bit(BIT_TX_SCHEDULED, &ctx->tx_bitmask)) { +				cancel_delayed_work(&ctx->tx_work.work); +				tls_tx_records(sk, msg->msg_flags); +			} +  			continue;  rollback_iter:  			copied -= try_to_copy; @@ -1204,6 +1214,12 @@ copied:  					goto send_end;  				}  			} + +			/* Transmit if any encryptions have completed */ +			if (test_and_clear_bit(BIT_TX_SCHEDULED, &ctx->tx_bitmask)) { +				cancel_delayed_work(&ctx->tx_work.work); +				tls_tx_records(sk, msg->msg_flags); +			}  		}  		continue; @@ -1223,8 +1239,9 @@ trim_sgl:  			goto alloc_encrypted;  	} +send_end:  	if (!num_async) { -		goto send_end; +		goto end;  	} else if (num_zc || eor) {  		int err; @@ -1242,7 +1259,7 @@ trim_sgl:  		tls_tx_records(sk, msg->msg_flags);  	} -send_end: +end:  	ret = sk_stream_error(sk, msg->msg_flags, ret);  	return copied > 0 ? copied : ret;  } @@ -1637,8 +1654,10 @@ static int tls_decrypt_sg(struct sock *sk, struct iov_iter *out_iov,  	if (unlikely(darg->async)) {  		err = tls_strp_msg_hold(&ctx->strp, &ctx->async_hold); -		if (err) -			__skb_queue_tail(&ctx->async_hold, darg->skb); +		if (err) { +			err = tls_decrypt_async_wait(ctx); +			darg->async = false; +		}  		return err;  	}  | 
