Commit 615580cb authored by Sabrina Dubroca's avatar Sabrina Dubroca Committed by David S. Miller
Browse files

tls: extract context alloc/initialization out of tls_set_sw_offload



Simplify tls_set_sw_offload a bit.

Signed-off-by: default avatarSabrina Dubroca <sd@queasysnail.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1c1cb311
Loading
Loading
Loading
Loading
+51 −35
Original line number Diff line number Diff line
@@ -2578,6 +2578,48 @@ void tls_update_rx_zc_capable(struct tls_context *tls_ctx)
		tls_ctx->prot_info.version != TLS_1_3_VERSION;
}

static struct tls_sw_context_tx *init_ctx_tx(struct tls_context *ctx, struct sock *sk)
{
	struct tls_sw_context_tx *sw_ctx_tx;

	if (!ctx->priv_ctx_tx) {
		sw_ctx_tx = kzalloc(sizeof(*sw_ctx_tx), GFP_KERNEL);
		if (!sw_ctx_tx)
			return NULL;
	} else {
		sw_ctx_tx = ctx->priv_ctx_tx;
	}

	crypto_init_wait(&sw_ctx_tx->async_wait);
	spin_lock_init(&sw_ctx_tx->encrypt_compl_lock);
	INIT_LIST_HEAD(&sw_ctx_tx->tx_list);
	INIT_DELAYED_WORK(&sw_ctx_tx->tx_work.work, tx_work_handler);
	sw_ctx_tx->tx_work.sk = sk;

	return sw_ctx_tx;
}

static struct tls_sw_context_rx *init_ctx_rx(struct tls_context *ctx)
{
	struct tls_sw_context_rx *sw_ctx_rx;

	if (!ctx->priv_ctx_rx) {
		sw_ctx_rx = kzalloc(sizeof(*sw_ctx_rx), GFP_KERNEL);
		if (!sw_ctx_rx)
			return NULL;
	} else {
		sw_ctx_rx = ctx->priv_ctx_rx;
	}

	crypto_init_wait(&sw_ctx_rx->async_wait);
	spin_lock_init(&sw_ctx_rx->decrypt_compl_lock);
	init_waitqueue_head(&sw_ctx_rx->wq);
	skb_queue_head_init(&sw_ctx_rx->rx_list);
	skb_queue_head_init(&sw_ctx_rx->async_hold);

	return sw_ctx_rx;
}

int tls_set_sw_offload(struct sock *sk, struct tls_context *ctx, int tx)
{
	struct tls_context *tls_ctx = tls_get_ctx(sk);
@@ -2599,48 +2641,22 @@ int tls_set_sw_offload(struct sock *sk, struct tls_context *ctx, int tx)
	}

	if (tx) {
		if (!ctx->priv_ctx_tx) {
			sw_ctx_tx = kzalloc(sizeof(*sw_ctx_tx), GFP_KERNEL);
			if (!sw_ctx_tx) {
				rc = -ENOMEM;
				goto out;
			}
			ctx->priv_ctx_tx = sw_ctx_tx;
		} else {
			sw_ctx_tx =
				(struct tls_sw_context_tx *)ctx->priv_ctx_tx;
		}
	} else {
		if (!ctx->priv_ctx_rx) {
			sw_ctx_rx = kzalloc(sizeof(*sw_ctx_rx), GFP_KERNEL);
			if (!sw_ctx_rx) {
				rc = -ENOMEM;
				goto out;
			}
			ctx->priv_ctx_rx = sw_ctx_rx;
		} else {
			sw_ctx_rx =
				(struct tls_sw_context_rx *)ctx->priv_ctx_rx;
		}
	}
		ctx->priv_ctx_tx = init_ctx_tx(ctx, sk);
		if (!ctx->priv_ctx_tx)
			return -ENOMEM;

	if (tx) {
		crypto_init_wait(&sw_ctx_tx->async_wait);
		spin_lock_init(&sw_ctx_tx->encrypt_compl_lock);
		sw_ctx_tx = ctx->priv_ctx_tx;
		crypto_info = &ctx->crypto_send.info;
		cctx = &ctx->tx;
		aead = &sw_ctx_tx->aead_send;
		INIT_LIST_HEAD(&sw_ctx_tx->tx_list);
		INIT_DELAYED_WORK(&sw_ctx_tx->tx_work.work, tx_work_handler);
		sw_ctx_tx->tx_work.sk = sk;
	} else {
		crypto_init_wait(&sw_ctx_rx->async_wait);
		spin_lock_init(&sw_ctx_rx->decrypt_compl_lock);
		init_waitqueue_head(&sw_ctx_rx->wq);
		ctx->priv_ctx_rx = init_ctx_rx(ctx);
		if (!ctx->priv_ctx_rx)
			return -ENOMEM;

		sw_ctx_rx = ctx->priv_ctx_rx;
		crypto_info = &ctx->crypto_recv.info;
		cctx = &ctx->rx;
		skb_queue_head_init(&sw_ctx_rx->rx_list);
		skb_queue_head_init(&sw_ctx_rx->async_hold);
		aead = &sw_ctx_rx->aead_recv;
	}