diff options
Diffstat (limited to 'net/tls/tls_sw.c')
-rw-r--r-- | net/tls/tls_sw.c | 83 |
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 | ||
2057 | void tls_sw_free_resources_tx(struct sock *sk) | 2057 | void 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 | |||
2066 | void 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 | |||
2101 | void 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 | ||
2122 | void tls_sw_free_resources_rx(struct sock *sk) | 2134 | void 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 | |||
2141 | void 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 | ||
2148 | void 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 */ |
2133 | static void tx_work_handler(struct work_struct *work) | 2157 | static 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 | ||
2193 | void 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 | |||
2163 | int tls_set_sw_offload(struct sock *sk, struct tls_context *ctx, int tx) | 2205 | int 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; |