Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v5.9-rc5 2017 lines 57 kB view raw
1// SPDX-License-Identifier: GPL-2.0-only 2/* Copyright (C) 2020 Chelsio Communications. All rights reserved. */ 3 4#ifdef CONFIG_CHELSIO_TLS_DEVICE 5#include <linux/highmem.h> 6#include "chcr_ktls.h" 7#include "clip_tbl.h" 8 9static int chcr_init_tcb_fields(struct chcr_ktls_info *tx_info); 10/* 11 * chcr_ktls_save_keys: calculate and save crypto keys. 12 * @tx_info - driver specific tls info. 13 * @crypto_info - tls crypto information. 14 * @direction - TX/RX direction. 15 * return - SUCCESS/FAILURE. 16 */ 17static int chcr_ktls_save_keys(struct chcr_ktls_info *tx_info, 18 struct tls_crypto_info *crypto_info, 19 enum tls_offload_ctx_dir direction) 20{ 21 int ck_size, key_ctx_size, mac_key_size, keylen, ghash_size, ret; 22 unsigned char ghash_h[TLS_CIPHER_AES_GCM_256_TAG_SIZE]; 23 struct tls12_crypto_info_aes_gcm_128 *info_128_gcm; 24 struct ktls_key_ctx *kctx = &tx_info->key_ctx; 25 struct crypto_cipher *cipher; 26 unsigned char *key, *salt; 27 28 switch (crypto_info->cipher_type) { 29 case TLS_CIPHER_AES_GCM_128: 30 info_128_gcm = 31 (struct tls12_crypto_info_aes_gcm_128 *)crypto_info; 32 keylen = TLS_CIPHER_AES_GCM_128_KEY_SIZE; 33 ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_128; 34 tx_info->salt_size = TLS_CIPHER_AES_GCM_128_SALT_SIZE; 35 mac_key_size = CHCR_KEYCTX_MAC_KEY_SIZE_128; 36 tx_info->iv_size = TLS_CIPHER_AES_GCM_128_IV_SIZE; 37 tx_info->iv = be64_to_cpu(*(__be64 *)info_128_gcm->iv); 38 39 ghash_size = TLS_CIPHER_AES_GCM_128_TAG_SIZE; 40 key = info_128_gcm->key; 41 salt = info_128_gcm->salt; 42 tx_info->record_no = *(u64 *)info_128_gcm->rec_seq; 43 44 /* The SCMD fields used when encrypting a full TLS 45 * record. Its a one time calculation till the 46 * connection exists. 47 */ 48 tx_info->scmd0_seqno_numivs = 49 SCMD_SEQ_NO_CTRL_V(CHCR_SCMD_SEQ_NO_CTRL_64BIT) | 50 SCMD_CIPH_AUTH_SEQ_CTRL_F | 51 SCMD_PROTO_VERSION_V(CHCR_SCMD_PROTO_VERSION_TLS) | 52 SCMD_CIPH_MODE_V(CHCR_SCMD_CIPHER_MODE_AES_GCM) | 53 SCMD_AUTH_MODE_V(CHCR_SCMD_AUTH_MODE_GHASH) | 54 SCMD_IV_SIZE_V(TLS_CIPHER_AES_GCM_128_IV_SIZE >> 1) | 55 SCMD_NUM_IVS_V(1); 56 57 /* keys will be sent inline. */ 58 tx_info->scmd0_ivgen_hdrlen = SCMD_KEY_CTX_INLINE_F; 59 60 /* The SCMD fields used when encrypting a partial TLS 61 * record (no trailer and possibly a truncated payload). 62 */ 63 tx_info->scmd0_short_seqno_numivs = 64 SCMD_CIPH_AUTH_SEQ_CTRL_F | 65 SCMD_PROTO_VERSION_V(CHCR_SCMD_PROTO_VERSION_GENERIC) | 66 SCMD_CIPH_MODE_V(CHCR_SCMD_CIPHER_MODE_AES_CTR) | 67 SCMD_IV_SIZE_V(AES_BLOCK_LEN >> 1); 68 69 tx_info->scmd0_short_ivgen_hdrlen = 70 tx_info->scmd0_ivgen_hdrlen | SCMD_AADIVDROP_F; 71 72 break; 73 74 default: 75 pr_err("GCM: cipher type 0x%x not supported\n", 76 crypto_info->cipher_type); 77 ret = -EINVAL; 78 goto out; 79 } 80 81 key_ctx_size = CHCR_KTLS_KEY_CTX_LEN + 82 roundup(keylen, 16) + ghash_size; 83 /* Calculate the H = CIPH(K, 0 repeated 16 times). 84 * It will go in key context 85 */ 86 cipher = crypto_alloc_cipher("aes", 0, 0); 87 if (IS_ERR(cipher)) { 88 ret = -ENOMEM; 89 goto out; 90 } 91 92 ret = crypto_cipher_setkey(cipher, key, keylen); 93 if (ret) 94 goto out1; 95 96 memset(ghash_h, 0, ghash_size); 97 crypto_cipher_encrypt_one(cipher, ghash_h, ghash_h); 98 99 /* fill the Key context */ 100 if (direction == TLS_OFFLOAD_CTX_DIR_TX) { 101 kctx->ctx_hdr = FILL_KEY_CTX_HDR(ck_size, 102 mac_key_size, 103 key_ctx_size >> 4); 104 } else { 105 ret = -EINVAL; 106 goto out1; 107 } 108 109 memcpy(kctx->salt, salt, tx_info->salt_size); 110 memcpy(kctx->key, key, keylen); 111 memcpy(kctx->key + keylen, ghash_h, ghash_size); 112 tx_info->key_ctx_len = key_ctx_size; 113 114out1: 115 crypto_free_cipher(cipher); 116out: 117 return ret; 118} 119 120static int chcr_ktls_update_connection_state(struct chcr_ktls_info *tx_info, 121 int new_state) 122{ 123 /* This function can be called from both rx (interrupt context) and tx 124 * queue contexts. 125 */ 126 spin_lock_bh(&tx_info->lock); 127 switch (tx_info->connection_state) { 128 case KTLS_CONN_CLOSED: 129 tx_info->connection_state = new_state; 130 break; 131 132 case KTLS_CONN_ACT_OPEN_REQ: 133 /* only go forward if state is greater than current state. */ 134 if (new_state <= tx_info->connection_state) 135 break; 136 /* update to the next state and also initialize TCB */ 137 tx_info->connection_state = new_state; 138 fallthrough; 139 case KTLS_CONN_ACT_OPEN_RPL: 140 /* if we are stuck in this state, means tcb init might not 141 * received by HW, try sending it again. 142 */ 143 if (!chcr_init_tcb_fields(tx_info)) 144 tx_info->connection_state = KTLS_CONN_SET_TCB_REQ; 145 break; 146 147 case KTLS_CONN_SET_TCB_REQ: 148 /* only go forward if state is greater than current state. */ 149 if (new_state <= tx_info->connection_state) 150 break; 151 /* update to the next state and check if l2t_state is valid */ 152 tx_info->connection_state = new_state; 153 fallthrough; 154 case KTLS_CONN_SET_TCB_RPL: 155 /* Check if l2t state is valid, then move to ready state. */ 156 if (cxgb4_check_l2t_valid(tx_info->l2te)) { 157 tx_info->connection_state = KTLS_CONN_TX_READY; 158 atomic64_inc(&tx_info->adap->chcr_stats.ktls_tx_ctx); 159 } 160 break; 161 162 case KTLS_CONN_TX_READY: 163 /* nothing to be done here */ 164 break; 165 166 default: 167 pr_err("unknown KTLS connection state\n"); 168 break; 169 } 170 spin_unlock_bh(&tx_info->lock); 171 172 return tx_info->connection_state; 173} 174/* 175 * chcr_ktls_act_open_req: creates TCB entry for ipv4 connection. 176 * @sk - tcp socket. 177 * @tx_info - driver specific tls info. 178 * @atid - connection active tid. 179 * return - send success/failure. 180 */ 181static int chcr_ktls_act_open_req(struct sock *sk, 182 struct chcr_ktls_info *tx_info, 183 int atid) 184{ 185 struct inet_sock *inet = inet_sk(sk); 186 struct cpl_t6_act_open_req *cpl6; 187 struct cpl_act_open_req *cpl; 188 struct sk_buff *skb; 189 unsigned int len; 190 int qid_atid; 191 u64 options; 192 193 len = sizeof(*cpl6); 194 skb = alloc_skb(len, GFP_KERNEL); 195 if (unlikely(!skb)) 196 return -ENOMEM; 197 /* mark it a control pkt */ 198 set_wr_txq(skb, CPL_PRIORITY_CONTROL, tx_info->port_id); 199 200 cpl6 = __skb_put_zero(skb, len); 201 cpl = (struct cpl_act_open_req *)cpl6; 202 INIT_TP_WR(cpl6, 0); 203 qid_atid = TID_QID_V(tx_info->rx_qid) | 204 TID_TID_V(atid); 205 OPCODE_TID(cpl) = htonl(MK_OPCODE_TID(CPL_ACT_OPEN_REQ, qid_atid)); 206 cpl->local_port = inet->inet_sport; 207 cpl->peer_port = inet->inet_dport; 208 cpl->local_ip = inet->inet_rcv_saddr; 209 cpl->peer_ip = inet->inet_daddr; 210 211 /* fill first 64 bit option field. */ 212 options = TCAM_BYPASS_F | ULP_MODE_V(ULP_MODE_NONE) | NON_OFFLOAD_F | 213 SMAC_SEL_V(tx_info->smt_idx) | TX_CHAN_V(tx_info->tx_chan); 214 cpl->opt0 = cpu_to_be64(options); 215 216 /* next 64 bit option field. */ 217 options = 218 TX_QUEUE_V(tx_info->adap->params.tp.tx_modq[tx_info->tx_chan]); 219 cpl->opt2 = htonl(options); 220 221 return cxgb4_l2t_send(tx_info->netdev, skb, tx_info->l2te); 222} 223 224#if IS_ENABLED(CONFIG_IPV6) 225/* 226 * chcr_ktls_act_open_req6: creates TCB entry for ipv6 connection. 227 * @sk - tcp socket. 228 * @tx_info - driver specific tls info. 229 * @atid - connection active tid. 230 * return - send success/failure. 231 */ 232static int chcr_ktls_act_open_req6(struct sock *sk, 233 struct chcr_ktls_info *tx_info, 234 int atid) 235{ 236 struct inet_sock *inet = inet_sk(sk); 237 struct cpl_t6_act_open_req6 *cpl6; 238 struct cpl_act_open_req6 *cpl; 239 struct sk_buff *skb; 240 unsigned int len; 241 int qid_atid; 242 u64 options; 243 244 len = sizeof(*cpl6); 245 skb = alloc_skb(len, GFP_KERNEL); 246 if (unlikely(!skb)) 247 return -ENOMEM; 248 /* mark it a control pkt */ 249 set_wr_txq(skb, CPL_PRIORITY_CONTROL, tx_info->port_id); 250 251 cpl6 = __skb_put_zero(skb, len); 252 cpl = (struct cpl_act_open_req6 *)cpl6; 253 INIT_TP_WR(cpl6, 0); 254 qid_atid = TID_QID_V(tx_info->rx_qid) | TID_TID_V(atid); 255 OPCODE_TID(cpl) = htonl(MK_OPCODE_TID(CPL_ACT_OPEN_REQ6, qid_atid)); 256 cpl->local_port = inet->inet_sport; 257 cpl->peer_port = inet->inet_dport; 258 cpl->local_ip_hi = *(__be64 *)&sk->sk_v6_rcv_saddr.in6_u.u6_addr8[0]; 259 cpl->local_ip_lo = *(__be64 *)&sk->sk_v6_rcv_saddr.in6_u.u6_addr8[8]; 260 cpl->peer_ip_hi = *(__be64 *)&sk->sk_v6_daddr.in6_u.u6_addr8[0]; 261 cpl->peer_ip_lo = *(__be64 *)&sk->sk_v6_daddr.in6_u.u6_addr8[8]; 262 263 /* first 64 bit option field. */ 264 options = TCAM_BYPASS_F | ULP_MODE_V(ULP_MODE_NONE) | NON_OFFLOAD_F | 265 SMAC_SEL_V(tx_info->smt_idx) | TX_CHAN_V(tx_info->tx_chan); 266 cpl->opt0 = cpu_to_be64(options); 267 /* next 64 bit option field. */ 268 options = 269 TX_QUEUE_V(tx_info->adap->params.tp.tx_modq[tx_info->tx_chan]); 270 cpl->opt2 = htonl(options); 271 272 return cxgb4_l2t_send(tx_info->netdev, skb, tx_info->l2te); 273} 274#endif /* #if IS_ENABLED(CONFIG_IPV6) */ 275 276/* 277 * chcr_setup_connection: create a TCB entry so that TP will form tcp packets. 278 * @sk - tcp socket. 279 * @tx_info - driver specific tls info. 280 * return: NET_TX_OK/NET_XMIT_DROP 281 */ 282static int chcr_setup_connection(struct sock *sk, 283 struct chcr_ktls_info *tx_info) 284{ 285 struct tid_info *t = &tx_info->adap->tids; 286 int atid, ret = 0; 287 288 atid = cxgb4_alloc_atid(t, tx_info); 289 if (atid == -1) 290 return -EINVAL; 291 292 tx_info->atid = atid; 293 tx_info->ip_family = sk->sk_family; 294 295 if (sk->sk_family == AF_INET) { 296 tx_info->ip_family = AF_INET; 297 ret = chcr_ktls_act_open_req(sk, tx_info, atid); 298#if IS_ENABLED(CONFIG_IPV6) 299 } else { 300 if (!sk->sk_ipv6only && 301 ipv6_addr_type(&sk->sk_v6_daddr) == IPV6_ADDR_MAPPED) { 302 tx_info->ip_family = AF_INET; 303 ret = chcr_ktls_act_open_req(sk, tx_info, atid); 304 } else { 305 tx_info->ip_family = AF_INET6; 306 ret = cxgb4_clip_get(tx_info->netdev, 307 (const u32 *) 308 &sk->sk_v6_rcv_saddr.s6_addr, 309 1); 310 if (ret) 311 goto out; 312 ret = chcr_ktls_act_open_req6(sk, tx_info, atid); 313 } 314#endif 315 } 316 317 /* if return type is NET_XMIT_CN, msg will be sent but delayed, mark ret 318 * success, if any other return type clear atid and return that failure. 319 */ 320 if (ret) { 321 if (ret == NET_XMIT_CN) 322 ret = 0; 323 else 324 cxgb4_free_atid(t, atid); 325 goto out; 326 } 327 328 /* update the connection state */ 329 chcr_ktls_update_connection_state(tx_info, KTLS_CONN_ACT_OPEN_REQ); 330out: 331 return ret; 332} 333 334/* 335 * chcr_set_tcb_field: update tcb fields. 336 * @tx_info - driver specific tls info. 337 * @word - TCB word. 338 * @mask - TCB word related mask. 339 * @val - TCB word related value. 340 * @no_reply - set 1 if not looking for TP response. 341 */ 342static int chcr_set_tcb_field(struct chcr_ktls_info *tx_info, u16 word, 343 u64 mask, u64 val, int no_reply) 344{ 345 struct cpl_set_tcb_field *req; 346 struct sk_buff *skb; 347 348 skb = alloc_skb(sizeof(struct cpl_set_tcb_field), GFP_ATOMIC); 349 if (!skb) 350 return -ENOMEM; 351 352 req = (struct cpl_set_tcb_field *)__skb_put_zero(skb, sizeof(*req)); 353 INIT_TP_WR_CPL(req, CPL_SET_TCB_FIELD, tx_info->tid); 354 req->reply_ctrl = htons(QUEUENO_V(tx_info->rx_qid) | 355 NO_REPLY_V(no_reply)); 356 req->word_cookie = htons(TCB_WORD_V(word)); 357 req->mask = cpu_to_be64(mask); 358 req->val = cpu_to_be64(val); 359 360 set_wr_txq(skb, CPL_PRIORITY_CONTROL, tx_info->port_id); 361 return cxgb4_ofld_send(tx_info->netdev, skb); 362} 363 364/* 365 * chcr_ktls_mark_tcb_close: mark tcb state to CLOSE 366 * @tx_info - driver specific tls info. 367 * return: NET_TX_OK/NET_XMIT_DROP. 368 */ 369static int chcr_ktls_mark_tcb_close(struct chcr_ktls_info *tx_info) 370{ 371 return chcr_set_tcb_field(tx_info, TCB_T_STATE_W, 372 TCB_T_STATE_V(TCB_T_STATE_M), 373 CHCR_TCB_STATE_CLOSED, 1); 374} 375 376/* 377 * chcr_ktls_dev_del: call back for tls_dev_del. 378 * Remove the tid and l2t entry and close the connection. 379 * it per connection basis. 380 * @netdev - net device. 381 * @tls_cts - tls context. 382 * @direction - TX/RX crypto direction 383 */ 384void chcr_ktls_dev_del(struct net_device *netdev, 385 struct tls_context *tls_ctx, 386 enum tls_offload_ctx_dir direction) 387{ 388 struct chcr_ktls_ofld_ctx_tx *tx_ctx = 389 chcr_get_ktls_tx_context(tls_ctx); 390 struct chcr_ktls_info *tx_info = tx_ctx->chcr_info; 391 struct sock *sk; 392 393 if (!tx_info) 394 return; 395 sk = tx_info->sk; 396 397 spin_lock(&tx_info->lock); 398 tx_info->connection_state = KTLS_CONN_CLOSED; 399 spin_unlock(&tx_info->lock); 400 401 /* clear l2t entry */ 402 if (tx_info->l2te) 403 cxgb4_l2t_release(tx_info->l2te); 404 405#if IS_ENABLED(CONFIG_IPV6) 406 /* clear clip entry */ 407 if (tx_info->ip_family == AF_INET6) 408 cxgb4_clip_release(netdev, 409 (const u32 *)&sk->sk_v6_daddr.in6_u.u6_addr8, 410 1); 411#endif 412 413 /* clear tid */ 414 if (tx_info->tid != -1) { 415 /* clear tcb state and then release tid */ 416 chcr_ktls_mark_tcb_close(tx_info); 417 cxgb4_remove_tid(&tx_info->adap->tids, tx_info->tx_chan, 418 tx_info->tid, tx_info->ip_family); 419 } 420 421 atomic64_inc(&tx_info->adap->chcr_stats.ktls_tx_connection_close); 422 kvfree(tx_info); 423 tx_ctx->chcr_info = NULL; 424 /* release module refcount */ 425 module_put(THIS_MODULE); 426} 427 428/* 429 * chcr_ktls_dev_add: call back for tls_dev_add. 430 * Create a tcb entry for TP. Also add l2t entry for the connection. And 431 * generate keys & save those keys locally. 432 * @netdev - net device. 433 * @tls_cts - tls context. 434 * @direction - TX/RX crypto direction 435 * return: SUCCESS/FAILURE. 436 */ 437int chcr_ktls_dev_add(struct net_device *netdev, struct sock *sk, 438 enum tls_offload_ctx_dir direction, 439 struct tls_crypto_info *crypto_info, 440 u32 start_offload_tcp_sn) 441{ 442 struct tls_context *tls_ctx = tls_get_ctx(sk); 443 struct chcr_ktls_ofld_ctx_tx *tx_ctx; 444 struct chcr_ktls_info *tx_info; 445 struct dst_entry *dst; 446 struct adapter *adap; 447 struct port_info *pi; 448 struct neighbour *n; 449 u8 daaddr[16]; 450 int ret = -1; 451 452 tx_ctx = chcr_get_ktls_tx_context(tls_ctx); 453 454 pi = netdev_priv(netdev); 455 adap = pi->adapter; 456 if (direction == TLS_OFFLOAD_CTX_DIR_RX) { 457 pr_err("not expecting for RX direction\n"); 458 ret = -EINVAL; 459 goto out; 460 } 461 if (tx_ctx->chcr_info) { 462 ret = -EINVAL; 463 goto out; 464 } 465 466 tx_info = kvzalloc(sizeof(*tx_info), GFP_KERNEL); 467 if (!tx_info) { 468 ret = -ENOMEM; 469 goto out; 470 } 471 472 spin_lock_init(&tx_info->lock); 473 474 /* clear connection state */ 475 spin_lock(&tx_info->lock); 476 tx_info->connection_state = KTLS_CONN_CLOSED; 477 spin_unlock(&tx_info->lock); 478 479 tx_info->sk = sk; 480 /* initialize tid and atid to -1, 0 is a also a valid id. */ 481 tx_info->tid = -1; 482 tx_info->atid = -1; 483 484 tx_info->adap = adap; 485 tx_info->netdev = netdev; 486 tx_info->first_qset = pi->first_qset; 487 tx_info->tx_chan = pi->tx_chan; 488 tx_info->smt_idx = pi->smt_idx; 489 tx_info->port_id = pi->port_id; 490 491 tx_info->rx_qid = chcr_get_first_rx_qid(adap); 492 if (unlikely(tx_info->rx_qid < 0)) 493 goto out2; 494 495 tx_info->prev_seq = start_offload_tcp_sn; 496 tx_info->tcp_start_seq_number = start_offload_tcp_sn; 497 498 /* save crypto keys */ 499 ret = chcr_ktls_save_keys(tx_info, crypto_info, direction); 500 if (ret < 0) 501 goto out2; 502 503 /* get peer ip */ 504 if (sk->sk_family == AF_INET) { 505 memcpy(daaddr, &sk->sk_daddr, 4); 506#if IS_ENABLED(CONFIG_IPV6) 507 } else { 508 if (!sk->sk_ipv6only && 509 ipv6_addr_type(&sk->sk_v6_daddr) == IPV6_ADDR_MAPPED) 510 memcpy(daaddr, &sk->sk_daddr, 4); 511 else 512 memcpy(daaddr, sk->sk_v6_daddr.in6_u.u6_addr8, 16); 513#endif 514 } 515 516 /* get the l2t index */ 517 dst = sk_dst_get(sk); 518 if (!dst) { 519 pr_err("DST entry not found\n"); 520 goto out2; 521 } 522 n = dst_neigh_lookup(dst, daaddr); 523 if (!n || !n->dev) { 524 pr_err("neighbour not found\n"); 525 dst_release(dst); 526 goto out2; 527 } 528 tx_info->l2te = cxgb4_l2t_get(adap->l2t, n, n->dev, 0); 529 530 neigh_release(n); 531 dst_release(dst); 532 533 if (!tx_info->l2te) { 534 pr_err("l2t entry not found\n"); 535 goto out2; 536 } 537 538 tx_ctx->chcr_info = tx_info; 539 540 /* create a filter and call cxgb4_l2t_send to send the packet out, which 541 * will take care of updating l2t entry in hw if not already done. 542 */ 543 ret = chcr_setup_connection(sk, tx_info); 544 if (ret) 545 goto out2; 546 547 /* Driver shouldn't be removed until any single connection exists */ 548 if (!try_module_get(THIS_MODULE)) { 549 ret = -EINVAL; 550 goto out2; 551 } 552 553 atomic64_inc(&adap->chcr_stats.ktls_tx_connection_open); 554 return 0; 555out2: 556 kvfree(tx_info); 557out: 558 atomic64_inc(&adap->chcr_stats.ktls_tx_connection_fail); 559 return ret; 560} 561 562/* 563 * chcr_init_tcb_fields: Initialize tcb fields to handle TCP seq number 564 * handling. 565 * @tx_info - driver specific tls info. 566 * return: NET_TX_OK/NET_XMIT_DROP 567 */ 568static int chcr_init_tcb_fields(struct chcr_ktls_info *tx_info) 569{ 570 int ret = 0; 571 572 /* set tcb in offload and bypass */ 573 ret = 574 chcr_set_tcb_field(tx_info, TCB_T_FLAGS_W, 575 TCB_T_FLAGS_V(TF_CORE_BYPASS_F | TF_NON_OFFLOAD_F), 576 TCB_T_FLAGS_V(TF_CORE_BYPASS_F), 1); 577 if (ret) 578 return ret; 579 /* reset snd_una and snd_next fields in tcb */ 580 ret = chcr_set_tcb_field(tx_info, TCB_SND_UNA_RAW_W, 581 TCB_SND_NXT_RAW_V(TCB_SND_NXT_RAW_M) | 582 TCB_SND_UNA_RAW_V(TCB_SND_UNA_RAW_M), 583 0, 1); 584 if (ret) 585 return ret; 586 587 /* reset send max */ 588 ret = chcr_set_tcb_field(tx_info, TCB_SND_MAX_RAW_W, 589 TCB_SND_MAX_RAW_V(TCB_SND_MAX_RAW_M), 590 0, 1); 591 if (ret) 592 return ret; 593 594 /* update l2t index and request for tp reply to confirm tcb is 595 * initialised to handle tx traffic. 596 */ 597 ret = chcr_set_tcb_field(tx_info, TCB_L2T_IX_W, 598 TCB_L2T_IX_V(TCB_L2T_IX_M), 599 TCB_L2T_IX_V(tx_info->l2te->idx), 0); 600 return ret; 601} 602 603/* 604 * chcr_ktls_cpl_act_open_rpl: connection reply received from TP. 605 */ 606int chcr_ktls_cpl_act_open_rpl(struct adapter *adap, unsigned char *input) 607{ 608 const struct cpl_act_open_rpl *p = (void *)input; 609 struct chcr_ktls_info *tx_info = NULL; 610 unsigned int atid, tid, status; 611 struct tid_info *t; 612 613 tid = GET_TID(p); 614 status = AOPEN_STATUS_G(ntohl(p->atid_status)); 615 atid = TID_TID_G(AOPEN_ATID_G(ntohl(p->atid_status))); 616 617 t = &adap->tids; 618 tx_info = lookup_atid(t, atid); 619 620 if (!tx_info || tx_info->atid != atid) { 621 pr_err("tx_info or atid is not correct\n"); 622 return -1; 623 } 624 625 if (!status) { 626 tx_info->tid = tid; 627 cxgb4_insert_tid(t, tx_info, tx_info->tid, tx_info->ip_family); 628 629 cxgb4_free_atid(t, atid); 630 tx_info->atid = -1; 631 /* update the connection state */ 632 chcr_ktls_update_connection_state(tx_info, 633 KTLS_CONN_ACT_OPEN_RPL); 634 } 635 return 0; 636} 637 638/* 639 * chcr_ktls_cpl_set_tcb_rpl: TCB reply received from TP. 640 */ 641int chcr_ktls_cpl_set_tcb_rpl(struct adapter *adap, unsigned char *input) 642{ 643 const struct cpl_set_tcb_rpl *p = (void *)input; 644 struct chcr_ktls_info *tx_info = NULL; 645 struct tid_info *t; 646 u32 tid; 647 648 tid = GET_TID(p); 649 650 t = &adap->tids; 651 tx_info = lookup_tid(t, tid); 652 if (!tx_info || tx_info->tid != tid) { 653 pr_err("tx_info or atid is not correct\n"); 654 return -1; 655 } 656 /* update the connection state */ 657 chcr_ktls_update_connection_state(tx_info, KTLS_CONN_SET_TCB_RPL); 658 return 0; 659} 660 661static void *__chcr_write_cpl_set_tcb_ulp(struct chcr_ktls_info *tx_info, 662 u32 tid, void *pos, u16 word, u64 mask, 663 u64 val, u32 reply) 664{ 665 struct cpl_set_tcb_field_core *cpl; 666 struct ulptx_idata *idata; 667 struct ulp_txpkt *txpkt; 668 669 /* ULP_TXPKT */ 670 txpkt = pos; 671 txpkt->cmd_dest = htonl(ULPTX_CMD_V(ULP_TX_PKT) | ULP_TXPKT_DEST_V(0)); 672 txpkt->len = htonl(DIV_ROUND_UP(CHCR_SET_TCB_FIELD_LEN, 16)); 673 674 /* ULPTX_IDATA sub-command */ 675 idata = (struct ulptx_idata *)(txpkt + 1); 676 idata->cmd_more = htonl(ULPTX_CMD_V(ULP_TX_SC_IMM)); 677 idata->len = htonl(sizeof(*cpl)); 678 pos = idata + 1; 679 680 cpl = pos; 681 /* CPL_SET_TCB_FIELD */ 682 OPCODE_TID(cpl) = htonl(MK_OPCODE_TID(CPL_SET_TCB_FIELD, tid)); 683 cpl->reply_ctrl = htons(QUEUENO_V(tx_info->rx_qid) | 684 NO_REPLY_V(!reply)); 685 cpl->word_cookie = htons(TCB_WORD_V(word)); 686 cpl->mask = cpu_to_be64(mask); 687 cpl->val = cpu_to_be64(val); 688 689 /* ULPTX_NOOP */ 690 idata = (struct ulptx_idata *)(cpl + 1); 691 idata->cmd_more = htonl(ULPTX_CMD_V(ULP_TX_SC_NOOP)); 692 idata->len = htonl(0); 693 pos = idata + 1; 694 695 return pos; 696} 697 698 699/* 700 * chcr_write_cpl_set_tcb_ulp: update tcb values. 701 * TCB is responsible to create tcp headers, so all the related values 702 * should be correctly updated. 703 * @tx_info - driver specific tls info. 704 * @q - tx queue on which packet is going out. 705 * @tid - TCB identifier. 706 * @pos - current index where should we start writing. 707 * @word - TCB word. 708 * @mask - TCB word related mask. 709 * @val - TCB word related value. 710 * @reply - set 1 if looking for TP response. 711 * return - next position to write. 712 */ 713static void *chcr_write_cpl_set_tcb_ulp(struct chcr_ktls_info *tx_info, 714 struct sge_eth_txq *q, u32 tid, 715 void *pos, u16 word, u64 mask, 716 u64 val, u32 reply) 717{ 718 int left = (void *)q->q.stat - pos; 719 720 if (unlikely(left < CHCR_SET_TCB_FIELD_LEN)) { 721 if (!left) { 722 pos = q->q.desc; 723 } else { 724 u8 buf[48] = {0}; 725 726 __chcr_write_cpl_set_tcb_ulp(tx_info, tid, buf, word, 727 mask, val, reply); 728 729 return chcr_copy_to_txd(buf, &q->q, pos, 730 CHCR_SET_TCB_FIELD_LEN); 731 } 732 } 733 734 pos = __chcr_write_cpl_set_tcb_ulp(tx_info, tid, pos, word, 735 mask, val, reply); 736 737 /* check again if we are at the end of the queue */ 738 if (left == CHCR_SET_TCB_FIELD_LEN) 739 pos = q->q.desc; 740 741 return pos; 742} 743 744/* 745 * chcr_ktls_xmit_tcb_cpls: update tcb entry so that TP will create the header 746 * with updated values like tcp seq, ack, window etc. 747 * @tx_info - driver specific tls info. 748 * @q - TX queue. 749 * @tcp_seq 750 * @tcp_ack 751 * @tcp_win 752 * return: NETDEV_TX_BUSY/NET_TX_OK. 753 */ 754static int chcr_ktls_xmit_tcb_cpls(struct chcr_ktls_info *tx_info, 755 struct sge_eth_txq *q, u64 tcp_seq, 756 u64 tcp_ack, u64 tcp_win) 757{ 758 bool first_wr = ((tx_info->prev_ack == 0) && (tx_info->prev_win == 0)); 759 u32 len, cpl = 0, ndesc, wr_len; 760 struct fw_ulptx_wr *wr; 761 int credits; 762 void *pos; 763 764 wr_len = sizeof(*wr); 765 /* there can be max 4 cpls, check if we have enough credits */ 766 len = wr_len + 4 * roundup(CHCR_SET_TCB_FIELD_LEN, 16); 767 ndesc = DIV_ROUND_UP(len, 64); 768 769 credits = chcr_txq_avail(&q->q) - ndesc; 770 if (unlikely(credits < 0)) { 771 chcr_eth_txq_stop(q); 772 return NETDEV_TX_BUSY; 773 } 774 775 pos = &q->q.desc[q->q.pidx]; 776 /* make space for WR, we'll fill it later when we know all the cpls 777 * being sent out and have complete length. 778 */ 779 wr = pos; 780 pos += wr_len; 781 /* update tx_max if its a re-transmit or the first wr */ 782 if (first_wr || tcp_seq != tx_info->prev_seq) { 783 pos = chcr_write_cpl_set_tcb_ulp(tx_info, q, tx_info->tid, pos, 784 TCB_TX_MAX_W, 785 TCB_TX_MAX_V(TCB_TX_MAX_M), 786 TCB_TX_MAX_V(tcp_seq), 0); 787 cpl++; 788 } 789 /* reset snd una if it's a re-transmit pkt */ 790 if (tcp_seq != tx_info->prev_seq) { 791 /* reset snd_una */ 792 pos = chcr_write_cpl_set_tcb_ulp(tx_info, q, tx_info->tid, pos, 793 TCB_SND_UNA_RAW_W, 794 TCB_SND_UNA_RAW_V 795 (TCB_SND_UNA_RAW_M), 796 TCB_SND_UNA_RAW_V(0), 0); 797 atomic64_inc(&tx_info->adap->chcr_stats.ktls_tx_ooo); 798 cpl++; 799 } 800 /* update ack */ 801 if (first_wr || tx_info->prev_ack != tcp_ack) { 802 pos = chcr_write_cpl_set_tcb_ulp(tx_info, q, tx_info->tid, pos, 803 TCB_RCV_NXT_W, 804 TCB_RCV_NXT_V(TCB_RCV_NXT_M), 805 TCB_RCV_NXT_V(tcp_ack), 0); 806 tx_info->prev_ack = tcp_ack; 807 cpl++; 808 } 809 /* update receive window */ 810 if (first_wr || tx_info->prev_win != tcp_win) { 811 pos = chcr_write_cpl_set_tcb_ulp(tx_info, q, tx_info->tid, pos, 812 TCB_RCV_WND_W, 813 TCB_RCV_WND_V(TCB_RCV_WND_M), 814 TCB_RCV_WND_V(tcp_win), 0); 815 tx_info->prev_win = tcp_win; 816 cpl++; 817 } 818 819 if (cpl) { 820 /* get the actual length */ 821 len = wr_len + cpl * roundup(CHCR_SET_TCB_FIELD_LEN, 16); 822 /* ULPTX wr */ 823 wr->op_to_compl = htonl(FW_WR_OP_V(FW_ULPTX_WR)); 824 wr->cookie = 0; 825 /* fill len in wr field */ 826 wr->flowid_len16 = htonl(FW_WR_LEN16_V(DIV_ROUND_UP(len, 16))); 827 828 ndesc = DIV_ROUND_UP(len, 64); 829 chcr_txq_advance(&q->q, ndesc); 830 cxgb4_ring_tx_db(tx_info->adap, &q->q, ndesc); 831 } 832 return 0; 833} 834 835/* 836 * chcr_ktls_skb_copy 837 * @nskb - new skb where the frags to be added. 838 * @skb - old skb from which frags will be copied. 839 */ 840static void chcr_ktls_skb_copy(struct sk_buff *skb, struct sk_buff *nskb) 841{ 842 int i; 843 844 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { 845 skb_shinfo(nskb)->frags[i] = skb_shinfo(skb)->frags[i]; 846 __skb_frag_ref(&skb_shinfo(nskb)->frags[i]); 847 } 848 849 skb_shinfo(nskb)->nr_frags = skb_shinfo(skb)->nr_frags; 850 nskb->len += skb->data_len; 851 nskb->data_len = skb->data_len; 852 nskb->truesize += skb->data_len; 853} 854 855/* 856 * chcr_ktls_get_tx_flits 857 * returns number of flits to be sent out, it includes key context length, WR 858 * size and skb fragments. 859 */ 860static unsigned int 861chcr_ktls_get_tx_flits(const struct sk_buff *skb, unsigned int key_ctx_len) 862{ 863 return chcr_sgl_len(skb_shinfo(skb)->nr_frags) + 864 DIV_ROUND_UP(key_ctx_len + CHCR_KTLS_WR_SIZE, 8); 865} 866 867/* 868 * chcr_ktls_check_tcp_options: To check if there is any TCP option availbale 869 * other than timestamp. 870 * @skb - skb contains partial record.. 871 * return: 1 / 0 872 */ 873static int 874chcr_ktls_check_tcp_options(struct tcphdr *tcp) 875{ 876 int cnt, opt, optlen; 877 u_char *cp; 878 879 cp = (u_char *)(tcp + 1); 880 cnt = (tcp->doff << 2) - sizeof(struct tcphdr); 881 for (; cnt > 0; cnt -= optlen, cp += optlen) { 882 opt = cp[0]; 883 if (opt == TCPOPT_EOL) 884 break; 885 if (opt == TCPOPT_NOP) { 886 optlen = 1; 887 } else { 888 if (cnt < 2) 889 break; 890 optlen = cp[1]; 891 if (optlen < 2 || optlen > cnt) 892 break; 893 } 894 switch (opt) { 895 case TCPOPT_NOP: 896 break; 897 default: 898 return 1; 899 } 900 } 901 return 0; 902} 903 904/* 905 * chcr_ktls_write_tcp_options : TP can't send out all the options, we need to 906 * send out separately. 907 * @tx_info - driver specific tls info. 908 * @skb - skb contains partial record.. 909 * @q - TX queue. 910 * @tx_chan - channel number. 911 * return: NETDEV_TX_OK/NETDEV_TX_BUSY. 912 */ 913static int 914chcr_ktls_write_tcp_options(struct chcr_ktls_info *tx_info, struct sk_buff *skb, 915 struct sge_eth_txq *q, uint32_t tx_chan) 916{ 917 struct fw_eth_tx_pkt_wr *wr; 918 struct cpl_tx_pkt_core *cpl; 919 u32 ctrl, iplen, maclen; 920#if IS_ENABLED(CONFIG_IPV6) 921 struct ipv6hdr *ip6; 922#endif 923 unsigned int ndesc; 924 struct tcphdr *tcp; 925 int len16, pktlen; 926 struct iphdr *ip; 927 int credits; 928 u8 buf[150]; 929 void *pos; 930 931 iplen = skb_network_header_len(skb); 932 maclen = skb_mac_header_len(skb); 933 934 /* packet length = eth hdr len + ip hdr len + tcp hdr len 935 * (including options). 936 */ 937 pktlen = skb->len - skb->data_len; 938 939 ctrl = sizeof(*cpl) + pktlen; 940 len16 = DIV_ROUND_UP(sizeof(*wr) + ctrl, 16); 941 /* check how many descriptors needed */ 942 ndesc = DIV_ROUND_UP(len16, 4); 943 944 credits = chcr_txq_avail(&q->q) - ndesc; 945 if (unlikely(credits < 0)) { 946 chcr_eth_txq_stop(q); 947 return NETDEV_TX_BUSY; 948 } 949 950 pos = &q->q.desc[q->q.pidx]; 951 wr = pos; 952 953 /* Firmware work request header */ 954 wr->op_immdlen = htonl(FW_WR_OP_V(FW_ETH_TX_PKT_WR) | 955 FW_WR_IMMDLEN_V(ctrl)); 956 957 wr->equiq_to_len16 = htonl(FW_WR_LEN16_V(len16)); 958 wr->r3 = 0; 959 960 cpl = (void *)(wr + 1); 961 962 /* CPL header */ 963 cpl->ctrl0 = htonl(TXPKT_OPCODE_V(CPL_TX_PKT) | TXPKT_INTF_V(tx_chan) | 964 TXPKT_PF_V(tx_info->adap->pf)); 965 cpl->pack = 0; 966 cpl->len = htons(pktlen); 967 /* checksum offload */ 968 cpl->ctrl1 = 0; 969 970 pos = cpl + 1; 971 972 memcpy(buf, skb->data, pktlen); 973 if (tx_info->ip_family == AF_INET) { 974 /* we need to correct ip header len */ 975 ip = (struct iphdr *)(buf + maclen); 976 ip->tot_len = htons(pktlen - maclen); 977#if IS_ENABLED(CONFIG_IPV6) 978 } else { 979 ip6 = (struct ipv6hdr *)(buf + maclen); 980 ip6->payload_len = htons(pktlen - maclen - iplen); 981#endif 982 } 983 /* now take care of the tcp header, if fin is not set then clear push 984 * bit as well, and if fin is set, it will be sent at the last so we 985 * need to update the tcp sequence number as per the last packet. 986 */ 987 tcp = (struct tcphdr *)(buf + maclen + iplen); 988 989 if (!tcp->fin) 990 tcp->psh = 0; 991 else 992 tcp->seq = htonl(tx_info->prev_seq); 993 994 chcr_copy_to_txd(buf, &q->q, pos, pktlen); 995 996 chcr_txq_advance(&q->q, ndesc); 997 cxgb4_ring_tx_db(tx_info->adap, &q->q, ndesc); 998 return 0; 999} 1000 1001/* chcr_ktls_skb_shift - Shifts request length paged data from skb to another. 1002 * @tgt- buffer into which tail data gets added 1003 * @skb- buffer from which the paged data comes from 1004 * @shiftlen- shift up to this many bytes 1005 */ 1006static int chcr_ktls_skb_shift(struct sk_buff *tgt, struct sk_buff *skb, 1007 int shiftlen) 1008{ 1009 skb_frag_t *fragfrom, *fragto; 1010 int from, to, todo; 1011 1012 WARN_ON(shiftlen > skb->data_len); 1013 1014 todo = shiftlen; 1015 from = 0; 1016 to = 0; 1017 fragfrom = &skb_shinfo(skb)->frags[from]; 1018 1019 while ((todo > 0) && (from < skb_shinfo(skb)->nr_frags)) { 1020 fragfrom = &skb_shinfo(skb)->frags[from]; 1021 fragto = &skb_shinfo(tgt)->frags[to]; 1022 1023 if (todo >= skb_frag_size(fragfrom)) { 1024 *fragto = *fragfrom; 1025 todo -= skb_frag_size(fragfrom); 1026 from++; 1027 to++; 1028 1029 } else { 1030 __skb_frag_ref(fragfrom); 1031 skb_frag_page_copy(fragto, fragfrom); 1032 skb_frag_off_copy(fragto, fragfrom); 1033 skb_frag_size_set(fragto, todo); 1034 1035 skb_frag_off_add(fragfrom, todo); 1036 skb_frag_size_sub(fragfrom, todo); 1037 todo = 0; 1038 1039 to++; 1040 break; 1041 } 1042 } 1043 1044 /* Ready to "commit" this state change to tgt */ 1045 skb_shinfo(tgt)->nr_frags = to; 1046 1047 /* Reposition in the original skb */ 1048 to = 0; 1049 while (from < skb_shinfo(skb)->nr_frags) 1050 skb_shinfo(skb)->frags[to++] = skb_shinfo(skb)->frags[from++]; 1051 1052 skb_shinfo(skb)->nr_frags = to; 1053 1054 WARN_ON(todo > 0 && !skb_shinfo(skb)->nr_frags); 1055 1056 skb->len -= shiftlen; 1057 skb->data_len -= shiftlen; 1058 skb->truesize -= shiftlen; 1059 tgt->len += shiftlen; 1060 tgt->data_len += shiftlen; 1061 tgt->truesize += shiftlen; 1062 1063 return shiftlen; 1064} 1065 1066/* 1067 * chcr_ktls_xmit_wr_complete: This sends out the complete record. If an skb 1068 * received has partial end part of the record, send out the complete record, so 1069 * that crypto block will be able to generate TAG/HASH. 1070 * @skb - segment which has complete or partial end part. 1071 * @tx_info - driver specific tls info. 1072 * @q - TX queue. 1073 * @tcp_seq 1074 * @tcp_push - tcp push bit. 1075 * @mss - segment size. 1076 * return: NETDEV_TX_BUSY/NET_TX_OK. 1077 */ 1078static int chcr_ktls_xmit_wr_complete(struct sk_buff *skb, 1079 struct chcr_ktls_info *tx_info, 1080 struct sge_eth_txq *q, u32 tcp_seq, 1081 bool tcp_push, u32 mss) 1082{ 1083 u32 len16, wr_mid = 0, flits = 0, ndesc, cipher_start; 1084 struct adapter *adap = tx_info->adap; 1085 int credits, left, last_desc; 1086 struct tx_sw_desc *sgl_sdesc; 1087 struct cpl_tx_data *tx_data; 1088 struct cpl_tx_sec_pdu *cpl; 1089 struct ulptx_idata *idata; 1090 struct ulp_txpkt *ulptx; 1091 struct fw_ulptx_wr *wr; 1092 void *pos; 1093 u64 *end; 1094 1095 /* get the number of flits required */ 1096 flits = chcr_ktls_get_tx_flits(skb, tx_info->key_ctx_len); 1097 /* number of descriptors */ 1098 ndesc = chcr_flits_to_desc(flits); 1099 /* check if enough credits available */ 1100 credits = chcr_txq_avail(&q->q) - ndesc; 1101 if (unlikely(credits < 0)) { 1102 chcr_eth_txq_stop(q); 1103 return NETDEV_TX_BUSY; 1104 } 1105 1106 if (unlikely(credits < ETHTXQ_STOP_THRES)) { 1107 /* Credits are below the threshold vaues, stop the queue after 1108 * injecting the Work Request for this packet. 1109 */ 1110 chcr_eth_txq_stop(q); 1111 wr_mid |= FW_WR_EQUEQ_F | FW_WR_EQUIQ_F; 1112 } 1113 1114 last_desc = q->q.pidx + ndesc - 1; 1115 if (last_desc >= q->q.size) 1116 last_desc -= q->q.size; 1117 sgl_sdesc = &q->q.sdesc[last_desc]; 1118 1119 if (unlikely(cxgb4_map_skb(adap->pdev_dev, skb, sgl_sdesc->addr) < 0)) { 1120 memset(sgl_sdesc->addr, 0, sizeof(sgl_sdesc->addr)); 1121 q->mapping_err++; 1122 return NETDEV_TX_BUSY; 1123 } 1124 1125 pos = &q->q.desc[q->q.pidx]; 1126 end = (u64 *)pos + flits; 1127 /* FW_ULPTX_WR */ 1128 wr = pos; 1129 /* WR will need len16 */ 1130 len16 = DIV_ROUND_UP(flits, 2); 1131 wr->op_to_compl = htonl(FW_WR_OP_V(FW_ULPTX_WR)); 1132 wr->flowid_len16 = htonl(wr_mid | FW_WR_LEN16_V(len16)); 1133 wr->cookie = 0; 1134 pos += sizeof(*wr); 1135 /* ULP_TXPKT */ 1136 ulptx = pos; 1137 ulptx->cmd_dest = htonl(ULPTX_CMD_V(ULP_TX_PKT) | 1138 ULP_TXPKT_CHANNELID_V(tx_info->port_id) | 1139 ULP_TXPKT_FID_V(q->q.cntxt_id) | 1140 ULP_TXPKT_RO_F); 1141 ulptx->len = htonl(len16 - 1); 1142 /* ULPTX_IDATA sub-command */ 1143 idata = (struct ulptx_idata *)(ulptx + 1); 1144 idata->cmd_more = htonl(ULPTX_CMD_V(ULP_TX_SC_IMM) | ULP_TX_SC_MORE_F); 1145 /* idata length will include cpl_tx_sec_pdu + key context size + 1146 * cpl_tx_data header. 1147 */ 1148 idata->len = htonl(sizeof(*cpl) + tx_info->key_ctx_len + 1149 sizeof(*tx_data)); 1150 /* SEC CPL */ 1151 cpl = (struct cpl_tx_sec_pdu *)(idata + 1); 1152 cpl->op_ivinsrtofst = 1153 htonl(CPL_TX_SEC_PDU_OPCODE_V(CPL_TX_SEC_PDU) | 1154 CPL_TX_SEC_PDU_CPLLEN_V(CHCR_CPL_TX_SEC_PDU_LEN_64BIT) | 1155 CPL_TX_SEC_PDU_PLACEHOLDER_V(1) | 1156 CPL_TX_SEC_PDU_IVINSRTOFST_V(TLS_HEADER_SIZE + 1)); 1157 cpl->pldlen = htonl(skb->data_len); 1158 1159 /* encryption should start after tls header size + iv size */ 1160 cipher_start = TLS_HEADER_SIZE + tx_info->iv_size + 1; 1161 1162 cpl->aadstart_cipherstop_hi = 1163 htonl(CPL_TX_SEC_PDU_AADSTART_V(1) | 1164 CPL_TX_SEC_PDU_AADSTOP_V(TLS_HEADER_SIZE) | 1165 CPL_TX_SEC_PDU_CIPHERSTART_V(cipher_start)); 1166 1167 /* authentication will also start after tls header + iv size */ 1168 cpl->cipherstop_lo_authinsert = 1169 htonl(CPL_TX_SEC_PDU_AUTHSTART_V(cipher_start) | 1170 CPL_TX_SEC_PDU_AUTHSTOP_V(TLS_CIPHER_AES_GCM_128_TAG_SIZE) | 1171 CPL_TX_SEC_PDU_AUTHINSERT_V(TLS_CIPHER_AES_GCM_128_TAG_SIZE)); 1172 1173 /* These two flits are actually a CPL_TLS_TX_SCMD_FMT. */ 1174 cpl->seqno_numivs = htonl(tx_info->scmd0_seqno_numivs); 1175 cpl->ivgen_hdrlen = htonl(tx_info->scmd0_ivgen_hdrlen); 1176 cpl->scmd1 = cpu_to_be64(tx_info->record_no); 1177 1178 pos = cpl + 1; 1179 /* check if space left to fill the keys */ 1180 left = (void *)q->q.stat - pos; 1181 if (!left) { 1182 left = (void *)end - (void *)q->q.stat; 1183 pos = q->q.desc; 1184 end = pos + left; 1185 } 1186 1187 pos = chcr_copy_to_txd(&tx_info->key_ctx, &q->q, pos, 1188 tx_info->key_ctx_len); 1189 left = (void *)q->q.stat - pos; 1190 1191 if (!left) { 1192 left = (void *)end - (void *)q->q.stat; 1193 pos = q->q.desc; 1194 end = pos + left; 1195 } 1196 /* CPL_TX_DATA */ 1197 tx_data = (void *)pos; 1198 OPCODE_TID(tx_data) = htonl(MK_OPCODE_TID(CPL_TX_DATA, tx_info->tid)); 1199 tx_data->len = htonl(TX_DATA_MSS_V(mss) | TX_LENGTH_V(skb->data_len)); 1200 1201 tx_data->rsvd = htonl(tcp_seq); 1202 1203 tx_data->flags = htonl(TX_BYPASS_F); 1204 if (tcp_push) 1205 tx_data->flags |= htonl(TX_PUSH_F | TX_SHOVE_F); 1206 1207 /* check left again, it might go beyond queue limit */ 1208 pos = tx_data + 1; 1209 left = (void *)q->q.stat - pos; 1210 1211 /* check the position again */ 1212 if (!left) { 1213 left = (void *)end - (void *)q->q.stat; 1214 pos = q->q.desc; 1215 end = pos + left; 1216 } 1217 1218 /* send the complete packet except the header */ 1219 cxgb4_write_sgl(skb, &q->q, pos, end, skb->len - skb->data_len, 1220 sgl_sdesc->addr); 1221 sgl_sdesc->skb = skb; 1222 1223 chcr_txq_advance(&q->q, ndesc); 1224 cxgb4_ring_tx_db(adap, &q->q, ndesc); 1225 atomic64_inc(&adap->chcr_stats.ktls_tx_send_records); 1226 1227 return 0; 1228} 1229 1230/* 1231 * chcr_ktls_xmit_wr_short: This is to send out partial records. If its 1232 * a middle part of a record, fetch the prior data to make it 16 byte aligned 1233 * and then only send it out. 1234 * 1235 * @skb - skb contains partial record.. 1236 * @tx_info - driver specific tls info. 1237 * @q - TX queue. 1238 * @tcp_seq 1239 * @tcp_push - tcp push bit. 1240 * @mss - segment size. 1241 * @tls_rec_offset - offset from start of the tls record. 1242 * @perior_data - data before the current segment, required to make this record 1243 * 16 byte aligned. 1244 * @prior_data_len - prior_data length (less than 16) 1245 * return: NETDEV_TX_BUSY/NET_TX_OK. 1246 */ 1247static int chcr_ktls_xmit_wr_short(struct sk_buff *skb, 1248 struct chcr_ktls_info *tx_info, 1249 struct sge_eth_txq *q, 1250 u32 tcp_seq, bool tcp_push, u32 mss, 1251 u32 tls_rec_offset, u8 *prior_data, 1252 u32 prior_data_len) 1253{ 1254 struct adapter *adap = tx_info->adap; 1255 u32 len16, wr_mid = 0, cipher_start; 1256 unsigned int flits = 0, ndesc; 1257 int credits, left, last_desc; 1258 struct tx_sw_desc *sgl_sdesc; 1259 struct cpl_tx_data *tx_data; 1260 struct cpl_tx_sec_pdu *cpl; 1261 struct ulptx_idata *idata; 1262 struct ulp_txpkt *ulptx; 1263 struct fw_ulptx_wr *wr; 1264 __be64 iv_record; 1265 void *pos; 1266 u64 *end; 1267 1268 /* get the number of flits required, it's a partial record so 2 flits 1269 * (AES_BLOCK_SIZE) will be added. 1270 */ 1271 flits = chcr_ktls_get_tx_flits(skb, tx_info->key_ctx_len) + 2; 1272 /* get the correct 8 byte IV of this record */ 1273 iv_record = cpu_to_be64(tx_info->iv + tx_info->record_no); 1274 /* If it's a middle record and not 16 byte aligned to run AES CTR, need 1275 * to make it 16 byte aligned. So atleadt 2 extra flits of immediate 1276 * data will be added. 1277 */ 1278 if (prior_data_len) 1279 flits += 2; 1280 /* number of descriptors */ 1281 ndesc = chcr_flits_to_desc(flits); 1282 /* check if enough credits available */ 1283 credits = chcr_txq_avail(&q->q) - ndesc; 1284 if (unlikely(credits < 0)) { 1285 chcr_eth_txq_stop(q); 1286 return NETDEV_TX_BUSY; 1287 } 1288 1289 if (unlikely(credits < ETHTXQ_STOP_THRES)) { 1290 chcr_eth_txq_stop(q); 1291 wr_mid |= FW_WR_EQUEQ_F | FW_WR_EQUIQ_F; 1292 } 1293 1294 last_desc = q->q.pidx + ndesc - 1; 1295 if (last_desc >= q->q.size) 1296 last_desc -= q->q.size; 1297 sgl_sdesc = &q->q.sdesc[last_desc]; 1298 1299 if (unlikely(cxgb4_map_skb(adap->pdev_dev, skb, sgl_sdesc->addr) < 0)) { 1300 memset(sgl_sdesc->addr, 0, sizeof(sgl_sdesc->addr)); 1301 q->mapping_err++; 1302 return NETDEV_TX_BUSY; 1303 } 1304 1305 pos = &q->q.desc[q->q.pidx]; 1306 end = (u64 *)pos + flits; 1307 /* FW_ULPTX_WR */ 1308 wr = pos; 1309 /* WR will need len16 */ 1310 len16 = DIV_ROUND_UP(flits, 2); 1311 wr->op_to_compl = htonl(FW_WR_OP_V(FW_ULPTX_WR)); 1312 wr->flowid_len16 = htonl(wr_mid | FW_WR_LEN16_V(len16)); 1313 wr->cookie = 0; 1314 pos += sizeof(*wr); 1315 /* ULP_TXPKT */ 1316 ulptx = pos; 1317 ulptx->cmd_dest = htonl(ULPTX_CMD_V(ULP_TX_PKT) | 1318 ULP_TXPKT_CHANNELID_V(tx_info->port_id) | 1319 ULP_TXPKT_FID_V(q->q.cntxt_id) | 1320 ULP_TXPKT_RO_F); 1321 ulptx->len = htonl(len16 - 1); 1322 /* ULPTX_IDATA sub-command */ 1323 idata = (struct ulptx_idata *)(ulptx + 1); 1324 idata->cmd_more = htonl(ULPTX_CMD_V(ULP_TX_SC_IMM) | ULP_TX_SC_MORE_F); 1325 /* idata length will include cpl_tx_sec_pdu + key context size + 1326 * cpl_tx_data header. 1327 */ 1328 idata->len = htonl(sizeof(*cpl) + tx_info->key_ctx_len + 1329 sizeof(*tx_data) + AES_BLOCK_LEN + prior_data_len); 1330 /* SEC CPL */ 1331 cpl = (struct cpl_tx_sec_pdu *)(idata + 1); 1332 /* cipher start will have tls header + iv size extra if its a header 1333 * part of tls record. else only 16 byte IV will be added. 1334 */ 1335 cipher_start = 1336 AES_BLOCK_LEN + 1 + 1337 (!tls_rec_offset ? TLS_HEADER_SIZE + tx_info->iv_size : 0); 1338 1339 cpl->op_ivinsrtofst = 1340 htonl(CPL_TX_SEC_PDU_OPCODE_V(CPL_TX_SEC_PDU) | 1341 CPL_TX_SEC_PDU_CPLLEN_V(CHCR_CPL_TX_SEC_PDU_LEN_64BIT) | 1342 CPL_TX_SEC_PDU_IVINSRTOFST_V(1)); 1343 cpl->pldlen = htonl(skb->data_len + AES_BLOCK_LEN + prior_data_len); 1344 cpl->aadstart_cipherstop_hi = 1345 htonl(CPL_TX_SEC_PDU_CIPHERSTART_V(cipher_start)); 1346 cpl->cipherstop_lo_authinsert = 0; 1347 /* These two flits are actually a CPL_TLS_TX_SCMD_FMT. */ 1348 cpl->seqno_numivs = htonl(tx_info->scmd0_short_seqno_numivs); 1349 cpl->ivgen_hdrlen = htonl(tx_info->scmd0_short_ivgen_hdrlen); 1350 cpl->scmd1 = 0; 1351 1352 pos = cpl + 1; 1353 /* check if space left to fill the keys */ 1354 left = (void *)q->q.stat - pos; 1355 if (!left) { 1356 left = (void *)end - (void *)q->q.stat; 1357 pos = q->q.desc; 1358 end = pos + left; 1359 } 1360 1361 pos = chcr_copy_to_txd(&tx_info->key_ctx, &q->q, pos, 1362 tx_info->key_ctx_len); 1363 left = (void *)q->q.stat - pos; 1364 1365 if (!left) { 1366 left = (void *)end - (void *)q->q.stat; 1367 pos = q->q.desc; 1368 end = pos + left; 1369 } 1370 /* CPL_TX_DATA */ 1371 tx_data = (void *)pos; 1372 OPCODE_TID(tx_data) = htonl(MK_OPCODE_TID(CPL_TX_DATA, tx_info->tid)); 1373 tx_data->len = htonl(TX_DATA_MSS_V(mss) | 1374 TX_LENGTH_V(skb->data_len + prior_data_len)); 1375 tx_data->rsvd = htonl(tcp_seq); 1376 tx_data->flags = htonl(TX_BYPASS_F); 1377 if (tcp_push) 1378 tx_data->flags |= htonl(TX_PUSH_F | TX_SHOVE_F); 1379 1380 /* check left again, it might go beyond queue limit */ 1381 pos = tx_data + 1; 1382 left = (void *)q->q.stat - pos; 1383 1384 /* check the position again */ 1385 if (!left) { 1386 left = (void *)end - (void *)q->q.stat; 1387 pos = q->q.desc; 1388 end = pos + left; 1389 } 1390 /* copy the 16 byte IV for AES-CTR, which includes 4 bytes of salt, 8 1391 * bytes of actual IV and 4 bytes of 16 byte-sequence. 1392 */ 1393 memcpy(pos, tx_info->key_ctx.salt, tx_info->salt_size); 1394 memcpy(pos + tx_info->salt_size, &iv_record, tx_info->iv_size); 1395 *(__be32 *)(pos + tx_info->salt_size + tx_info->iv_size) = 1396 htonl(2 + (tls_rec_offset ? ((tls_rec_offset - 1397 (TLS_HEADER_SIZE + tx_info->iv_size)) / AES_BLOCK_LEN) : 0)); 1398 1399 pos += 16; 1400 /* Prior_data_len will always be less than 16 bytes, fill the 1401 * prio_data_len after AES_CTRL_BLOCK and clear the remaining length 1402 * to 0. 1403 */ 1404 if (prior_data_len) 1405 pos = chcr_copy_to_txd(prior_data, &q->q, pos, 16); 1406 /* send the complete packet except the header */ 1407 cxgb4_write_sgl(skb, &q->q, pos, end, skb->len - skb->data_len, 1408 sgl_sdesc->addr); 1409 sgl_sdesc->skb = skb; 1410 1411 chcr_txq_advance(&q->q, ndesc); 1412 cxgb4_ring_tx_db(adap, &q->q, ndesc); 1413 1414 return 0; 1415} 1416 1417/* 1418 * chcr_ktls_tx_plaintxt: This handler will take care of the records which has 1419 * only plain text (only tls header and iv) 1420 * @tx_info - driver specific tls info. 1421 * @skb - skb contains partial record.. 1422 * @tcp_seq 1423 * @mss - segment size. 1424 * @tcp_push - tcp push bit. 1425 * @q - TX queue. 1426 * @port_id : port number 1427 * @perior_data - data before the current segment, required to make this record 1428 * 16 byte aligned. 1429 * @prior_data_len - prior_data length (less than 16) 1430 * return: NETDEV_TX_BUSY/NET_TX_OK. 1431 */ 1432static int chcr_ktls_tx_plaintxt(struct chcr_ktls_info *tx_info, 1433 struct sk_buff *skb, u32 tcp_seq, u32 mss, 1434 bool tcp_push, struct sge_eth_txq *q, 1435 u32 port_id, u8 *prior_data, 1436 u32 prior_data_len) 1437{ 1438 int credits, left, len16, last_desc; 1439 unsigned int flits = 0, ndesc; 1440 struct tx_sw_desc *sgl_sdesc; 1441 struct cpl_tx_data *tx_data; 1442 struct ulptx_idata *idata; 1443 struct ulp_txpkt *ulptx; 1444 struct fw_ulptx_wr *wr; 1445 u32 wr_mid = 0; 1446 void *pos; 1447 u64 *end; 1448 1449 flits = DIV_ROUND_UP(CHCR_PLAIN_TX_DATA_LEN, 8); 1450 flits += chcr_sgl_len(skb_shinfo(skb)->nr_frags); 1451 if (prior_data_len) 1452 flits += 2; 1453 /* WR will need len16 */ 1454 len16 = DIV_ROUND_UP(flits, 2); 1455 /* check how many descriptors needed */ 1456 ndesc = DIV_ROUND_UP(flits, 8); 1457 1458 credits = chcr_txq_avail(&q->q) - ndesc; 1459 if (unlikely(credits < 0)) { 1460 chcr_eth_txq_stop(q); 1461 return NETDEV_TX_BUSY; 1462 } 1463 1464 if (unlikely(credits < ETHTXQ_STOP_THRES)) { 1465 chcr_eth_txq_stop(q); 1466 wr_mid |= FW_WR_EQUEQ_F | FW_WR_EQUIQ_F; 1467 } 1468 1469 last_desc = q->q.pidx + ndesc - 1; 1470 if (last_desc >= q->q.size) 1471 last_desc -= q->q.size; 1472 sgl_sdesc = &q->q.sdesc[last_desc]; 1473 1474 if (unlikely(cxgb4_map_skb(tx_info->adap->pdev_dev, skb, 1475 sgl_sdesc->addr) < 0)) { 1476 memset(sgl_sdesc->addr, 0, sizeof(sgl_sdesc->addr)); 1477 q->mapping_err++; 1478 return NETDEV_TX_BUSY; 1479 } 1480 1481 pos = &q->q.desc[q->q.pidx]; 1482 end = (u64 *)pos + flits; 1483 /* FW_ULPTX_WR */ 1484 wr = pos; 1485 wr->op_to_compl = htonl(FW_WR_OP_V(FW_ULPTX_WR)); 1486 wr->flowid_len16 = htonl(wr_mid | FW_WR_LEN16_V(len16)); 1487 wr->cookie = 0; 1488 pos += sizeof(*wr); 1489 /* ULP_TXPKT */ 1490 ulptx = (struct ulp_txpkt *)(wr + 1); 1491 ulptx->cmd_dest = htonl(ULPTX_CMD_V(ULP_TX_PKT) | 1492 ULP_TXPKT_DATAMODIFY_V(0) | 1493 ULP_TXPKT_CHANNELID_V(tx_info->port_id) | 1494 ULP_TXPKT_DEST_V(0) | 1495 ULP_TXPKT_FID_V(q->q.cntxt_id) | ULP_TXPKT_RO_V(1)); 1496 ulptx->len = htonl(len16 - 1); 1497 /* ULPTX_IDATA sub-command */ 1498 idata = (struct ulptx_idata *)(ulptx + 1); 1499 idata->cmd_more = htonl(ULPTX_CMD_V(ULP_TX_SC_IMM) | ULP_TX_SC_MORE_F); 1500 idata->len = htonl(sizeof(*tx_data) + prior_data_len); 1501 /* CPL_TX_DATA */ 1502 tx_data = (struct cpl_tx_data *)(idata + 1); 1503 OPCODE_TID(tx_data) = htonl(MK_OPCODE_TID(CPL_TX_DATA, tx_info->tid)); 1504 tx_data->len = htonl(TX_DATA_MSS_V(mss) | 1505 TX_LENGTH_V(skb->data_len + prior_data_len)); 1506 /* set tcp seq number */ 1507 tx_data->rsvd = htonl(tcp_seq); 1508 tx_data->flags = htonl(TX_BYPASS_F); 1509 if (tcp_push) 1510 tx_data->flags |= htonl(TX_PUSH_F | TX_SHOVE_F); 1511 1512 pos = tx_data + 1; 1513 /* apart from prior_data_len, we should set remaining part of 16 bytes 1514 * to be zero. 1515 */ 1516 if (prior_data_len) 1517 pos = chcr_copy_to_txd(prior_data, &q->q, pos, 16); 1518 1519 /* check left again, it might go beyond queue limit */ 1520 left = (void *)q->q.stat - pos; 1521 1522 /* check the position again */ 1523 if (!left) { 1524 left = (void *)end - (void *)q->q.stat; 1525 pos = q->q.desc; 1526 end = pos + left; 1527 } 1528 /* send the complete packet including the header */ 1529 cxgb4_write_sgl(skb, &q->q, pos, end, skb->len - skb->data_len, 1530 sgl_sdesc->addr); 1531 sgl_sdesc->skb = skb; 1532 1533 chcr_txq_advance(&q->q, ndesc); 1534 cxgb4_ring_tx_db(tx_info->adap, &q->q, ndesc); 1535 return 0; 1536} 1537 1538/* 1539 * chcr_ktls_copy_record_in_skb 1540 * @nskb - new skb where the frags to be added. 1541 * @record - specific record which has complete 16k record in frags. 1542 */ 1543static void chcr_ktls_copy_record_in_skb(struct sk_buff *nskb, 1544 struct tls_record_info *record) 1545{ 1546 int i = 0; 1547 1548 for (i = 0; i < record->num_frags; i++) { 1549 skb_shinfo(nskb)->frags[i] = record->frags[i]; 1550 /* increase the frag ref count */ 1551 __skb_frag_ref(&skb_shinfo(nskb)->frags[i]); 1552 } 1553 1554 skb_shinfo(nskb)->nr_frags = record->num_frags; 1555 nskb->data_len = record->len; 1556 nskb->len += record->len; 1557 nskb->truesize += record->len; 1558} 1559 1560/* 1561 * chcr_ktls_update_snd_una: Reset the SEND_UNA. It will be done to avoid 1562 * sending the same segment again. It will discard the segment which is before 1563 * the current tx max. 1564 * @tx_info - driver specific tls info. 1565 * @q - TX queue. 1566 * return: NET_TX_OK/NET_XMIT_DROP. 1567 */ 1568static int chcr_ktls_update_snd_una(struct chcr_ktls_info *tx_info, 1569 struct sge_eth_txq *q) 1570{ 1571 struct fw_ulptx_wr *wr; 1572 unsigned int ndesc; 1573 int credits; 1574 void *pos; 1575 u32 len; 1576 1577 len = sizeof(*wr) + roundup(CHCR_SET_TCB_FIELD_LEN, 16); 1578 ndesc = DIV_ROUND_UP(len, 64); 1579 1580 credits = chcr_txq_avail(&q->q) - ndesc; 1581 if (unlikely(credits < 0)) { 1582 chcr_eth_txq_stop(q); 1583 return NETDEV_TX_BUSY; 1584 } 1585 1586 pos = &q->q.desc[q->q.pidx]; 1587 1588 wr = pos; 1589 /* ULPTX wr */ 1590 wr->op_to_compl = htonl(FW_WR_OP_V(FW_ULPTX_WR)); 1591 wr->cookie = 0; 1592 /* fill len in wr field */ 1593 wr->flowid_len16 = htonl(FW_WR_LEN16_V(DIV_ROUND_UP(len, 16))); 1594 1595 pos += sizeof(*wr); 1596 1597 pos = chcr_write_cpl_set_tcb_ulp(tx_info, q, tx_info->tid, pos, 1598 TCB_SND_UNA_RAW_W, 1599 TCB_SND_UNA_RAW_V(TCB_SND_UNA_RAW_M), 1600 TCB_SND_UNA_RAW_V(0), 0); 1601 1602 chcr_txq_advance(&q->q, ndesc); 1603 cxgb4_ring_tx_db(tx_info->adap, &q->q, ndesc); 1604 1605 return 0; 1606} 1607 1608/* 1609 * chcr_end_part_handler: This handler will handle the record which 1610 * is complete or if record's end part is received. T6 adapter has a issue that 1611 * it can't send out TAG with partial record so if its an end part then we have 1612 * to send TAG as well and for which we need to fetch the complete record and 1613 * send it to crypto module. 1614 * @tx_info - driver specific tls info. 1615 * @skb - skb contains partial record. 1616 * @record - complete record of 16K size. 1617 * @tcp_seq 1618 * @mss - segment size in which TP needs to chop a packet. 1619 * @tcp_push_no_fin - tcp push if fin is not set. 1620 * @q - TX queue. 1621 * @tls_end_offset - offset from end of the record. 1622 * @last wr : check if this is the last part of the skb going out. 1623 * return: NETDEV_TX_OK/NETDEV_TX_BUSY. 1624 */ 1625static int chcr_end_part_handler(struct chcr_ktls_info *tx_info, 1626 struct sk_buff *skb, 1627 struct tls_record_info *record, 1628 u32 tcp_seq, int mss, bool tcp_push_no_fin, 1629 struct sge_eth_txq *q, 1630 u32 tls_end_offset, bool last_wr) 1631{ 1632 struct sk_buff *nskb = NULL; 1633 /* check if it is a complete record */ 1634 if (tls_end_offset == record->len) { 1635 nskb = skb; 1636 atomic64_inc(&tx_info->adap->chcr_stats.ktls_tx_complete_pkts); 1637 } else { 1638 dev_kfree_skb_any(skb); 1639 1640 nskb = alloc_skb(0, GFP_KERNEL); 1641 if (!nskb) 1642 return NETDEV_TX_BUSY; 1643 /* copy complete record in skb */ 1644 chcr_ktls_copy_record_in_skb(nskb, record); 1645 /* packet is being sent from the beginning, update the tcp_seq 1646 * accordingly. 1647 */ 1648 tcp_seq = tls_record_start_seq(record); 1649 /* reset snd una, so the middle record won't send the already 1650 * sent part. 1651 */ 1652 if (chcr_ktls_update_snd_una(tx_info, q)) 1653 goto out; 1654 atomic64_inc(&tx_info->adap->chcr_stats.ktls_tx_end_pkts); 1655 } 1656 1657 if (chcr_ktls_xmit_wr_complete(nskb, tx_info, q, tcp_seq, 1658 (last_wr && tcp_push_no_fin), 1659 mss)) { 1660 goto out; 1661 } 1662 return 0; 1663out: 1664 dev_kfree_skb_any(nskb); 1665 return NETDEV_TX_BUSY; 1666} 1667 1668/* 1669 * chcr_short_record_handler: This handler will take care of the records which 1670 * doesn't have end part (1st part or the middle part(/s) of a record). In such 1671 * cases, AES CTR will be used in place of AES GCM to send out partial packet. 1672 * This partial record might be the first part of the record, or the middle 1673 * part. In case of middle record we should fetch the prior data to make it 16 1674 * byte aligned. If it has a partial tls header or iv then get to the start of 1675 * tls header. And if it has partial TAG, then remove the complete TAG and send 1676 * only the payload. 1677 * There is one more possibility that it gets a partial header, send that 1678 * portion as a plaintext. 1679 * @tx_info - driver specific tls info. 1680 * @skb - skb contains partial record.. 1681 * @record - complete record of 16K size. 1682 * @tcp_seq 1683 * @mss - segment size in which TP needs to chop a packet. 1684 * @tcp_push_no_fin - tcp push if fin is not set. 1685 * @q - TX queue. 1686 * @tls_end_offset - offset from end of the record. 1687 * return: NETDEV_TX_OK/NETDEV_TX_BUSY. 1688 */ 1689static int chcr_short_record_handler(struct chcr_ktls_info *tx_info, 1690 struct sk_buff *skb, 1691 struct tls_record_info *record, 1692 u32 tcp_seq, int mss, bool tcp_push_no_fin, 1693 struct sge_eth_txq *q, u32 tls_end_offset) 1694{ 1695 u32 tls_rec_offset = tcp_seq - tls_record_start_seq(record); 1696 u8 prior_data[16] = {0}; 1697 u32 prior_data_len = 0; 1698 u32 data_len; 1699 1700 /* check if the skb is ending in middle of tag/HASH, its a big 1701 * trouble, send the packet before the HASH. 1702 */ 1703 int remaining_record = tls_end_offset - skb->data_len; 1704 1705 if (remaining_record > 0 && 1706 remaining_record < TLS_CIPHER_AES_GCM_128_TAG_SIZE) { 1707 int trimmed_len = skb->data_len - 1708 (TLS_CIPHER_AES_GCM_128_TAG_SIZE - remaining_record); 1709 struct sk_buff *tmp_skb = NULL; 1710 /* don't process the pkt if it is only a partial tag */ 1711 if (skb->data_len < TLS_CIPHER_AES_GCM_128_TAG_SIZE) 1712 goto out; 1713 1714 WARN_ON(trimmed_len > skb->data_len); 1715 1716 /* shift to those many bytes */ 1717 tmp_skb = alloc_skb(0, GFP_KERNEL); 1718 if (unlikely(!tmp_skb)) 1719 goto out; 1720 1721 chcr_ktls_skb_shift(tmp_skb, skb, trimmed_len); 1722 /* free the last trimmed portion */ 1723 dev_kfree_skb_any(skb); 1724 skb = tmp_skb; 1725 atomic64_inc(&tx_info->adap->chcr_stats.ktls_tx_trimmed_pkts); 1726 } 1727 data_len = skb->data_len; 1728 /* check if the middle record's start point is 16 byte aligned. CTR 1729 * needs 16 byte aligned start point to start encryption. 1730 */ 1731 if (tls_rec_offset) { 1732 /* there is an offset from start, means its a middle record */ 1733 int remaining = 0; 1734 1735 if (tls_rec_offset < (TLS_HEADER_SIZE + tx_info->iv_size)) { 1736 prior_data_len = tls_rec_offset; 1737 tls_rec_offset = 0; 1738 remaining = 0; 1739 } else { 1740 prior_data_len = 1741 (tls_rec_offset - 1742 (TLS_HEADER_SIZE + tx_info->iv_size)) 1743 % AES_BLOCK_LEN; 1744 remaining = tls_rec_offset - prior_data_len; 1745 } 1746 1747 /* if prior_data_len is not zero, means we need to fetch prior 1748 * data to make this record 16 byte aligned, or we need to reach 1749 * to start offset. 1750 */ 1751 if (prior_data_len) { 1752 int i = 0; 1753 u8 *data = NULL; 1754 skb_frag_t *f; 1755 u8 *vaddr; 1756 int frag_size = 0, frag_delta = 0; 1757 1758 while (remaining > 0) { 1759 frag_size = skb_frag_size(&record->frags[i]); 1760 if (remaining < frag_size) 1761 break; 1762 1763 remaining -= frag_size; 1764 i++; 1765 } 1766 f = &record->frags[i]; 1767 vaddr = kmap_atomic(skb_frag_page(f)); 1768 1769 data = vaddr + skb_frag_off(f) + remaining; 1770 frag_delta = skb_frag_size(f) - remaining; 1771 1772 if (frag_delta >= prior_data_len) { 1773 memcpy(prior_data, data, prior_data_len); 1774 kunmap_atomic(vaddr); 1775 } else { 1776 memcpy(prior_data, data, frag_delta); 1777 kunmap_atomic(vaddr); 1778 /* get the next page */ 1779 f = &record->frags[i + 1]; 1780 vaddr = kmap_atomic(skb_frag_page(f)); 1781 data = vaddr + skb_frag_off(f); 1782 memcpy(prior_data + frag_delta, 1783 data, (prior_data_len - frag_delta)); 1784 kunmap_atomic(vaddr); 1785 } 1786 /* reset tcp_seq as per the prior_data_required len */ 1787 tcp_seq -= prior_data_len; 1788 /* include prio_data_len for further calculation. 1789 */ 1790 data_len += prior_data_len; 1791 } 1792 /* reset snd una, so the middle record won't send the already 1793 * sent part. 1794 */ 1795 if (chcr_ktls_update_snd_una(tx_info, q)) 1796 goto out; 1797 atomic64_inc(&tx_info->adap->chcr_stats.ktls_tx_middle_pkts); 1798 } else { 1799 /* Else means, its a partial first part of the record. Check if 1800 * its only the header, don't need to send for encryption then. 1801 */ 1802 if (data_len <= TLS_HEADER_SIZE + tx_info->iv_size) { 1803 if (chcr_ktls_tx_plaintxt(tx_info, skb, tcp_seq, mss, 1804 tcp_push_no_fin, q, 1805 tx_info->port_id, 1806 prior_data, 1807 prior_data_len)) { 1808 goto out; 1809 } 1810 return 0; 1811 } 1812 atomic64_inc(&tx_info->adap->chcr_stats.ktls_tx_start_pkts); 1813 } 1814 1815 if (chcr_ktls_xmit_wr_short(skb, tx_info, q, tcp_seq, tcp_push_no_fin, 1816 mss, tls_rec_offset, prior_data, 1817 prior_data_len)) { 1818 goto out; 1819 } 1820 1821 return 0; 1822out: 1823 dev_kfree_skb_any(skb); 1824 return NETDEV_TX_BUSY; 1825} 1826 1827/* nic tls TX handler */ 1828int chcr_ktls_xmit(struct sk_buff *skb, struct net_device *dev) 1829{ 1830 struct chcr_ktls_ofld_ctx_tx *tx_ctx; 1831 struct tcphdr *th = tcp_hdr(skb); 1832 int data_len, qidx, ret = 0, mss; 1833 struct tls_record_info *record; 1834 struct chcr_stats_debug *stats; 1835 struct chcr_ktls_info *tx_info; 1836 u32 tls_end_offset, tcp_seq; 1837 struct tls_context *tls_ctx; 1838 struct sk_buff *local_skb; 1839 int new_connection_state; 1840 struct sge_eth_txq *q; 1841 struct adapter *adap; 1842 unsigned long flags; 1843 1844 tcp_seq = ntohl(th->seq); 1845 1846 mss = skb_is_gso(skb) ? skb_shinfo(skb)->gso_size : skb->data_len; 1847 1848 /* check if we haven't set it for ktls offload */ 1849 if (!skb->sk || !tls_is_sk_tx_device_offloaded(skb->sk)) 1850 goto out; 1851 1852 tls_ctx = tls_get_ctx(skb->sk); 1853 if (unlikely(tls_ctx->netdev != dev)) 1854 goto out; 1855 1856 tx_ctx = chcr_get_ktls_tx_context(tls_ctx); 1857 tx_info = tx_ctx->chcr_info; 1858 1859 if (unlikely(!tx_info)) 1860 goto out; 1861 1862 /* check the connection state, we don't need to pass new connection 1863 * state, state machine will check and update the new state if it is 1864 * stuck due to responses not received from HW. 1865 * Start the tx handling only if state is KTLS_CONN_TX_READY. 1866 */ 1867 new_connection_state = chcr_ktls_update_connection_state(tx_info, 0); 1868 if (new_connection_state != KTLS_CONN_TX_READY) 1869 goto out; 1870 1871 /* don't touch the original skb, make a new skb to extract each records 1872 * and send them separately. 1873 */ 1874 local_skb = alloc_skb(0, GFP_KERNEL); 1875 1876 if (unlikely(!local_skb)) 1877 return NETDEV_TX_BUSY; 1878 1879 adap = tx_info->adap; 1880 stats = &adap->chcr_stats; 1881 1882 qidx = skb->queue_mapping; 1883 q = &adap->sge.ethtxq[qidx + tx_info->first_qset]; 1884 cxgb4_reclaim_completed_tx(adap, &q->q, true); 1885 /* if tcp options are set but finish is not send the options first */ 1886 if (!th->fin && chcr_ktls_check_tcp_options(th)) { 1887 ret = chcr_ktls_write_tcp_options(tx_info, skb, q, 1888 tx_info->tx_chan); 1889 if (ret) 1890 return NETDEV_TX_BUSY; 1891 } 1892 /* update tcb */ 1893 ret = chcr_ktls_xmit_tcb_cpls(tx_info, q, ntohl(th->seq), 1894 ntohl(th->ack_seq), 1895 ntohs(th->window)); 1896 if (ret) { 1897 dev_kfree_skb_any(local_skb); 1898 return NETDEV_TX_BUSY; 1899 } 1900 1901 /* copy skb contents into local skb */ 1902 chcr_ktls_skb_copy(skb, local_skb); 1903 1904 /* go through the skb and send only one record at a time. */ 1905 data_len = skb->data_len; 1906 /* TCP segments can be in received either complete or partial. 1907 * chcr_end_part_handler will handle cases if complete record or end 1908 * part of the record is received. Incase of partial end part of record, 1909 * we will send the complete record again. 1910 */ 1911 1912 do { 1913 int i; 1914 1915 cxgb4_reclaim_completed_tx(adap, &q->q, true); 1916 /* lock taken */ 1917 spin_lock_irqsave(&tx_ctx->base.lock, flags); 1918 /* fetch the tls record */ 1919 record = tls_get_record(&tx_ctx->base, tcp_seq, 1920 &tx_info->record_no); 1921 /* By the time packet reached to us, ACK is received, and record 1922 * won't be found in that case, handle it gracefully. 1923 */ 1924 if (unlikely(!record)) { 1925 spin_unlock_irqrestore(&tx_ctx->base.lock, flags); 1926 atomic64_inc(&stats->ktls_tx_drop_no_sync_data); 1927 goto out; 1928 } 1929 1930 if (unlikely(tls_record_is_start_marker(record))) { 1931 spin_unlock_irqrestore(&tx_ctx->base.lock, flags); 1932 atomic64_inc(&stats->ktls_tx_skip_no_sync_data); 1933 goto out; 1934 } 1935 1936 /* increase page reference count of the record, so that there 1937 * won't be any chance of page free in middle if in case stack 1938 * receives ACK and try to delete the record. 1939 */ 1940 for (i = 0; i < record->num_frags; i++) 1941 __skb_frag_ref(&record->frags[i]); 1942 /* lock cleared */ 1943 spin_unlock_irqrestore(&tx_ctx->base.lock, flags); 1944 1945 tls_end_offset = record->end_seq - tcp_seq; 1946 1947 pr_debug("seq 0x%x, end_seq 0x%x prev_seq 0x%x, datalen 0x%x\n", 1948 tcp_seq, record->end_seq, tx_info->prev_seq, data_len); 1949 /* if a tls record is finishing in this SKB */ 1950 if (tls_end_offset <= data_len) { 1951 struct sk_buff *nskb = NULL; 1952 1953 if (tls_end_offset < data_len) { 1954 nskb = alloc_skb(0, GFP_KERNEL); 1955 if (unlikely(!nskb)) { 1956 ret = -ENOMEM; 1957 goto clear_ref; 1958 } 1959 1960 chcr_ktls_skb_shift(nskb, local_skb, 1961 tls_end_offset); 1962 } else { 1963 /* its the only record in this skb, directly 1964 * point it. 1965 */ 1966 nskb = local_skb; 1967 } 1968 ret = chcr_end_part_handler(tx_info, nskb, record, 1969 tcp_seq, mss, 1970 (!th->fin && th->psh), q, 1971 tls_end_offset, 1972 (nskb == local_skb)); 1973 1974 if (ret && nskb != local_skb) 1975 dev_kfree_skb_any(local_skb); 1976 1977 data_len -= tls_end_offset; 1978 /* tcp_seq increment is required to handle next record. 1979 */ 1980 tcp_seq += tls_end_offset; 1981 } else { 1982 ret = chcr_short_record_handler(tx_info, local_skb, 1983 record, tcp_seq, mss, 1984 (!th->fin && th->psh), 1985 q, tls_end_offset); 1986 data_len = 0; 1987 } 1988clear_ref: 1989 /* clear the frag ref count which increased locally before */ 1990 for (i = 0; i < record->num_frags; i++) { 1991 /* clear the frag ref count */ 1992 __skb_frag_unref(&record->frags[i]); 1993 } 1994 /* if any failure, come out from the loop. */ 1995 if (ret) 1996 goto out; 1997 /* length should never be less than 0 */ 1998 WARN_ON(data_len < 0); 1999 2000 } while (data_len > 0); 2001 2002 tx_info->prev_seq = ntohl(th->seq) + skb->data_len; 2003 2004 atomic64_inc(&stats->ktls_tx_encrypted_packets); 2005 atomic64_add(skb->data_len, &stats->ktls_tx_encrypted_bytes); 2006 2007 /* tcp finish is set, send a separate tcp msg including all the options 2008 * as well. 2009 */ 2010 if (th->fin) 2011 chcr_ktls_write_tcp_options(tx_info, skb, q, tx_info->tx_chan); 2012 2013out: 2014 dev_kfree_skb_any(skb); 2015 return NETDEV_TX_OK; 2016} 2017#endif /* CONFIG_CHELSIO_TLS_DEVICE */