chtls_hw.c (12034B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Copyright (c) 2018 Chelsio Communications, Inc. 4 * 5 * Written by: Atul Gupta (atul.gupta@chelsio.com) 6 */ 7 8#include <linux/module.h> 9#include <linux/list.h> 10#include <linux/workqueue.h> 11#include <linux/skbuff.h> 12#include <linux/timer.h> 13#include <linux/notifier.h> 14#include <linux/inetdevice.h> 15#include <linux/ip.h> 16#include <linux/tcp.h> 17#include <linux/tls.h> 18#include <net/tls.h> 19 20#include "chtls.h" 21#include "chtls_cm.h" 22 23static void __set_tcb_field_direct(struct chtls_sock *csk, 24 struct cpl_set_tcb_field *req, u16 word, 25 u64 mask, u64 val, u8 cookie, int no_reply) 26{ 27 struct ulptx_idata *sc; 28 29 INIT_TP_WR_CPL(req, CPL_SET_TCB_FIELD, csk->tid); 30 req->wr.wr_mid |= htonl(FW_WR_FLOWID_V(csk->tid)); 31 req->reply_ctrl = htons(NO_REPLY_V(no_reply) | 32 QUEUENO_V(csk->rss_qid)); 33 req->word_cookie = htons(TCB_WORD_V(word) | TCB_COOKIE_V(cookie)); 34 req->mask = cpu_to_be64(mask); 35 req->val = cpu_to_be64(val); 36 sc = (struct ulptx_idata *)(req + 1); 37 sc->cmd_more = htonl(ULPTX_CMD_V(ULP_TX_SC_NOOP)); 38 sc->len = htonl(0); 39} 40 41static void __set_tcb_field(struct sock *sk, struct sk_buff *skb, u16 word, 42 u64 mask, u64 val, u8 cookie, int no_reply) 43{ 44 struct cpl_set_tcb_field *req; 45 struct chtls_sock *csk; 46 struct ulptx_idata *sc; 47 unsigned int wrlen; 48 49 wrlen = roundup(sizeof(*req) + sizeof(*sc), 16); 50 csk = rcu_dereference_sk_user_data(sk); 51 52 req = (struct cpl_set_tcb_field *)__skb_put(skb, wrlen); 53 __set_tcb_field_direct(csk, req, word, mask, val, cookie, no_reply); 54 set_wr_txq(skb, CPL_PRIORITY_CONTROL, csk->port_id); 55} 56 57/* 58 * Send control message to HW, message go as immediate data and packet 59 * is freed immediately. 60 */ 61static int chtls_set_tcb_field(struct sock *sk, u16 word, u64 mask, u64 val) 62{ 63 struct cpl_set_tcb_field *req; 64 unsigned int credits_needed; 65 struct chtls_sock *csk; 66 struct ulptx_idata *sc; 67 struct sk_buff *skb; 68 unsigned int wrlen; 69 int ret; 70 71 wrlen = roundup(sizeof(*req) + sizeof(*sc), 16); 72 73 skb = alloc_skb(wrlen, GFP_ATOMIC); 74 if (!skb) 75 return -ENOMEM; 76 77 credits_needed = DIV_ROUND_UP(wrlen, 16); 78 csk = rcu_dereference_sk_user_data(sk); 79 80 __set_tcb_field(sk, skb, word, mask, val, 0, 1); 81 skb_set_queue_mapping(skb, (csk->txq_idx << 1) | CPL_PRIORITY_DATA); 82 csk->wr_credits -= credits_needed; 83 csk->wr_unacked += credits_needed; 84 enqueue_wr(csk, skb); 85 ret = cxgb4_ofld_send(csk->egress_dev, skb); 86 if (ret < 0) 87 kfree_skb(skb); 88 return ret < 0 ? ret : 0; 89} 90 91void chtls_set_tcb_field_rpl_skb(struct sock *sk, u16 word, 92 u64 mask, u64 val, u8 cookie, 93 int through_l2t) 94{ 95 struct sk_buff *skb; 96 unsigned int wrlen; 97 98 wrlen = sizeof(struct cpl_set_tcb_field) + sizeof(struct ulptx_idata); 99 wrlen = roundup(wrlen, 16); 100 101 skb = alloc_skb(wrlen, GFP_KERNEL | __GFP_NOFAIL); 102 if (!skb) 103 return; 104 105 __set_tcb_field(sk, skb, word, mask, val, cookie, 0); 106 send_or_defer(sk, tcp_sk(sk), skb, through_l2t); 107} 108 109/* 110 * Set one of the t_flags bits in the TCB. 111 */ 112int chtls_set_tcb_tflag(struct sock *sk, unsigned int bit_pos, int val) 113{ 114 return chtls_set_tcb_field(sk, 1, 1ULL << bit_pos, 115 (u64)val << bit_pos); 116} 117 118static int chtls_set_tcb_keyid(struct sock *sk, int keyid) 119{ 120 return chtls_set_tcb_field(sk, 31, 0xFFFFFFFFULL, keyid); 121} 122 123static int chtls_set_tcb_seqno(struct sock *sk) 124{ 125 return chtls_set_tcb_field(sk, 28, ~0ULL, 0); 126} 127 128static int chtls_set_tcb_quiesce(struct sock *sk, int val) 129{ 130 return chtls_set_tcb_field(sk, 1, (1ULL << TF_RX_QUIESCE_S), 131 TF_RX_QUIESCE_V(val)); 132} 133 134void chtls_set_quiesce_ctrl(struct sock *sk, int val) 135{ 136 struct chtls_sock *csk; 137 struct sk_buff *skb; 138 unsigned int wrlen; 139 int ret; 140 141 wrlen = sizeof(struct cpl_set_tcb_field) + sizeof(struct ulptx_idata); 142 wrlen = roundup(wrlen, 16); 143 144 skb = alloc_skb(wrlen, GFP_ATOMIC); 145 if (!skb) 146 return; 147 148 csk = rcu_dereference_sk_user_data(sk); 149 150 __set_tcb_field(sk, skb, 1, TF_RX_QUIESCE_V(1), 0, 0, 1); 151 set_wr_txq(skb, CPL_PRIORITY_CONTROL, csk->port_id); 152 ret = cxgb4_ofld_send(csk->egress_dev, skb); 153 if (ret < 0) 154 kfree_skb(skb); 155} 156 157/* TLS Key bitmap processing */ 158int chtls_init_kmap(struct chtls_dev *cdev, struct cxgb4_lld_info *lldi) 159{ 160 unsigned int num_key_ctx, bsize; 161 int ksize; 162 163 num_key_ctx = (lldi->vr->key.size / TLS_KEY_CONTEXT_SZ); 164 bsize = BITS_TO_LONGS(num_key_ctx); 165 166 cdev->kmap.size = num_key_ctx; 167 cdev->kmap.available = bsize; 168 ksize = sizeof(*cdev->kmap.addr) * bsize; 169 cdev->kmap.addr = kvzalloc(ksize, GFP_KERNEL); 170 if (!cdev->kmap.addr) 171 return -ENOMEM; 172 173 cdev->kmap.start = lldi->vr->key.start; 174 spin_lock_init(&cdev->kmap.lock); 175 return 0; 176} 177 178static int get_new_keyid(struct chtls_sock *csk, u32 optname) 179{ 180 struct net_device *dev = csk->egress_dev; 181 struct chtls_dev *cdev = csk->cdev; 182 struct chtls_hws *hws; 183 struct adapter *adap; 184 int keyid; 185 186 adap = netdev2adap(dev); 187 hws = &csk->tlshws; 188 189 spin_lock_bh(&cdev->kmap.lock); 190 keyid = find_first_zero_bit(cdev->kmap.addr, cdev->kmap.size); 191 if (keyid < cdev->kmap.size) { 192 __set_bit(keyid, cdev->kmap.addr); 193 if (optname == TLS_RX) 194 hws->rxkey = keyid; 195 else 196 hws->txkey = keyid; 197 atomic_inc(&adap->chcr_stats.tls_key); 198 } else { 199 keyid = -1; 200 } 201 spin_unlock_bh(&cdev->kmap.lock); 202 return keyid; 203} 204 205void free_tls_keyid(struct sock *sk) 206{ 207 struct chtls_sock *csk = rcu_dereference_sk_user_data(sk); 208 struct net_device *dev = csk->egress_dev; 209 struct chtls_dev *cdev = csk->cdev; 210 struct chtls_hws *hws; 211 struct adapter *adap; 212 213 if (!cdev->kmap.addr) 214 return; 215 216 adap = netdev2adap(dev); 217 hws = &csk->tlshws; 218 219 spin_lock_bh(&cdev->kmap.lock); 220 if (hws->rxkey >= 0) { 221 __clear_bit(hws->rxkey, cdev->kmap.addr); 222 atomic_dec(&adap->chcr_stats.tls_key); 223 hws->rxkey = -1; 224 } 225 if (hws->txkey >= 0) { 226 __clear_bit(hws->txkey, cdev->kmap.addr); 227 atomic_dec(&adap->chcr_stats.tls_key); 228 hws->txkey = -1; 229 } 230 spin_unlock_bh(&cdev->kmap.lock); 231} 232 233unsigned int keyid_to_addr(int start_addr, int keyid) 234{ 235 return (start_addr + (keyid * TLS_KEY_CONTEXT_SZ)) >> 5; 236} 237 238static void chtls_rxkey_ivauth(struct _key_ctx *kctx) 239{ 240 kctx->iv_to_auth = cpu_to_be64(KEYCTX_TX_WR_IV_V(6ULL) | 241 KEYCTX_TX_WR_AAD_V(1ULL) | 242 KEYCTX_TX_WR_AADST_V(5ULL) | 243 KEYCTX_TX_WR_CIPHER_V(14ULL) | 244 KEYCTX_TX_WR_CIPHERST_V(0ULL) | 245 KEYCTX_TX_WR_AUTH_V(14ULL) | 246 KEYCTX_TX_WR_AUTHST_V(16ULL) | 247 KEYCTX_TX_WR_AUTHIN_V(16ULL)); 248} 249 250static int chtls_key_info(struct chtls_sock *csk, 251 struct _key_ctx *kctx, 252 u32 keylen, u32 optname, 253 int cipher_type) 254{ 255 unsigned char key[AES_MAX_KEY_SIZE]; 256 unsigned char *key_p, *salt; 257 unsigned char ghash_h[AEAD_H_SIZE]; 258 int ck_size, key_ctx_size, kctx_mackey_size, salt_size; 259 struct crypto_aes_ctx aes; 260 int ret; 261 262 key_ctx_size = sizeof(struct _key_ctx) + 263 roundup(keylen, 16) + AEAD_H_SIZE; 264 265 /* GCM mode of AES supports 128 and 256 bit encryption, so 266 * prepare key context base on GCM cipher type 267 */ 268 switch (cipher_type) { 269 case TLS_CIPHER_AES_GCM_128: { 270 struct tls12_crypto_info_aes_gcm_128 *gcm_ctx_128 = 271 (struct tls12_crypto_info_aes_gcm_128 *) 272 &csk->tlshws.crypto_info; 273 memcpy(key, gcm_ctx_128->key, keylen); 274 275 key_p = gcm_ctx_128->key; 276 salt = gcm_ctx_128->salt; 277 ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_128; 278 salt_size = TLS_CIPHER_AES_GCM_128_SALT_SIZE; 279 kctx_mackey_size = CHCR_KEYCTX_MAC_KEY_SIZE_128; 280 break; 281 } 282 case TLS_CIPHER_AES_GCM_256: { 283 struct tls12_crypto_info_aes_gcm_256 *gcm_ctx_256 = 284 (struct tls12_crypto_info_aes_gcm_256 *) 285 &csk->tlshws.crypto_info; 286 memcpy(key, gcm_ctx_256->key, keylen); 287 288 key_p = gcm_ctx_256->key; 289 salt = gcm_ctx_256->salt; 290 ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_256; 291 salt_size = TLS_CIPHER_AES_GCM_256_SALT_SIZE; 292 kctx_mackey_size = CHCR_KEYCTX_MAC_KEY_SIZE_256; 293 break; 294 } 295 default: 296 pr_err("GCM: Invalid key length %d\n", keylen); 297 return -EINVAL; 298 } 299 300 /* Calculate the H = CIPH(K, 0 repeated 16 times). 301 * It will go in key context 302 */ 303 ret = aes_expandkey(&aes, key, keylen); 304 if (ret) 305 return ret; 306 307 memset(ghash_h, 0, AEAD_H_SIZE); 308 aes_encrypt(&aes, ghash_h, ghash_h); 309 memzero_explicit(&aes, sizeof(aes)); 310 csk->tlshws.keylen = key_ctx_size; 311 312 /* Copy the Key context */ 313 if (optname == TLS_RX) { 314 int key_ctx; 315 316 key_ctx = ((key_ctx_size >> 4) << 3); 317 kctx->ctx_hdr = FILL_KEY_CRX_HDR(ck_size, 318 kctx_mackey_size, 319 0, 0, key_ctx); 320 chtls_rxkey_ivauth(kctx); 321 } else { 322 kctx->ctx_hdr = FILL_KEY_CTX_HDR(ck_size, 323 kctx_mackey_size, 324 0, 0, key_ctx_size >> 4); 325 } 326 327 memcpy(kctx->salt, salt, salt_size); 328 memcpy(kctx->key, key_p, keylen); 329 memcpy(kctx->key + keylen, ghash_h, AEAD_H_SIZE); 330 /* erase key info from driver */ 331 memset(key_p, 0, keylen); 332 333 return 0; 334} 335 336static void chtls_set_scmd(struct chtls_sock *csk) 337{ 338 struct chtls_hws *hws = &csk->tlshws; 339 340 hws->scmd.seqno_numivs = 341 SCMD_SEQ_NO_CTRL_V(3) | 342 SCMD_PROTO_VERSION_V(0) | 343 SCMD_ENC_DEC_CTRL_V(0) | 344 SCMD_CIPH_AUTH_SEQ_CTRL_V(1) | 345 SCMD_CIPH_MODE_V(2) | 346 SCMD_AUTH_MODE_V(4) | 347 SCMD_HMAC_CTRL_V(0) | 348 SCMD_IV_SIZE_V(4) | 349 SCMD_NUM_IVS_V(1); 350 351 hws->scmd.ivgen_hdrlen = 352 SCMD_IV_GEN_CTRL_V(1) | 353 SCMD_KEY_CTX_INLINE_V(0) | 354 SCMD_TLS_FRAG_ENABLE_V(1); 355} 356 357int chtls_setkey(struct chtls_sock *csk, u32 keylen, 358 u32 optname, int cipher_type) 359{ 360 struct tls_key_req *kwr; 361 struct chtls_dev *cdev; 362 struct _key_ctx *kctx; 363 int wrlen, klen, len; 364 struct sk_buff *skb; 365 struct sock *sk; 366 int keyid; 367 int kaddr; 368 int ret; 369 370 cdev = csk->cdev; 371 sk = csk->sk; 372 373 klen = roundup((keylen + AEAD_H_SIZE) + sizeof(*kctx), 32); 374 wrlen = roundup(sizeof(*kwr), 16); 375 len = klen + wrlen; 376 377 /* Flush out-standing data before new key takes effect */ 378 if (optname == TLS_TX) { 379 lock_sock(sk); 380 if (skb_queue_len(&csk->txq)) 381 chtls_push_frames(csk, 0); 382 release_sock(sk); 383 } 384 385 skb = alloc_skb(len, GFP_KERNEL); 386 if (!skb) 387 return -ENOMEM; 388 389 keyid = get_new_keyid(csk, optname); 390 if (keyid < 0) { 391 ret = -ENOSPC; 392 goto out_nokey; 393 } 394 395 kaddr = keyid_to_addr(cdev->kmap.start, keyid); 396 kwr = (struct tls_key_req *)__skb_put_zero(skb, len); 397 kwr->wr.op_to_compl = 398 cpu_to_be32(FW_WR_OP_V(FW_ULPTX_WR) | FW_WR_COMPL_F | 399 FW_WR_ATOMIC_V(1U)); 400 kwr->wr.flowid_len16 = 401 cpu_to_be32(FW_WR_LEN16_V(DIV_ROUND_UP(len, 16) | 402 FW_WR_FLOWID_V(csk->tid))); 403 kwr->wr.protocol = 0; 404 kwr->wr.mfs = htons(TLS_MFS); 405 kwr->wr.reneg_to_write_rx = optname; 406 407 /* ulptx command */ 408 kwr->req.cmd = cpu_to_be32(ULPTX_CMD_V(ULP_TX_MEM_WRITE) | 409 T5_ULP_MEMIO_ORDER_V(1) | 410 T5_ULP_MEMIO_IMM_V(1)); 411 kwr->req.len16 = cpu_to_be32((csk->tid << 8) | 412 DIV_ROUND_UP(len - sizeof(kwr->wr), 16)); 413 kwr->req.dlen = cpu_to_be32(ULP_MEMIO_DATA_LEN_V(klen >> 5)); 414 kwr->req.lock_addr = cpu_to_be32(ULP_MEMIO_ADDR_V(kaddr)); 415 416 /* sub command */ 417 kwr->sc_imm.cmd_more = cpu_to_be32(ULPTX_CMD_V(ULP_TX_SC_IMM)); 418 kwr->sc_imm.len = cpu_to_be32(klen); 419 420 lock_sock(sk); 421 /* key info */ 422 kctx = (struct _key_ctx *)(kwr + 1); 423 ret = chtls_key_info(csk, kctx, keylen, optname, cipher_type); 424 if (ret) 425 goto out_notcb; 426 427 if (unlikely(csk_flag(sk, CSK_ABORT_SHUTDOWN))) 428 goto out_notcb; 429 430 set_wr_txq(skb, CPL_PRIORITY_DATA, csk->tlshws.txqid); 431 csk->wr_credits -= DIV_ROUND_UP(len, 16); 432 csk->wr_unacked += DIV_ROUND_UP(len, 16); 433 enqueue_wr(csk, skb); 434 cxgb4_ofld_send(csk->egress_dev, skb); 435 skb = NULL; 436 437 chtls_set_scmd(csk); 438 /* Clear quiesce for Rx key */ 439 if (optname == TLS_RX) { 440 ret = chtls_set_tcb_keyid(sk, keyid); 441 if (ret) 442 goto out_notcb; 443 ret = chtls_set_tcb_field(sk, 0, 444 TCB_ULP_RAW_V(TCB_ULP_RAW_M), 445 TCB_ULP_RAW_V((TF_TLS_KEY_SIZE_V(1) | 446 TF_TLS_CONTROL_V(1) | 447 TF_TLS_ACTIVE_V(1) | 448 TF_TLS_ENABLE_V(1)))); 449 if (ret) 450 goto out_notcb; 451 ret = chtls_set_tcb_seqno(sk); 452 if (ret) 453 goto out_notcb; 454 ret = chtls_set_tcb_quiesce(sk, 0); 455 if (ret) 456 goto out_notcb; 457 csk->tlshws.rxkey = keyid; 458 } else { 459 csk->tlshws.tx_seq_no = 0; 460 csk->tlshws.txkey = keyid; 461 } 462 463 release_sock(sk); 464 return ret; 465out_notcb: 466 release_sock(sk); 467 free_tls_keyid(sk); 468out_nokey: 469 kfree_skb(skb); 470 return ret; 471}