1 /*- 2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3 * 4 * Copyright (c) 2017-2018 Chelsio Communications, Inc. 5 * All rights reserved. 6 * Written by: John Baldwin <jhb@FreeBSD.org> 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 */ 29 30 #include "opt_inet.h" 31 #include "opt_kern_tls.h" 32 33 #include <sys/cdefs.h> 34 __FBSDID("$FreeBSD$"); 35 36 #ifdef KERN_TLS 37 #include <sys/param.h> 38 #include <sys/ktr.h> 39 #include <sys/ktls.h> 40 #include <sys/sglist.h> 41 #include <sys/socket.h> 42 #include <sys/socketvar.h> 43 #include <sys/systm.h> 44 #include <netinet/in.h> 45 #include <netinet/in_pcb.h> 46 #include <netinet/tcp_var.h> 47 #include <netinet/toecore.h> 48 #include <opencrypto/cryptodev.h> 49 #include <opencrypto/xform.h> 50 51 #ifdef TCP_OFFLOAD 52 #include "common/common.h" 53 #include "common/t4_tcb.h" 54 #include "crypto/t4_crypto.h" 55 #include "tom/t4_tom_l2t.h" 56 #include "tom/t4_tom.h" 57 58 /* 59 * The TCP sequence number of a CPL_TLS_DATA mbuf is saved here while 60 * the mbuf is in the ulp_pdu_reclaimq. 61 */ 62 #define tls_tcp_seq PH_loc.thirtytwo[0] 63 64 static void 65 t4_set_tls_tcb_field(struct toepcb *toep, uint16_t word, uint64_t mask, 66 uint64_t val) 67 { 68 struct adapter *sc = td_adapter(toep->td); 69 70 t4_set_tcb_field(sc, &toep->ofld_txq->wrq, toep, word, mask, val, 0, 0); 71 } 72 73 /* TLS and DTLS common routines */ 74 bool 75 can_tls_offload(struct adapter *sc) 76 { 77 78 return (sc->tt.tls && sc->cryptocaps & FW_CAPS_CONFIG_TLSKEYS); 79 } 80 81 int 82 tls_tx_key(struct toepcb *toep) 83 { 84 struct tls_ofld_info *tls_ofld = &toep->tls; 85 86 return (tls_ofld->tx_key_addr >= 0); 87 } 88 89 /* Set TF_RX_QUIESCE to pause receive. */ 90 static void 91 t4_set_rx_quiesce(struct toepcb *toep) 92 { 93 struct adapter *sc = td_adapter(toep->td); 94 95 t4_set_tcb_field(sc, &toep->ofld_txq->wrq, toep, W_TCB_T_FLAGS, 96 V_TF_RX_QUIESCE(1), V_TF_RX_QUIESCE(1), 1, CPL_COOKIE_TOM); 97 } 98 99 /* Clear TF_RX_QUIESCE to re-enable receive. */ 100 static void 101 t4_clear_rx_quiesce(struct toepcb *toep) 102 { 103 104 t4_set_tls_tcb_field(toep, W_TCB_T_FLAGS, V_TF_RX_QUIESCE(1), 0); 105 } 106 107 /* TLS/DTLS content type for CPL SFO */ 108 static inline unsigned char 109 tls_content_type(unsigned char content_type) 110 { 111 switch (content_type) { 112 case CONTENT_TYPE_CCS: 113 return CPL_TX_TLS_SFO_TYPE_CCS; 114 case CONTENT_TYPE_ALERT: 115 return CPL_TX_TLS_SFO_TYPE_ALERT; 116 case CONTENT_TYPE_HANDSHAKE: 117 return CPL_TX_TLS_SFO_TYPE_HANDSHAKE; 118 case CONTENT_TYPE_APP_DATA: 119 return CPL_TX_TLS_SFO_TYPE_DATA; 120 default: 121 return CPL_TX_TLS_SFO_TYPE_CUSTOM; 122 } 123 } 124 125 /* TLS Key memory management */ 126 static void 127 clear_tls_keyid(struct toepcb *toep) 128 { 129 struct tls_ofld_info *tls_ofld = &toep->tls; 130 struct adapter *sc = td_adapter(toep->td); 131 132 if (tls_ofld->rx_key_addr >= 0) { 133 t4_free_tls_keyid(sc, tls_ofld->rx_key_addr); 134 tls_ofld->rx_key_addr = -1; 135 } 136 if (tls_ofld->tx_key_addr >= 0) { 137 t4_free_tls_keyid(sc, tls_ofld->tx_key_addr); 138 tls_ofld->tx_key_addr = -1; 139 } 140 } 141 142 static int 143 get_tp_plen_max(struct ktls_session *tls) 144 { 145 int plen = ((min(3*4096, TP_TX_PG_SZ))/1448) * 1448; 146 147 return (tls->params.max_frame_len <= 8192 ? plen : FC_TP_PLEN_MAX); 148 } 149 150 /* Send request to get the key-id */ 151 static int 152 tls_program_key_id(struct toepcb *toep, struct ktls_session *tls, 153 int direction) 154 { 155 struct tls_ofld_info *tls_ofld = &toep->tls; 156 struct adapter *sc = td_adapter(toep->td); 157 struct ofld_tx_sdesc *txsd; 158 int keyid; 159 struct wrqe *wr; 160 struct tls_key_req *kwr; 161 struct tls_keyctx *kctx; 162 163 #ifdef INVARIANTS 164 int kwrlen, kctxlen, len; 165 166 kwrlen = sizeof(*kwr); 167 kctxlen = roundup2(sizeof(*kctx), 32); 168 len = roundup2(kwrlen + kctxlen, 16); 169 MPASS(TLS_KEY_WR_SZ == len); 170 #endif 171 if (toep->txsd_avail == 0) 172 return (EAGAIN); 173 174 if ((keyid = t4_alloc_tls_keyid(sc)) < 0) { 175 return (ENOSPC); 176 } 177 178 wr = alloc_wrqe(TLS_KEY_WR_SZ, &toep->ofld_txq->wrq); 179 if (wr == NULL) { 180 t4_free_tls_keyid(sc, keyid); 181 return (ENOMEM); 182 } 183 kwr = wrtod(wr); 184 memset(kwr, 0, TLS_KEY_WR_SZ); 185 186 t4_write_tlskey_wr(tls, direction, toep->tid, F_FW_WR_COMPL, keyid, 187 kwr); 188 kctx = (struct tls_keyctx *)(kwr + 1); 189 if (direction == KTLS_TX) 190 tls_ofld->tx_key_addr = keyid; 191 else 192 tls_ofld->rx_key_addr = keyid; 193 t4_tls_key_ctx(tls, direction, kctx); 194 195 txsd = &toep->txsd[toep->txsd_pidx]; 196 txsd->tx_credits = DIV_ROUND_UP(TLS_KEY_WR_SZ, 16); 197 txsd->plen = 0; 198 toep->tx_credits -= txsd->tx_credits; 199 if (__predict_false(++toep->txsd_pidx == toep->txsd_total)) 200 toep->txsd_pidx = 0; 201 toep->txsd_avail--; 202 203 t4_wrq_tx(sc, wr); 204 205 return (0); 206 } 207 208 int 209 tls_alloc_ktls(struct toepcb *toep, struct ktls_session *tls, int direction) 210 { 211 struct adapter *sc = td_adapter(toep->td); 212 int error, explicit_iv_size, mac_first; 213 214 if (!can_tls_offload(sc)) 215 return (EINVAL); 216 217 if (direction == KTLS_RX) { 218 if (ulp_mode(toep) != ULP_MODE_NONE) 219 return (EINVAL); 220 if ((toep->flags & TPF_TLS_STARTING) != 0) 221 return (EINVAL); 222 } else { 223 switch (ulp_mode(toep)) { 224 case ULP_MODE_NONE: 225 case ULP_MODE_TLS: 226 case ULP_MODE_TCPDDP: 227 break; 228 default: 229 return (EINVAL); 230 } 231 } 232 233 switch (tls->params.cipher_algorithm) { 234 case CRYPTO_AES_CBC: 235 /* XXX: Explicitly ignore any provided IV. */ 236 switch (tls->params.cipher_key_len) { 237 case 128 / 8: 238 case 192 / 8: 239 case 256 / 8: 240 break; 241 default: 242 return (EINVAL); 243 } 244 switch (tls->params.auth_algorithm) { 245 case CRYPTO_SHA1_HMAC: 246 case CRYPTO_SHA2_256_HMAC: 247 case CRYPTO_SHA2_384_HMAC: 248 break; 249 default: 250 return (EPROTONOSUPPORT); 251 } 252 explicit_iv_size = AES_BLOCK_LEN; 253 mac_first = 1; 254 break; 255 case CRYPTO_AES_NIST_GCM_16: 256 if (tls->params.iv_len != SALT_SIZE) { 257 return (EINVAL); 258 } 259 switch (tls->params.cipher_key_len) { 260 case 128 / 8: 261 case 192 / 8: 262 case 256 / 8: 263 break; 264 default: 265 return (EINVAL); 266 } 267 explicit_iv_size = 8; 268 mac_first = 0; 269 break; 270 default: 271 return (EPROTONOSUPPORT); 272 } 273 274 /* Only TLS 1.1 and TLS 1.2 are currently supported. */ 275 if (tls->params.tls_vmajor != TLS_MAJOR_VER_ONE || 276 tls->params.tls_vminor < TLS_MINOR_VER_ONE || 277 tls->params.tls_vminor > TLS_MINOR_VER_TWO) { 278 return (EPROTONOSUPPORT); 279 } 280 281 /* Bail if we already have a key. */ 282 if (direction == KTLS_TX) { 283 if (toep->tls.tx_key_addr != -1) 284 return (EOPNOTSUPP); 285 } else { 286 if (toep->tls.rx_key_addr != -1) 287 return (EOPNOTSUPP); 288 } 289 290 error = tls_program_key_id(toep, tls, direction); 291 if (error) 292 return (error); 293 294 if (direction == KTLS_TX) { 295 toep->tls.scmd0.seqno_numivs = 296 (V_SCMD_SEQ_NO_CTRL(3) | 297 V_SCMD_PROTO_VERSION(t4_tls_proto_ver(tls)) | 298 V_SCMD_ENC_DEC_CTRL(SCMD_ENCDECCTRL_ENCRYPT) | 299 V_SCMD_CIPH_AUTH_SEQ_CTRL((mac_first == 0)) | 300 V_SCMD_CIPH_MODE(t4_tls_cipher_mode(tls)) | 301 V_SCMD_AUTH_MODE(t4_tls_auth_mode(tls)) | 302 V_SCMD_HMAC_CTRL(t4_tls_hmac_ctrl(tls)) | 303 V_SCMD_IV_SIZE(explicit_iv_size / 2)); 304 305 toep->tls.scmd0.ivgen_hdrlen = 306 (V_SCMD_IV_GEN_CTRL(1) | 307 V_SCMD_KEY_CTX_INLINE(0) | 308 V_SCMD_TLS_FRAG_ENABLE(1)); 309 310 toep->tls.iv_len = explicit_iv_size; 311 toep->tls.frag_size = tls->params.max_frame_len; 312 toep->tls.fcplenmax = get_tp_plen_max(tls); 313 toep->tls.expn_per_ulp = tls->params.tls_hlen + 314 tls->params.tls_tlen; 315 toep->tls.pdus_per_ulp = 1; 316 toep->tls.adjusted_plen = toep->tls.expn_per_ulp + 317 tls->params.max_frame_len; 318 toep->tls.tx_key_info_size = t4_tls_key_info_size(tls); 319 } else { 320 toep->flags |= TPF_TLS_STARTING | TPF_TLS_RX_QUIESCED; 321 toep->tls.rx_version = tls->params.tls_vmajor << 8 | 322 tls->params.tls_vminor; 323 324 CTR2(KTR_CXGBE, "%s: tid %d setting RX_QUIESCE", __func__, 325 toep->tid); 326 t4_set_rx_quiesce(toep); 327 } 328 329 return (0); 330 } 331 332 void 333 tls_init_toep(struct toepcb *toep) 334 { 335 struct tls_ofld_info *tls_ofld = &toep->tls; 336 337 tls_ofld->rx_key_addr = -1; 338 tls_ofld->tx_key_addr = -1; 339 } 340 341 void 342 tls_uninit_toep(struct toepcb *toep) 343 { 344 345 clear_tls_keyid(toep); 346 } 347 348 #define MAX_OFLD_TX_CREDITS (SGE_MAX_WR_LEN / 16) 349 #define MIN_OFLD_TLSTX_CREDITS(toep) \ 350 (howmany(sizeof(struct fw_tlstx_data_wr) + \ 351 sizeof(struct cpl_tx_tls_sfo) + sizeof(struct ulptx_idata) + \ 352 sizeof(struct ulptx_sc_memrd) + \ 353 AES_BLOCK_LEN + 1, 16)) 354 355 static void 356 write_tlstx_wr(struct fw_tlstx_data_wr *txwr, struct toepcb *toep, 357 unsigned int plen, unsigned int expn, uint8_t credits, int shove) 358 { 359 struct tls_ofld_info *tls_ofld = &toep->tls; 360 unsigned int len = plen + expn; 361 362 txwr->op_to_immdlen = htobe32(V_WR_OP(FW_TLSTX_DATA_WR) | 363 V_FW_TLSTX_DATA_WR_COMPL(1) | 364 V_FW_TLSTX_DATA_WR_IMMDLEN(0)); 365 txwr->flowid_len16 = htobe32(V_FW_TLSTX_DATA_WR_FLOWID(toep->tid) | 366 V_FW_TLSTX_DATA_WR_LEN16(credits)); 367 txwr->plen = htobe32(len); 368 txwr->lsodisable_to_flags = htobe32(V_TX_ULP_MODE(ULP_MODE_TLS) | 369 V_TX_URG(0) | /* F_T6_TX_FORCE | */ V_TX_SHOVE(shove)); 370 txwr->ctxloc_to_exp = htobe32(V_FW_TLSTX_DATA_WR_NUMIVS(1) | 371 V_FW_TLSTX_DATA_WR_EXP(expn) | 372 V_FW_TLSTX_DATA_WR_CTXLOC(TLS_SFO_WR_CONTEXTLOC_DDR) | 373 V_FW_TLSTX_DATA_WR_IVDSGL(0) | 374 V_FW_TLSTX_DATA_WR_KEYSIZE(tls_ofld->tx_key_info_size >> 4)); 375 txwr->mfs = htobe16(tls_ofld->frag_size); 376 txwr->adjustedplen_pkd = htobe16( 377 V_FW_TLSTX_DATA_WR_ADJUSTEDPLEN(tls_ofld->adjusted_plen)); 378 txwr->expinplenmax_pkd = htobe16( 379 V_FW_TLSTX_DATA_WR_EXPINPLENMAX(tls_ofld->expn_per_ulp)); 380 txwr->pdusinplenmax_pkd = 381 V_FW_TLSTX_DATA_WR_PDUSINPLENMAX(tls_ofld->pdus_per_ulp); 382 } 383 384 static void 385 write_tlstx_cpl(struct cpl_tx_tls_sfo *cpl, struct toepcb *toep, 386 struct tls_hdr *tls_hdr, unsigned int plen, uint64_t seqno) 387 { 388 struct tls_ofld_info *tls_ofld = &toep->tls; 389 int data_type, seglen; 390 391 seglen = plen; 392 data_type = tls_content_type(tls_hdr->type); 393 cpl->op_to_seg_len = htobe32(V_CPL_TX_TLS_SFO_OPCODE(CPL_TX_TLS_SFO) | 394 V_CPL_TX_TLS_SFO_DATA_TYPE(data_type) | 395 V_CPL_TX_TLS_SFO_CPL_LEN(2) | V_CPL_TX_TLS_SFO_SEG_LEN(seglen)); 396 cpl->pld_len = htobe32(plen); 397 if (data_type == CPL_TX_TLS_SFO_TYPE_CUSTOM) 398 cpl->type_protover = htobe32( 399 V_CPL_TX_TLS_SFO_TYPE(tls_hdr->type)); 400 cpl->seqno_numivs = htobe32(tls_ofld->scmd0.seqno_numivs | 401 V_SCMD_NUM_IVS(1)); 402 cpl->ivgen_hdrlen = htobe32(tls_ofld->scmd0.ivgen_hdrlen); 403 cpl->scmd1 = htobe64(seqno); 404 } 405 406 static int 407 count_ext_pgs_segs(struct mbuf *m) 408 { 409 vm_paddr_t nextpa; 410 u_int i, nsegs; 411 412 MPASS(m->m_epg_npgs > 0); 413 nsegs = 1; 414 nextpa = m->m_epg_pa[0] + PAGE_SIZE; 415 for (i = 1; i < m->m_epg_npgs; i++) { 416 if (nextpa != m->m_epg_pa[i]) 417 nsegs++; 418 nextpa = m->m_epg_pa[i] + PAGE_SIZE; 419 } 420 return (nsegs); 421 } 422 423 static void 424 write_ktlstx_sgl(void *dst, struct mbuf *m, int nsegs) 425 { 426 struct ulptx_sgl *usgl = dst; 427 vm_paddr_t pa; 428 uint32_t len; 429 int i, j; 430 431 KASSERT(nsegs > 0, ("%s: nsegs 0", __func__)); 432 433 usgl->cmd_nsge = htobe32(V_ULPTX_CMD(ULP_TX_SC_DSGL) | 434 V_ULPTX_NSGE(nsegs)); 435 436 /* Figure out the first S/G length. */ 437 pa = m->m_epg_pa[0] + m->m_epg_1st_off; 438 usgl->addr0 = htobe64(pa); 439 len = m_epg_pagelen(m, 0, m->m_epg_1st_off); 440 pa += len; 441 for (i = 1; i < m->m_epg_npgs; i++) { 442 if (m->m_epg_pa[i] != pa) 443 break; 444 len += m_epg_pagelen(m, i, 0); 445 pa += m_epg_pagelen(m, i, 0); 446 } 447 usgl->len0 = htobe32(len); 448 #ifdef INVARIANTS 449 nsegs--; 450 #endif 451 452 j = -1; 453 for (; i < m->m_epg_npgs; i++) { 454 if (j == -1 || m->m_epg_pa[i] != pa) { 455 if (j >= 0) 456 usgl->sge[j / 2].len[j & 1] = htobe32(len); 457 j++; 458 #ifdef INVARIANTS 459 nsegs--; 460 #endif 461 pa = m->m_epg_pa[i]; 462 usgl->sge[j / 2].addr[j & 1] = htobe64(pa); 463 len = m_epg_pagelen(m, i, 0); 464 pa += len; 465 } else { 466 len += m_epg_pagelen(m, i, 0); 467 pa += m_epg_pagelen(m, i, 0); 468 } 469 } 470 if (j >= 0) { 471 usgl->sge[j / 2].len[j & 1] = htobe32(len); 472 473 if ((j & 1) == 0) 474 usgl->sge[j / 2].len[1] = htobe32(0); 475 } 476 KASSERT(nsegs == 0, ("%s: nsegs %d, m %p", __func__, nsegs, m)); 477 } 478 479 /* 480 * Similar to t4_push_frames() but handles sockets that contain TLS 481 * record mbufs. 482 */ 483 void 484 t4_push_ktls(struct adapter *sc, struct toepcb *toep, int drop) 485 { 486 struct tls_hdr *thdr; 487 struct fw_tlstx_data_wr *txwr; 488 struct cpl_tx_tls_sfo *cpl; 489 struct ulptx_idata *idata; 490 struct ulptx_sc_memrd *memrd; 491 struct wrqe *wr; 492 struct mbuf *m; 493 u_int nsegs, credits, wr_len; 494 u_int expn_size; 495 struct inpcb *inp = toep->inp; 496 struct tcpcb *tp = intotcpcb(inp); 497 struct socket *so = inp->inp_socket; 498 struct sockbuf *sb = &so->so_snd; 499 int tls_size, tx_credits, shove, sowwakeup; 500 struct ofld_tx_sdesc *txsd; 501 char *buf; 502 503 INP_WLOCK_ASSERT(inp); 504 KASSERT(toep->flags & TPF_FLOWC_WR_SENT, 505 ("%s: flowc_wr not sent for tid %u.", __func__, toep->tid)); 506 507 KASSERT(ulp_mode(toep) == ULP_MODE_NONE || 508 ulp_mode(toep) == ULP_MODE_TCPDDP || ulp_mode(toep) == ULP_MODE_TLS, 509 ("%s: ulp_mode %u for toep %p", __func__, ulp_mode(toep), toep)); 510 KASSERT(tls_tx_key(toep), 511 ("%s: TX key not set for toep %p", __func__, toep)); 512 513 #ifdef VERBOSE_TRACES 514 CTR4(KTR_CXGBE, "%s: tid %d toep flags %#x tp flags %#x drop %d", 515 __func__, toep->tid, toep->flags, tp->t_flags); 516 #endif 517 if (__predict_false(toep->flags & TPF_ABORT_SHUTDOWN)) 518 return; 519 520 #ifdef RATELIMIT 521 if (__predict_false(inp->inp_flags2 & INP_RATE_LIMIT_CHANGED) && 522 (update_tx_rate_limit(sc, toep, so->so_max_pacing_rate) == 0)) { 523 inp->inp_flags2 &= ~INP_RATE_LIMIT_CHANGED; 524 } 525 #endif 526 527 /* 528 * This function doesn't resume by itself. Someone else must clear the 529 * flag and call this function. 530 */ 531 if (__predict_false(toep->flags & TPF_TX_SUSPENDED)) { 532 KASSERT(drop == 0, 533 ("%s: drop (%d) != 0 but tx is suspended", __func__, drop)); 534 return; 535 } 536 537 txsd = &toep->txsd[toep->txsd_pidx]; 538 for (;;) { 539 tx_credits = min(toep->tx_credits, MAX_OFLD_TX_CREDITS); 540 541 SOCKBUF_LOCK(sb); 542 sowwakeup = drop; 543 if (drop) { 544 sbdrop_locked(sb, drop); 545 drop = 0; 546 } 547 548 m = sb->sb_sndptr != NULL ? sb->sb_sndptr->m_next : sb->sb_mb; 549 550 /* 551 * Send a FIN if requested, but only if there's no 552 * more data to send. 553 */ 554 if (m == NULL && toep->flags & TPF_SEND_FIN) { 555 if (sowwakeup) 556 sowwakeup_locked(so); 557 else 558 SOCKBUF_UNLOCK(sb); 559 SOCKBUF_UNLOCK_ASSERT(sb); 560 t4_close_conn(sc, toep); 561 return; 562 } 563 564 /* 565 * If there is no ready data to send, wait until more 566 * data arrives. 567 */ 568 if (m == NULL || (m->m_flags & M_NOTAVAIL) != 0) { 569 if (sowwakeup) 570 sowwakeup_locked(so); 571 else 572 SOCKBUF_UNLOCK(sb); 573 SOCKBUF_UNLOCK_ASSERT(sb); 574 #ifdef VERBOSE_TRACES 575 CTR2(KTR_CXGBE, "%s: tid %d no ready data to send", 576 __func__, toep->tid); 577 #endif 578 return; 579 } 580 581 KASSERT(m->m_flags & M_EXTPG, ("%s: mbuf %p is not NOMAP", 582 __func__, m)); 583 KASSERT(m->m_epg_tls != NULL, 584 ("%s: mbuf %p doesn't have TLS session", __func__, m)); 585 586 /* Calculate WR length. */ 587 wr_len = sizeof(struct fw_tlstx_data_wr) + 588 sizeof(struct cpl_tx_tls_sfo) + 589 sizeof(struct ulptx_idata) + sizeof(struct ulptx_sc_memrd); 590 591 /* Explicit IVs for AES-CBC and AES-GCM are <= 16. */ 592 MPASS(toep->tls.iv_len <= AES_BLOCK_LEN); 593 wr_len += AES_BLOCK_LEN; 594 595 /* Account for SGL in work request length. */ 596 nsegs = count_ext_pgs_segs(m); 597 wr_len += sizeof(struct ulptx_sgl) + 598 ((3 * (nsegs - 1)) / 2 + ((nsegs - 1) & 1)) * 8; 599 600 /* Not enough credits for this work request. */ 601 if (howmany(wr_len, 16) > tx_credits) { 602 if (sowwakeup) 603 sowwakeup_locked(so); 604 else 605 SOCKBUF_UNLOCK(sb); 606 SOCKBUF_UNLOCK_ASSERT(sb); 607 #ifdef VERBOSE_TRACES 608 CTR5(KTR_CXGBE, 609 "%s: tid %d mbuf %p requires %d credits, but only %d available", 610 __func__, toep->tid, m, howmany(wr_len, 16), 611 tx_credits); 612 #endif 613 toep->flags |= TPF_TX_SUSPENDED; 614 return; 615 } 616 617 /* Shove if there is no additional data pending. */ 618 shove = ((m->m_next == NULL || 619 (m->m_next->m_flags & M_NOTAVAIL) != 0)) && 620 (tp->t_flags & TF_MORETOCOME) == 0; 621 622 if (sb->sb_flags & SB_AUTOSIZE && 623 V_tcp_do_autosndbuf && 624 sb->sb_hiwat < V_tcp_autosndbuf_max && 625 sbused(sb) >= sb->sb_hiwat * 7 / 8) { 626 int newsize = min(sb->sb_hiwat + V_tcp_autosndbuf_inc, 627 V_tcp_autosndbuf_max); 628 629 if (!sbreserve_locked(so, SO_SND, newsize, NULL)) 630 sb->sb_flags &= ~SB_AUTOSIZE; 631 else 632 sowwakeup = 1; /* room available */ 633 } 634 if (sowwakeup) 635 sowwakeup_locked(so); 636 else 637 SOCKBUF_UNLOCK(sb); 638 SOCKBUF_UNLOCK_ASSERT(sb); 639 640 if (__predict_false(toep->flags & TPF_FIN_SENT)) 641 panic("%s: excess tx.", __func__); 642 643 wr = alloc_wrqe(roundup2(wr_len, 16), &toep->ofld_txq->wrq); 644 if (wr == NULL) { 645 /* XXX: how will we recover from this? */ 646 toep->flags |= TPF_TX_SUSPENDED; 647 return; 648 } 649 650 thdr = (struct tls_hdr *)&m->m_epg_hdr; 651 #ifdef VERBOSE_TRACES 652 CTR5(KTR_CXGBE, "%s: tid %d TLS record %ju type %d len %#x", 653 __func__, toep->tid, m->m_epg_seqno, thdr->type, 654 m->m_len); 655 #endif 656 txwr = wrtod(wr); 657 cpl = (struct cpl_tx_tls_sfo *)(txwr + 1); 658 memset(txwr, 0, roundup2(wr_len, 16)); 659 credits = howmany(wr_len, 16); 660 expn_size = m->m_epg_hdrlen + 661 m->m_epg_trllen; 662 tls_size = m->m_len - expn_size; 663 write_tlstx_wr(txwr, toep, tls_size, expn_size, credits, shove); 664 write_tlstx_cpl(cpl, toep, thdr, tls_size, m->m_epg_seqno); 665 666 idata = (struct ulptx_idata *)(cpl + 1); 667 idata->cmd_more = htobe32(V_ULPTX_CMD(ULP_TX_SC_NOOP)); 668 idata->len = htobe32(0); 669 memrd = (struct ulptx_sc_memrd *)(idata + 1); 670 memrd->cmd_to_len = htobe32(V_ULPTX_CMD(ULP_TX_SC_MEMRD) | 671 V_ULP_TX_SC_MORE(1) | 672 V_ULPTX_LEN16(toep->tls.tx_key_info_size >> 4)); 673 memrd->addr = htobe32(toep->tls.tx_key_addr >> 5); 674 675 /* Copy IV. */ 676 buf = (char *)(memrd + 1); 677 memcpy(buf, thdr + 1, toep->tls.iv_len); 678 buf += AES_BLOCK_LEN; 679 680 write_ktlstx_sgl(buf, m, nsegs); 681 682 KASSERT(toep->tx_credits >= credits, 683 ("%s: not enough credits", __func__)); 684 685 toep->tx_credits -= credits; 686 687 tp->snd_nxt += m->m_len; 688 tp->snd_max += m->m_len; 689 690 SOCKBUF_LOCK(sb); 691 sb->sb_sndptr = m; 692 SOCKBUF_UNLOCK(sb); 693 694 toep->flags |= TPF_TX_DATA_SENT; 695 if (toep->tx_credits < MIN_OFLD_TLSTX_CREDITS(toep)) 696 toep->flags |= TPF_TX_SUSPENDED; 697 698 KASSERT(toep->txsd_avail > 0, ("%s: no txsd", __func__)); 699 txsd->plen = m->m_len; 700 txsd->tx_credits = credits; 701 txsd++; 702 if (__predict_false(++toep->txsd_pidx == toep->txsd_total)) { 703 toep->txsd_pidx = 0; 704 txsd = &toep->txsd[0]; 705 } 706 toep->txsd_avail--; 707 708 counter_u64_add(toep->ofld_txq->tx_toe_tls_records, 1); 709 counter_u64_add(toep->ofld_txq->tx_toe_tls_octets, m->m_len); 710 711 t4_l2t_send(sc, wr, toep->l2te); 712 } 713 } 714 715 /* 716 * For TLS data we place received mbufs received via CPL_TLS_DATA into 717 * an mbufq in the TLS offload state. When CPL_RX_TLS_CMP is 718 * received, the completed PDUs are placed into the socket receive 719 * buffer. 720 * 721 * The TLS code reuses the ulp_pdu_reclaimq to hold the pending mbufs. 722 */ 723 static int 724 do_tls_data(struct sge_iq *iq, const struct rss_header *rss, struct mbuf *m) 725 { 726 struct adapter *sc = iq->adapter; 727 const struct cpl_tls_data *cpl = mtod(m, const void *); 728 unsigned int tid = GET_TID(cpl); 729 struct toepcb *toep = lookup_tid(sc, tid); 730 struct inpcb *inp = toep->inp; 731 struct tcpcb *tp; 732 int len; 733 734 /* XXX: Should this match do_rx_data instead? */ 735 KASSERT(!(toep->flags & TPF_SYNQE), 736 ("%s: toep %p claims to be a synq entry", __func__, toep)); 737 738 KASSERT(toep->tid == tid, ("%s: toep tid/atid mismatch", __func__)); 739 740 /* strip off CPL header */ 741 m_adj(m, sizeof(*cpl)); 742 len = m->m_pkthdr.len; 743 744 toep->ofld_rxq->rx_toe_tls_octets += len; 745 746 KASSERT(len == G_CPL_TLS_DATA_LENGTH(be32toh(cpl->length_pkd)), 747 ("%s: payload length mismatch", __func__)); 748 749 INP_WLOCK(inp); 750 if (inp->inp_flags & INP_DROPPED) { 751 CTR4(KTR_CXGBE, "%s: tid %u, rx (%d bytes), inp_flags 0x%x", 752 __func__, tid, len, inp->inp_flags); 753 INP_WUNLOCK(inp); 754 m_freem(m); 755 return (0); 756 } 757 758 /* Save TCP sequence number. */ 759 m->m_pkthdr.tls_tcp_seq = be32toh(cpl->seq); 760 761 if (mbufq_enqueue(&toep->ulp_pdu_reclaimq, m)) { 762 #ifdef INVARIANTS 763 panic("Failed to queue TLS data packet"); 764 #else 765 printf("%s: Failed to queue TLS data packet\n", __func__); 766 INP_WUNLOCK(inp); 767 m_freem(m); 768 return (0); 769 #endif 770 } 771 772 tp = intotcpcb(inp); 773 tp->t_rcvtime = ticks; 774 775 #ifdef VERBOSE_TRACES 776 CTR4(KTR_CXGBE, "%s: tid %u len %d seq %u", __func__, tid, len, 777 be32toh(cpl->seq)); 778 #endif 779 780 INP_WUNLOCK(inp); 781 return (0); 782 } 783 784 static int 785 do_rx_tls_cmp(struct sge_iq *iq, const struct rss_header *rss, struct mbuf *m) 786 { 787 struct adapter *sc = iq->adapter; 788 const struct cpl_rx_tls_cmp *cpl = mtod(m, const void *); 789 struct tlsrx_hdr_pkt *tls_hdr_pkt; 790 unsigned int tid = GET_TID(cpl); 791 struct toepcb *toep = lookup_tid(sc, tid); 792 struct inpcb *inp = toep->inp; 793 struct tcpcb *tp; 794 struct socket *so; 795 struct sockbuf *sb; 796 struct mbuf *tls_data; 797 struct tls_get_record *tgr; 798 struct mbuf *control; 799 int pdu_length, rx_credits, trailer_len; 800 #if defined(KTR) || defined(INVARIANTS) 801 int len; 802 #endif 803 804 KASSERT(toep->tid == tid, ("%s: toep tid/atid mismatch", __func__)); 805 KASSERT(!(toep->flags & TPF_SYNQE), 806 ("%s: toep %p claims to be a synq entry", __func__, toep)); 807 808 /* strip off CPL header */ 809 m_adj(m, sizeof(*cpl)); 810 #if defined(KTR) || defined(INVARIANTS) 811 len = m->m_pkthdr.len; 812 #endif 813 814 toep->ofld_rxq->rx_toe_tls_records++; 815 816 KASSERT(len == G_CPL_RX_TLS_CMP_LENGTH(be32toh(cpl->pdulength_length)), 817 ("%s: payload length mismatch", __func__)); 818 819 INP_WLOCK(inp); 820 if (inp->inp_flags & INP_DROPPED) { 821 CTR4(KTR_CXGBE, "%s: tid %u, rx (%d bytes), inp_flags 0x%x", 822 __func__, tid, len, inp->inp_flags); 823 INP_WUNLOCK(inp); 824 m_freem(m); 825 return (0); 826 } 827 828 pdu_length = G_CPL_RX_TLS_CMP_PDULENGTH(be32toh(cpl->pdulength_length)); 829 830 so = inp_inpcbtosocket(inp); 831 tp = intotcpcb(inp); 832 833 #ifdef VERBOSE_TRACES 834 CTR6(KTR_CXGBE, "%s: tid %u PDU len %d len %d seq %u, rcv_nxt %u", 835 __func__, tid, pdu_length, len, be32toh(cpl->seq), tp->rcv_nxt); 836 #endif 837 838 tp->rcv_nxt += pdu_length; 839 KASSERT(tp->rcv_wnd >= pdu_length, 840 ("%s: negative window size", __func__)); 841 tp->rcv_wnd -= pdu_length; 842 843 /* XXX: Not sure what to do about urgent data. */ 844 845 /* 846 * The payload of this CPL is the TLS header followed by 847 * additional fields. 848 */ 849 KASSERT(m->m_len >= sizeof(*tls_hdr_pkt), 850 ("%s: payload too small", __func__)); 851 tls_hdr_pkt = mtod(m, void *); 852 853 tls_data = mbufq_dequeue(&toep->ulp_pdu_reclaimq); 854 if (tls_data != NULL) { 855 KASSERT(be32toh(cpl->seq) == tls_data->m_pkthdr.tls_tcp_seq, 856 ("%s: sequence mismatch", __func__)); 857 } 858 859 /* Report decryption errors as EBADMSG. */ 860 if ((tls_hdr_pkt->res_to_mac_error & M_TLSRX_HDR_PKT_ERROR) != 0) { 861 CTR4(KTR_CXGBE, "%s: tid %u TLS error %#x ddp_vld %#x", 862 __func__, toep->tid, tls_hdr_pkt->res_to_mac_error, 863 be32toh(cpl->ddp_valid)); 864 m_freem(m); 865 m_freem(tls_data); 866 867 CURVNET_SET(toep->vnet); 868 so->so_error = EBADMSG; 869 sorwakeup(so); 870 871 INP_WUNLOCK(inp); 872 CURVNET_RESTORE(); 873 874 return (0); 875 } 876 877 /* Handle data received after the socket is closed. */ 878 sb = &so->so_rcv; 879 SOCKBUF_LOCK(sb); 880 if (__predict_false(sb->sb_state & SBS_CANTRCVMORE)) { 881 struct epoch_tracker et; 882 883 CTR3(KTR_CXGBE, "%s: tid %u, excess rx (%d bytes)", 884 __func__, tid, pdu_length); 885 m_freem(m); 886 m_freem(tls_data); 887 SOCKBUF_UNLOCK(sb); 888 INP_WUNLOCK(inp); 889 890 CURVNET_SET(toep->vnet); 891 NET_EPOCH_ENTER(et); 892 INP_WLOCK(inp); 893 tp = tcp_drop(tp, ECONNRESET); 894 if (tp != NULL) 895 INP_WUNLOCK(inp); 896 NET_EPOCH_EXIT(et); 897 CURVNET_RESTORE(); 898 899 return (0); 900 } 901 902 /* 903 * If there is any data in the 'sb_mtls' chain of the socket 904 * or we aren't able to allocate the control mbuf, append the 905 * record as a CSUM_TLS_DECRYPTED packet to 'sb_mtls' rather 906 * than as a decrypted record to 'sb_m'. 907 */ 908 if (sb->sb_mtls != NULL) 909 control = NULL; 910 else 911 control = sbcreatecontrol(NULL, sizeof(*tgr), TLS_GET_RECORD, 912 IPPROTO_TCP, M_NOWAIT); 913 914 if (control != NULL) { 915 tgr = (struct tls_get_record *) 916 CMSG_DATA(mtod(control, struct cmsghdr *)); 917 memset(tgr, 0, sizeof(*tgr)); 918 tgr->tls_type = tls_hdr_pkt->type; 919 tgr->tls_vmajor = be16toh(tls_hdr_pkt->version) >> 8; 920 tgr->tls_vminor = be16toh(tls_hdr_pkt->version) & 0xff; 921 if (tls_data != NULL) { 922 m_last(tls_data)->m_flags |= M_EOR; 923 tgr->tls_length = htobe16(tls_data->m_pkthdr.len); 924 } else 925 tgr->tls_length = 0; 926 927 m_freem(m); 928 m = tls_data; 929 } else { 930 M_ASSERTPKTHDR(m); 931 932 /* It's ok that any explicit IV is missing. */ 933 m->m_len = sb->sb_tls_info->params.tls_hlen; 934 m->m_pkthdr.csum_flags |= CSUM_TLS_DECRYPTED; 935 m->m_pkthdr.len = m->m_len; 936 if (tls_data != NULL) { 937 m->m_pkthdr.len += tls_data->m_pkthdr.len; 938 m_demote_pkthdr(tls_data); 939 m->m_next = tls_data; 940 } 941 942 /* 943 * Grow the chain by the trailer, but without 944 * contents. The trailer will be thrown away by 945 * ktls_decrypt. Note that ktls_decrypt assumes the 946 * trailer is tls_tlen bytes long, so append that many 947 * bytes not the actual trailer size computed from 948 * pdu_length. 949 */ 950 trailer_len = sb->sb_tls_info->params.tls_tlen; 951 if (tls_data != NULL) { 952 m_last(tls_data)->m_len += trailer_len; 953 tls_data = NULL; 954 } else 955 m->m_len += trailer_len; 956 m->m_pkthdr.len += trailer_len; 957 tls_hdr_pkt->length = htobe16(m->m_pkthdr.len - 958 sizeof(struct tls_record_layer)); 959 } 960 961 /* receive buffer autosize */ 962 MPASS(toep->vnet == so->so_vnet); 963 CURVNET_SET(toep->vnet); 964 if (sb->sb_flags & SB_AUTOSIZE && 965 V_tcp_do_autorcvbuf && 966 sb->sb_hiwat < V_tcp_autorcvbuf_max && 967 m->m_pkthdr.len > (sbspace(sb) / 8 * 7)) { 968 unsigned int hiwat = sb->sb_hiwat; 969 unsigned int newsize = min(hiwat + sc->tt.autorcvbuf_inc, 970 V_tcp_autorcvbuf_max); 971 972 if (!sbreserve_locked(so, SO_RCV, newsize, NULL)) 973 sb->sb_flags &= ~SB_AUTOSIZE; 974 } 975 976 if (control != NULL) 977 sbappendcontrol_locked(sb, m, control, 0); 978 else 979 sbappendstream_locked(sb, m, 0); 980 rx_credits = sbspace(sb) > tp->rcv_wnd ? sbspace(sb) - tp->rcv_wnd : 0; 981 #ifdef VERBOSE_TRACES 982 CTR4(KTR_CXGBE, "%s: tid %u rx_credits %u rcv_wnd %u", 983 __func__, tid, rx_credits, tp->rcv_wnd); 984 #endif 985 if (rx_credits > 0 && sbused(sb) + tp->rcv_wnd < sb->sb_lowat) { 986 rx_credits = send_rx_credits(sc, toep, rx_credits); 987 tp->rcv_wnd += rx_credits; 988 tp->rcv_adv += rx_credits; 989 } 990 991 sorwakeup_locked(so); 992 SOCKBUF_UNLOCK_ASSERT(sb); 993 994 INP_WUNLOCK(inp); 995 CURVNET_RESTORE(); 996 return (0); 997 } 998 999 void 1000 do_rx_data_tls(const struct cpl_rx_data *cpl, struct toepcb *toep, 1001 struct mbuf *m) 1002 { 1003 struct inpcb *inp = toep->inp; 1004 struct tls_ofld_info *tls_ofld = &toep->tls; 1005 struct tls_hdr *hdr; 1006 struct tcpcb *tp; 1007 struct socket *so; 1008 struct sockbuf *sb; 1009 int len, rx_credits; 1010 1011 len = m->m_pkthdr.len; 1012 1013 INP_WLOCK_ASSERT(inp); 1014 1015 so = inp_inpcbtosocket(inp); 1016 tp = intotcpcb(inp); 1017 sb = &so->so_rcv; 1018 SOCKBUF_LOCK(sb); 1019 CURVNET_SET(toep->vnet); 1020 1021 tp->rcv_nxt += len; 1022 KASSERT(tp->rcv_wnd >= len, ("%s: negative window size", __func__)); 1023 tp->rcv_wnd -= len; 1024 1025 /* Do we have a full TLS header? */ 1026 if (len < sizeof(*hdr)) { 1027 CTR3(KTR_CXGBE, "%s: tid %u len %d: too short for a TLS header", 1028 __func__, toep->tid, len); 1029 so->so_error = EMSGSIZE; 1030 goto out; 1031 } 1032 hdr = mtod(m, struct tls_hdr *); 1033 1034 /* Is the header valid? */ 1035 if (be16toh(hdr->version) != tls_ofld->rx_version) { 1036 CTR3(KTR_CXGBE, "%s: tid %u invalid version %04x", 1037 __func__, toep->tid, be16toh(hdr->version)); 1038 so->so_error = EINVAL; 1039 goto out; 1040 } 1041 if (be16toh(hdr->length) < sizeof(*hdr)) { 1042 CTR3(KTR_CXGBE, "%s: tid %u invalid length %u", 1043 __func__, toep->tid, be16toh(hdr->length)); 1044 so->so_error = EBADMSG; 1045 goto out; 1046 } 1047 1048 /* Did we get a truncated record? */ 1049 if (len < be16toh(hdr->length)) { 1050 CTR4(KTR_CXGBE, "%s: tid %u truncated TLS record (%d vs %u)", 1051 __func__, toep->tid, len, be16toh(hdr->length)); 1052 1053 so->so_error = EMSGSIZE; 1054 goto out; 1055 } 1056 1057 /* Is the header type unknown? */ 1058 switch (hdr->type) { 1059 case CONTENT_TYPE_CCS: 1060 case CONTENT_TYPE_ALERT: 1061 case CONTENT_TYPE_APP_DATA: 1062 case CONTENT_TYPE_HANDSHAKE: 1063 break; 1064 default: 1065 CTR3(KTR_CXGBE, "%s: tid %u invalid TLS record type %u", 1066 __func__, toep->tid, hdr->type); 1067 so->so_error = EBADMSG; 1068 goto out; 1069 } 1070 1071 /* 1072 * Just punt. Although this could fall back to software 1073 * decryption, this case should never really happen. 1074 */ 1075 CTR4(KTR_CXGBE, "%s: tid %u dropping TLS record type %u, length %u", 1076 __func__, toep->tid, hdr->type, be16toh(hdr->length)); 1077 so->so_error = EBADMSG; 1078 1079 out: 1080 /* 1081 * This connection is going to die anyway, so probably don't 1082 * need to bother with returning credits. 1083 */ 1084 rx_credits = sbspace(sb) > tp->rcv_wnd ? sbspace(sb) - tp->rcv_wnd : 0; 1085 #ifdef VERBOSE_TRACES 1086 CTR4(KTR_CXGBE, "%s: tid %u rx_credits %u rcv_wnd %u", 1087 __func__, toep->tid, rx_credits, tp->rcv_wnd); 1088 #endif 1089 if (rx_credits > 0 && sbused(sb) + tp->rcv_wnd < sb->sb_lowat) { 1090 rx_credits = send_rx_credits(toep->vi->adapter, toep, 1091 rx_credits); 1092 tp->rcv_wnd += rx_credits; 1093 tp->rcv_adv += rx_credits; 1094 } 1095 1096 sorwakeup_locked(so); 1097 SOCKBUF_UNLOCK_ASSERT(sb); 1098 1099 INP_WUNLOCK(inp); 1100 CURVNET_RESTORE(); 1101 1102 m_freem(m); 1103 } 1104 1105 /* SET_TCB_FIELD sent as a ULP command looks like this */ 1106 #define LEN__SET_TCB_FIELD_ULP (sizeof(struct ulp_txpkt) + \ 1107 sizeof(struct ulptx_idata) + sizeof(struct cpl_set_tcb_field_core)) 1108 1109 static inline void * 1110 mk_set_tcb_field_ulp(struct ulp_txpkt *ulpmc, struct toepcb *toep, 1111 uint64_t word, uint64_t mask, uint64_t val) 1112 { 1113 struct ulptx_idata *ulpsc; 1114 struct cpl_set_tcb_field_core *req; 1115 1116 ulpmc->cmd_dest = htonl(V_ULPTX_CMD(ULP_TX_PKT) | V_ULP_TXPKT_DEST(0)); 1117 ulpmc->len = htobe32(howmany(LEN__SET_TCB_FIELD_ULP, 16)); 1118 1119 ulpsc = (struct ulptx_idata *)(ulpmc + 1); 1120 ulpsc->cmd_more = htobe32(V_ULPTX_CMD(ULP_TX_SC_IMM)); 1121 ulpsc->len = htobe32(sizeof(*req)); 1122 1123 req = (struct cpl_set_tcb_field_core *)(ulpsc + 1); 1124 OPCODE_TID(req) = htobe32(MK_OPCODE_TID(CPL_SET_TCB_FIELD, toep->tid)); 1125 req->reply_ctrl = htobe16(V_NO_REPLY(1) | 1126 V_QUEUENO(toep->ofld_rxq->iq.abs_id)); 1127 req->word_cookie = htobe16(V_WORD(word) | V_COOKIE(0)); 1128 req->mask = htobe64(mask); 1129 req->val = htobe64(val); 1130 1131 ulpsc = (struct ulptx_idata *)(req + 1); 1132 if (LEN__SET_TCB_FIELD_ULP % 16) { 1133 ulpsc->cmd_more = htobe32(V_ULPTX_CMD(ULP_TX_SC_NOOP)); 1134 ulpsc->len = htobe32(0); 1135 return (ulpsc + 1); 1136 } 1137 return (ulpsc); 1138 } 1139 1140 /* 1141 * Send a work request setting multiple TCB fields to enable 1142 * ULP_MODE_TLS. 1143 */ 1144 static void 1145 tls_update_tcb(struct adapter *sc, struct toepcb *toep, uint64_t seqno) 1146 { 1147 struct wrqe *wr; 1148 struct work_request_hdr *wrh; 1149 struct ulp_txpkt *ulpmc; 1150 int fields, key_offset, len; 1151 1152 KASSERT(ulp_mode(toep) == ULP_MODE_NONE, 1153 ("%s: tid %d already ULP_MODE_TLS", __func__, toep->tid)); 1154 1155 fields = 0; 1156 1157 /* 2 writes for the overlay region */ 1158 fields += 2; 1159 1160 /* W_TCB_TLS_SEQ */ 1161 fields++; 1162 1163 /* W_TCB_ULP_RAW */ 1164 fields++; 1165 1166 /* W_TCB_ULP_TYPE */ 1167 fields ++; 1168 1169 /* W_TCB_T_FLAGS */ 1170 fields++; 1171 1172 len = sizeof(*wrh) + fields * roundup2(LEN__SET_TCB_FIELD_ULP, 16); 1173 KASSERT(len <= SGE_MAX_WR_LEN, 1174 ("%s: WR with %d TCB field updates too large", __func__, fields)); 1175 1176 wr = alloc_wrqe(len, toep->ctrlq); 1177 if (wr == NULL) { 1178 /* XXX */ 1179 panic("%s: out of memory", __func__); 1180 } 1181 1182 wrh = wrtod(wr); 1183 INIT_ULPTX_WRH(wrh, len, 1, 0); /* atomic */ 1184 ulpmc = (struct ulp_txpkt *)(wrh + 1); 1185 1186 /* 1187 * Clear the TLS overlay region: 1023:832. 1188 * 1189 * Words 26/27 are always set to zero. Words 28/29 1190 * contain seqno and are set when enabling TLS 1191 * decryption. Word 30 is zero and Word 31 contains 1192 * the keyid. 1193 */ 1194 ulpmc = mk_set_tcb_field_ulp(ulpmc, toep, 26, 1195 0xffffffffffffffff, 0); 1196 1197 /* 1198 * RX key tags are an index into the key portion of MA 1199 * memory stored as an offset from the base address in 1200 * units of 64 bytes. 1201 */ 1202 key_offset = toep->tls.rx_key_addr - sc->vres.key.start; 1203 ulpmc = mk_set_tcb_field_ulp(ulpmc, toep, 30, 1204 0xffffffffffffffff, 1205 (uint64_t)V_TCB_RX_TLS_KEY_TAG(key_offset / 64) << 32); 1206 1207 CTR3(KTR_CXGBE, "%s: tid %d enable TLS seqno %lu", __func__, 1208 toep->tid, seqno); 1209 ulpmc = mk_set_tcb_field_ulp(ulpmc, toep, W_TCB_TLS_SEQ, 1210 V_TCB_TLS_SEQ(M_TCB_TLS_SEQ), V_TCB_TLS_SEQ(seqno)); 1211 ulpmc = mk_set_tcb_field_ulp(ulpmc, toep, W_TCB_ULP_RAW, 1212 V_TCB_ULP_RAW(M_TCB_ULP_RAW), 1213 V_TCB_ULP_RAW((V_TF_TLS_KEY_SIZE(3) | V_TF_TLS_CONTROL(1) | 1214 V_TF_TLS_ACTIVE(1) | V_TF_TLS_ENABLE(1)))); 1215 1216 toep->flags &= ~TPF_TLS_STARTING; 1217 toep->flags |= TPF_TLS_RECEIVE; 1218 1219 /* Set the ULP mode to ULP_MODE_TLS. */ 1220 toep->params.ulp_mode = ULP_MODE_TLS; 1221 ulpmc = mk_set_tcb_field_ulp(ulpmc, toep, W_TCB_ULP_TYPE, 1222 V_TCB_ULP_TYPE(M_TCB_ULP_TYPE), 1223 V_TCB_ULP_TYPE(ULP_MODE_TLS)); 1224 1225 /* Clear TF_RX_QUIESCE. */ 1226 ulpmc = mk_set_tcb_field_ulp(ulpmc, toep, W_TCB_T_FLAGS, 1227 V_TF_RX_QUIESCE(1), 0); 1228 1229 t4_wrq_tx(sc, wr); 1230 } 1231 1232 /* 1233 * Examine the pending data in the socket buffer and either enable TLS 1234 * RX or request more encrypted data. 1235 */ 1236 static void 1237 tls_check_rx_sockbuf(struct adapter *sc, struct toepcb *toep, 1238 struct sockbuf *sb) 1239 { 1240 uint64_t seqno; 1241 size_t resid; 1242 bool have_header; 1243 1244 SOCKBUF_LOCK_ASSERT(sb); 1245 MPASS(toep->tls.rx_resid == 0); 1246 1247 have_header = ktls_pending_rx_info(sb, &seqno, &resid); 1248 CTR5(KTR_CXGBE, "%s: tid %d have_header %d seqno %lu resid %zu", 1249 __func__, toep->tid, have_header, seqno, resid); 1250 1251 /* 1252 * If we have a partial header or we need fewer bytes than the 1253 * size of a TLS record, re-enable receive and pause again once 1254 * we get more data to try again. 1255 */ 1256 if (!have_header || resid != 0) { 1257 CTR(KTR_CXGBE, "%s: tid %d waiting for more data", __func__, 1258 toep->tid); 1259 toep->flags &= ~TPF_TLS_RX_QUIESCED; 1260 t4_clear_rx_quiesce(toep); 1261 return; 1262 } 1263 1264 tls_update_tcb(sc, toep, seqno); 1265 } 1266 1267 void 1268 tls_received_starting_data(struct adapter *sc, struct toepcb *toep, 1269 struct sockbuf *sb, int len) 1270 { 1271 MPASS(toep->flags & TPF_TLS_STARTING); 1272 1273 /* 1274 * A previous call to tls_check_rx_sockbuf needed more data. 1275 * Now that more data has arrived, quiesce receive again and 1276 * check the state once the quiesce has completed. 1277 */ 1278 if ((toep->flags & TPF_TLS_RX_QUIESCED) == 0) { 1279 CTR(KTR_CXGBE, "%s: tid %d quiescing", __func__, toep->tid); 1280 toep->flags |= TPF_TLS_RX_QUIESCED; 1281 t4_set_rx_quiesce(toep); 1282 return; 1283 } 1284 1285 KASSERT(len <= toep->tls.rx_resid, 1286 ("%s: received excess bytes %d (waiting for %zu)", __func__, len, 1287 toep->tls.rx_resid)); 1288 toep->tls.rx_resid -= len; 1289 if (toep->tls.rx_resid != 0) 1290 return; 1291 1292 tls_check_rx_sockbuf(sc, toep, sb); 1293 } 1294 1295 static int 1296 do_tls_tcb_rpl(struct sge_iq *iq, const struct rss_header *rss, struct mbuf *m) 1297 { 1298 struct adapter *sc = iq->adapter; 1299 const struct cpl_set_tcb_rpl *cpl = (const void *)(rss + 1); 1300 unsigned int tid = GET_TID(cpl); 1301 struct toepcb *toep; 1302 struct inpcb *inp; 1303 struct socket *so; 1304 struct sockbuf *sb; 1305 1306 if (cpl->status != CPL_ERR_NONE) 1307 panic("XXX: tcp_rpl failed: %d", cpl->status); 1308 1309 toep = lookup_tid(sc, tid); 1310 inp = toep->inp; 1311 switch (cpl->cookie) { 1312 case V_WORD(W_TCB_T_FLAGS) | V_COOKIE(CPL_COOKIE_TOM): 1313 INP_WLOCK(inp); 1314 if ((toep->flags & TPF_TLS_STARTING) == 0) 1315 panic("%s: connection is not starting TLS RX\n", 1316 __func__); 1317 1318 so = inp->inp_socket; 1319 sb = &so->so_rcv; 1320 SOCKBUF_LOCK(sb); 1321 tls_check_rx_sockbuf(sc, toep, sb); 1322 SOCKBUF_UNLOCK(sb); 1323 INP_WUNLOCK(inp); 1324 break; 1325 default: 1326 panic("XXX: unknown tcb_rpl offset %#x, cookie %#x", 1327 G_WORD(cpl->cookie), G_COOKIE(cpl->cookie)); 1328 } 1329 1330 return (0); 1331 } 1332 1333 void 1334 t4_tls_mod_load(void) 1335 { 1336 1337 t4_register_cpl_handler(CPL_TLS_DATA, do_tls_data); 1338 t4_register_cpl_handler(CPL_RX_TLS_CMP, do_rx_tls_cmp); 1339 t4_register_shared_cpl_handler(CPL_SET_TCB_RPL, do_tls_tcb_rpl, 1340 CPL_COOKIE_TOM); 1341 } 1342 1343 void 1344 t4_tls_mod_unload(void) 1345 { 1346 1347 t4_register_cpl_handler(CPL_TLS_DATA, NULL); 1348 t4_register_cpl_handler(CPL_RX_TLS_CMP, NULL); 1349 t4_register_shared_cpl_handler(CPL_SET_TCB_RPL, NULL, CPL_COOKIE_TOM); 1350 } 1351 #endif /* TCP_OFFLOAD */ 1352 #endif /* KERN_TLS */ 1353