xref: /freebsd/sys/dev/cxgbe/tom/t4_tls.c (revision d5b0e70f7e04d971691517ce1304d86a1e367e2e)
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 TLS Key-Id in TCB */
90 static void
91 t4_set_tls_keyid(struct toepcb *toep, unsigned int key_id)
92 {
93 
94 	t4_set_tls_tcb_field(toep, W_TCB_RX_TLS_KEY_TAG,
95 			 V_TCB_RX_TLS_KEY_TAG(M_TCB_RX_TLS_BUF_TAG),
96 			 V_TCB_RX_TLS_KEY_TAG(key_id));
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 static void
108 tls_clr_ofld_mode(struct toepcb *toep)
109 {
110 
111 	tls_stop_handshake_timer(toep);
112 
113 	KASSERT(toep->tls.rx_key_addr == -1,
114 	    ("%s: tid %d has RX key", __func__, toep->tid));
115 
116 	/* Switch to plain TOE mode. */
117 	t4_set_tls_tcb_field(toep, W_TCB_ULP_RAW,
118 	    V_TCB_ULP_RAW(V_TF_TLS_ENABLE(1)),
119 	    V_TCB_ULP_RAW(V_TF_TLS_ENABLE(0)));
120 	t4_set_tls_tcb_field(toep, W_TCB_ULP_TYPE,
121 	    V_TCB_ULP_TYPE(M_TCB_ULP_TYPE), V_TCB_ULP_TYPE(ULP_MODE_NONE));
122 	t4_clear_rx_quiesce(toep);
123 
124 	toep->flags &= ~(TPF_FORCE_CREDITS | TPF_TLS_ESTABLISHED);
125 	toep->params.ulp_mode = ULP_MODE_NONE;
126 }
127 
128 /* TLS/DTLS content type  for CPL SFO */
129 static inline unsigned char
130 tls_content_type(unsigned char content_type)
131 {
132 	switch (content_type) {
133 	case CONTENT_TYPE_CCS:
134 		return CPL_TX_TLS_SFO_TYPE_CCS;
135 	case CONTENT_TYPE_ALERT:
136 		return CPL_TX_TLS_SFO_TYPE_ALERT;
137 	case CONTENT_TYPE_HANDSHAKE:
138 		return CPL_TX_TLS_SFO_TYPE_HANDSHAKE;
139 	case CONTENT_TYPE_APP_DATA:
140 		return CPL_TX_TLS_SFO_TYPE_DATA;
141 	default:
142 		return CPL_TX_TLS_SFO_TYPE_CUSTOM;
143 	}
144 }
145 
146 /* TLS Key memory management */
147 static void
148 clear_tls_keyid(struct toepcb *toep)
149 {
150 	struct tls_ofld_info *tls_ofld = &toep->tls;
151 	struct adapter *sc = td_adapter(toep->td);
152 
153 	if (tls_ofld->rx_key_addr >= 0) {
154 		t4_free_tls_keyid(sc, tls_ofld->rx_key_addr);
155 		tls_ofld->rx_key_addr = -1;
156 	}
157 	if (tls_ofld->tx_key_addr >= 0) {
158 		t4_free_tls_keyid(sc, tls_ofld->tx_key_addr);
159 		tls_ofld->tx_key_addr = -1;
160 	}
161 }
162 
163 static int
164 get_tp_plen_max(struct ktls_session *tls)
165 {
166 	int plen = ((min(3*4096, TP_TX_PG_SZ))/1448) * 1448;
167 
168 	return (tls->params.max_frame_len <= 8192 ? plen : FC_TP_PLEN_MAX);
169 }
170 
171 /* Send request to get the key-id */
172 static int
173 tls_program_key_id(struct toepcb *toep, struct ktls_session *tls,
174     int direction)
175 {
176 	struct tls_ofld_info *tls_ofld = &toep->tls;
177 	struct adapter *sc = td_adapter(toep->td);
178 	struct ofld_tx_sdesc *txsd;
179 	int keyid;
180 	struct wrqe *wr;
181 	struct tls_key_req *kwr;
182 	struct tls_keyctx *kctx;
183 
184 #ifdef INVARIANTS
185 	int kwrlen, kctxlen, len;
186 
187 	kwrlen = sizeof(*kwr);
188 	kctxlen = roundup2(sizeof(*kctx), 32);
189 	len = roundup2(kwrlen + kctxlen, 16);
190 	MPASS(TLS_KEY_WR_SZ == len);
191 #endif
192 	if (toep->txsd_avail == 0)
193 		return (EAGAIN);
194 
195 	if ((keyid = t4_alloc_tls_keyid(sc)) < 0) {
196 		return (ENOSPC);
197 	}
198 
199 	wr = alloc_wrqe(TLS_KEY_WR_SZ, &toep->ofld_txq->wrq);
200 	if (wr == NULL) {
201 		t4_free_tls_keyid(sc, keyid);
202 		return (ENOMEM);
203 	}
204 	kwr = wrtod(wr);
205 	memset(kwr, 0, TLS_KEY_WR_SZ);
206 
207 	t4_write_tlskey_wr(tls, direction, toep->tid, F_FW_WR_COMPL, keyid,
208 	    kwr);
209 	kctx = (struct tls_keyctx *)(kwr + 1);
210 	if (direction == KTLS_TX)
211 		tls_ofld->tx_key_addr = keyid;
212 	else
213 		tls_ofld->rx_key_addr = keyid;
214 	t4_tls_key_ctx(tls, direction, kctx);
215 
216 	txsd = &toep->txsd[toep->txsd_pidx];
217 	txsd->tx_credits = DIV_ROUND_UP(TLS_KEY_WR_SZ, 16);
218 	txsd->plen = 0;
219 	toep->tx_credits -= txsd->tx_credits;
220 	if (__predict_false(++toep->txsd_pidx == toep->txsd_total))
221 		toep->txsd_pidx = 0;
222 	toep->txsd_avail--;
223 
224 	t4_wrq_tx(sc, wr);
225 
226 	return (0);
227 }
228 
229 /*
230  * In some cases a client connection can hang without sending the
231  * ServerHelloDone message from the NIC to the host.  Send a dummy
232  * RX_DATA_ACK with RX_MODULATE to unstick the connection.
233  */
234 static void
235 tls_send_handshake_ack(void *arg)
236 {
237 	struct toepcb *toep = arg;
238 	struct tls_ofld_info *tls_ofld = &toep->tls;
239 	struct adapter *sc = td_adapter(toep->td);
240 
241 	/* Bail without rescheduling if the connection has closed. */
242 	if ((toep->flags & (TPF_FIN_SENT | TPF_ABORT_SHUTDOWN)) != 0)
243 		return;
244 
245 	/*
246 	 * If this connection has timed out without receiving more
247 	 * data, downgrade to plain TOE mode and don't re-arm the
248 	 * timer.
249 	 */
250 	if (sc->tt.tls_rx_timeout != 0) {
251 		struct inpcb *inp;
252 		struct tcpcb *tp;
253 
254 		inp = toep->inp;
255 		tp = intotcpcb(inp);
256 		if ((ticks - tp->t_rcvtime) >= sc->tt.tls_rx_timeout) {
257 			CTR2(KTR_CXGBE, "%s: tid %d clr_ofld_mode", __func__,
258 			    toep->tid);
259 			tls_clr_ofld_mode(toep);
260 			return;
261 		}
262 	}
263 
264 	/*
265 	 * XXX: Does not have the t4_get_tcb() checks to refine the
266 	 * workaround.
267 	 */
268 	callout_schedule(&tls_ofld->handshake_timer, TLS_SRV_HELLO_RD_TM * hz);
269 
270 	CTR2(KTR_CXGBE, "%s: tid %d sending RX_DATA_ACK", __func__, toep->tid);
271 	send_rx_modulate(sc, toep);
272 }
273 
274 static void
275 tls_start_handshake_timer(struct toepcb *toep)
276 {
277 	struct tls_ofld_info *tls_ofld = &toep->tls;
278 
279 	INP_WLOCK_ASSERT(toep->inp);
280 	callout_reset(&tls_ofld->handshake_timer, TLS_SRV_HELLO_BKOFF_TM * hz,
281 	    tls_send_handshake_ack, toep);
282 }
283 
284 void
285 tls_stop_handshake_timer(struct toepcb *toep)
286 {
287 	struct tls_ofld_info *tls_ofld = &toep->tls;
288 
289 	INP_WLOCK_ASSERT(toep->inp);
290 	callout_stop(&tls_ofld->handshake_timer);
291 }
292 
293 int
294 tls_alloc_ktls(struct toepcb *toep, struct ktls_session *tls, int direction)
295 {
296 	struct adapter *sc = td_adapter(toep->td);
297 	int error, explicit_iv_size, key_offset, mac_first;
298 
299 	if (!can_tls_offload(td_adapter(toep->td)))
300 		return (EINVAL);
301 	switch (ulp_mode(toep)) {
302 	case ULP_MODE_TLS:
303 		break;
304 	case ULP_MODE_NONE:
305 	case ULP_MODE_TCPDDP:
306 		if (direction != KTLS_TX)
307 			return (EINVAL);
308 		break;
309 	default:
310 		return (EINVAL);
311 	}
312 
313 	switch (tls->params.cipher_algorithm) {
314 	case CRYPTO_AES_CBC:
315 		/* XXX: Explicitly ignore any provided IV. */
316 		switch (tls->params.cipher_key_len) {
317 		case 128 / 8:
318 		case 192 / 8:
319 		case 256 / 8:
320 			break;
321 		default:
322 			error = EINVAL;
323 			goto clr_ofld;
324 		}
325 		switch (tls->params.auth_algorithm) {
326 		case CRYPTO_SHA1_HMAC:
327 		case CRYPTO_SHA2_256_HMAC:
328 		case CRYPTO_SHA2_384_HMAC:
329 			break;
330 		default:
331 			error = EPROTONOSUPPORT;
332 			goto clr_ofld;
333 		}
334 		explicit_iv_size = AES_BLOCK_LEN;
335 		mac_first = 1;
336 		break;
337 	case CRYPTO_AES_NIST_GCM_16:
338 		if (tls->params.iv_len != SALT_SIZE) {
339 			error = EINVAL;
340 			goto clr_ofld;
341 		}
342 		switch (tls->params.cipher_key_len) {
343 		case 128 / 8:
344 		case 192 / 8:
345 		case 256 / 8:
346 			break;
347 		default:
348 			error = EINVAL;
349 			goto clr_ofld;
350 		}
351 		explicit_iv_size = 8;
352 		mac_first = 0;
353 		break;
354 	default:
355 		error = EPROTONOSUPPORT;
356 		goto clr_ofld;
357 	}
358 
359 	/* Only TLS 1.1 and TLS 1.2 are currently supported. */
360 	if (tls->params.tls_vmajor != TLS_MAJOR_VER_ONE ||
361 	    tls->params.tls_vminor < TLS_MINOR_VER_ONE ||
362 	    tls->params.tls_vminor > TLS_MINOR_VER_TWO) {
363 		error = EPROTONOSUPPORT;
364 		goto clr_ofld;
365 	}
366 
367 	/* Bail if we already have a key. */
368 	if (direction == KTLS_TX) {
369 		if (toep->tls.tx_key_addr != -1)
370 			return (EOPNOTSUPP);
371 	} else {
372 		if (toep->tls.rx_key_addr != -1)
373 			return (EOPNOTSUPP);
374 	}
375 
376 	error = tls_program_key_id(toep, tls, direction);
377 	if (error) {
378 		if (direction == KTLS_RX)
379 			goto clr_ofld;
380 		return (error);
381 	}
382 
383 	if (direction == KTLS_TX) {
384 		toep->tls.scmd0.seqno_numivs =
385 			(V_SCMD_SEQ_NO_CTRL(3) |
386 			 V_SCMD_PROTO_VERSION(t4_tls_proto_ver(tls)) |
387 			 V_SCMD_ENC_DEC_CTRL(SCMD_ENCDECCTRL_ENCRYPT) |
388 			 V_SCMD_CIPH_AUTH_SEQ_CTRL((mac_first == 0)) |
389 			 V_SCMD_CIPH_MODE(t4_tls_cipher_mode(tls)) |
390 			 V_SCMD_AUTH_MODE(t4_tls_auth_mode(tls)) |
391 			 V_SCMD_HMAC_CTRL(t4_tls_hmac_ctrl(tls)) |
392 			 V_SCMD_IV_SIZE(explicit_iv_size / 2));
393 
394 		toep->tls.scmd0.ivgen_hdrlen =
395 			(V_SCMD_IV_GEN_CTRL(1) |
396 			 V_SCMD_KEY_CTX_INLINE(0) |
397 			 V_SCMD_TLS_FRAG_ENABLE(1));
398 
399 		toep->tls.iv_len = explicit_iv_size;
400 		toep->tls.frag_size = tls->params.max_frame_len;
401 		toep->tls.fcplenmax = get_tp_plen_max(tls);
402 		toep->tls.expn_per_ulp = tls->params.tls_hlen +
403 		    tls->params.tls_tlen;
404 		toep->tls.pdus_per_ulp = 1;
405 		toep->tls.adjusted_plen = toep->tls.expn_per_ulp +
406 		    tls->params.max_frame_len;
407 		toep->tls.tx_key_info_size = t4_tls_key_info_size(tls);
408 	} else {
409 		/* Stop timer on handshake completion */
410 		tls_stop_handshake_timer(toep);
411 
412 		toep->flags &= ~TPF_FORCE_CREDITS;
413 		toep->flags |= TPF_TLS_RECEIVE;
414 		toep->tls.rx_version = tls->params.tls_vmajor << 8 |
415 		    tls->params.tls_vminor;
416 
417 		/*
418 		 * RX key tags are an index into the key portion of MA
419 		 * memory stored as an offset from the base address in
420 		 * units of 64 bytes.
421 		 */
422 		key_offset = toep->tls.rx_key_addr - sc->vres.key.start;
423 		t4_set_tls_keyid(toep, key_offset / 64);
424 		t4_set_tls_tcb_field(toep, W_TCB_ULP_RAW,
425 				 V_TCB_ULP_RAW(M_TCB_ULP_RAW),
426 				 V_TCB_ULP_RAW((V_TF_TLS_KEY_SIZE(3) |
427 						V_TF_TLS_CONTROL(1) |
428 						V_TF_TLS_ACTIVE(1) |
429 						V_TF_TLS_ENABLE(1))));
430 		t4_set_tls_tcb_field(toep, W_TCB_TLS_SEQ,
431 				 V_TCB_TLS_SEQ(M_TCB_TLS_SEQ),
432 				 V_TCB_TLS_SEQ(0));
433 		t4_clear_rx_quiesce(toep);
434 	}
435 
436 	return (0);
437 
438 clr_ofld:
439 	if (ulp_mode(toep) == ULP_MODE_TLS) {
440 		CTR2(KTR_CXGBE, "%s: tid %d clr_ofld_mode", __func__,
441 		    toep->tid);
442 		tls_clr_ofld_mode(toep);
443 	}
444 	return (error);
445 }
446 
447 void
448 tls_init_toep(struct toepcb *toep)
449 {
450 	struct tls_ofld_info *tls_ofld = &toep->tls;
451 
452 	tls_ofld->rx_key_addr = -1;
453 	tls_ofld->tx_key_addr = -1;
454 }
455 
456 void
457 tls_establish(struct toepcb *toep)
458 {
459 
460 	/*
461 	 * Enable PDU extraction.
462 	 *
463 	 * XXX: Supposedly this should be done by the firmware when
464 	 * the ULP_MODE FLOWC parameter is set in send_flowc_wr(), but
465 	 * in practice this seems to be required.
466 	 */
467 	CTR2(KTR_CXGBE, "%s: tid %d setting TLS_ENABLE", __func__, toep->tid);
468 	t4_set_tls_tcb_field(toep, W_TCB_ULP_RAW, V_TCB_ULP_RAW(M_TCB_ULP_RAW),
469 	    V_TCB_ULP_RAW(V_TF_TLS_ENABLE(1)));
470 
471 	toep->flags |= TPF_FORCE_CREDITS | TPF_TLS_ESTABLISHED;
472 
473 	callout_init_rw(&toep->tls.handshake_timer, &toep->inp->inp_lock, 0);
474 	tls_start_handshake_timer(toep);
475 }
476 
477 void
478 tls_detach(struct toepcb *toep)
479 {
480 
481 	if (toep->flags & TPF_TLS_ESTABLISHED) {
482 		tls_stop_handshake_timer(toep);
483 		toep->flags &= ~TPF_TLS_ESTABLISHED;
484 	}
485 }
486 
487 void
488 tls_uninit_toep(struct toepcb *toep)
489 {
490 
491 	MPASS((toep->flags & TPF_TLS_ESTABLISHED) == 0);
492 	clear_tls_keyid(toep);
493 }
494 
495 #define MAX_OFLD_TX_CREDITS (SGE_MAX_WR_LEN / 16)
496 #define	MIN_OFLD_TLSTX_CREDITS(toep)					\
497 	(howmany(sizeof(struct fw_tlstx_data_wr) + 			\
498 	    sizeof(struct cpl_tx_tls_sfo) + sizeof(struct ulptx_idata) + \
499 	    sizeof(struct ulptx_sc_memrd) +				\
500 	    AES_BLOCK_LEN + 1, 16))
501 
502 static void
503 write_tlstx_wr(struct fw_tlstx_data_wr *txwr, struct toepcb *toep,
504     unsigned int plen, unsigned int expn, uint8_t credits, int shove)
505 {
506 	struct tls_ofld_info *tls_ofld = &toep->tls;
507 	unsigned int len = plen + expn;
508 
509 	txwr->op_to_immdlen = htobe32(V_WR_OP(FW_TLSTX_DATA_WR) |
510 	    V_FW_TLSTX_DATA_WR_COMPL(1) |
511 	    V_FW_TLSTX_DATA_WR_IMMDLEN(0));
512 	txwr->flowid_len16 = htobe32(V_FW_TLSTX_DATA_WR_FLOWID(toep->tid) |
513 	    V_FW_TLSTX_DATA_WR_LEN16(credits));
514 	txwr->plen = htobe32(len);
515 	txwr->lsodisable_to_flags = htobe32(V_TX_ULP_MODE(ULP_MODE_TLS) |
516 	    V_TX_URG(0) | /* F_T6_TX_FORCE | */ V_TX_SHOVE(shove));
517 	txwr->ctxloc_to_exp = htobe32(V_FW_TLSTX_DATA_WR_NUMIVS(1) |
518 	    V_FW_TLSTX_DATA_WR_EXP(expn) |
519 	    V_FW_TLSTX_DATA_WR_CTXLOC(TLS_SFO_WR_CONTEXTLOC_DDR) |
520 	    V_FW_TLSTX_DATA_WR_IVDSGL(0) |
521 	    V_FW_TLSTX_DATA_WR_KEYSIZE(tls_ofld->tx_key_info_size >> 4));
522 	txwr->mfs = htobe16(tls_ofld->frag_size);
523 	txwr->adjustedplen_pkd = htobe16(
524 	    V_FW_TLSTX_DATA_WR_ADJUSTEDPLEN(tls_ofld->adjusted_plen));
525 	txwr->expinplenmax_pkd = htobe16(
526 	    V_FW_TLSTX_DATA_WR_EXPINPLENMAX(tls_ofld->expn_per_ulp));
527 	txwr->pdusinplenmax_pkd =
528 	    V_FW_TLSTX_DATA_WR_PDUSINPLENMAX(tls_ofld->pdus_per_ulp);
529 }
530 
531 static void
532 write_tlstx_cpl(struct cpl_tx_tls_sfo *cpl, struct toepcb *toep,
533     struct tls_hdr *tls_hdr, unsigned int plen, uint64_t seqno)
534 {
535 	struct tls_ofld_info *tls_ofld = &toep->tls;
536 	int data_type, seglen;
537 
538 	seglen = plen;
539 	data_type = tls_content_type(tls_hdr->type);
540 	cpl->op_to_seg_len = htobe32(V_CPL_TX_TLS_SFO_OPCODE(CPL_TX_TLS_SFO) |
541 	    V_CPL_TX_TLS_SFO_DATA_TYPE(data_type) |
542 	    V_CPL_TX_TLS_SFO_CPL_LEN(2) | V_CPL_TX_TLS_SFO_SEG_LEN(seglen));
543 	cpl->pld_len = htobe32(plen);
544 	if (data_type == CPL_TX_TLS_SFO_TYPE_CUSTOM)
545 		cpl->type_protover = htobe32(
546 		    V_CPL_TX_TLS_SFO_TYPE(tls_hdr->type));
547 	cpl->seqno_numivs = htobe32(tls_ofld->scmd0.seqno_numivs |
548 	    V_SCMD_NUM_IVS(1));
549 	cpl->ivgen_hdrlen = htobe32(tls_ofld->scmd0.ivgen_hdrlen);
550 	cpl->scmd1 = htobe64(seqno);
551 }
552 
553 static int
554 count_ext_pgs_segs(struct mbuf *m)
555 {
556 	vm_paddr_t nextpa;
557 	u_int i, nsegs;
558 
559 	MPASS(m->m_epg_npgs > 0);
560 	nsegs = 1;
561 	nextpa = m->m_epg_pa[0] + PAGE_SIZE;
562 	for (i = 1; i < m->m_epg_npgs; i++) {
563 		if (nextpa != m->m_epg_pa[i])
564 			nsegs++;
565 		nextpa = m->m_epg_pa[i] + PAGE_SIZE;
566 	}
567 	return (nsegs);
568 }
569 
570 static void
571 write_ktlstx_sgl(void *dst, struct mbuf *m, int nsegs)
572 {
573 	struct ulptx_sgl *usgl = dst;
574 	vm_paddr_t pa;
575 	uint32_t len;
576 	int i, j;
577 
578 	KASSERT(nsegs > 0, ("%s: nsegs 0", __func__));
579 
580 	usgl->cmd_nsge = htobe32(V_ULPTX_CMD(ULP_TX_SC_DSGL) |
581 	    V_ULPTX_NSGE(nsegs));
582 
583 	/* Figure out the first S/G length. */
584 	pa = m->m_epg_pa[0] + m->m_epg_1st_off;
585 	usgl->addr0 = htobe64(pa);
586 	len = m_epg_pagelen(m, 0, m->m_epg_1st_off);
587 	pa += len;
588 	for (i = 1; i < m->m_epg_npgs; i++) {
589 		if (m->m_epg_pa[i] != pa)
590 			break;
591 		len += m_epg_pagelen(m, i, 0);
592 		pa += m_epg_pagelen(m, i, 0);
593 	}
594 	usgl->len0 = htobe32(len);
595 #ifdef INVARIANTS
596 	nsegs--;
597 #endif
598 
599 	j = -1;
600 	for (; i < m->m_epg_npgs; i++) {
601 		if (j == -1 || m->m_epg_pa[i] != pa) {
602 			if (j >= 0)
603 				usgl->sge[j / 2].len[j & 1] = htobe32(len);
604 			j++;
605 #ifdef INVARIANTS
606 			nsegs--;
607 #endif
608 			pa = m->m_epg_pa[i];
609 			usgl->sge[j / 2].addr[j & 1] = htobe64(pa);
610 			len = m_epg_pagelen(m, i, 0);
611 			pa += len;
612 		} else {
613 			len += m_epg_pagelen(m, i, 0);
614 			pa += m_epg_pagelen(m, i, 0);
615 		}
616 	}
617 	if (j >= 0) {
618 		usgl->sge[j / 2].len[j & 1] = htobe32(len);
619 
620 		if ((j & 1) == 0)
621 			usgl->sge[j / 2].len[1] = htobe32(0);
622 	}
623 	KASSERT(nsegs == 0, ("%s: nsegs %d, m %p", __func__, nsegs, m));
624 }
625 
626 /*
627  * Similar to t4_push_frames() but handles sockets that contain TLS
628  * record mbufs.
629  */
630 void
631 t4_push_ktls(struct adapter *sc, struct toepcb *toep, int drop)
632 {
633 	struct tls_hdr *thdr;
634 	struct fw_tlstx_data_wr *txwr;
635 	struct cpl_tx_tls_sfo *cpl;
636 	struct ulptx_idata *idata;
637 	struct ulptx_sc_memrd *memrd;
638 	struct wrqe *wr;
639 	struct mbuf *m;
640 	u_int nsegs, credits, wr_len;
641 	u_int expn_size;
642 	struct inpcb *inp = toep->inp;
643 	struct tcpcb *tp = intotcpcb(inp);
644 	struct socket *so = inp->inp_socket;
645 	struct sockbuf *sb = &so->so_snd;
646 	int tls_size, tx_credits, shove, sowwakeup;
647 	struct ofld_tx_sdesc *txsd;
648 	char *buf;
649 
650 	INP_WLOCK_ASSERT(inp);
651 	KASSERT(toep->flags & TPF_FLOWC_WR_SENT,
652 	    ("%s: flowc_wr not sent for tid %u.", __func__, toep->tid));
653 
654 	KASSERT(ulp_mode(toep) == ULP_MODE_NONE ||
655 	    ulp_mode(toep) == ULP_MODE_TCPDDP || ulp_mode(toep) == ULP_MODE_TLS,
656 	    ("%s: ulp_mode %u for toep %p", __func__, ulp_mode(toep), toep));
657 	KASSERT(tls_tx_key(toep),
658 	    ("%s: TX key not set for toep %p", __func__, toep));
659 
660 #ifdef VERBOSE_TRACES
661 	CTR4(KTR_CXGBE, "%s: tid %d toep flags %#x tp flags %#x drop %d",
662 	    __func__, toep->tid, toep->flags, tp->t_flags);
663 #endif
664 	if (__predict_false(toep->flags & TPF_ABORT_SHUTDOWN))
665 		return;
666 
667 #ifdef RATELIMIT
668 	if (__predict_false(inp->inp_flags2 & INP_RATE_LIMIT_CHANGED) &&
669 	    (update_tx_rate_limit(sc, toep, so->so_max_pacing_rate) == 0)) {
670 		inp->inp_flags2 &= ~INP_RATE_LIMIT_CHANGED;
671 	}
672 #endif
673 
674 	/*
675 	 * This function doesn't resume by itself.  Someone else must clear the
676 	 * flag and call this function.
677 	 */
678 	if (__predict_false(toep->flags & TPF_TX_SUSPENDED)) {
679 		KASSERT(drop == 0,
680 		    ("%s: drop (%d) != 0 but tx is suspended", __func__, drop));
681 		return;
682 	}
683 
684 	txsd = &toep->txsd[toep->txsd_pidx];
685 	for (;;) {
686 		tx_credits = min(toep->tx_credits, MAX_OFLD_TX_CREDITS);
687 
688 		SOCKBUF_LOCK(sb);
689 		sowwakeup = drop;
690 		if (drop) {
691 			sbdrop_locked(sb, drop);
692 			drop = 0;
693 		}
694 
695 		m = sb->sb_sndptr != NULL ? sb->sb_sndptr->m_next : sb->sb_mb;
696 
697 		/*
698 		 * Send a FIN if requested, but only if there's no
699 		 * more data to send.
700 		 */
701 		if (m == NULL && toep->flags & TPF_SEND_FIN) {
702 			if (sowwakeup)
703 				sowwakeup_locked(so);
704 			else
705 				SOCKBUF_UNLOCK(sb);
706 			SOCKBUF_UNLOCK_ASSERT(sb);
707 			t4_close_conn(sc, toep);
708 			return;
709 		}
710 
711 		/*
712 		 * If there is no ready data to send, wait until more
713 		 * data arrives.
714 		 */
715 		if (m == NULL || (m->m_flags & M_NOTAVAIL) != 0) {
716 			if (sowwakeup)
717 				sowwakeup_locked(so);
718 			else
719 				SOCKBUF_UNLOCK(sb);
720 			SOCKBUF_UNLOCK_ASSERT(sb);
721 #ifdef VERBOSE_TRACES
722 			CTR2(KTR_CXGBE, "%s: tid %d no ready data to send",
723 			    __func__, toep->tid);
724 #endif
725 			return;
726 		}
727 
728 		KASSERT(m->m_flags & M_EXTPG, ("%s: mbuf %p is not NOMAP",
729 		    __func__, m));
730 		KASSERT(m->m_epg_tls != NULL,
731 		    ("%s: mbuf %p doesn't have TLS session", __func__, m));
732 
733 		/* Calculate WR length. */
734 		wr_len = sizeof(struct fw_tlstx_data_wr) +
735 		    sizeof(struct cpl_tx_tls_sfo) +
736 		    sizeof(struct ulptx_idata) + sizeof(struct ulptx_sc_memrd);
737 
738 		/* Explicit IVs for AES-CBC and AES-GCM are <= 16. */
739 		MPASS(toep->tls.iv_len <= AES_BLOCK_LEN);
740 		wr_len += AES_BLOCK_LEN;
741 
742 		/* Account for SGL in work request length. */
743 		nsegs = count_ext_pgs_segs(m);
744 		wr_len += sizeof(struct ulptx_sgl) +
745 		    ((3 * (nsegs - 1)) / 2 + ((nsegs - 1) & 1)) * 8;
746 
747 		/* Not enough credits for this work request. */
748 		if (howmany(wr_len, 16) > tx_credits) {
749 			if (sowwakeup)
750 				sowwakeup_locked(so);
751 			else
752 				SOCKBUF_UNLOCK(sb);
753 			SOCKBUF_UNLOCK_ASSERT(sb);
754 #ifdef VERBOSE_TRACES
755 			CTR5(KTR_CXGBE,
756 	    "%s: tid %d mbuf %p requires %d credits, but only %d available",
757 			    __func__, toep->tid, m, howmany(wr_len, 16),
758 			    tx_credits);
759 #endif
760 			toep->flags |= TPF_TX_SUSPENDED;
761 			return;
762 		}
763 
764 		/* Shove if there is no additional data pending. */
765 		shove = ((m->m_next == NULL ||
766 		    (m->m_next->m_flags & M_NOTAVAIL) != 0)) &&
767 		    (tp->t_flags & TF_MORETOCOME) == 0;
768 
769 		if (sb->sb_flags & SB_AUTOSIZE &&
770 		    V_tcp_do_autosndbuf &&
771 		    sb->sb_hiwat < V_tcp_autosndbuf_max &&
772 		    sbused(sb) >= sb->sb_hiwat * 7 / 8) {
773 			int newsize = min(sb->sb_hiwat + V_tcp_autosndbuf_inc,
774 			    V_tcp_autosndbuf_max);
775 
776 			if (!sbreserve_locked(so, SO_SND, newsize, NULL))
777 				sb->sb_flags &= ~SB_AUTOSIZE;
778 			else
779 				sowwakeup = 1;	/* room available */
780 		}
781 		if (sowwakeup)
782 			sowwakeup_locked(so);
783 		else
784 			SOCKBUF_UNLOCK(sb);
785 		SOCKBUF_UNLOCK_ASSERT(sb);
786 
787 		if (__predict_false(toep->flags & TPF_FIN_SENT))
788 			panic("%s: excess tx.", __func__);
789 
790 		wr = alloc_wrqe(roundup2(wr_len, 16), &toep->ofld_txq->wrq);
791 		if (wr == NULL) {
792 			/* XXX: how will we recover from this? */
793 			toep->flags |= TPF_TX_SUSPENDED;
794 			return;
795 		}
796 
797 		thdr = (struct tls_hdr *)&m->m_epg_hdr;
798 #ifdef VERBOSE_TRACES
799 		CTR5(KTR_CXGBE, "%s: tid %d TLS record %ju type %d len %#x",
800 		    __func__, toep->tid, m->m_epg_seqno, thdr->type,
801 		    m->m_len);
802 #endif
803 		txwr = wrtod(wr);
804 		cpl = (struct cpl_tx_tls_sfo *)(txwr + 1);
805 		memset(txwr, 0, roundup2(wr_len, 16));
806 		credits = howmany(wr_len, 16);
807 		expn_size = m->m_epg_hdrlen +
808 		    m->m_epg_trllen;
809 		tls_size = m->m_len - expn_size;
810 		write_tlstx_wr(txwr, toep, tls_size, expn_size, credits, shove);
811 		write_tlstx_cpl(cpl, toep, thdr, tls_size, m->m_epg_seqno);
812 
813 		idata = (struct ulptx_idata *)(cpl + 1);
814 		idata->cmd_more = htobe32(V_ULPTX_CMD(ULP_TX_SC_NOOP));
815 		idata->len = htobe32(0);
816 		memrd = (struct ulptx_sc_memrd *)(idata + 1);
817 		memrd->cmd_to_len = htobe32(V_ULPTX_CMD(ULP_TX_SC_MEMRD) |
818 		    V_ULP_TX_SC_MORE(1) |
819 		    V_ULPTX_LEN16(toep->tls.tx_key_info_size >> 4));
820 		memrd->addr = htobe32(toep->tls.tx_key_addr >> 5);
821 
822 		/* Copy IV. */
823 		buf = (char *)(memrd + 1);
824 		memcpy(buf, thdr + 1, toep->tls.iv_len);
825 		buf += AES_BLOCK_LEN;
826 
827 		write_ktlstx_sgl(buf, m, nsegs);
828 
829 		KASSERT(toep->tx_credits >= credits,
830 			("%s: not enough credits", __func__));
831 
832 		toep->tx_credits -= credits;
833 
834 		tp->snd_nxt += m->m_len;
835 		tp->snd_max += m->m_len;
836 
837 		SOCKBUF_LOCK(sb);
838 		sb->sb_sndptr = m;
839 		SOCKBUF_UNLOCK(sb);
840 
841 		toep->flags |= TPF_TX_DATA_SENT;
842 		if (toep->tx_credits < MIN_OFLD_TLSTX_CREDITS(toep))
843 			toep->flags |= TPF_TX_SUSPENDED;
844 
845 		KASSERT(toep->txsd_avail > 0, ("%s: no txsd", __func__));
846 		txsd->plen = m->m_len;
847 		txsd->tx_credits = credits;
848 		txsd++;
849 		if (__predict_false(++toep->txsd_pidx == toep->txsd_total)) {
850 			toep->txsd_pidx = 0;
851 			txsd = &toep->txsd[0];
852 		}
853 		toep->txsd_avail--;
854 
855 		counter_u64_add(toep->ofld_txq->tx_toe_tls_records, 1);
856 		counter_u64_add(toep->ofld_txq->tx_toe_tls_octets, m->m_len);
857 
858 		t4_l2t_send(sc, wr, toep->l2te);
859 	}
860 }
861 
862 /*
863  * For TLS data we place received mbufs received via CPL_TLS_DATA into
864  * an mbufq in the TLS offload state.  When CPL_RX_TLS_CMP is
865  * received, the completed PDUs are placed into the socket receive
866  * buffer.
867  *
868  * The TLS code reuses the ulp_pdu_reclaimq to hold the pending mbufs.
869  */
870 static int
871 do_tls_data(struct sge_iq *iq, const struct rss_header *rss, struct mbuf *m)
872 {
873 	struct adapter *sc = iq->adapter;
874 	const struct cpl_tls_data *cpl = mtod(m, const void *);
875 	unsigned int tid = GET_TID(cpl);
876 	struct toepcb *toep = lookup_tid(sc, tid);
877 	struct inpcb *inp = toep->inp;
878 	struct tcpcb *tp;
879 	int len;
880 
881 	/* XXX: Should this match do_rx_data instead? */
882 	KASSERT(!(toep->flags & TPF_SYNQE),
883 	    ("%s: toep %p claims to be a synq entry", __func__, toep));
884 
885 	KASSERT(toep->tid == tid, ("%s: toep tid/atid mismatch", __func__));
886 
887 	/* strip off CPL header */
888 	m_adj(m, sizeof(*cpl));
889 	len = m->m_pkthdr.len;
890 
891 	toep->ofld_rxq->rx_toe_tls_octets += len;
892 
893 	KASSERT(len == G_CPL_TLS_DATA_LENGTH(be32toh(cpl->length_pkd)),
894 	    ("%s: payload length mismatch", __func__));
895 
896 	INP_WLOCK(inp);
897 	if (inp->inp_flags & INP_DROPPED) {
898 		CTR4(KTR_CXGBE, "%s: tid %u, rx (%d bytes), inp_flags 0x%x",
899 		    __func__, tid, len, inp->inp_flags);
900 		INP_WUNLOCK(inp);
901 		m_freem(m);
902 		return (0);
903 	}
904 
905 	/* Save TCP sequence number. */
906 	m->m_pkthdr.tls_tcp_seq = be32toh(cpl->seq);
907 
908 	if (mbufq_enqueue(&toep->ulp_pdu_reclaimq, m)) {
909 #ifdef INVARIANTS
910 		panic("Failed to queue TLS data packet");
911 #else
912 		printf("%s: Failed to queue TLS data packet\n", __func__);
913 		INP_WUNLOCK(inp);
914 		m_freem(m);
915 		return (0);
916 #endif
917 	}
918 
919 	tp = intotcpcb(inp);
920 	tp->t_rcvtime = ticks;
921 
922 #ifdef VERBOSE_TRACES
923 	CTR4(KTR_CXGBE, "%s: tid %u len %d seq %u", __func__, tid, len,
924 	    be32toh(cpl->seq));
925 #endif
926 
927 	INP_WUNLOCK(inp);
928 	return (0);
929 }
930 
931 static int
932 do_rx_tls_cmp(struct sge_iq *iq, const struct rss_header *rss, struct mbuf *m)
933 {
934 	struct adapter *sc = iq->adapter;
935 	const struct cpl_rx_tls_cmp *cpl = mtod(m, const void *);
936 	struct tlsrx_hdr_pkt *tls_hdr_pkt;
937 	unsigned int tid = GET_TID(cpl);
938 	struct toepcb *toep = lookup_tid(sc, tid);
939 	struct inpcb *inp = toep->inp;
940 	struct tcpcb *tp;
941 	struct socket *so;
942 	struct sockbuf *sb;
943 	struct mbuf *tls_data;
944 	struct tls_get_record *tgr;
945 	struct mbuf *control;
946 	int pdu_length, rx_credits;
947 #if defined(KTR) || defined(INVARIANTS)
948 	int len;
949 #endif
950 
951 	KASSERT(toep->tid == tid, ("%s: toep tid/atid mismatch", __func__));
952 	KASSERT(!(toep->flags & TPF_SYNQE),
953 	    ("%s: toep %p claims to be a synq entry", __func__, toep));
954 
955 	/* strip off CPL header */
956 	m_adj(m, sizeof(*cpl));
957 #if defined(KTR) || defined(INVARIANTS)
958 	len = m->m_pkthdr.len;
959 #endif
960 
961 	toep->ofld_rxq->rx_toe_tls_records++;
962 
963 	KASSERT(len == G_CPL_RX_TLS_CMP_LENGTH(be32toh(cpl->pdulength_length)),
964 	    ("%s: payload length mismatch", __func__));
965 
966 	INP_WLOCK(inp);
967 	if (inp->inp_flags & INP_DROPPED) {
968 		CTR4(KTR_CXGBE, "%s: tid %u, rx (%d bytes), inp_flags 0x%x",
969 		    __func__, tid, len, inp->inp_flags);
970 		INP_WUNLOCK(inp);
971 		m_freem(m);
972 		return (0);
973 	}
974 
975 	pdu_length = G_CPL_RX_TLS_CMP_PDULENGTH(be32toh(cpl->pdulength_length));
976 
977 	so = inp_inpcbtosocket(inp);
978 	tp = intotcpcb(inp);
979 
980 #ifdef VERBOSE_TRACES
981 	CTR6(KTR_CXGBE, "%s: tid %u PDU len %d len %d seq %u, rcv_nxt %u",
982 	    __func__, tid, pdu_length, len, be32toh(cpl->seq), tp->rcv_nxt);
983 #endif
984 
985 	tp->rcv_nxt += pdu_length;
986 	KASSERT(tp->rcv_wnd >= pdu_length,
987 	    ("%s: negative window size", __func__));
988 	tp->rcv_wnd -= pdu_length;
989 
990 	/* XXX: Not sure what to do about urgent data. */
991 
992 	/*
993 	 * The payload of this CPL is the TLS header followed by
994 	 * additional fields.
995 	 */
996 	KASSERT(m->m_len >= sizeof(*tls_hdr_pkt),
997 	    ("%s: payload too small", __func__));
998 	tls_hdr_pkt = mtod(m, void *);
999 
1000 	tls_data = mbufq_dequeue(&toep->ulp_pdu_reclaimq);
1001 	if (tls_data != NULL) {
1002 		KASSERT(be32toh(cpl->seq) == tls_data->m_pkthdr.tls_tcp_seq,
1003 		    ("%s: sequence mismatch", __func__));
1004 	}
1005 
1006 	/* Report decryption errors as EBADMSG. */
1007 	if ((tls_hdr_pkt->res_to_mac_error & M_TLSRX_HDR_PKT_ERROR) != 0) {
1008 		m_freem(m);
1009 		m_freem(tls_data);
1010 
1011 		CURVNET_SET(toep->vnet);
1012 		so->so_error = EBADMSG;
1013 		sorwakeup(so);
1014 
1015 		INP_WUNLOCK(inp);
1016 		CURVNET_RESTORE();
1017 
1018 		return (0);
1019 	}
1020 
1021 	/* Allocate the control message mbuf. */
1022 	control = sbcreatecontrol(NULL, sizeof(*tgr), TLS_GET_RECORD,
1023 	    IPPROTO_TCP, M_NOWAIT);
1024 	if (control == NULL) {
1025 		m_freem(m);
1026 		m_freem(tls_data);
1027 
1028 		CURVNET_SET(toep->vnet);
1029 		so->so_error = ENOBUFS;
1030 		sorwakeup(so);
1031 
1032 		INP_WUNLOCK(inp);
1033 		CURVNET_RESTORE();
1034 
1035 		return (0);
1036 	}
1037 
1038 	tgr = (struct tls_get_record *)
1039 	    CMSG_DATA(mtod(control, struct cmsghdr *));
1040 	memset(tgr, 0, sizeof(*tgr));
1041 	tgr->tls_type = tls_hdr_pkt->type;
1042 	tgr->tls_vmajor = be16toh(tls_hdr_pkt->version) >> 8;
1043 	tgr->tls_vminor = be16toh(tls_hdr_pkt->version) & 0xff;
1044 
1045 	m_freem(m);
1046 
1047 	if (tls_data != NULL) {
1048 		m_last(tls_data)->m_flags |= M_EOR;
1049 		tgr->tls_length = htobe16(tls_data->m_pkthdr.len);
1050 	} else
1051 		tgr->tls_length = 0;
1052 	m = tls_data;
1053 
1054 	sb = &so->so_rcv;
1055 	SOCKBUF_LOCK(sb);
1056 
1057 	if (__predict_false(sb->sb_state & SBS_CANTRCVMORE)) {
1058 		struct epoch_tracker et;
1059 
1060 		CTR3(KTR_CXGBE, "%s: tid %u, excess rx (%d bytes)",
1061 		    __func__, tid, pdu_length);
1062 		m_freem(m);
1063 		m_freem(control);
1064 		SOCKBUF_UNLOCK(sb);
1065 		INP_WUNLOCK(inp);
1066 
1067 		CURVNET_SET(toep->vnet);
1068 		NET_EPOCH_ENTER(et);
1069 		INP_WLOCK(inp);
1070 		tp = tcp_drop(tp, ECONNRESET);
1071 		if (tp)
1072 			INP_WUNLOCK(inp);
1073 		NET_EPOCH_EXIT(et);
1074 		CURVNET_RESTORE();
1075 
1076 		return (0);
1077 	}
1078 
1079 	/*
1080 	 * Not all of the bytes on the wire are included in the socket buffer
1081 	 * (e.g. the MAC of the TLS record).  However, those bytes are included
1082 	 * in the TCP sequence space.
1083 	 */
1084 
1085 	/* receive buffer autosize */
1086 	MPASS(toep->vnet == so->so_vnet);
1087 	CURVNET_SET(toep->vnet);
1088 	if (sb->sb_flags & SB_AUTOSIZE &&
1089 	    V_tcp_do_autorcvbuf &&
1090 	    sb->sb_hiwat < V_tcp_autorcvbuf_max &&
1091 	    m->m_pkthdr.len > (sbspace(sb) / 8 * 7)) {
1092 		unsigned int hiwat = sb->sb_hiwat;
1093 		unsigned int newsize = min(hiwat + sc->tt.autorcvbuf_inc,
1094 		    V_tcp_autorcvbuf_max);
1095 
1096 		if (!sbreserve_locked(so, SO_RCV, newsize, NULL))
1097 			sb->sb_flags &= ~SB_AUTOSIZE;
1098 	}
1099 
1100 	sbappendcontrol_locked(sb, m, control, 0);
1101 	rx_credits = sbspace(sb) > tp->rcv_wnd ? sbspace(sb) - tp->rcv_wnd : 0;
1102 #ifdef VERBOSE_TRACES
1103 	CTR4(KTR_CXGBE, "%s: tid %u rx_credits %u rcv_wnd %u",
1104 	    __func__, tid, rx_credits, tp->rcv_wnd);
1105 #endif
1106 	if (rx_credits > 0 && sbused(sb) + tp->rcv_wnd < sb->sb_lowat) {
1107 		rx_credits = send_rx_credits(sc, toep, rx_credits);
1108 		tp->rcv_wnd += rx_credits;
1109 		tp->rcv_adv += rx_credits;
1110 	}
1111 
1112 	sorwakeup_locked(so);
1113 	SOCKBUF_UNLOCK_ASSERT(sb);
1114 
1115 	INP_WUNLOCK(inp);
1116 	CURVNET_RESTORE();
1117 	return (0);
1118 }
1119 
1120 void
1121 do_rx_data_tls(const struct cpl_rx_data *cpl, struct toepcb *toep,
1122     struct mbuf *m)
1123 {
1124 	struct inpcb *inp = toep->inp;
1125 	struct tls_ofld_info *tls_ofld = &toep->tls;
1126 	struct tls_hdr *hdr;
1127 	struct tcpcb *tp;
1128 	struct socket *so;
1129 	struct sockbuf *sb;
1130 	int len, rx_credits;
1131 
1132 	len = m->m_pkthdr.len;
1133 
1134 	INP_WLOCK_ASSERT(inp);
1135 
1136 	so = inp_inpcbtosocket(inp);
1137 	tp = intotcpcb(inp);
1138 	sb = &so->so_rcv;
1139 	SOCKBUF_LOCK(sb);
1140 	CURVNET_SET(toep->vnet);
1141 
1142 	tp->rcv_nxt += len;
1143 	KASSERT(tp->rcv_wnd >= len, ("%s: negative window size", __func__));
1144 	tp->rcv_wnd -= len;
1145 
1146 	/* Do we have a full TLS header? */
1147 	if (len < sizeof(*hdr)) {
1148 		CTR3(KTR_CXGBE, "%s: tid %u len %d: too short for a TLS header",
1149 		    __func__, toep->tid, len);
1150 		so->so_error = EMSGSIZE;
1151 		goto out;
1152 	}
1153 	hdr = mtod(m, struct tls_hdr *);
1154 
1155 	/* Is the header valid? */
1156 	if (be16toh(hdr->version) != tls_ofld->rx_version) {
1157 		CTR3(KTR_CXGBE, "%s: tid %u invalid version %04x",
1158 		    __func__, toep->tid, be16toh(hdr->version));
1159 		so->so_error = EINVAL;
1160 		goto out;
1161 	}
1162 	if (be16toh(hdr->length) < sizeof(*hdr)) {
1163 		CTR3(KTR_CXGBE, "%s: tid %u invalid length %u",
1164 		    __func__, toep->tid, be16toh(hdr->length));
1165 		so->so_error = EBADMSG;
1166 		goto out;
1167 	}
1168 
1169 	/* Did we get a truncated record? */
1170 	if (len < be16toh(hdr->length)) {
1171 		CTR4(KTR_CXGBE, "%s: tid %u truncated TLS record (%d vs %u)",
1172 		    __func__, toep->tid, len, be16toh(hdr->length));
1173 
1174 		so->so_error = EMSGSIZE;
1175 		goto out;
1176 	}
1177 
1178 	/* Is the header type unknown? */
1179 	switch (hdr->type) {
1180 	case CONTENT_TYPE_CCS:
1181 	case CONTENT_TYPE_ALERT:
1182 	case CONTENT_TYPE_APP_DATA:
1183 	case CONTENT_TYPE_HANDSHAKE:
1184 		break;
1185 	default:
1186 		CTR3(KTR_CXGBE, "%s: tid %u invalid TLS record type %u",
1187 		    __func__, toep->tid, hdr->type);
1188 		so->so_error = EBADMSG;
1189 		goto out;
1190 	}
1191 
1192 	/*
1193 	 * Just punt.  Although this could fall back to software
1194 	 * decryption, this case should never really happen.
1195 	 */
1196 	CTR4(KTR_CXGBE, "%s: tid %u dropping TLS record type %u, length %u",
1197 	    __func__, toep->tid, hdr->type, be16toh(hdr->length));
1198 	so->so_error = EBADMSG;
1199 
1200 out:
1201 	/*
1202 	 * This connection is going to die anyway, so probably don't
1203 	 * need to bother with returning credits.
1204 	 */
1205 	rx_credits = sbspace(sb) > tp->rcv_wnd ? sbspace(sb) - tp->rcv_wnd : 0;
1206 #ifdef VERBOSE_TRACES
1207 	CTR4(KTR_CXGBE, "%s: tid %u rx_credits %u rcv_wnd %u",
1208 	    __func__, toep->tid, rx_credits, tp->rcv_wnd);
1209 #endif
1210 	if (rx_credits > 0 && sbused(sb) + tp->rcv_wnd < sb->sb_lowat) {
1211 		rx_credits = send_rx_credits(toep->vi->adapter, toep,
1212 		    rx_credits);
1213 		tp->rcv_wnd += rx_credits;
1214 		tp->rcv_adv += rx_credits;
1215 	}
1216 
1217 	sorwakeup_locked(so);
1218 	SOCKBUF_UNLOCK_ASSERT(sb);
1219 
1220 	INP_WUNLOCK(inp);
1221 	CURVNET_RESTORE();
1222 
1223 	m_freem(m);
1224 }
1225 
1226 void
1227 t4_tls_mod_load(void)
1228 {
1229 
1230 	t4_register_cpl_handler(CPL_TLS_DATA, do_tls_data);
1231 	t4_register_cpl_handler(CPL_RX_TLS_CMP, do_rx_tls_cmp);
1232 }
1233 
1234 void
1235 t4_tls_mod_unload(void)
1236 {
1237 
1238 	t4_register_cpl_handler(CPL_TLS_DATA, NULL);
1239 	t4_register_cpl_handler(CPL_RX_TLS_CMP, NULL);
1240 }
1241 #endif	/* TCP_OFFLOAD */
1242 #endif	/* KERN_TLS */
1243