diff options
Diffstat (limited to 'net/tls')
| -rw-r--r-- | net/tls/tls_device.c | 5 | ||||
| -rw-r--r-- | net/tls/tls_sw.c | 6 | 
2 files changed, 10 insertions, 1 deletions
| diff --git a/net/tls/tls_device.c b/net/tls/tls_device.c index 54d3e161d198..a3ab2d3d4e4e 100644 --- a/net/tls/tls_device.c +++ b/net/tls/tls_device.c @@ -1262,6 +1262,8 @@ void tls_device_offload_cleanup_rx(struct sock *sk)  	if (tls_ctx->tx_conf != TLS_HW) {  		dev_put(netdev);  		tls_ctx->netdev = NULL; +	} else { +		set_bit(TLS_RX_DEV_CLOSED, &tls_ctx->flags);  	}  out:  	up_read(&device_offload_lock); @@ -1291,7 +1293,8 @@ static int tls_device_down(struct net_device *netdev)  		if (ctx->tx_conf == TLS_HW)  			netdev->tlsdev_ops->tls_dev_del(netdev, ctx,  							TLS_OFFLOAD_CTX_DIR_TX); -		if (ctx->rx_conf == TLS_HW) +		if (ctx->rx_conf == TLS_HW && +		    !test_bit(TLS_RX_DEV_CLOSED, &ctx->flags))  			netdev->tlsdev_ops->tls_dev_del(netdev, ctx,  							TLS_OFFLOAD_CTX_DIR_RX);  		WRITE_ONCE(ctx->netdev, NULL); diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c index 2fe9e2cf8659..845c628ac1b2 100644 --- a/net/tls/tls_sw.c +++ b/net/tls/tls_sw.c @@ -1295,6 +1295,12 @@ static struct sk_buff *tls_wait_data(struct sock *sk, struct sk_psock *psock,  			return NULL;  		} +		if (!skb_queue_empty(&sk->sk_receive_queue)) { +			__strp_unpause(&ctx->strp); +			if (ctx->recv_pkt) +				return ctx->recv_pkt; +		} +  		if (sk->sk_shutdown & RCV_SHUTDOWN)  			return NULL; |