aboutsummaryrefslogtreecommitdiffstats
path: root/net/tls/tls_sw.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/tls/tls_sw.c')
-rw-r--r--net/tls/tls_sw.c83
1 files changed, 59 insertions, 24 deletions
diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c
index 53b4ad94e74a..91d21b048a9b 100644
--- a/net/tls/tls_sw.c
+++ b/net/tls/tls_sw.c
@@ -2054,7 +2054,16 @@ static void tls_data_ready(struct sock *sk)
2054 } 2054 }
2055} 2055}
2056 2056
2057void tls_sw_free_resources_tx(struct sock *sk) 2057void tls_sw_cancel_work_tx(struct tls_context *tls_ctx)
2058{
2059 struct tls_sw_context_tx *ctx = tls_sw_ctx_tx(tls_ctx);
2060
2061 set_bit(BIT_TX_CLOSING, &ctx->tx_bitmask);
2062 set_bit(BIT_TX_SCHEDULED, &ctx->tx_bitmask);
2063 cancel_delayed_work_sync(&ctx->tx_work.work);
2064}
2065
2066void tls_sw_release_resources_tx(struct sock *sk)
2058{ 2067{
2059 struct tls_context *tls_ctx = tls_get_ctx(sk); 2068 struct tls_context *tls_ctx = tls_get_ctx(sk);
2060 struct tls_sw_context_tx *ctx = tls_sw_ctx_tx(tls_ctx); 2069 struct tls_sw_context_tx *ctx = tls_sw_ctx_tx(tls_ctx);
@@ -2065,11 +2074,6 @@ void tls_sw_free_resources_tx(struct sock *sk)
2065 if (atomic_read(&ctx->encrypt_pending)) 2074 if (atomic_read(&ctx->encrypt_pending))
2066 crypto_wait_req(-EINPROGRESS, &ctx->async_wait); 2075 crypto_wait_req(-EINPROGRESS, &ctx->async_wait);
2067 2076
2068 release_sock(sk);
2069 cancel_delayed_work_sync(&ctx->tx_work.work);
2070 lock_sock(sk);
2071
2072 /* Tx whatever records we can transmit and abandon the rest */
2073 tls_tx_records(sk, -1); 2077 tls_tx_records(sk, -1);
2074 2078
2075 /* Free up un-sent records in tx_list. First, free 2079 /* Free up un-sent records in tx_list. First, free
@@ -2092,6 +2096,11 @@ void tls_sw_free_resources_tx(struct sock *sk)
2092 2096
2093 crypto_free_aead(ctx->aead_send); 2097 crypto_free_aead(ctx->aead_send);
2094 tls_free_open_rec(sk); 2098 tls_free_open_rec(sk);
2099}
2100
2101void tls_sw_free_ctx_tx(struct tls_context *tls_ctx)
2102{
2103 struct tls_sw_context_tx *ctx = tls_sw_ctx_tx(tls_ctx);
2095 2104
2096 kfree(ctx); 2105 kfree(ctx);
2097} 2106}
@@ -2110,25 +2119,40 @@ void tls_sw_release_resources_rx(struct sock *sk)
2110 skb_queue_purge(&ctx->rx_list); 2119 skb_queue_purge(&ctx->rx_list);
2111 crypto_free_aead(ctx->aead_recv); 2120 crypto_free_aead(ctx->aead_recv);
2112 strp_stop(&ctx->strp); 2121 strp_stop(&ctx->strp);
2113 write_lock_bh(&sk->sk_callback_lock); 2122 /* If tls_sw_strparser_arm() was not called (cleanup paths)
2114 sk->sk_data_ready = ctx->saved_data_ready; 2123 * we still want to strp_stop(), but sk->sk_data_ready was
2115 write_unlock_bh(&sk->sk_callback_lock); 2124 * never swapped.
2116 release_sock(sk); 2125 */
2117 strp_done(&ctx->strp); 2126 if (ctx->saved_data_ready) {
2118 lock_sock(sk); 2127 write_lock_bh(&sk->sk_callback_lock);
2128 sk->sk_data_ready = ctx->saved_data_ready;
2129 write_unlock_bh(&sk->sk_callback_lock);
2130 }
2119 } 2131 }
2120} 2132}
2121 2133
2122void tls_sw_free_resources_rx(struct sock *sk) 2134void tls_sw_strparser_done(struct tls_context *tls_ctx)
2123{ 2135{
2124 struct tls_context *tls_ctx = tls_get_ctx(sk);
2125 struct tls_sw_context_rx *ctx = tls_sw_ctx_rx(tls_ctx); 2136 struct tls_sw_context_rx *ctx = tls_sw_ctx_rx(tls_ctx);
2126 2137
2127 tls_sw_release_resources_rx(sk); 2138 strp_done(&ctx->strp);
2139}
2140
2141void tls_sw_free_ctx_rx(struct tls_context *tls_ctx)
2142{
2143 struct tls_sw_context_rx *ctx = tls_sw_ctx_rx(tls_ctx);
2128 2144
2129 kfree(ctx); 2145 kfree(ctx);
2130} 2146}
2131 2147
2148void tls_sw_free_resources_rx(struct sock *sk)
2149{
2150 struct tls_context *tls_ctx = tls_get_ctx(sk);
2151
2152 tls_sw_release_resources_rx(sk);
2153 tls_sw_free_ctx_rx(tls_ctx);
2154}
2155
2132/* The work handler to transmitt the encrypted records in tx_list */ 2156/* The work handler to transmitt the encrypted records in tx_list */
2133static void tx_work_handler(struct work_struct *work) 2157static void tx_work_handler(struct work_struct *work)
2134{ 2158{
@@ -2137,11 +2161,17 @@ static void tx_work_handler(struct work_struct *work)
2137 struct tx_work, work); 2161 struct tx_work, work);
2138 struct sock *sk = tx_work->sk; 2162 struct sock *sk = tx_work->sk;
2139 struct tls_context *tls_ctx = tls_get_ctx(sk); 2163 struct tls_context *tls_ctx = tls_get_ctx(sk);
2140 struct tls_sw_context_tx *ctx = tls_sw_ctx_tx(tls_ctx); 2164 struct tls_sw_context_tx *ctx;
2141 2165
2142 if (!test_and_clear_bit(BIT_TX_SCHEDULED, &ctx->tx_bitmask)) 2166 if (unlikely(!tls_ctx))
2143 return; 2167 return;
2144 2168
2169 ctx = tls_sw_ctx_tx(tls_ctx);
2170 if (test_bit(BIT_TX_CLOSING, &ctx->tx_bitmask))
2171 return;
2172
2173 if (!test_and_clear_bit(BIT_TX_SCHEDULED, &ctx->tx_bitmask))
2174 return;
2145 lock_sock(sk); 2175 lock_sock(sk);
2146 tls_tx_records(sk, -1); 2176 tls_tx_records(sk, -1);
2147 release_sock(sk); 2177 release_sock(sk);
@@ -2160,6 +2190,18 @@ void tls_sw_write_space(struct sock *sk, struct tls_context *ctx)
2160 } 2190 }
2161} 2191}
2162 2192
2193void tls_sw_strparser_arm(struct sock *sk, struct tls_context *tls_ctx)
2194{
2195 struct tls_sw_context_rx *rx_ctx = tls_sw_ctx_rx(tls_ctx);
2196
2197 write_lock_bh(&sk->sk_callback_lock);
2198 rx_ctx->saved_data_ready = sk->sk_data_ready;
2199 sk->sk_data_ready = tls_data_ready;
2200 write_unlock_bh(&sk->sk_callback_lock);
2201
2202 strp_check_rcv(&rx_ctx->strp);
2203}
2204
2163int tls_set_sw_offload(struct sock *sk, struct tls_context *ctx, int tx) 2205int tls_set_sw_offload(struct sock *sk, struct tls_context *ctx, int tx)
2164{ 2206{
2165 struct tls_context *tls_ctx = tls_get_ctx(sk); 2207 struct tls_context *tls_ctx = tls_get_ctx(sk);
@@ -2357,13 +2399,6 @@ int tls_set_sw_offload(struct sock *sk, struct tls_context *ctx, int tx)
2357 cb.parse_msg = tls_read_size; 2399 cb.parse_msg = tls_read_size;
2358 2400
2359 strp_init(&sw_ctx_rx->strp, sk, &cb); 2401 strp_init(&sw_ctx_rx->strp, sk, &cb);
2360
2361 write_lock_bh(&sk->sk_callback_lock);
2362 sw_ctx_rx->saved_data_ready = sk->sk_data_ready;
2363 sk->sk_data_ready = tls_data_ready;
2364 write_unlock_bh(&sk->sk_callback_lock);
2365
2366 strp_check_rcv(&sw_ctx_rx->strp);
2367 } 2402 }
2368 2403
2369 goto out; 2404 goto out;