xref: /openbmc/linux/net/ceph/messenger_v2.c (revision ecefa105)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Ceph msgr2 protocol implementation
4  *
5  * Copyright (C) 2020 Ilya Dryomov <idryomov@gmail.com>
6  */
7 
8 #include <linux/ceph/ceph_debug.h>
9 
10 #include <crypto/aead.h>
11 #include <crypto/algapi.h>  /* for crypto_memneq() */
12 #include <crypto/hash.h>
13 #include <crypto/sha2.h>
14 #include <linux/bvec.h>
15 #include <linux/crc32c.h>
16 #include <linux/net.h>
17 #include <linux/scatterlist.h>
18 #include <linux/socket.h>
19 #include <linux/sched/mm.h>
20 #include <net/sock.h>
21 #include <net/tcp.h>
22 
23 #include <linux/ceph/ceph_features.h>
24 #include <linux/ceph/decode.h>
25 #include <linux/ceph/libceph.h>
26 #include <linux/ceph/messenger.h>
27 
28 #include "crypto.h"  /* for CEPH_KEY_LEN and CEPH_MAX_CON_SECRET_LEN */
29 
30 #define FRAME_TAG_HELLO			1
31 #define FRAME_TAG_AUTH_REQUEST		2
32 #define FRAME_TAG_AUTH_BAD_METHOD	3
33 #define FRAME_TAG_AUTH_REPLY_MORE	4
34 #define FRAME_TAG_AUTH_REQUEST_MORE	5
35 #define FRAME_TAG_AUTH_DONE		6
36 #define FRAME_TAG_AUTH_SIGNATURE	7
37 #define FRAME_TAG_CLIENT_IDENT		8
38 #define FRAME_TAG_SERVER_IDENT		9
39 #define FRAME_TAG_IDENT_MISSING_FEATURES 10
40 #define FRAME_TAG_SESSION_RECONNECT	11
41 #define FRAME_TAG_SESSION_RESET		12
42 #define FRAME_TAG_SESSION_RETRY		13
43 #define FRAME_TAG_SESSION_RETRY_GLOBAL	14
44 #define FRAME_TAG_SESSION_RECONNECT_OK	15
45 #define FRAME_TAG_WAIT			16
46 #define FRAME_TAG_MESSAGE		17
47 #define FRAME_TAG_KEEPALIVE2		18
48 #define FRAME_TAG_KEEPALIVE2_ACK	19
49 #define FRAME_TAG_ACK			20
50 
51 #define FRAME_LATE_STATUS_ABORTED	0x1
52 #define FRAME_LATE_STATUS_COMPLETE	0xe
53 #define FRAME_LATE_STATUS_ABORTED_MASK	0xf
54 
55 #define IN_S_HANDLE_PREAMBLE		1
56 #define IN_S_HANDLE_CONTROL		2
57 #define IN_S_HANDLE_CONTROL_REMAINDER	3
58 #define IN_S_PREPARE_READ_DATA		4
59 #define IN_S_PREPARE_READ_DATA_CONT	5
60 #define IN_S_PREPARE_READ_ENC_PAGE	6
61 #define IN_S_HANDLE_EPILOGUE		7
62 #define IN_S_FINISH_SKIP		8
63 
64 #define OUT_S_QUEUE_DATA		1
65 #define OUT_S_QUEUE_DATA_CONT		2
66 #define OUT_S_QUEUE_ENC_PAGE		3
67 #define OUT_S_QUEUE_ZEROS		4
68 #define OUT_S_FINISH_MESSAGE		5
69 #define OUT_S_GET_NEXT			6
70 
71 #define CTRL_BODY(p)	((void *)(p) + CEPH_PREAMBLE_LEN)
72 #define FRONT_PAD(p)	((void *)(p) + CEPH_EPILOGUE_SECURE_LEN)
73 #define MIDDLE_PAD(p)	(FRONT_PAD(p) + CEPH_GCM_BLOCK_LEN)
74 #define DATA_PAD(p)	(MIDDLE_PAD(p) + CEPH_GCM_BLOCK_LEN)
75 
76 #define CEPH_MSG_FLAGS (MSG_DONTWAIT | MSG_NOSIGNAL)
77 
78 static int do_recvmsg(struct socket *sock, struct iov_iter *it)
79 {
80 	struct msghdr msg = { .msg_flags = CEPH_MSG_FLAGS };
81 	int ret;
82 
83 	msg.msg_iter = *it;
84 	while (iov_iter_count(it)) {
85 		ret = sock_recvmsg(sock, &msg, msg.msg_flags);
86 		if (ret <= 0) {
87 			if (ret == -EAGAIN)
88 				ret = 0;
89 			return ret;
90 		}
91 
92 		iov_iter_advance(it, ret);
93 	}
94 
95 	WARN_ON(msg_data_left(&msg));
96 	return 1;
97 }
98 
99 /*
100  * Read as much as possible.
101  *
102  * Return:
103  *   1 - done, nothing (else) to read
104  *   0 - socket is empty, need to wait
105  *  <0 - error
106  */
107 static int ceph_tcp_recv(struct ceph_connection *con)
108 {
109 	int ret;
110 
111 	dout("%s con %p %s %zu\n", __func__, con,
112 	     iov_iter_is_discard(&con->v2.in_iter) ? "discard" : "need",
113 	     iov_iter_count(&con->v2.in_iter));
114 	ret = do_recvmsg(con->sock, &con->v2.in_iter);
115 	dout("%s con %p ret %d left %zu\n", __func__, con, ret,
116 	     iov_iter_count(&con->v2.in_iter));
117 	return ret;
118 }
119 
120 static int do_sendmsg(struct socket *sock, struct iov_iter *it)
121 {
122 	struct msghdr msg = { .msg_flags = CEPH_MSG_FLAGS };
123 	int ret;
124 
125 	msg.msg_iter = *it;
126 	while (iov_iter_count(it)) {
127 		ret = sock_sendmsg(sock, &msg);
128 		if (ret <= 0) {
129 			if (ret == -EAGAIN)
130 				ret = 0;
131 			return ret;
132 		}
133 
134 		iov_iter_advance(it, ret);
135 	}
136 
137 	WARN_ON(msg_data_left(&msg));
138 	return 1;
139 }
140 
141 static int do_try_sendpage(struct socket *sock, struct iov_iter *it)
142 {
143 	struct msghdr msg = { .msg_flags = CEPH_MSG_FLAGS };
144 	struct bio_vec bv;
145 	int ret;
146 
147 	if (WARN_ON(!iov_iter_is_bvec(it)))
148 		return -EINVAL;
149 
150 	while (iov_iter_count(it)) {
151 		/* iov_iter_iovec() for ITER_BVEC */
152 		bvec_set_page(&bv, it->bvec->bv_page,
153 			      min(iov_iter_count(it),
154 				  it->bvec->bv_len - it->iov_offset),
155 			      it->bvec->bv_offset + it->iov_offset);
156 
157 		/*
158 		 * sendpage cannot properly handle pages with
159 		 * page_count == 0, we need to fall back to sendmsg if
160 		 * that's the case.
161 		 *
162 		 * Same goes for slab pages: skb_can_coalesce() allows
163 		 * coalescing neighboring slab objects into a single frag
164 		 * which triggers one of hardened usercopy checks.
165 		 */
166 		if (sendpage_ok(bv.bv_page)) {
167 			ret = sock->ops->sendpage(sock, bv.bv_page,
168 						  bv.bv_offset, bv.bv_len,
169 						  CEPH_MSG_FLAGS);
170 		} else {
171 			iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, &bv, 1, bv.bv_len);
172 			ret = sock_sendmsg(sock, &msg);
173 		}
174 		if (ret <= 0) {
175 			if (ret == -EAGAIN)
176 				ret = 0;
177 			return ret;
178 		}
179 
180 		iov_iter_advance(it, ret);
181 	}
182 
183 	return 1;
184 }
185 
186 /*
187  * Write as much as possible.  The socket is expected to be corked,
188  * so we don't bother with MSG_MORE/MSG_SENDPAGE_NOTLAST here.
189  *
190  * Return:
191  *   1 - done, nothing (else) to write
192  *   0 - socket is full, need to wait
193  *  <0 - error
194  */
195 static int ceph_tcp_send(struct ceph_connection *con)
196 {
197 	int ret;
198 
199 	dout("%s con %p have %zu try_sendpage %d\n", __func__, con,
200 	     iov_iter_count(&con->v2.out_iter), con->v2.out_iter_sendpage);
201 	if (con->v2.out_iter_sendpage)
202 		ret = do_try_sendpage(con->sock, &con->v2.out_iter);
203 	else
204 		ret = do_sendmsg(con->sock, &con->v2.out_iter);
205 	dout("%s con %p ret %d left %zu\n", __func__, con, ret,
206 	     iov_iter_count(&con->v2.out_iter));
207 	return ret;
208 }
209 
210 static void add_in_kvec(struct ceph_connection *con, void *buf, int len)
211 {
212 	BUG_ON(con->v2.in_kvec_cnt >= ARRAY_SIZE(con->v2.in_kvecs));
213 	WARN_ON(!iov_iter_is_kvec(&con->v2.in_iter));
214 
215 	con->v2.in_kvecs[con->v2.in_kvec_cnt].iov_base = buf;
216 	con->v2.in_kvecs[con->v2.in_kvec_cnt].iov_len = len;
217 	con->v2.in_kvec_cnt++;
218 
219 	con->v2.in_iter.nr_segs++;
220 	con->v2.in_iter.count += len;
221 }
222 
223 static void reset_in_kvecs(struct ceph_connection *con)
224 {
225 	WARN_ON(iov_iter_count(&con->v2.in_iter));
226 
227 	con->v2.in_kvec_cnt = 0;
228 	iov_iter_kvec(&con->v2.in_iter, ITER_DEST, con->v2.in_kvecs, 0, 0);
229 }
230 
231 static void set_in_bvec(struct ceph_connection *con, const struct bio_vec *bv)
232 {
233 	WARN_ON(iov_iter_count(&con->v2.in_iter));
234 
235 	con->v2.in_bvec = *bv;
236 	iov_iter_bvec(&con->v2.in_iter, ITER_DEST, &con->v2.in_bvec, 1, bv->bv_len);
237 }
238 
239 static void set_in_skip(struct ceph_connection *con, int len)
240 {
241 	WARN_ON(iov_iter_count(&con->v2.in_iter));
242 
243 	dout("%s con %p len %d\n", __func__, con, len);
244 	iov_iter_discard(&con->v2.in_iter, ITER_DEST, len);
245 }
246 
247 static void add_out_kvec(struct ceph_connection *con, void *buf, int len)
248 {
249 	BUG_ON(con->v2.out_kvec_cnt >= ARRAY_SIZE(con->v2.out_kvecs));
250 	WARN_ON(!iov_iter_is_kvec(&con->v2.out_iter));
251 	WARN_ON(con->v2.out_zero);
252 
253 	con->v2.out_kvecs[con->v2.out_kvec_cnt].iov_base = buf;
254 	con->v2.out_kvecs[con->v2.out_kvec_cnt].iov_len = len;
255 	con->v2.out_kvec_cnt++;
256 
257 	con->v2.out_iter.nr_segs++;
258 	con->v2.out_iter.count += len;
259 }
260 
261 static void reset_out_kvecs(struct ceph_connection *con)
262 {
263 	WARN_ON(iov_iter_count(&con->v2.out_iter));
264 	WARN_ON(con->v2.out_zero);
265 
266 	con->v2.out_kvec_cnt = 0;
267 
268 	iov_iter_kvec(&con->v2.out_iter, ITER_SOURCE, con->v2.out_kvecs, 0, 0);
269 	con->v2.out_iter_sendpage = false;
270 }
271 
272 static void set_out_bvec(struct ceph_connection *con, const struct bio_vec *bv,
273 			 bool zerocopy)
274 {
275 	WARN_ON(iov_iter_count(&con->v2.out_iter));
276 	WARN_ON(con->v2.out_zero);
277 
278 	con->v2.out_bvec = *bv;
279 	con->v2.out_iter_sendpage = zerocopy;
280 	iov_iter_bvec(&con->v2.out_iter, ITER_SOURCE, &con->v2.out_bvec, 1,
281 		      con->v2.out_bvec.bv_len);
282 }
283 
284 static void set_out_bvec_zero(struct ceph_connection *con)
285 {
286 	WARN_ON(iov_iter_count(&con->v2.out_iter));
287 	WARN_ON(!con->v2.out_zero);
288 
289 	bvec_set_page(&con->v2.out_bvec, ceph_zero_page,
290 		      min(con->v2.out_zero, (int)PAGE_SIZE), 0);
291 	con->v2.out_iter_sendpage = true;
292 	iov_iter_bvec(&con->v2.out_iter, ITER_SOURCE, &con->v2.out_bvec, 1,
293 		      con->v2.out_bvec.bv_len);
294 }
295 
296 static void out_zero_add(struct ceph_connection *con, int len)
297 {
298 	dout("%s con %p len %d\n", __func__, con, len);
299 	con->v2.out_zero += len;
300 }
301 
302 static void *alloc_conn_buf(struct ceph_connection *con, int len)
303 {
304 	void *buf;
305 
306 	dout("%s con %p len %d\n", __func__, con, len);
307 
308 	if (WARN_ON(con->v2.conn_buf_cnt >= ARRAY_SIZE(con->v2.conn_bufs)))
309 		return NULL;
310 
311 	buf = kvmalloc(len, GFP_NOIO);
312 	if (!buf)
313 		return NULL;
314 
315 	con->v2.conn_bufs[con->v2.conn_buf_cnt++] = buf;
316 	return buf;
317 }
318 
319 static void free_conn_bufs(struct ceph_connection *con)
320 {
321 	while (con->v2.conn_buf_cnt)
322 		kvfree(con->v2.conn_bufs[--con->v2.conn_buf_cnt]);
323 }
324 
325 static void add_in_sign_kvec(struct ceph_connection *con, void *buf, int len)
326 {
327 	BUG_ON(con->v2.in_sign_kvec_cnt >= ARRAY_SIZE(con->v2.in_sign_kvecs));
328 
329 	con->v2.in_sign_kvecs[con->v2.in_sign_kvec_cnt].iov_base = buf;
330 	con->v2.in_sign_kvecs[con->v2.in_sign_kvec_cnt].iov_len = len;
331 	con->v2.in_sign_kvec_cnt++;
332 }
333 
334 static void clear_in_sign_kvecs(struct ceph_connection *con)
335 {
336 	con->v2.in_sign_kvec_cnt = 0;
337 }
338 
339 static void add_out_sign_kvec(struct ceph_connection *con, void *buf, int len)
340 {
341 	BUG_ON(con->v2.out_sign_kvec_cnt >= ARRAY_SIZE(con->v2.out_sign_kvecs));
342 
343 	con->v2.out_sign_kvecs[con->v2.out_sign_kvec_cnt].iov_base = buf;
344 	con->v2.out_sign_kvecs[con->v2.out_sign_kvec_cnt].iov_len = len;
345 	con->v2.out_sign_kvec_cnt++;
346 }
347 
348 static void clear_out_sign_kvecs(struct ceph_connection *con)
349 {
350 	con->v2.out_sign_kvec_cnt = 0;
351 }
352 
353 static bool con_secure(struct ceph_connection *con)
354 {
355 	return con->v2.con_mode == CEPH_CON_MODE_SECURE;
356 }
357 
358 static int front_len(const struct ceph_msg *msg)
359 {
360 	return le32_to_cpu(msg->hdr.front_len);
361 }
362 
363 static int middle_len(const struct ceph_msg *msg)
364 {
365 	return le32_to_cpu(msg->hdr.middle_len);
366 }
367 
368 static int data_len(const struct ceph_msg *msg)
369 {
370 	return le32_to_cpu(msg->hdr.data_len);
371 }
372 
373 static bool need_padding(int len)
374 {
375 	return !IS_ALIGNED(len, CEPH_GCM_BLOCK_LEN);
376 }
377 
378 static int padded_len(int len)
379 {
380 	return ALIGN(len, CEPH_GCM_BLOCK_LEN);
381 }
382 
383 static int padding_len(int len)
384 {
385 	return padded_len(len) - len;
386 }
387 
388 /* preamble + control segment */
389 static int head_onwire_len(int ctrl_len, bool secure)
390 {
391 	int head_len;
392 	int rem_len;
393 
394 	if (secure) {
395 		head_len = CEPH_PREAMBLE_SECURE_LEN;
396 		if (ctrl_len > CEPH_PREAMBLE_INLINE_LEN) {
397 			rem_len = ctrl_len - CEPH_PREAMBLE_INLINE_LEN;
398 			head_len += padded_len(rem_len) + CEPH_GCM_TAG_LEN;
399 		}
400 	} else {
401 		head_len = CEPH_PREAMBLE_PLAIN_LEN;
402 		if (ctrl_len)
403 			head_len += ctrl_len + CEPH_CRC_LEN;
404 	}
405 	return head_len;
406 }
407 
408 /* front, middle and data segments + epilogue */
409 static int __tail_onwire_len(int front_len, int middle_len, int data_len,
410 			     bool secure)
411 {
412 	if (!front_len && !middle_len && !data_len)
413 		return 0;
414 
415 	if (!secure)
416 		return front_len + middle_len + data_len +
417 		       CEPH_EPILOGUE_PLAIN_LEN;
418 
419 	return padded_len(front_len) + padded_len(middle_len) +
420 	       padded_len(data_len) + CEPH_EPILOGUE_SECURE_LEN;
421 }
422 
423 static int tail_onwire_len(const struct ceph_msg *msg, bool secure)
424 {
425 	return __tail_onwire_len(front_len(msg), middle_len(msg),
426 				 data_len(msg), secure);
427 }
428 
429 /* head_onwire_len(sizeof(struct ceph_msg_header2), false) */
430 #define MESSAGE_HEAD_PLAIN_LEN	(CEPH_PREAMBLE_PLAIN_LEN +		\
431 				 sizeof(struct ceph_msg_header2) +	\
432 				 CEPH_CRC_LEN)
433 
434 static const int frame_aligns[] = {
435 	sizeof(void *),
436 	sizeof(void *),
437 	sizeof(void *),
438 	PAGE_SIZE
439 };
440 
441 /*
442  * Discards trailing empty segments, unless there is just one segment.
443  * A frame always has at least one (possibly empty) segment.
444  */
445 static int calc_segment_count(const int *lens, int len_cnt)
446 {
447 	int i;
448 
449 	for (i = len_cnt - 1; i >= 0; i--) {
450 		if (lens[i])
451 			return i + 1;
452 	}
453 
454 	return 1;
455 }
456 
457 static void init_frame_desc(struct ceph_frame_desc *desc, int tag,
458 			    const int *lens, int len_cnt)
459 {
460 	int i;
461 
462 	memset(desc, 0, sizeof(*desc));
463 
464 	desc->fd_tag = tag;
465 	desc->fd_seg_cnt = calc_segment_count(lens, len_cnt);
466 	BUG_ON(desc->fd_seg_cnt > CEPH_FRAME_MAX_SEGMENT_COUNT);
467 	for (i = 0; i < desc->fd_seg_cnt; i++) {
468 		desc->fd_lens[i] = lens[i];
469 		desc->fd_aligns[i] = frame_aligns[i];
470 	}
471 }
472 
473 /*
474  * Preamble crc covers everything up to itself (28 bytes) and
475  * is calculated and verified irrespective of the connection mode
476  * (i.e. even if the frame is encrypted).
477  */
478 static void encode_preamble(const struct ceph_frame_desc *desc, void *p)
479 {
480 	void *crcp = p + CEPH_PREAMBLE_LEN - CEPH_CRC_LEN;
481 	void *start = p;
482 	int i;
483 
484 	memset(p, 0, CEPH_PREAMBLE_LEN);
485 
486 	ceph_encode_8(&p, desc->fd_tag);
487 	ceph_encode_8(&p, desc->fd_seg_cnt);
488 	for (i = 0; i < desc->fd_seg_cnt; i++) {
489 		ceph_encode_32(&p, desc->fd_lens[i]);
490 		ceph_encode_16(&p, desc->fd_aligns[i]);
491 	}
492 
493 	put_unaligned_le32(crc32c(0, start, crcp - start), crcp);
494 }
495 
496 static int decode_preamble(void *p, struct ceph_frame_desc *desc)
497 {
498 	void *crcp = p + CEPH_PREAMBLE_LEN - CEPH_CRC_LEN;
499 	u32 crc, expected_crc;
500 	int i;
501 
502 	crc = crc32c(0, p, crcp - p);
503 	expected_crc = get_unaligned_le32(crcp);
504 	if (crc != expected_crc) {
505 		pr_err("bad preamble crc, calculated %u, expected %u\n",
506 		       crc, expected_crc);
507 		return -EBADMSG;
508 	}
509 
510 	memset(desc, 0, sizeof(*desc));
511 
512 	desc->fd_tag = ceph_decode_8(&p);
513 	desc->fd_seg_cnt = ceph_decode_8(&p);
514 	if (desc->fd_seg_cnt < 1 ||
515 	    desc->fd_seg_cnt > CEPH_FRAME_MAX_SEGMENT_COUNT) {
516 		pr_err("bad segment count %d\n", desc->fd_seg_cnt);
517 		return -EINVAL;
518 	}
519 	for (i = 0; i < desc->fd_seg_cnt; i++) {
520 		desc->fd_lens[i] = ceph_decode_32(&p);
521 		desc->fd_aligns[i] = ceph_decode_16(&p);
522 	}
523 
524 	/*
525 	 * This would fire for FRAME_TAG_WAIT (it has one empty
526 	 * segment), but we should never get it as client.
527 	 */
528 	if (!desc->fd_lens[desc->fd_seg_cnt - 1]) {
529 		pr_err("last segment empty\n");
530 		return -EINVAL;
531 	}
532 
533 	if (desc->fd_lens[0] > CEPH_MSG_MAX_CONTROL_LEN) {
534 		pr_err("control segment too big %d\n", desc->fd_lens[0]);
535 		return -EINVAL;
536 	}
537 	if (desc->fd_lens[1] > CEPH_MSG_MAX_FRONT_LEN) {
538 		pr_err("front segment too big %d\n", desc->fd_lens[1]);
539 		return -EINVAL;
540 	}
541 	if (desc->fd_lens[2] > CEPH_MSG_MAX_MIDDLE_LEN) {
542 		pr_err("middle segment too big %d\n", desc->fd_lens[2]);
543 		return -EINVAL;
544 	}
545 	if (desc->fd_lens[3] > CEPH_MSG_MAX_DATA_LEN) {
546 		pr_err("data segment too big %d\n", desc->fd_lens[3]);
547 		return -EINVAL;
548 	}
549 
550 	return 0;
551 }
552 
553 static void encode_epilogue_plain(struct ceph_connection *con, bool aborted)
554 {
555 	con->v2.out_epil.late_status = aborted ? FRAME_LATE_STATUS_ABORTED :
556 						 FRAME_LATE_STATUS_COMPLETE;
557 	cpu_to_le32s(&con->v2.out_epil.front_crc);
558 	cpu_to_le32s(&con->v2.out_epil.middle_crc);
559 	cpu_to_le32s(&con->v2.out_epil.data_crc);
560 }
561 
562 static void encode_epilogue_secure(struct ceph_connection *con, bool aborted)
563 {
564 	memset(&con->v2.out_epil, 0, sizeof(con->v2.out_epil));
565 	con->v2.out_epil.late_status = aborted ? FRAME_LATE_STATUS_ABORTED :
566 						 FRAME_LATE_STATUS_COMPLETE;
567 }
568 
569 static int decode_epilogue(void *p, u32 *front_crc, u32 *middle_crc,
570 			   u32 *data_crc)
571 {
572 	u8 late_status;
573 
574 	late_status = ceph_decode_8(&p);
575 	if ((late_status & FRAME_LATE_STATUS_ABORTED_MASK) !=
576 			FRAME_LATE_STATUS_COMPLETE) {
577 		/* we should never get an aborted message as client */
578 		pr_err("bad late_status 0x%x\n", late_status);
579 		return -EINVAL;
580 	}
581 
582 	if (front_crc && middle_crc && data_crc) {
583 		*front_crc = ceph_decode_32(&p);
584 		*middle_crc = ceph_decode_32(&p);
585 		*data_crc = ceph_decode_32(&p);
586 	}
587 
588 	return 0;
589 }
590 
591 static void fill_header(struct ceph_msg_header *hdr,
592 			const struct ceph_msg_header2 *hdr2,
593 			int front_len, int middle_len, int data_len,
594 			const struct ceph_entity_name *peer_name)
595 {
596 	hdr->seq = hdr2->seq;
597 	hdr->tid = hdr2->tid;
598 	hdr->type = hdr2->type;
599 	hdr->priority = hdr2->priority;
600 	hdr->version = hdr2->version;
601 	hdr->front_len = cpu_to_le32(front_len);
602 	hdr->middle_len = cpu_to_le32(middle_len);
603 	hdr->data_len = cpu_to_le32(data_len);
604 	hdr->data_off = hdr2->data_off;
605 	hdr->src = *peer_name;
606 	hdr->compat_version = hdr2->compat_version;
607 	hdr->reserved = 0;
608 	hdr->crc = 0;
609 }
610 
611 static void fill_header2(struct ceph_msg_header2 *hdr2,
612 			 const struct ceph_msg_header *hdr, u64 ack_seq)
613 {
614 	hdr2->seq = hdr->seq;
615 	hdr2->tid = hdr->tid;
616 	hdr2->type = hdr->type;
617 	hdr2->priority = hdr->priority;
618 	hdr2->version = hdr->version;
619 	hdr2->data_pre_padding_len = 0;
620 	hdr2->data_off = hdr->data_off;
621 	hdr2->ack_seq = cpu_to_le64(ack_seq);
622 	hdr2->flags = 0;
623 	hdr2->compat_version = hdr->compat_version;
624 	hdr2->reserved = 0;
625 }
626 
627 static int verify_control_crc(struct ceph_connection *con)
628 {
629 	int ctrl_len = con->v2.in_desc.fd_lens[0];
630 	u32 crc, expected_crc;
631 
632 	WARN_ON(con->v2.in_kvecs[0].iov_len != ctrl_len);
633 	WARN_ON(con->v2.in_kvecs[1].iov_len != CEPH_CRC_LEN);
634 
635 	crc = crc32c(-1, con->v2.in_kvecs[0].iov_base, ctrl_len);
636 	expected_crc = get_unaligned_le32(con->v2.in_kvecs[1].iov_base);
637 	if (crc != expected_crc) {
638 		pr_err("bad control crc, calculated %u, expected %u\n",
639 		       crc, expected_crc);
640 		return -EBADMSG;
641 	}
642 
643 	return 0;
644 }
645 
646 static int verify_epilogue_crcs(struct ceph_connection *con, u32 front_crc,
647 				u32 middle_crc, u32 data_crc)
648 {
649 	if (front_len(con->in_msg)) {
650 		con->in_front_crc = crc32c(-1, con->in_msg->front.iov_base,
651 					   front_len(con->in_msg));
652 	} else {
653 		WARN_ON(!middle_len(con->in_msg) && !data_len(con->in_msg));
654 		con->in_front_crc = -1;
655 	}
656 
657 	if (middle_len(con->in_msg))
658 		con->in_middle_crc = crc32c(-1,
659 					    con->in_msg->middle->vec.iov_base,
660 					    middle_len(con->in_msg));
661 	else if (data_len(con->in_msg))
662 		con->in_middle_crc = -1;
663 	else
664 		con->in_middle_crc = 0;
665 
666 	if (!data_len(con->in_msg))
667 		con->in_data_crc = 0;
668 
669 	dout("%s con %p msg %p crcs %u %u %u\n", __func__, con, con->in_msg,
670 	     con->in_front_crc, con->in_middle_crc, con->in_data_crc);
671 
672 	if (con->in_front_crc != front_crc) {
673 		pr_err("bad front crc, calculated %u, expected %u\n",
674 		       con->in_front_crc, front_crc);
675 		return -EBADMSG;
676 	}
677 	if (con->in_middle_crc != middle_crc) {
678 		pr_err("bad middle crc, calculated %u, expected %u\n",
679 		       con->in_middle_crc, middle_crc);
680 		return -EBADMSG;
681 	}
682 	if (con->in_data_crc != data_crc) {
683 		pr_err("bad data crc, calculated %u, expected %u\n",
684 		       con->in_data_crc, data_crc);
685 		return -EBADMSG;
686 	}
687 
688 	return 0;
689 }
690 
691 static int setup_crypto(struct ceph_connection *con,
692 			const u8 *session_key, int session_key_len,
693 			const u8 *con_secret, int con_secret_len)
694 {
695 	unsigned int noio_flag;
696 	int ret;
697 
698 	dout("%s con %p con_mode %d session_key_len %d con_secret_len %d\n",
699 	     __func__, con, con->v2.con_mode, session_key_len, con_secret_len);
700 	WARN_ON(con->v2.hmac_tfm || con->v2.gcm_tfm || con->v2.gcm_req);
701 
702 	if (con->v2.con_mode != CEPH_CON_MODE_CRC &&
703 	    con->v2.con_mode != CEPH_CON_MODE_SECURE) {
704 		pr_err("bad con_mode %d\n", con->v2.con_mode);
705 		return -EINVAL;
706 	}
707 
708 	if (!session_key_len) {
709 		WARN_ON(con->v2.con_mode != CEPH_CON_MODE_CRC);
710 		WARN_ON(con_secret_len);
711 		return 0;  /* auth_none */
712 	}
713 
714 	noio_flag = memalloc_noio_save();
715 	con->v2.hmac_tfm = crypto_alloc_shash("hmac(sha256)", 0, 0);
716 	memalloc_noio_restore(noio_flag);
717 	if (IS_ERR(con->v2.hmac_tfm)) {
718 		ret = PTR_ERR(con->v2.hmac_tfm);
719 		con->v2.hmac_tfm = NULL;
720 		pr_err("failed to allocate hmac tfm context: %d\n", ret);
721 		return ret;
722 	}
723 
724 	WARN_ON((unsigned long)session_key &
725 		crypto_shash_alignmask(con->v2.hmac_tfm));
726 	ret = crypto_shash_setkey(con->v2.hmac_tfm, session_key,
727 				  session_key_len);
728 	if (ret) {
729 		pr_err("failed to set hmac key: %d\n", ret);
730 		return ret;
731 	}
732 
733 	if (con->v2.con_mode == CEPH_CON_MODE_CRC) {
734 		WARN_ON(con_secret_len);
735 		return 0;  /* auth_x, plain mode */
736 	}
737 
738 	if (con_secret_len < CEPH_GCM_KEY_LEN + 2 * CEPH_GCM_IV_LEN) {
739 		pr_err("con_secret too small %d\n", con_secret_len);
740 		return -EINVAL;
741 	}
742 
743 	noio_flag = memalloc_noio_save();
744 	con->v2.gcm_tfm = crypto_alloc_aead("gcm(aes)", 0, 0);
745 	memalloc_noio_restore(noio_flag);
746 	if (IS_ERR(con->v2.gcm_tfm)) {
747 		ret = PTR_ERR(con->v2.gcm_tfm);
748 		con->v2.gcm_tfm = NULL;
749 		pr_err("failed to allocate gcm tfm context: %d\n", ret);
750 		return ret;
751 	}
752 
753 	WARN_ON((unsigned long)con_secret &
754 		crypto_aead_alignmask(con->v2.gcm_tfm));
755 	ret = crypto_aead_setkey(con->v2.gcm_tfm, con_secret, CEPH_GCM_KEY_LEN);
756 	if (ret) {
757 		pr_err("failed to set gcm key: %d\n", ret);
758 		return ret;
759 	}
760 
761 	WARN_ON(crypto_aead_ivsize(con->v2.gcm_tfm) != CEPH_GCM_IV_LEN);
762 	ret = crypto_aead_setauthsize(con->v2.gcm_tfm, CEPH_GCM_TAG_LEN);
763 	if (ret) {
764 		pr_err("failed to set gcm tag size: %d\n", ret);
765 		return ret;
766 	}
767 
768 	con->v2.gcm_req = aead_request_alloc(con->v2.gcm_tfm, GFP_NOIO);
769 	if (!con->v2.gcm_req) {
770 		pr_err("failed to allocate gcm request\n");
771 		return -ENOMEM;
772 	}
773 
774 	crypto_init_wait(&con->v2.gcm_wait);
775 	aead_request_set_callback(con->v2.gcm_req, CRYPTO_TFM_REQ_MAY_BACKLOG,
776 				  crypto_req_done, &con->v2.gcm_wait);
777 
778 	memcpy(&con->v2.in_gcm_nonce, con_secret + CEPH_GCM_KEY_LEN,
779 	       CEPH_GCM_IV_LEN);
780 	memcpy(&con->v2.out_gcm_nonce,
781 	       con_secret + CEPH_GCM_KEY_LEN + CEPH_GCM_IV_LEN,
782 	       CEPH_GCM_IV_LEN);
783 	return 0;  /* auth_x, secure mode */
784 }
785 
786 static int hmac_sha256(struct ceph_connection *con, const struct kvec *kvecs,
787 		       int kvec_cnt, u8 *hmac)
788 {
789 	SHASH_DESC_ON_STACK(desc, con->v2.hmac_tfm);  /* tfm arg is ignored */
790 	int ret;
791 	int i;
792 
793 	dout("%s con %p hmac_tfm %p kvec_cnt %d\n", __func__, con,
794 	     con->v2.hmac_tfm, kvec_cnt);
795 
796 	if (!con->v2.hmac_tfm) {
797 		memset(hmac, 0, SHA256_DIGEST_SIZE);
798 		return 0;  /* auth_none */
799 	}
800 
801 	desc->tfm = con->v2.hmac_tfm;
802 	ret = crypto_shash_init(desc);
803 	if (ret)
804 		goto out;
805 
806 	for (i = 0; i < kvec_cnt; i++) {
807 		WARN_ON((unsigned long)kvecs[i].iov_base &
808 			crypto_shash_alignmask(con->v2.hmac_tfm));
809 		ret = crypto_shash_update(desc, kvecs[i].iov_base,
810 					  kvecs[i].iov_len);
811 		if (ret)
812 			goto out;
813 	}
814 
815 	ret = crypto_shash_final(desc, hmac);
816 
817 out:
818 	shash_desc_zero(desc);
819 	return ret;  /* auth_x, both plain and secure modes */
820 }
821 
822 static void gcm_inc_nonce(struct ceph_gcm_nonce *nonce)
823 {
824 	u64 counter;
825 
826 	counter = le64_to_cpu(nonce->counter);
827 	nonce->counter = cpu_to_le64(counter + 1);
828 }
829 
830 static int gcm_crypt(struct ceph_connection *con, bool encrypt,
831 		     struct scatterlist *src, struct scatterlist *dst,
832 		     int src_len)
833 {
834 	struct ceph_gcm_nonce *nonce;
835 	int ret;
836 
837 	nonce = encrypt ? &con->v2.out_gcm_nonce : &con->v2.in_gcm_nonce;
838 
839 	aead_request_set_ad(con->v2.gcm_req, 0);  /* no AAD */
840 	aead_request_set_crypt(con->v2.gcm_req, src, dst, src_len, (u8 *)nonce);
841 	ret = crypto_wait_req(encrypt ? crypto_aead_encrypt(con->v2.gcm_req) :
842 					crypto_aead_decrypt(con->v2.gcm_req),
843 			      &con->v2.gcm_wait);
844 	if (ret)
845 		return ret;
846 
847 	gcm_inc_nonce(nonce);
848 	return 0;
849 }
850 
851 static void get_bvec_at(struct ceph_msg_data_cursor *cursor,
852 			struct bio_vec *bv)
853 {
854 	struct page *page;
855 	size_t off, len;
856 
857 	WARN_ON(!cursor->total_resid);
858 
859 	/* skip zero-length data items */
860 	while (!cursor->resid)
861 		ceph_msg_data_advance(cursor, 0);
862 
863 	/* get a piece of data, cursor isn't advanced */
864 	page = ceph_msg_data_next(cursor, &off, &len);
865 	bvec_set_page(bv, page, len, off);
866 }
867 
868 static int calc_sg_cnt(void *buf, int buf_len)
869 {
870 	int sg_cnt;
871 
872 	if (!buf_len)
873 		return 0;
874 
875 	sg_cnt = need_padding(buf_len) ? 1 : 0;
876 	if (is_vmalloc_addr(buf)) {
877 		WARN_ON(offset_in_page(buf));
878 		sg_cnt += PAGE_ALIGN(buf_len) >> PAGE_SHIFT;
879 	} else {
880 		sg_cnt++;
881 	}
882 
883 	return sg_cnt;
884 }
885 
886 static int calc_sg_cnt_cursor(struct ceph_msg_data_cursor *cursor)
887 {
888 	int data_len = cursor->total_resid;
889 	struct bio_vec bv;
890 	int sg_cnt;
891 
892 	if (!data_len)
893 		return 0;
894 
895 	sg_cnt = need_padding(data_len) ? 1 : 0;
896 	do {
897 		get_bvec_at(cursor, &bv);
898 		sg_cnt++;
899 
900 		ceph_msg_data_advance(cursor, bv.bv_len);
901 	} while (cursor->total_resid);
902 
903 	return sg_cnt;
904 }
905 
906 static void init_sgs(struct scatterlist **sg, void *buf, int buf_len, u8 *pad)
907 {
908 	void *end = buf + buf_len;
909 	struct page *page;
910 	int len;
911 	void *p;
912 
913 	if (!buf_len)
914 		return;
915 
916 	if (is_vmalloc_addr(buf)) {
917 		p = buf;
918 		do {
919 			page = vmalloc_to_page(p);
920 			len = min_t(int, end - p, PAGE_SIZE);
921 			WARN_ON(!page || !len || offset_in_page(p));
922 			sg_set_page(*sg, page, len, 0);
923 			*sg = sg_next(*sg);
924 			p += len;
925 		} while (p != end);
926 	} else {
927 		sg_set_buf(*sg, buf, buf_len);
928 		*sg = sg_next(*sg);
929 	}
930 
931 	if (need_padding(buf_len)) {
932 		sg_set_buf(*sg, pad, padding_len(buf_len));
933 		*sg = sg_next(*sg);
934 	}
935 }
936 
937 static void init_sgs_cursor(struct scatterlist **sg,
938 			    struct ceph_msg_data_cursor *cursor, u8 *pad)
939 {
940 	int data_len = cursor->total_resid;
941 	struct bio_vec bv;
942 
943 	if (!data_len)
944 		return;
945 
946 	do {
947 		get_bvec_at(cursor, &bv);
948 		sg_set_page(*sg, bv.bv_page, bv.bv_len, bv.bv_offset);
949 		*sg = sg_next(*sg);
950 
951 		ceph_msg_data_advance(cursor, bv.bv_len);
952 	} while (cursor->total_resid);
953 
954 	if (need_padding(data_len)) {
955 		sg_set_buf(*sg, pad, padding_len(data_len));
956 		*sg = sg_next(*sg);
957 	}
958 }
959 
960 static int setup_message_sgs(struct sg_table *sgt, struct ceph_msg *msg,
961 			     u8 *front_pad, u8 *middle_pad, u8 *data_pad,
962 			     void *epilogue, bool add_tag)
963 {
964 	struct ceph_msg_data_cursor cursor;
965 	struct scatterlist *cur_sg;
966 	int sg_cnt;
967 	int ret;
968 
969 	if (!front_len(msg) && !middle_len(msg) && !data_len(msg))
970 		return 0;
971 
972 	sg_cnt = 1;  /* epilogue + [auth tag] */
973 	if (front_len(msg))
974 		sg_cnt += calc_sg_cnt(msg->front.iov_base,
975 				      front_len(msg));
976 	if (middle_len(msg))
977 		sg_cnt += calc_sg_cnt(msg->middle->vec.iov_base,
978 				      middle_len(msg));
979 	if (data_len(msg)) {
980 		ceph_msg_data_cursor_init(&cursor, msg, data_len(msg));
981 		sg_cnt += calc_sg_cnt_cursor(&cursor);
982 	}
983 
984 	ret = sg_alloc_table(sgt, sg_cnt, GFP_NOIO);
985 	if (ret)
986 		return ret;
987 
988 	cur_sg = sgt->sgl;
989 	if (front_len(msg))
990 		init_sgs(&cur_sg, msg->front.iov_base, front_len(msg),
991 			 front_pad);
992 	if (middle_len(msg))
993 		init_sgs(&cur_sg, msg->middle->vec.iov_base, middle_len(msg),
994 			 middle_pad);
995 	if (data_len(msg)) {
996 		ceph_msg_data_cursor_init(&cursor, msg, data_len(msg));
997 		init_sgs_cursor(&cur_sg, &cursor, data_pad);
998 	}
999 
1000 	WARN_ON(!sg_is_last(cur_sg));
1001 	sg_set_buf(cur_sg, epilogue,
1002 		   CEPH_GCM_BLOCK_LEN + (add_tag ? CEPH_GCM_TAG_LEN : 0));
1003 	return 0;
1004 }
1005 
1006 static int decrypt_preamble(struct ceph_connection *con)
1007 {
1008 	struct scatterlist sg;
1009 
1010 	sg_init_one(&sg, con->v2.in_buf, CEPH_PREAMBLE_SECURE_LEN);
1011 	return gcm_crypt(con, false, &sg, &sg, CEPH_PREAMBLE_SECURE_LEN);
1012 }
1013 
1014 static int decrypt_control_remainder(struct ceph_connection *con)
1015 {
1016 	int ctrl_len = con->v2.in_desc.fd_lens[0];
1017 	int rem_len = ctrl_len - CEPH_PREAMBLE_INLINE_LEN;
1018 	int pt_len = padding_len(rem_len) + CEPH_GCM_TAG_LEN;
1019 	struct scatterlist sgs[2];
1020 
1021 	WARN_ON(con->v2.in_kvecs[0].iov_len != rem_len);
1022 	WARN_ON(con->v2.in_kvecs[1].iov_len != pt_len);
1023 
1024 	sg_init_table(sgs, 2);
1025 	sg_set_buf(&sgs[0], con->v2.in_kvecs[0].iov_base, rem_len);
1026 	sg_set_buf(&sgs[1], con->v2.in_buf, pt_len);
1027 
1028 	return gcm_crypt(con, false, sgs, sgs,
1029 			 padded_len(rem_len) + CEPH_GCM_TAG_LEN);
1030 }
1031 
1032 static int decrypt_tail(struct ceph_connection *con)
1033 {
1034 	struct sg_table enc_sgt = {};
1035 	struct sg_table sgt = {};
1036 	int tail_len;
1037 	int ret;
1038 
1039 	tail_len = tail_onwire_len(con->in_msg, true);
1040 	ret = sg_alloc_table_from_pages(&enc_sgt, con->v2.in_enc_pages,
1041 					con->v2.in_enc_page_cnt, 0, tail_len,
1042 					GFP_NOIO);
1043 	if (ret)
1044 		goto out;
1045 
1046 	ret = setup_message_sgs(&sgt, con->in_msg, FRONT_PAD(con->v2.in_buf),
1047 			MIDDLE_PAD(con->v2.in_buf), DATA_PAD(con->v2.in_buf),
1048 			con->v2.in_buf, true);
1049 	if (ret)
1050 		goto out;
1051 
1052 	dout("%s con %p msg %p enc_page_cnt %d sg_cnt %d\n", __func__, con,
1053 	     con->in_msg, con->v2.in_enc_page_cnt, sgt.orig_nents);
1054 	ret = gcm_crypt(con, false, enc_sgt.sgl, sgt.sgl, tail_len);
1055 	if (ret)
1056 		goto out;
1057 
1058 	WARN_ON(!con->v2.in_enc_page_cnt);
1059 	ceph_release_page_vector(con->v2.in_enc_pages,
1060 				 con->v2.in_enc_page_cnt);
1061 	con->v2.in_enc_pages = NULL;
1062 	con->v2.in_enc_page_cnt = 0;
1063 
1064 out:
1065 	sg_free_table(&sgt);
1066 	sg_free_table(&enc_sgt);
1067 	return ret;
1068 }
1069 
1070 static int prepare_banner(struct ceph_connection *con)
1071 {
1072 	int buf_len = CEPH_BANNER_V2_LEN + 2 + 8 + 8;
1073 	void *buf, *p;
1074 
1075 	buf = alloc_conn_buf(con, buf_len);
1076 	if (!buf)
1077 		return -ENOMEM;
1078 
1079 	p = buf;
1080 	ceph_encode_copy(&p, CEPH_BANNER_V2, CEPH_BANNER_V2_LEN);
1081 	ceph_encode_16(&p, sizeof(u64) + sizeof(u64));
1082 	ceph_encode_64(&p, CEPH_MSGR2_SUPPORTED_FEATURES);
1083 	ceph_encode_64(&p, CEPH_MSGR2_REQUIRED_FEATURES);
1084 	WARN_ON(p != buf + buf_len);
1085 
1086 	add_out_kvec(con, buf, buf_len);
1087 	add_out_sign_kvec(con, buf, buf_len);
1088 	ceph_con_flag_set(con, CEPH_CON_F_WRITE_PENDING);
1089 	return 0;
1090 }
1091 
1092 /*
1093  * base:
1094  *   preamble
1095  *   control body (ctrl_len bytes)
1096  *   space for control crc
1097  *
1098  * extdata (optional):
1099  *   control body (extdata_len bytes)
1100  *
1101  * Compute control crc and gather base and extdata into:
1102  *
1103  *   preamble
1104  *   control body (ctrl_len + extdata_len bytes)
1105  *   control crc
1106  *
1107  * Preamble should already be encoded at the start of base.
1108  */
1109 static void prepare_head_plain(struct ceph_connection *con, void *base,
1110 			       int ctrl_len, void *extdata, int extdata_len,
1111 			       bool to_be_signed)
1112 {
1113 	int base_len = CEPH_PREAMBLE_LEN + ctrl_len + CEPH_CRC_LEN;
1114 	void *crcp = base + base_len - CEPH_CRC_LEN;
1115 	u32 crc;
1116 
1117 	crc = crc32c(-1, CTRL_BODY(base), ctrl_len);
1118 	if (extdata_len)
1119 		crc = crc32c(crc, extdata, extdata_len);
1120 	put_unaligned_le32(crc, crcp);
1121 
1122 	if (!extdata_len) {
1123 		add_out_kvec(con, base, base_len);
1124 		if (to_be_signed)
1125 			add_out_sign_kvec(con, base, base_len);
1126 		return;
1127 	}
1128 
1129 	add_out_kvec(con, base, crcp - base);
1130 	add_out_kvec(con, extdata, extdata_len);
1131 	add_out_kvec(con, crcp, CEPH_CRC_LEN);
1132 	if (to_be_signed) {
1133 		add_out_sign_kvec(con, base, crcp - base);
1134 		add_out_sign_kvec(con, extdata, extdata_len);
1135 		add_out_sign_kvec(con, crcp, CEPH_CRC_LEN);
1136 	}
1137 }
1138 
1139 static int prepare_head_secure_small(struct ceph_connection *con,
1140 				     void *base, int ctrl_len)
1141 {
1142 	struct scatterlist sg;
1143 	int ret;
1144 
1145 	/* inline buffer padding? */
1146 	if (ctrl_len < CEPH_PREAMBLE_INLINE_LEN)
1147 		memset(CTRL_BODY(base) + ctrl_len, 0,
1148 		       CEPH_PREAMBLE_INLINE_LEN - ctrl_len);
1149 
1150 	sg_init_one(&sg, base, CEPH_PREAMBLE_SECURE_LEN);
1151 	ret = gcm_crypt(con, true, &sg, &sg,
1152 			CEPH_PREAMBLE_SECURE_LEN - CEPH_GCM_TAG_LEN);
1153 	if (ret)
1154 		return ret;
1155 
1156 	add_out_kvec(con, base, CEPH_PREAMBLE_SECURE_LEN);
1157 	return 0;
1158 }
1159 
1160 /*
1161  * base:
1162  *   preamble
1163  *   control body (ctrl_len bytes)
1164  *   space for padding, if needed
1165  *   space for control remainder auth tag
1166  *   space for preamble auth tag
1167  *
1168  * Encrypt preamble and the inline portion, then encrypt the remainder
1169  * and gather into:
1170  *
1171  *   preamble
1172  *   control body (48 bytes)
1173  *   preamble auth tag
1174  *   control body (ctrl_len - 48 bytes)
1175  *   zero padding, if needed
1176  *   control remainder auth tag
1177  *
1178  * Preamble should already be encoded at the start of base.
1179  */
1180 static int prepare_head_secure_big(struct ceph_connection *con,
1181 				   void *base, int ctrl_len)
1182 {
1183 	int rem_len = ctrl_len - CEPH_PREAMBLE_INLINE_LEN;
1184 	void *rem = CTRL_BODY(base) + CEPH_PREAMBLE_INLINE_LEN;
1185 	void *rem_tag = rem + padded_len(rem_len);
1186 	void *pmbl_tag = rem_tag + CEPH_GCM_TAG_LEN;
1187 	struct scatterlist sgs[2];
1188 	int ret;
1189 
1190 	sg_init_table(sgs, 2);
1191 	sg_set_buf(&sgs[0], base, rem - base);
1192 	sg_set_buf(&sgs[1], pmbl_tag, CEPH_GCM_TAG_LEN);
1193 	ret = gcm_crypt(con, true, sgs, sgs, rem - base);
1194 	if (ret)
1195 		return ret;
1196 
1197 	/* control remainder padding? */
1198 	if (need_padding(rem_len))
1199 		memset(rem + rem_len, 0, padding_len(rem_len));
1200 
1201 	sg_init_one(&sgs[0], rem, pmbl_tag - rem);
1202 	ret = gcm_crypt(con, true, sgs, sgs, rem_tag - rem);
1203 	if (ret)
1204 		return ret;
1205 
1206 	add_out_kvec(con, base, rem - base);
1207 	add_out_kvec(con, pmbl_tag, CEPH_GCM_TAG_LEN);
1208 	add_out_kvec(con, rem, pmbl_tag - rem);
1209 	return 0;
1210 }
1211 
1212 static int __prepare_control(struct ceph_connection *con, int tag,
1213 			     void *base, int ctrl_len, void *extdata,
1214 			     int extdata_len, bool to_be_signed)
1215 {
1216 	int total_len = ctrl_len + extdata_len;
1217 	struct ceph_frame_desc desc;
1218 	int ret;
1219 
1220 	dout("%s con %p tag %d len %d (%d+%d)\n", __func__, con, tag,
1221 	     total_len, ctrl_len, extdata_len);
1222 
1223 	/* extdata may be vmalloc'ed but not base */
1224 	if (WARN_ON(is_vmalloc_addr(base) || !ctrl_len))
1225 		return -EINVAL;
1226 
1227 	init_frame_desc(&desc, tag, &total_len, 1);
1228 	encode_preamble(&desc, base);
1229 
1230 	if (con_secure(con)) {
1231 		if (WARN_ON(extdata_len || to_be_signed))
1232 			return -EINVAL;
1233 
1234 		if (ctrl_len <= CEPH_PREAMBLE_INLINE_LEN)
1235 			/* fully inlined, inline buffer may need padding */
1236 			ret = prepare_head_secure_small(con, base, ctrl_len);
1237 		else
1238 			/* partially inlined, inline buffer is full */
1239 			ret = prepare_head_secure_big(con, base, ctrl_len);
1240 		if (ret)
1241 			return ret;
1242 	} else {
1243 		prepare_head_plain(con, base, ctrl_len, extdata, extdata_len,
1244 				   to_be_signed);
1245 	}
1246 
1247 	ceph_con_flag_set(con, CEPH_CON_F_WRITE_PENDING);
1248 	return 0;
1249 }
1250 
1251 static int prepare_control(struct ceph_connection *con, int tag,
1252 			   void *base, int ctrl_len)
1253 {
1254 	return __prepare_control(con, tag, base, ctrl_len, NULL, 0, false);
1255 }
1256 
1257 static int prepare_hello(struct ceph_connection *con)
1258 {
1259 	void *buf, *p;
1260 	int ctrl_len;
1261 
1262 	ctrl_len = 1 + ceph_entity_addr_encoding_len(&con->peer_addr);
1263 	buf = alloc_conn_buf(con, head_onwire_len(ctrl_len, false));
1264 	if (!buf)
1265 		return -ENOMEM;
1266 
1267 	p = CTRL_BODY(buf);
1268 	ceph_encode_8(&p, CEPH_ENTITY_TYPE_CLIENT);
1269 	ceph_encode_entity_addr(&p, &con->peer_addr);
1270 	WARN_ON(p != CTRL_BODY(buf) + ctrl_len);
1271 
1272 	return __prepare_control(con, FRAME_TAG_HELLO, buf, ctrl_len,
1273 				 NULL, 0, true);
1274 }
1275 
1276 /* so that head_onwire_len(AUTH_BUF_LEN, false) is 512 */
1277 #define AUTH_BUF_LEN	(512 - CEPH_CRC_LEN - CEPH_PREAMBLE_PLAIN_LEN)
1278 
1279 static int prepare_auth_request(struct ceph_connection *con)
1280 {
1281 	void *authorizer, *authorizer_copy;
1282 	int ctrl_len, authorizer_len;
1283 	void *buf;
1284 	int ret;
1285 
1286 	ctrl_len = AUTH_BUF_LEN;
1287 	buf = alloc_conn_buf(con, head_onwire_len(ctrl_len, false));
1288 	if (!buf)
1289 		return -ENOMEM;
1290 
1291 	mutex_unlock(&con->mutex);
1292 	ret = con->ops->get_auth_request(con, CTRL_BODY(buf), &ctrl_len,
1293 					 &authorizer, &authorizer_len);
1294 	mutex_lock(&con->mutex);
1295 	if (con->state != CEPH_CON_S_V2_HELLO) {
1296 		dout("%s con %p state changed to %d\n", __func__, con,
1297 		     con->state);
1298 		return -EAGAIN;
1299 	}
1300 
1301 	dout("%s con %p get_auth_request ret %d\n", __func__, con, ret);
1302 	if (ret)
1303 		return ret;
1304 
1305 	authorizer_copy = alloc_conn_buf(con, authorizer_len);
1306 	if (!authorizer_copy)
1307 		return -ENOMEM;
1308 
1309 	memcpy(authorizer_copy, authorizer, authorizer_len);
1310 
1311 	return __prepare_control(con, FRAME_TAG_AUTH_REQUEST, buf, ctrl_len,
1312 				 authorizer_copy, authorizer_len, true);
1313 }
1314 
1315 static int prepare_auth_request_more(struct ceph_connection *con,
1316 				     void *reply, int reply_len)
1317 {
1318 	int ctrl_len, authorizer_len;
1319 	void *authorizer;
1320 	void *buf;
1321 	int ret;
1322 
1323 	ctrl_len = AUTH_BUF_LEN;
1324 	buf = alloc_conn_buf(con, head_onwire_len(ctrl_len, false));
1325 	if (!buf)
1326 		return -ENOMEM;
1327 
1328 	mutex_unlock(&con->mutex);
1329 	ret = con->ops->handle_auth_reply_more(con, reply, reply_len,
1330 					       CTRL_BODY(buf), &ctrl_len,
1331 					       &authorizer, &authorizer_len);
1332 	mutex_lock(&con->mutex);
1333 	if (con->state != CEPH_CON_S_V2_AUTH) {
1334 		dout("%s con %p state changed to %d\n", __func__, con,
1335 		     con->state);
1336 		return -EAGAIN;
1337 	}
1338 
1339 	dout("%s con %p handle_auth_reply_more ret %d\n", __func__, con, ret);
1340 	if (ret)
1341 		return ret;
1342 
1343 	return __prepare_control(con, FRAME_TAG_AUTH_REQUEST_MORE, buf,
1344 				 ctrl_len, authorizer, authorizer_len, true);
1345 }
1346 
1347 static int prepare_auth_signature(struct ceph_connection *con)
1348 {
1349 	void *buf;
1350 	int ret;
1351 
1352 	buf = alloc_conn_buf(con, head_onwire_len(SHA256_DIGEST_SIZE,
1353 						  con_secure(con)));
1354 	if (!buf)
1355 		return -ENOMEM;
1356 
1357 	ret = hmac_sha256(con, con->v2.in_sign_kvecs, con->v2.in_sign_kvec_cnt,
1358 			  CTRL_BODY(buf));
1359 	if (ret)
1360 		return ret;
1361 
1362 	return prepare_control(con, FRAME_TAG_AUTH_SIGNATURE, buf,
1363 			       SHA256_DIGEST_SIZE);
1364 }
1365 
1366 static int prepare_client_ident(struct ceph_connection *con)
1367 {
1368 	struct ceph_entity_addr *my_addr = &con->msgr->inst.addr;
1369 	struct ceph_client *client = from_msgr(con->msgr);
1370 	u64 global_id = ceph_client_gid(client);
1371 	void *buf, *p;
1372 	int ctrl_len;
1373 
1374 	WARN_ON(con->v2.server_cookie);
1375 	WARN_ON(con->v2.connect_seq);
1376 	WARN_ON(con->v2.peer_global_seq);
1377 
1378 	if (!con->v2.client_cookie) {
1379 		do {
1380 			get_random_bytes(&con->v2.client_cookie,
1381 					 sizeof(con->v2.client_cookie));
1382 		} while (!con->v2.client_cookie);
1383 		dout("%s con %p generated cookie 0x%llx\n", __func__, con,
1384 		     con->v2.client_cookie);
1385 	} else {
1386 		dout("%s con %p cookie already set 0x%llx\n", __func__, con,
1387 		     con->v2.client_cookie);
1388 	}
1389 
1390 	dout("%s con %p my_addr %s/%u peer_addr %s/%u global_id %llu global_seq %llu features 0x%llx required_features 0x%llx cookie 0x%llx\n",
1391 	     __func__, con, ceph_pr_addr(my_addr), le32_to_cpu(my_addr->nonce),
1392 	     ceph_pr_addr(&con->peer_addr), le32_to_cpu(con->peer_addr.nonce),
1393 	     global_id, con->v2.global_seq, client->supported_features,
1394 	     client->required_features, con->v2.client_cookie);
1395 
1396 	ctrl_len = 1 + 4 + ceph_entity_addr_encoding_len(my_addr) +
1397 		   ceph_entity_addr_encoding_len(&con->peer_addr) + 6 * 8;
1398 	buf = alloc_conn_buf(con, head_onwire_len(ctrl_len, con_secure(con)));
1399 	if (!buf)
1400 		return -ENOMEM;
1401 
1402 	p = CTRL_BODY(buf);
1403 	ceph_encode_8(&p, 2);  /* addrvec marker */
1404 	ceph_encode_32(&p, 1);  /* addr_cnt */
1405 	ceph_encode_entity_addr(&p, my_addr);
1406 	ceph_encode_entity_addr(&p, &con->peer_addr);
1407 	ceph_encode_64(&p, global_id);
1408 	ceph_encode_64(&p, con->v2.global_seq);
1409 	ceph_encode_64(&p, client->supported_features);
1410 	ceph_encode_64(&p, client->required_features);
1411 	ceph_encode_64(&p, 0);  /* flags */
1412 	ceph_encode_64(&p, con->v2.client_cookie);
1413 	WARN_ON(p != CTRL_BODY(buf) + ctrl_len);
1414 
1415 	return prepare_control(con, FRAME_TAG_CLIENT_IDENT, buf, ctrl_len);
1416 }
1417 
1418 static int prepare_session_reconnect(struct ceph_connection *con)
1419 {
1420 	struct ceph_entity_addr *my_addr = &con->msgr->inst.addr;
1421 	void *buf, *p;
1422 	int ctrl_len;
1423 
1424 	WARN_ON(!con->v2.client_cookie);
1425 	WARN_ON(!con->v2.server_cookie);
1426 	WARN_ON(!con->v2.connect_seq);
1427 	WARN_ON(!con->v2.peer_global_seq);
1428 
1429 	dout("%s con %p my_addr %s/%u client_cookie 0x%llx server_cookie 0x%llx global_seq %llu connect_seq %llu in_seq %llu\n",
1430 	     __func__, con, ceph_pr_addr(my_addr), le32_to_cpu(my_addr->nonce),
1431 	     con->v2.client_cookie, con->v2.server_cookie, con->v2.global_seq,
1432 	     con->v2.connect_seq, con->in_seq);
1433 
1434 	ctrl_len = 1 + 4 + ceph_entity_addr_encoding_len(my_addr) + 5 * 8;
1435 	buf = alloc_conn_buf(con, head_onwire_len(ctrl_len, con_secure(con)));
1436 	if (!buf)
1437 		return -ENOMEM;
1438 
1439 	p = CTRL_BODY(buf);
1440 	ceph_encode_8(&p, 2);  /* entity_addrvec_t marker */
1441 	ceph_encode_32(&p, 1);  /* my_addrs len */
1442 	ceph_encode_entity_addr(&p, my_addr);
1443 	ceph_encode_64(&p, con->v2.client_cookie);
1444 	ceph_encode_64(&p, con->v2.server_cookie);
1445 	ceph_encode_64(&p, con->v2.global_seq);
1446 	ceph_encode_64(&p, con->v2.connect_seq);
1447 	ceph_encode_64(&p, con->in_seq);
1448 	WARN_ON(p != CTRL_BODY(buf) + ctrl_len);
1449 
1450 	return prepare_control(con, FRAME_TAG_SESSION_RECONNECT, buf, ctrl_len);
1451 }
1452 
1453 static int prepare_keepalive2(struct ceph_connection *con)
1454 {
1455 	struct ceph_timespec *ts = CTRL_BODY(con->v2.out_buf);
1456 	struct timespec64 now;
1457 
1458 	ktime_get_real_ts64(&now);
1459 	dout("%s con %p timestamp %lld.%09ld\n", __func__, con, now.tv_sec,
1460 	     now.tv_nsec);
1461 
1462 	ceph_encode_timespec64(ts, &now);
1463 
1464 	reset_out_kvecs(con);
1465 	return prepare_control(con, FRAME_TAG_KEEPALIVE2, con->v2.out_buf,
1466 			       sizeof(struct ceph_timespec));
1467 }
1468 
1469 static int prepare_ack(struct ceph_connection *con)
1470 {
1471 	void *p;
1472 
1473 	dout("%s con %p in_seq_acked %llu -> %llu\n", __func__, con,
1474 	     con->in_seq_acked, con->in_seq);
1475 	con->in_seq_acked = con->in_seq;
1476 
1477 	p = CTRL_BODY(con->v2.out_buf);
1478 	ceph_encode_64(&p, con->in_seq_acked);
1479 
1480 	reset_out_kvecs(con);
1481 	return prepare_control(con, FRAME_TAG_ACK, con->v2.out_buf, 8);
1482 }
1483 
1484 static void prepare_epilogue_plain(struct ceph_connection *con, bool aborted)
1485 {
1486 	dout("%s con %p msg %p aborted %d crcs %u %u %u\n", __func__, con,
1487 	     con->out_msg, aborted, con->v2.out_epil.front_crc,
1488 	     con->v2.out_epil.middle_crc, con->v2.out_epil.data_crc);
1489 
1490 	encode_epilogue_plain(con, aborted);
1491 	add_out_kvec(con, &con->v2.out_epil, CEPH_EPILOGUE_PLAIN_LEN);
1492 }
1493 
1494 /*
1495  * For "used" empty segments, crc is -1.  For unused (trailing)
1496  * segments, crc is 0.
1497  */
1498 static void prepare_message_plain(struct ceph_connection *con)
1499 {
1500 	struct ceph_msg *msg = con->out_msg;
1501 
1502 	prepare_head_plain(con, con->v2.out_buf,
1503 			   sizeof(struct ceph_msg_header2), NULL, 0, false);
1504 
1505 	if (!front_len(msg) && !middle_len(msg)) {
1506 		if (!data_len(msg)) {
1507 			/*
1508 			 * Empty message: once the head is written,
1509 			 * we are done -- there is no epilogue.
1510 			 */
1511 			con->v2.out_state = OUT_S_FINISH_MESSAGE;
1512 			return;
1513 		}
1514 
1515 		con->v2.out_epil.front_crc = -1;
1516 		con->v2.out_epil.middle_crc = -1;
1517 		con->v2.out_state = OUT_S_QUEUE_DATA;
1518 		return;
1519 	}
1520 
1521 	if (front_len(msg)) {
1522 		con->v2.out_epil.front_crc = crc32c(-1, msg->front.iov_base,
1523 						    front_len(msg));
1524 		add_out_kvec(con, msg->front.iov_base, front_len(msg));
1525 	} else {
1526 		/* middle (at least) is there, checked above */
1527 		con->v2.out_epil.front_crc = -1;
1528 	}
1529 
1530 	if (middle_len(msg)) {
1531 		con->v2.out_epil.middle_crc =
1532 			crc32c(-1, msg->middle->vec.iov_base, middle_len(msg));
1533 		add_out_kvec(con, msg->middle->vec.iov_base, middle_len(msg));
1534 	} else {
1535 		con->v2.out_epil.middle_crc = data_len(msg) ? -1 : 0;
1536 	}
1537 
1538 	if (data_len(msg)) {
1539 		con->v2.out_state = OUT_S_QUEUE_DATA;
1540 	} else {
1541 		con->v2.out_epil.data_crc = 0;
1542 		prepare_epilogue_plain(con, false);
1543 		con->v2.out_state = OUT_S_FINISH_MESSAGE;
1544 	}
1545 }
1546 
1547 /*
1548  * Unfortunately the kernel crypto API doesn't support streaming
1549  * (piecewise) operation for AEAD algorithms, so we can't get away
1550  * with a fixed size buffer and a couple sgs.  Instead, we have to
1551  * allocate pages for the entire tail of the message (currently up
1552  * to ~32M) and two sgs arrays (up to ~256K each)...
1553  */
1554 static int prepare_message_secure(struct ceph_connection *con)
1555 {
1556 	void *zerop = page_address(ceph_zero_page);
1557 	struct sg_table enc_sgt = {};
1558 	struct sg_table sgt = {};
1559 	struct page **enc_pages;
1560 	int enc_page_cnt;
1561 	int tail_len;
1562 	int ret;
1563 
1564 	ret = prepare_head_secure_small(con, con->v2.out_buf,
1565 					sizeof(struct ceph_msg_header2));
1566 	if (ret)
1567 		return ret;
1568 
1569 	tail_len = tail_onwire_len(con->out_msg, true);
1570 	if (!tail_len) {
1571 		/*
1572 		 * Empty message: once the head is written,
1573 		 * we are done -- there is no epilogue.
1574 		 */
1575 		con->v2.out_state = OUT_S_FINISH_MESSAGE;
1576 		return 0;
1577 	}
1578 
1579 	encode_epilogue_secure(con, false);
1580 	ret = setup_message_sgs(&sgt, con->out_msg, zerop, zerop, zerop,
1581 				&con->v2.out_epil, false);
1582 	if (ret)
1583 		goto out;
1584 
1585 	enc_page_cnt = calc_pages_for(0, tail_len);
1586 	enc_pages = ceph_alloc_page_vector(enc_page_cnt, GFP_NOIO);
1587 	if (IS_ERR(enc_pages)) {
1588 		ret = PTR_ERR(enc_pages);
1589 		goto out;
1590 	}
1591 
1592 	WARN_ON(con->v2.out_enc_pages || con->v2.out_enc_page_cnt);
1593 	con->v2.out_enc_pages = enc_pages;
1594 	con->v2.out_enc_page_cnt = enc_page_cnt;
1595 	con->v2.out_enc_resid = tail_len;
1596 	con->v2.out_enc_i = 0;
1597 
1598 	ret = sg_alloc_table_from_pages(&enc_sgt, enc_pages, enc_page_cnt,
1599 					0, tail_len, GFP_NOIO);
1600 	if (ret)
1601 		goto out;
1602 
1603 	ret = gcm_crypt(con, true, sgt.sgl, enc_sgt.sgl,
1604 			tail_len - CEPH_GCM_TAG_LEN);
1605 	if (ret)
1606 		goto out;
1607 
1608 	dout("%s con %p msg %p sg_cnt %d enc_page_cnt %d\n", __func__, con,
1609 	     con->out_msg, sgt.orig_nents, enc_page_cnt);
1610 	con->v2.out_state = OUT_S_QUEUE_ENC_PAGE;
1611 
1612 out:
1613 	sg_free_table(&sgt);
1614 	sg_free_table(&enc_sgt);
1615 	return ret;
1616 }
1617 
1618 static int prepare_message(struct ceph_connection *con)
1619 {
1620 	int lens[] = {
1621 		sizeof(struct ceph_msg_header2),
1622 		front_len(con->out_msg),
1623 		middle_len(con->out_msg),
1624 		data_len(con->out_msg)
1625 	};
1626 	struct ceph_frame_desc desc;
1627 	int ret;
1628 
1629 	dout("%s con %p msg %p logical %d+%d+%d+%d\n", __func__, con,
1630 	     con->out_msg, lens[0], lens[1], lens[2], lens[3]);
1631 
1632 	if (con->in_seq > con->in_seq_acked) {
1633 		dout("%s con %p in_seq_acked %llu -> %llu\n", __func__, con,
1634 		     con->in_seq_acked, con->in_seq);
1635 		con->in_seq_acked = con->in_seq;
1636 	}
1637 
1638 	reset_out_kvecs(con);
1639 	init_frame_desc(&desc, FRAME_TAG_MESSAGE, lens, 4);
1640 	encode_preamble(&desc, con->v2.out_buf);
1641 	fill_header2(CTRL_BODY(con->v2.out_buf), &con->out_msg->hdr,
1642 		     con->in_seq_acked);
1643 
1644 	if (con_secure(con)) {
1645 		ret = prepare_message_secure(con);
1646 		if (ret)
1647 			return ret;
1648 	} else {
1649 		prepare_message_plain(con);
1650 	}
1651 
1652 	ceph_con_flag_set(con, CEPH_CON_F_WRITE_PENDING);
1653 	return 0;
1654 }
1655 
1656 static int prepare_read_banner_prefix(struct ceph_connection *con)
1657 {
1658 	void *buf;
1659 
1660 	buf = alloc_conn_buf(con, CEPH_BANNER_V2_PREFIX_LEN);
1661 	if (!buf)
1662 		return -ENOMEM;
1663 
1664 	reset_in_kvecs(con);
1665 	add_in_kvec(con, buf, CEPH_BANNER_V2_PREFIX_LEN);
1666 	add_in_sign_kvec(con, buf, CEPH_BANNER_V2_PREFIX_LEN);
1667 	con->state = CEPH_CON_S_V2_BANNER_PREFIX;
1668 	return 0;
1669 }
1670 
1671 static int prepare_read_banner_payload(struct ceph_connection *con,
1672 				       int payload_len)
1673 {
1674 	void *buf;
1675 
1676 	buf = alloc_conn_buf(con, payload_len);
1677 	if (!buf)
1678 		return -ENOMEM;
1679 
1680 	reset_in_kvecs(con);
1681 	add_in_kvec(con, buf, payload_len);
1682 	add_in_sign_kvec(con, buf, payload_len);
1683 	con->state = CEPH_CON_S_V2_BANNER_PAYLOAD;
1684 	return 0;
1685 }
1686 
1687 static void prepare_read_preamble(struct ceph_connection *con)
1688 {
1689 	reset_in_kvecs(con);
1690 	add_in_kvec(con, con->v2.in_buf,
1691 		    con_secure(con) ? CEPH_PREAMBLE_SECURE_LEN :
1692 				      CEPH_PREAMBLE_PLAIN_LEN);
1693 	con->v2.in_state = IN_S_HANDLE_PREAMBLE;
1694 }
1695 
1696 static int prepare_read_control(struct ceph_connection *con)
1697 {
1698 	int ctrl_len = con->v2.in_desc.fd_lens[0];
1699 	int head_len;
1700 	void *buf;
1701 
1702 	reset_in_kvecs(con);
1703 	if (con->state == CEPH_CON_S_V2_HELLO ||
1704 	    con->state == CEPH_CON_S_V2_AUTH) {
1705 		head_len = head_onwire_len(ctrl_len, false);
1706 		buf = alloc_conn_buf(con, head_len);
1707 		if (!buf)
1708 			return -ENOMEM;
1709 
1710 		/* preserve preamble */
1711 		memcpy(buf, con->v2.in_buf, CEPH_PREAMBLE_LEN);
1712 
1713 		add_in_kvec(con, CTRL_BODY(buf), ctrl_len);
1714 		add_in_kvec(con, CTRL_BODY(buf) + ctrl_len, CEPH_CRC_LEN);
1715 		add_in_sign_kvec(con, buf, head_len);
1716 	} else {
1717 		if (ctrl_len > CEPH_PREAMBLE_INLINE_LEN) {
1718 			buf = alloc_conn_buf(con, ctrl_len);
1719 			if (!buf)
1720 				return -ENOMEM;
1721 
1722 			add_in_kvec(con, buf, ctrl_len);
1723 		} else {
1724 			add_in_kvec(con, CTRL_BODY(con->v2.in_buf), ctrl_len);
1725 		}
1726 		add_in_kvec(con, con->v2.in_buf, CEPH_CRC_LEN);
1727 	}
1728 	con->v2.in_state = IN_S_HANDLE_CONTROL;
1729 	return 0;
1730 }
1731 
1732 static int prepare_read_control_remainder(struct ceph_connection *con)
1733 {
1734 	int ctrl_len = con->v2.in_desc.fd_lens[0];
1735 	int rem_len = ctrl_len - CEPH_PREAMBLE_INLINE_LEN;
1736 	void *buf;
1737 
1738 	buf = alloc_conn_buf(con, ctrl_len);
1739 	if (!buf)
1740 		return -ENOMEM;
1741 
1742 	memcpy(buf, CTRL_BODY(con->v2.in_buf), CEPH_PREAMBLE_INLINE_LEN);
1743 
1744 	reset_in_kvecs(con);
1745 	add_in_kvec(con, buf + CEPH_PREAMBLE_INLINE_LEN, rem_len);
1746 	add_in_kvec(con, con->v2.in_buf,
1747 		    padding_len(rem_len) + CEPH_GCM_TAG_LEN);
1748 	con->v2.in_state = IN_S_HANDLE_CONTROL_REMAINDER;
1749 	return 0;
1750 }
1751 
1752 static int prepare_read_data(struct ceph_connection *con)
1753 {
1754 	struct bio_vec bv;
1755 
1756 	con->in_data_crc = -1;
1757 	ceph_msg_data_cursor_init(&con->v2.in_cursor, con->in_msg,
1758 				  data_len(con->in_msg));
1759 
1760 	get_bvec_at(&con->v2.in_cursor, &bv);
1761 	if (ceph_test_opt(from_msgr(con->msgr), RXBOUNCE)) {
1762 		if (unlikely(!con->bounce_page)) {
1763 			con->bounce_page = alloc_page(GFP_NOIO);
1764 			if (!con->bounce_page) {
1765 				pr_err("failed to allocate bounce page\n");
1766 				return -ENOMEM;
1767 			}
1768 		}
1769 
1770 		bv.bv_page = con->bounce_page;
1771 		bv.bv_offset = 0;
1772 	}
1773 	set_in_bvec(con, &bv);
1774 	con->v2.in_state = IN_S_PREPARE_READ_DATA_CONT;
1775 	return 0;
1776 }
1777 
1778 static void prepare_read_data_cont(struct ceph_connection *con)
1779 {
1780 	struct bio_vec bv;
1781 
1782 	if (ceph_test_opt(from_msgr(con->msgr), RXBOUNCE)) {
1783 		con->in_data_crc = crc32c(con->in_data_crc,
1784 					  page_address(con->bounce_page),
1785 					  con->v2.in_bvec.bv_len);
1786 
1787 		get_bvec_at(&con->v2.in_cursor, &bv);
1788 		memcpy_to_page(bv.bv_page, bv.bv_offset,
1789 			       page_address(con->bounce_page),
1790 			       con->v2.in_bvec.bv_len);
1791 	} else {
1792 		con->in_data_crc = ceph_crc32c_page(con->in_data_crc,
1793 						    con->v2.in_bvec.bv_page,
1794 						    con->v2.in_bvec.bv_offset,
1795 						    con->v2.in_bvec.bv_len);
1796 	}
1797 
1798 	ceph_msg_data_advance(&con->v2.in_cursor, con->v2.in_bvec.bv_len);
1799 	if (con->v2.in_cursor.total_resid) {
1800 		get_bvec_at(&con->v2.in_cursor, &bv);
1801 		if (ceph_test_opt(from_msgr(con->msgr), RXBOUNCE)) {
1802 			bv.bv_page = con->bounce_page;
1803 			bv.bv_offset = 0;
1804 		}
1805 		set_in_bvec(con, &bv);
1806 		WARN_ON(con->v2.in_state != IN_S_PREPARE_READ_DATA_CONT);
1807 		return;
1808 	}
1809 
1810 	/*
1811 	 * We've read all data.  Prepare to read epilogue.
1812 	 */
1813 	reset_in_kvecs(con);
1814 	add_in_kvec(con, con->v2.in_buf, CEPH_EPILOGUE_PLAIN_LEN);
1815 	con->v2.in_state = IN_S_HANDLE_EPILOGUE;
1816 }
1817 
1818 static int prepare_read_tail_plain(struct ceph_connection *con)
1819 {
1820 	struct ceph_msg *msg = con->in_msg;
1821 
1822 	if (!front_len(msg) && !middle_len(msg)) {
1823 		WARN_ON(!data_len(msg));
1824 		return prepare_read_data(con);
1825 	}
1826 
1827 	reset_in_kvecs(con);
1828 	if (front_len(msg)) {
1829 		add_in_kvec(con, msg->front.iov_base, front_len(msg));
1830 		WARN_ON(msg->front.iov_len != front_len(msg));
1831 	}
1832 	if (middle_len(msg)) {
1833 		add_in_kvec(con, msg->middle->vec.iov_base, middle_len(msg));
1834 		WARN_ON(msg->middle->vec.iov_len != middle_len(msg));
1835 	}
1836 
1837 	if (data_len(msg)) {
1838 		con->v2.in_state = IN_S_PREPARE_READ_DATA;
1839 	} else {
1840 		add_in_kvec(con, con->v2.in_buf, CEPH_EPILOGUE_PLAIN_LEN);
1841 		con->v2.in_state = IN_S_HANDLE_EPILOGUE;
1842 	}
1843 	return 0;
1844 }
1845 
1846 static void prepare_read_enc_page(struct ceph_connection *con)
1847 {
1848 	struct bio_vec bv;
1849 
1850 	dout("%s con %p i %d resid %d\n", __func__, con, con->v2.in_enc_i,
1851 	     con->v2.in_enc_resid);
1852 	WARN_ON(!con->v2.in_enc_resid);
1853 
1854 	bvec_set_page(&bv, con->v2.in_enc_pages[con->v2.in_enc_i],
1855 		      min(con->v2.in_enc_resid, (int)PAGE_SIZE), 0);
1856 
1857 	set_in_bvec(con, &bv);
1858 	con->v2.in_enc_i++;
1859 	con->v2.in_enc_resid -= bv.bv_len;
1860 
1861 	if (con->v2.in_enc_resid) {
1862 		con->v2.in_state = IN_S_PREPARE_READ_ENC_PAGE;
1863 		return;
1864 	}
1865 
1866 	/*
1867 	 * We are set to read the last piece of ciphertext (ending
1868 	 * with epilogue) + auth tag.
1869 	 */
1870 	WARN_ON(con->v2.in_enc_i != con->v2.in_enc_page_cnt);
1871 	con->v2.in_state = IN_S_HANDLE_EPILOGUE;
1872 }
1873 
1874 static int prepare_read_tail_secure(struct ceph_connection *con)
1875 {
1876 	struct page **enc_pages;
1877 	int enc_page_cnt;
1878 	int tail_len;
1879 
1880 	tail_len = tail_onwire_len(con->in_msg, true);
1881 	WARN_ON(!tail_len);
1882 
1883 	enc_page_cnt = calc_pages_for(0, tail_len);
1884 	enc_pages = ceph_alloc_page_vector(enc_page_cnt, GFP_NOIO);
1885 	if (IS_ERR(enc_pages))
1886 		return PTR_ERR(enc_pages);
1887 
1888 	WARN_ON(con->v2.in_enc_pages || con->v2.in_enc_page_cnt);
1889 	con->v2.in_enc_pages = enc_pages;
1890 	con->v2.in_enc_page_cnt = enc_page_cnt;
1891 	con->v2.in_enc_resid = tail_len;
1892 	con->v2.in_enc_i = 0;
1893 
1894 	prepare_read_enc_page(con);
1895 	return 0;
1896 }
1897 
1898 static void __finish_skip(struct ceph_connection *con)
1899 {
1900 	con->in_seq++;
1901 	prepare_read_preamble(con);
1902 }
1903 
1904 static void prepare_skip_message(struct ceph_connection *con)
1905 {
1906 	struct ceph_frame_desc *desc = &con->v2.in_desc;
1907 	int tail_len;
1908 
1909 	dout("%s con %p %d+%d+%d\n", __func__, con, desc->fd_lens[1],
1910 	     desc->fd_lens[2], desc->fd_lens[3]);
1911 
1912 	tail_len = __tail_onwire_len(desc->fd_lens[1], desc->fd_lens[2],
1913 				     desc->fd_lens[3], con_secure(con));
1914 	if (!tail_len) {
1915 		__finish_skip(con);
1916 	} else {
1917 		set_in_skip(con, tail_len);
1918 		con->v2.in_state = IN_S_FINISH_SKIP;
1919 	}
1920 }
1921 
1922 static int process_banner_prefix(struct ceph_connection *con)
1923 {
1924 	int payload_len;
1925 	void *p;
1926 
1927 	WARN_ON(con->v2.in_kvecs[0].iov_len != CEPH_BANNER_V2_PREFIX_LEN);
1928 
1929 	p = con->v2.in_kvecs[0].iov_base;
1930 	if (memcmp(p, CEPH_BANNER_V2, CEPH_BANNER_V2_LEN)) {
1931 		if (!memcmp(p, CEPH_BANNER, CEPH_BANNER_LEN))
1932 			con->error_msg = "server is speaking msgr1 protocol";
1933 		else
1934 			con->error_msg = "protocol error, bad banner";
1935 		return -EINVAL;
1936 	}
1937 
1938 	p += CEPH_BANNER_V2_LEN;
1939 	payload_len = ceph_decode_16(&p);
1940 	dout("%s con %p payload_len %d\n", __func__, con, payload_len);
1941 
1942 	return prepare_read_banner_payload(con, payload_len);
1943 }
1944 
1945 static int process_banner_payload(struct ceph_connection *con)
1946 {
1947 	void *end = con->v2.in_kvecs[0].iov_base + con->v2.in_kvecs[0].iov_len;
1948 	u64 feat = CEPH_MSGR2_SUPPORTED_FEATURES;
1949 	u64 req_feat = CEPH_MSGR2_REQUIRED_FEATURES;
1950 	u64 server_feat, server_req_feat;
1951 	void *p;
1952 	int ret;
1953 
1954 	p = con->v2.in_kvecs[0].iov_base;
1955 	ceph_decode_64_safe(&p, end, server_feat, bad);
1956 	ceph_decode_64_safe(&p, end, server_req_feat, bad);
1957 
1958 	dout("%s con %p server_feat 0x%llx server_req_feat 0x%llx\n",
1959 	     __func__, con, server_feat, server_req_feat);
1960 
1961 	if (req_feat & ~server_feat) {
1962 		pr_err("msgr2 feature set mismatch: my required > server's supported 0x%llx, need 0x%llx\n",
1963 		       server_feat, req_feat & ~server_feat);
1964 		con->error_msg = "missing required protocol features";
1965 		return -EINVAL;
1966 	}
1967 	if (server_req_feat & ~feat) {
1968 		pr_err("msgr2 feature set mismatch: server's required > my supported 0x%llx, missing 0x%llx\n",
1969 		       feat, server_req_feat & ~feat);
1970 		con->error_msg = "missing required protocol features";
1971 		return -EINVAL;
1972 	}
1973 
1974 	/* no reset_out_kvecs() as our banner may still be pending */
1975 	ret = prepare_hello(con);
1976 	if (ret) {
1977 		pr_err("prepare_hello failed: %d\n", ret);
1978 		return ret;
1979 	}
1980 
1981 	con->state = CEPH_CON_S_V2_HELLO;
1982 	prepare_read_preamble(con);
1983 	return 0;
1984 
1985 bad:
1986 	pr_err("failed to decode banner payload\n");
1987 	return -EINVAL;
1988 }
1989 
1990 static int process_hello(struct ceph_connection *con, void *p, void *end)
1991 {
1992 	struct ceph_entity_addr *my_addr = &con->msgr->inst.addr;
1993 	struct ceph_entity_addr addr_for_me;
1994 	u8 entity_type;
1995 	int ret;
1996 
1997 	if (con->state != CEPH_CON_S_V2_HELLO) {
1998 		con->error_msg = "protocol error, unexpected hello";
1999 		return -EINVAL;
2000 	}
2001 
2002 	ceph_decode_8_safe(&p, end, entity_type, bad);
2003 	ret = ceph_decode_entity_addr(&p, end, &addr_for_me);
2004 	if (ret) {
2005 		pr_err("failed to decode addr_for_me: %d\n", ret);
2006 		return ret;
2007 	}
2008 
2009 	dout("%s con %p entity_type %d addr_for_me %s\n", __func__, con,
2010 	     entity_type, ceph_pr_addr(&addr_for_me));
2011 
2012 	if (entity_type != con->peer_name.type) {
2013 		pr_err("bad peer type, want %d, got %d\n",
2014 		       con->peer_name.type, entity_type);
2015 		con->error_msg = "wrong peer at address";
2016 		return -EINVAL;
2017 	}
2018 
2019 	/*
2020 	 * Set our address to the address our first peer (i.e. monitor)
2021 	 * sees that we are connecting from.  If we are behind some sort
2022 	 * of NAT and want to be identified by some private (not NATed)
2023 	 * address, ip option should be used.
2024 	 */
2025 	if (ceph_addr_is_blank(my_addr)) {
2026 		memcpy(&my_addr->in_addr, &addr_for_me.in_addr,
2027 		       sizeof(my_addr->in_addr));
2028 		ceph_addr_set_port(my_addr, 0);
2029 		dout("%s con %p set my addr %s, as seen by peer %s\n",
2030 		     __func__, con, ceph_pr_addr(my_addr),
2031 		     ceph_pr_addr(&con->peer_addr));
2032 	} else {
2033 		dout("%s con %p my addr already set %s\n",
2034 		     __func__, con, ceph_pr_addr(my_addr));
2035 	}
2036 
2037 	WARN_ON(ceph_addr_is_blank(my_addr) || ceph_addr_port(my_addr));
2038 	WARN_ON(my_addr->type != CEPH_ENTITY_ADDR_TYPE_ANY);
2039 	WARN_ON(!my_addr->nonce);
2040 
2041 	/* no reset_out_kvecs() as our hello may still be pending */
2042 	ret = prepare_auth_request(con);
2043 	if (ret) {
2044 		if (ret != -EAGAIN)
2045 			pr_err("prepare_auth_request failed: %d\n", ret);
2046 		return ret;
2047 	}
2048 
2049 	con->state = CEPH_CON_S_V2_AUTH;
2050 	return 0;
2051 
2052 bad:
2053 	pr_err("failed to decode hello\n");
2054 	return -EINVAL;
2055 }
2056 
2057 static int process_auth_bad_method(struct ceph_connection *con,
2058 				   void *p, void *end)
2059 {
2060 	int allowed_protos[8], allowed_modes[8];
2061 	int allowed_proto_cnt, allowed_mode_cnt;
2062 	int used_proto, result;
2063 	int ret;
2064 	int i;
2065 
2066 	if (con->state != CEPH_CON_S_V2_AUTH) {
2067 		con->error_msg = "protocol error, unexpected auth_bad_method";
2068 		return -EINVAL;
2069 	}
2070 
2071 	ceph_decode_32_safe(&p, end, used_proto, bad);
2072 	ceph_decode_32_safe(&p, end, result, bad);
2073 	dout("%s con %p used_proto %d result %d\n", __func__, con, used_proto,
2074 	     result);
2075 
2076 	ceph_decode_32_safe(&p, end, allowed_proto_cnt, bad);
2077 	if (allowed_proto_cnt > ARRAY_SIZE(allowed_protos)) {
2078 		pr_err("allowed_protos too big %d\n", allowed_proto_cnt);
2079 		return -EINVAL;
2080 	}
2081 	for (i = 0; i < allowed_proto_cnt; i++) {
2082 		ceph_decode_32_safe(&p, end, allowed_protos[i], bad);
2083 		dout("%s con %p allowed_protos[%d] %d\n", __func__, con,
2084 		     i, allowed_protos[i]);
2085 	}
2086 
2087 	ceph_decode_32_safe(&p, end, allowed_mode_cnt, bad);
2088 	if (allowed_mode_cnt > ARRAY_SIZE(allowed_modes)) {
2089 		pr_err("allowed_modes too big %d\n", allowed_mode_cnt);
2090 		return -EINVAL;
2091 	}
2092 	for (i = 0; i < allowed_mode_cnt; i++) {
2093 		ceph_decode_32_safe(&p, end, allowed_modes[i], bad);
2094 		dout("%s con %p allowed_modes[%d] %d\n", __func__, con,
2095 		     i, allowed_modes[i]);
2096 	}
2097 
2098 	mutex_unlock(&con->mutex);
2099 	ret = con->ops->handle_auth_bad_method(con, used_proto, result,
2100 					       allowed_protos,
2101 					       allowed_proto_cnt,
2102 					       allowed_modes,
2103 					       allowed_mode_cnt);
2104 	mutex_lock(&con->mutex);
2105 	if (con->state != CEPH_CON_S_V2_AUTH) {
2106 		dout("%s con %p state changed to %d\n", __func__, con,
2107 		     con->state);
2108 		return -EAGAIN;
2109 	}
2110 
2111 	dout("%s con %p handle_auth_bad_method ret %d\n", __func__, con, ret);
2112 	return ret;
2113 
2114 bad:
2115 	pr_err("failed to decode auth_bad_method\n");
2116 	return -EINVAL;
2117 }
2118 
2119 static int process_auth_reply_more(struct ceph_connection *con,
2120 				   void *p, void *end)
2121 {
2122 	int payload_len;
2123 	int ret;
2124 
2125 	if (con->state != CEPH_CON_S_V2_AUTH) {
2126 		con->error_msg = "protocol error, unexpected auth_reply_more";
2127 		return -EINVAL;
2128 	}
2129 
2130 	ceph_decode_32_safe(&p, end, payload_len, bad);
2131 	ceph_decode_need(&p, end, payload_len, bad);
2132 
2133 	dout("%s con %p payload_len %d\n", __func__, con, payload_len);
2134 
2135 	reset_out_kvecs(con);
2136 	ret = prepare_auth_request_more(con, p, payload_len);
2137 	if (ret) {
2138 		if (ret != -EAGAIN)
2139 			pr_err("prepare_auth_request_more failed: %d\n", ret);
2140 		return ret;
2141 	}
2142 
2143 	return 0;
2144 
2145 bad:
2146 	pr_err("failed to decode auth_reply_more\n");
2147 	return -EINVAL;
2148 }
2149 
2150 /*
2151  * Align session_key and con_secret to avoid GFP_ATOMIC allocation
2152  * inside crypto_shash_setkey() and crypto_aead_setkey() called from
2153  * setup_crypto().  __aligned(16) isn't guaranteed to work for stack
2154  * objects, so do it by hand.
2155  */
2156 static int process_auth_done(struct ceph_connection *con, void *p, void *end)
2157 {
2158 	u8 session_key_buf[CEPH_KEY_LEN + 16];
2159 	u8 con_secret_buf[CEPH_MAX_CON_SECRET_LEN + 16];
2160 	u8 *session_key = PTR_ALIGN(&session_key_buf[0], 16);
2161 	u8 *con_secret = PTR_ALIGN(&con_secret_buf[0], 16);
2162 	int session_key_len, con_secret_len;
2163 	int payload_len;
2164 	u64 global_id;
2165 	int ret;
2166 
2167 	if (con->state != CEPH_CON_S_V2_AUTH) {
2168 		con->error_msg = "protocol error, unexpected auth_done";
2169 		return -EINVAL;
2170 	}
2171 
2172 	ceph_decode_64_safe(&p, end, global_id, bad);
2173 	ceph_decode_32_safe(&p, end, con->v2.con_mode, bad);
2174 	ceph_decode_32_safe(&p, end, payload_len, bad);
2175 
2176 	dout("%s con %p global_id %llu con_mode %d payload_len %d\n",
2177 	     __func__, con, global_id, con->v2.con_mode, payload_len);
2178 
2179 	mutex_unlock(&con->mutex);
2180 	session_key_len = 0;
2181 	con_secret_len = 0;
2182 	ret = con->ops->handle_auth_done(con, global_id, p, payload_len,
2183 					 session_key, &session_key_len,
2184 					 con_secret, &con_secret_len);
2185 	mutex_lock(&con->mutex);
2186 	if (con->state != CEPH_CON_S_V2_AUTH) {
2187 		dout("%s con %p state changed to %d\n", __func__, con,
2188 		     con->state);
2189 		ret = -EAGAIN;
2190 		goto out;
2191 	}
2192 
2193 	dout("%s con %p handle_auth_done ret %d\n", __func__, con, ret);
2194 	if (ret)
2195 		goto out;
2196 
2197 	ret = setup_crypto(con, session_key, session_key_len, con_secret,
2198 			   con_secret_len);
2199 	if (ret)
2200 		goto out;
2201 
2202 	reset_out_kvecs(con);
2203 	ret = prepare_auth_signature(con);
2204 	if (ret) {
2205 		pr_err("prepare_auth_signature failed: %d\n", ret);
2206 		goto out;
2207 	}
2208 
2209 	con->state = CEPH_CON_S_V2_AUTH_SIGNATURE;
2210 
2211 out:
2212 	memzero_explicit(session_key_buf, sizeof(session_key_buf));
2213 	memzero_explicit(con_secret_buf, sizeof(con_secret_buf));
2214 	return ret;
2215 
2216 bad:
2217 	pr_err("failed to decode auth_done\n");
2218 	return -EINVAL;
2219 }
2220 
2221 static int process_auth_signature(struct ceph_connection *con,
2222 				  void *p, void *end)
2223 {
2224 	u8 hmac[SHA256_DIGEST_SIZE];
2225 	int ret;
2226 
2227 	if (con->state != CEPH_CON_S_V2_AUTH_SIGNATURE) {
2228 		con->error_msg = "protocol error, unexpected auth_signature";
2229 		return -EINVAL;
2230 	}
2231 
2232 	ret = hmac_sha256(con, con->v2.out_sign_kvecs,
2233 			  con->v2.out_sign_kvec_cnt, hmac);
2234 	if (ret)
2235 		return ret;
2236 
2237 	ceph_decode_need(&p, end, SHA256_DIGEST_SIZE, bad);
2238 	if (crypto_memneq(p, hmac, SHA256_DIGEST_SIZE)) {
2239 		con->error_msg = "integrity error, bad auth signature";
2240 		return -EBADMSG;
2241 	}
2242 
2243 	dout("%s con %p auth signature ok\n", __func__, con);
2244 
2245 	/* no reset_out_kvecs() as our auth_signature may still be pending */
2246 	if (!con->v2.server_cookie) {
2247 		ret = prepare_client_ident(con);
2248 		if (ret) {
2249 			pr_err("prepare_client_ident failed: %d\n", ret);
2250 			return ret;
2251 		}
2252 
2253 		con->state = CEPH_CON_S_V2_SESSION_CONNECT;
2254 	} else {
2255 		ret = prepare_session_reconnect(con);
2256 		if (ret) {
2257 			pr_err("prepare_session_reconnect failed: %d\n", ret);
2258 			return ret;
2259 		}
2260 
2261 		con->state = CEPH_CON_S_V2_SESSION_RECONNECT;
2262 	}
2263 
2264 	return 0;
2265 
2266 bad:
2267 	pr_err("failed to decode auth_signature\n");
2268 	return -EINVAL;
2269 }
2270 
2271 static int process_server_ident(struct ceph_connection *con,
2272 				void *p, void *end)
2273 {
2274 	struct ceph_client *client = from_msgr(con->msgr);
2275 	u64 features, required_features;
2276 	struct ceph_entity_addr addr;
2277 	u64 global_seq;
2278 	u64 global_id;
2279 	u64 cookie;
2280 	u64 flags;
2281 	int ret;
2282 
2283 	if (con->state != CEPH_CON_S_V2_SESSION_CONNECT) {
2284 		con->error_msg = "protocol error, unexpected server_ident";
2285 		return -EINVAL;
2286 	}
2287 
2288 	ret = ceph_decode_entity_addrvec(&p, end, true, &addr);
2289 	if (ret) {
2290 		pr_err("failed to decode server addrs: %d\n", ret);
2291 		return ret;
2292 	}
2293 
2294 	ceph_decode_64_safe(&p, end, global_id, bad);
2295 	ceph_decode_64_safe(&p, end, global_seq, bad);
2296 	ceph_decode_64_safe(&p, end, features, bad);
2297 	ceph_decode_64_safe(&p, end, required_features, bad);
2298 	ceph_decode_64_safe(&p, end, flags, bad);
2299 	ceph_decode_64_safe(&p, end, cookie, bad);
2300 
2301 	dout("%s con %p addr %s/%u global_id %llu global_seq %llu features 0x%llx required_features 0x%llx flags 0x%llx cookie 0x%llx\n",
2302 	     __func__, con, ceph_pr_addr(&addr), le32_to_cpu(addr.nonce),
2303 	     global_id, global_seq, features, required_features, flags, cookie);
2304 
2305 	/* is this who we intended to talk to? */
2306 	if (memcmp(&addr, &con->peer_addr, sizeof(con->peer_addr))) {
2307 		pr_err("bad peer addr/nonce, want %s/%u, got %s/%u\n",
2308 		       ceph_pr_addr(&con->peer_addr),
2309 		       le32_to_cpu(con->peer_addr.nonce),
2310 		       ceph_pr_addr(&addr), le32_to_cpu(addr.nonce));
2311 		con->error_msg = "wrong peer at address";
2312 		return -EINVAL;
2313 	}
2314 
2315 	if (client->required_features & ~features) {
2316 		pr_err("RADOS feature set mismatch: my required > server's supported 0x%llx, need 0x%llx\n",
2317 		       features, client->required_features & ~features);
2318 		con->error_msg = "missing required protocol features";
2319 		return -EINVAL;
2320 	}
2321 
2322 	/*
2323 	 * Both name->type and name->num are set in ceph_con_open() but
2324 	 * name->num may be bogus in the initial monmap.  name->type is
2325 	 * verified in handle_hello().
2326 	 */
2327 	WARN_ON(!con->peer_name.type);
2328 	con->peer_name.num = cpu_to_le64(global_id);
2329 	con->v2.peer_global_seq = global_seq;
2330 	con->peer_features = features;
2331 	WARN_ON(required_features & ~client->supported_features);
2332 	con->v2.server_cookie = cookie;
2333 
2334 	if (flags & CEPH_MSG_CONNECT_LOSSY) {
2335 		ceph_con_flag_set(con, CEPH_CON_F_LOSSYTX);
2336 		WARN_ON(con->v2.server_cookie);
2337 	} else {
2338 		WARN_ON(!con->v2.server_cookie);
2339 	}
2340 
2341 	clear_in_sign_kvecs(con);
2342 	clear_out_sign_kvecs(con);
2343 	free_conn_bufs(con);
2344 	con->delay = 0;  /* reset backoff memory */
2345 
2346 	con->state = CEPH_CON_S_OPEN;
2347 	con->v2.out_state = OUT_S_GET_NEXT;
2348 	return 0;
2349 
2350 bad:
2351 	pr_err("failed to decode server_ident\n");
2352 	return -EINVAL;
2353 }
2354 
2355 static int process_ident_missing_features(struct ceph_connection *con,
2356 					  void *p, void *end)
2357 {
2358 	struct ceph_client *client = from_msgr(con->msgr);
2359 	u64 missing_features;
2360 
2361 	if (con->state != CEPH_CON_S_V2_SESSION_CONNECT) {
2362 		con->error_msg = "protocol error, unexpected ident_missing_features";
2363 		return -EINVAL;
2364 	}
2365 
2366 	ceph_decode_64_safe(&p, end, missing_features, bad);
2367 	pr_err("RADOS feature set mismatch: server's required > my supported 0x%llx, missing 0x%llx\n",
2368 	       client->supported_features, missing_features);
2369 	con->error_msg = "missing required protocol features";
2370 	return -EINVAL;
2371 
2372 bad:
2373 	pr_err("failed to decode ident_missing_features\n");
2374 	return -EINVAL;
2375 }
2376 
2377 static int process_session_reconnect_ok(struct ceph_connection *con,
2378 					void *p, void *end)
2379 {
2380 	u64 seq;
2381 
2382 	if (con->state != CEPH_CON_S_V2_SESSION_RECONNECT) {
2383 		con->error_msg = "protocol error, unexpected session_reconnect_ok";
2384 		return -EINVAL;
2385 	}
2386 
2387 	ceph_decode_64_safe(&p, end, seq, bad);
2388 
2389 	dout("%s con %p seq %llu\n", __func__, con, seq);
2390 	ceph_con_discard_requeued(con, seq);
2391 
2392 	clear_in_sign_kvecs(con);
2393 	clear_out_sign_kvecs(con);
2394 	free_conn_bufs(con);
2395 	con->delay = 0;  /* reset backoff memory */
2396 
2397 	con->state = CEPH_CON_S_OPEN;
2398 	con->v2.out_state = OUT_S_GET_NEXT;
2399 	return 0;
2400 
2401 bad:
2402 	pr_err("failed to decode session_reconnect_ok\n");
2403 	return -EINVAL;
2404 }
2405 
2406 static int process_session_retry(struct ceph_connection *con,
2407 				 void *p, void *end)
2408 {
2409 	u64 connect_seq;
2410 	int ret;
2411 
2412 	if (con->state != CEPH_CON_S_V2_SESSION_RECONNECT) {
2413 		con->error_msg = "protocol error, unexpected session_retry";
2414 		return -EINVAL;
2415 	}
2416 
2417 	ceph_decode_64_safe(&p, end, connect_seq, bad);
2418 
2419 	dout("%s con %p connect_seq %llu\n", __func__, con, connect_seq);
2420 	WARN_ON(connect_seq <= con->v2.connect_seq);
2421 	con->v2.connect_seq = connect_seq + 1;
2422 
2423 	free_conn_bufs(con);
2424 
2425 	reset_out_kvecs(con);
2426 	ret = prepare_session_reconnect(con);
2427 	if (ret) {
2428 		pr_err("prepare_session_reconnect (cseq) failed: %d\n", ret);
2429 		return ret;
2430 	}
2431 
2432 	return 0;
2433 
2434 bad:
2435 	pr_err("failed to decode session_retry\n");
2436 	return -EINVAL;
2437 }
2438 
2439 static int process_session_retry_global(struct ceph_connection *con,
2440 					void *p, void *end)
2441 {
2442 	u64 global_seq;
2443 	int ret;
2444 
2445 	if (con->state != CEPH_CON_S_V2_SESSION_RECONNECT) {
2446 		con->error_msg = "protocol error, unexpected session_retry_global";
2447 		return -EINVAL;
2448 	}
2449 
2450 	ceph_decode_64_safe(&p, end, global_seq, bad);
2451 
2452 	dout("%s con %p global_seq %llu\n", __func__, con, global_seq);
2453 	WARN_ON(global_seq <= con->v2.global_seq);
2454 	con->v2.global_seq = ceph_get_global_seq(con->msgr, global_seq);
2455 
2456 	free_conn_bufs(con);
2457 
2458 	reset_out_kvecs(con);
2459 	ret = prepare_session_reconnect(con);
2460 	if (ret) {
2461 		pr_err("prepare_session_reconnect (gseq) failed: %d\n", ret);
2462 		return ret;
2463 	}
2464 
2465 	return 0;
2466 
2467 bad:
2468 	pr_err("failed to decode session_retry_global\n");
2469 	return -EINVAL;
2470 }
2471 
2472 static int process_session_reset(struct ceph_connection *con,
2473 				 void *p, void *end)
2474 {
2475 	bool full;
2476 	int ret;
2477 
2478 	if (con->state != CEPH_CON_S_V2_SESSION_RECONNECT) {
2479 		con->error_msg = "protocol error, unexpected session_reset";
2480 		return -EINVAL;
2481 	}
2482 
2483 	ceph_decode_8_safe(&p, end, full, bad);
2484 	if (!full) {
2485 		con->error_msg = "protocol error, bad session_reset";
2486 		return -EINVAL;
2487 	}
2488 
2489 	pr_info("%s%lld %s session reset\n", ENTITY_NAME(con->peer_name),
2490 		ceph_pr_addr(&con->peer_addr));
2491 	ceph_con_reset_session(con);
2492 
2493 	mutex_unlock(&con->mutex);
2494 	if (con->ops->peer_reset)
2495 		con->ops->peer_reset(con);
2496 	mutex_lock(&con->mutex);
2497 	if (con->state != CEPH_CON_S_V2_SESSION_RECONNECT) {
2498 		dout("%s con %p state changed to %d\n", __func__, con,
2499 		     con->state);
2500 		return -EAGAIN;
2501 	}
2502 
2503 	free_conn_bufs(con);
2504 
2505 	reset_out_kvecs(con);
2506 	ret = prepare_client_ident(con);
2507 	if (ret) {
2508 		pr_err("prepare_client_ident (rst) failed: %d\n", ret);
2509 		return ret;
2510 	}
2511 
2512 	con->state = CEPH_CON_S_V2_SESSION_CONNECT;
2513 	return 0;
2514 
2515 bad:
2516 	pr_err("failed to decode session_reset\n");
2517 	return -EINVAL;
2518 }
2519 
2520 static int process_keepalive2_ack(struct ceph_connection *con,
2521 				  void *p, void *end)
2522 {
2523 	if (con->state != CEPH_CON_S_OPEN) {
2524 		con->error_msg = "protocol error, unexpected keepalive2_ack";
2525 		return -EINVAL;
2526 	}
2527 
2528 	ceph_decode_need(&p, end, sizeof(struct ceph_timespec), bad);
2529 	ceph_decode_timespec64(&con->last_keepalive_ack, p);
2530 
2531 	dout("%s con %p timestamp %lld.%09ld\n", __func__, con,
2532 	     con->last_keepalive_ack.tv_sec, con->last_keepalive_ack.tv_nsec);
2533 
2534 	return 0;
2535 
2536 bad:
2537 	pr_err("failed to decode keepalive2_ack\n");
2538 	return -EINVAL;
2539 }
2540 
2541 static int process_ack(struct ceph_connection *con, void *p, void *end)
2542 {
2543 	u64 seq;
2544 
2545 	if (con->state != CEPH_CON_S_OPEN) {
2546 		con->error_msg = "protocol error, unexpected ack";
2547 		return -EINVAL;
2548 	}
2549 
2550 	ceph_decode_64_safe(&p, end, seq, bad);
2551 
2552 	dout("%s con %p seq %llu\n", __func__, con, seq);
2553 	ceph_con_discard_sent(con, seq);
2554 	return 0;
2555 
2556 bad:
2557 	pr_err("failed to decode ack\n");
2558 	return -EINVAL;
2559 }
2560 
2561 static int process_control(struct ceph_connection *con, void *p, void *end)
2562 {
2563 	int tag = con->v2.in_desc.fd_tag;
2564 	int ret;
2565 
2566 	dout("%s con %p tag %d len %d\n", __func__, con, tag, (int)(end - p));
2567 
2568 	switch (tag) {
2569 	case FRAME_TAG_HELLO:
2570 		ret = process_hello(con, p, end);
2571 		break;
2572 	case FRAME_TAG_AUTH_BAD_METHOD:
2573 		ret = process_auth_bad_method(con, p, end);
2574 		break;
2575 	case FRAME_TAG_AUTH_REPLY_MORE:
2576 		ret = process_auth_reply_more(con, p, end);
2577 		break;
2578 	case FRAME_TAG_AUTH_DONE:
2579 		ret = process_auth_done(con, p, end);
2580 		break;
2581 	case FRAME_TAG_AUTH_SIGNATURE:
2582 		ret = process_auth_signature(con, p, end);
2583 		break;
2584 	case FRAME_TAG_SERVER_IDENT:
2585 		ret = process_server_ident(con, p, end);
2586 		break;
2587 	case FRAME_TAG_IDENT_MISSING_FEATURES:
2588 		ret = process_ident_missing_features(con, p, end);
2589 		break;
2590 	case FRAME_TAG_SESSION_RECONNECT_OK:
2591 		ret = process_session_reconnect_ok(con, p, end);
2592 		break;
2593 	case FRAME_TAG_SESSION_RETRY:
2594 		ret = process_session_retry(con, p, end);
2595 		break;
2596 	case FRAME_TAG_SESSION_RETRY_GLOBAL:
2597 		ret = process_session_retry_global(con, p, end);
2598 		break;
2599 	case FRAME_TAG_SESSION_RESET:
2600 		ret = process_session_reset(con, p, end);
2601 		break;
2602 	case FRAME_TAG_KEEPALIVE2_ACK:
2603 		ret = process_keepalive2_ack(con, p, end);
2604 		break;
2605 	case FRAME_TAG_ACK:
2606 		ret = process_ack(con, p, end);
2607 		break;
2608 	default:
2609 		pr_err("bad tag %d\n", tag);
2610 		con->error_msg = "protocol error, bad tag";
2611 		return -EINVAL;
2612 	}
2613 	if (ret) {
2614 		dout("%s con %p error %d\n", __func__, con, ret);
2615 		return ret;
2616 	}
2617 
2618 	prepare_read_preamble(con);
2619 	return 0;
2620 }
2621 
2622 /*
2623  * Return:
2624  *   1 - con->in_msg set, read message
2625  *   0 - skip message
2626  *  <0 - error
2627  */
2628 static int process_message_header(struct ceph_connection *con,
2629 				  void *p, void *end)
2630 {
2631 	struct ceph_frame_desc *desc = &con->v2.in_desc;
2632 	struct ceph_msg_header2 *hdr2 = p;
2633 	struct ceph_msg_header hdr;
2634 	int skip;
2635 	int ret;
2636 	u64 seq;
2637 
2638 	/* verify seq# */
2639 	seq = le64_to_cpu(hdr2->seq);
2640 	if ((s64)seq - (s64)con->in_seq < 1) {
2641 		pr_info("%s%lld %s skipping old message: seq %llu, expected %llu\n",
2642 			ENTITY_NAME(con->peer_name),
2643 			ceph_pr_addr(&con->peer_addr),
2644 			seq, con->in_seq + 1);
2645 		return 0;
2646 	}
2647 	if ((s64)seq - (s64)con->in_seq > 1) {
2648 		pr_err("bad seq %llu, expected %llu\n", seq, con->in_seq + 1);
2649 		con->error_msg = "bad message sequence # for incoming message";
2650 		return -EBADE;
2651 	}
2652 
2653 	ceph_con_discard_sent(con, le64_to_cpu(hdr2->ack_seq));
2654 
2655 	fill_header(&hdr, hdr2, desc->fd_lens[1], desc->fd_lens[2],
2656 		    desc->fd_lens[3], &con->peer_name);
2657 	ret = ceph_con_in_msg_alloc(con, &hdr, &skip);
2658 	if (ret)
2659 		return ret;
2660 
2661 	WARN_ON(!con->in_msg ^ skip);
2662 	if (skip)
2663 		return 0;
2664 
2665 	WARN_ON(!con->in_msg);
2666 	WARN_ON(con->in_msg->con != con);
2667 	return 1;
2668 }
2669 
2670 static int process_message(struct ceph_connection *con)
2671 {
2672 	ceph_con_process_message(con);
2673 
2674 	/*
2675 	 * We could have been closed by ceph_con_close() because
2676 	 * ceph_con_process_message() temporarily drops con->mutex.
2677 	 */
2678 	if (con->state != CEPH_CON_S_OPEN) {
2679 		dout("%s con %p state changed to %d\n", __func__, con,
2680 		     con->state);
2681 		return -EAGAIN;
2682 	}
2683 
2684 	prepare_read_preamble(con);
2685 	return 0;
2686 }
2687 
2688 static int __handle_control(struct ceph_connection *con, void *p)
2689 {
2690 	void *end = p + con->v2.in_desc.fd_lens[0];
2691 	struct ceph_msg *msg;
2692 	int ret;
2693 
2694 	if (con->v2.in_desc.fd_tag != FRAME_TAG_MESSAGE)
2695 		return process_control(con, p, end);
2696 
2697 	ret = process_message_header(con, p, end);
2698 	if (ret < 0)
2699 		return ret;
2700 	if (ret == 0) {
2701 		prepare_skip_message(con);
2702 		return 0;
2703 	}
2704 
2705 	msg = con->in_msg;  /* set in process_message_header() */
2706 	if (front_len(msg)) {
2707 		WARN_ON(front_len(msg) > msg->front_alloc_len);
2708 		msg->front.iov_len = front_len(msg);
2709 	} else {
2710 		msg->front.iov_len = 0;
2711 	}
2712 	if (middle_len(msg)) {
2713 		WARN_ON(middle_len(msg) > msg->middle->alloc_len);
2714 		msg->middle->vec.iov_len = middle_len(msg);
2715 	} else if (msg->middle) {
2716 		msg->middle->vec.iov_len = 0;
2717 	}
2718 
2719 	if (!front_len(msg) && !middle_len(msg) && !data_len(msg))
2720 		return process_message(con);
2721 
2722 	if (con_secure(con))
2723 		return prepare_read_tail_secure(con);
2724 
2725 	return prepare_read_tail_plain(con);
2726 }
2727 
2728 static int handle_preamble(struct ceph_connection *con)
2729 {
2730 	struct ceph_frame_desc *desc = &con->v2.in_desc;
2731 	int ret;
2732 
2733 	if (con_secure(con)) {
2734 		ret = decrypt_preamble(con);
2735 		if (ret) {
2736 			if (ret == -EBADMSG)
2737 				con->error_msg = "integrity error, bad preamble auth tag";
2738 			return ret;
2739 		}
2740 	}
2741 
2742 	ret = decode_preamble(con->v2.in_buf, desc);
2743 	if (ret) {
2744 		if (ret == -EBADMSG)
2745 			con->error_msg = "integrity error, bad crc";
2746 		else
2747 			con->error_msg = "protocol error, bad preamble";
2748 		return ret;
2749 	}
2750 
2751 	dout("%s con %p tag %d seg_cnt %d %d+%d+%d+%d\n", __func__,
2752 	     con, desc->fd_tag, desc->fd_seg_cnt, desc->fd_lens[0],
2753 	     desc->fd_lens[1], desc->fd_lens[2], desc->fd_lens[3]);
2754 
2755 	if (!con_secure(con))
2756 		return prepare_read_control(con);
2757 
2758 	if (desc->fd_lens[0] > CEPH_PREAMBLE_INLINE_LEN)
2759 		return prepare_read_control_remainder(con);
2760 
2761 	return __handle_control(con, CTRL_BODY(con->v2.in_buf));
2762 }
2763 
2764 static int handle_control(struct ceph_connection *con)
2765 {
2766 	int ctrl_len = con->v2.in_desc.fd_lens[0];
2767 	void *buf;
2768 	int ret;
2769 
2770 	WARN_ON(con_secure(con));
2771 
2772 	ret = verify_control_crc(con);
2773 	if (ret) {
2774 		con->error_msg = "integrity error, bad crc";
2775 		return ret;
2776 	}
2777 
2778 	if (con->state == CEPH_CON_S_V2_AUTH) {
2779 		buf = alloc_conn_buf(con, ctrl_len);
2780 		if (!buf)
2781 			return -ENOMEM;
2782 
2783 		memcpy(buf, con->v2.in_kvecs[0].iov_base, ctrl_len);
2784 		return __handle_control(con, buf);
2785 	}
2786 
2787 	return __handle_control(con, con->v2.in_kvecs[0].iov_base);
2788 }
2789 
2790 static int handle_control_remainder(struct ceph_connection *con)
2791 {
2792 	int ret;
2793 
2794 	WARN_ON(!con_secure(con));
2795 
2796 	ret = decrypt_control_remainder(con);
2797 	if (ret) {
2798 		if (ret == -EBADMSG)
2799 			con->error_msg = "integrity error, bad control remainder auth tag";
2800 		return ret;
2801 	}
2802 
2803 	return __handle_control(con, con->v2.in_kvecs[0].iov_base -
2804 				     CEPH_PREAMBLE_INLINE_LEN);
2805 }
2806 
2807 static int handle_epilogue(struct ceph_connection *con)
2808 {
2809 	u32 front_crc, middle_crc, data_crc;
2810 	int ret;
2811 
2812 	if (con_secure(con)) {
2813 		ret = decrypt_tail(con);
2814 		if (ret) {
2815 			if (ret == -EBADMSG)
2816 				con->error_msg = "integrity error, bad epilogue auth tag";
2817 			return ret;
2818 		}
2819 
2820 		/* just late_status */
2821 		ret = decode_epilogue(con->v2.in_buf, NULL, NULL, NULL);
2822 		if (ret) {
2823 			con->error_msg = "protocol error, bad epilogue";
2824 			return ret;
2825 		}
2826 	} else {
2827 		ret = decode_epilogue(con->v2.in_buf, &front_crc,
2828 				      &middle_crc, &data_crc);
2829 		if (ret) {
2830 			con->error_msg = "protocol error, bad epilogue";
2831 			return ret;
2832 		}
2833 
2834 		ret = verify_epilogue_crcs(con, front_crc, middle_crc,
2835 					   data_crc);
2836 		if (ret) {
2837 			con->error_msg = "integrity error, bad crc";
2838 			return ret;
2839 		}
2840 	}
2841 
2842 	return process_message(con);
2843 }
2844 
2845 static void finish_skip(struct ceph_connection *con)
2846 {
2847 	dout("%s con %p\n", __func__, con);
2848 
2849 	if (con_secure(con))
2850 		gcm_inc_nonce(&con->v2.in_gcm_nonce);
2851 
2852 	__finish_skip(con);
2853 }
2854 
2855 static int populate_in_iter(struct ceph_connection *con)
2856 {
2857 	int ret;
2858 
2859 	dout("%s con %p state %d in_state %d\n", __func__, con, con->state,
2860 	     con->v2.in_state);
2861 	WARN_ON(iov_iter_count(&con->v2.in_iter));
2862 
2863 	if (con->state == CEPH_CON_S_V2_BANNER_PREFIX) {
2864 		ret = process_banner_prefix(con);
2865 	} else if (con->state == CEPH_CON_S_V2_BANNER_PAYLOAD) {
2866 		ret = process_banner_payload(con);
2867 	} else if ((con->state >= CEPH_CON_S_V2_HELLO &&
2868 		    con->state <= CEPH_CON_S_V2_SESSION_RECONNECT) ||
2869 		   con->state == CEPH_CON_S_OPEN) {
2870 		switch (con->v2.in_state) {
2871 		case IN_S_HANDLE_PREAMBLE:
2872 			ret = handle_preamble(con);
2873 			break;
2874 		case IN_S_HANDLE_CONTROL:
2875 			ret = handle_control(con);
2876 			break;
2877 		case IN_S_HANDLE_CONTROL_REMAINDER:
2878 			ret = handle_control_remainder(con);
2879 			break;
2880 		case IN_S_PREPARE_READ_DATA:
2881 			ret = prepare_read_data(con);
2882 			break;
2883 		case IN_S_PREPARE_READ_DATA_CONT:
2884 			prepare_read_data_cont(con);
2885 			ret = 0;
2886 			break;
2887 		case IN_S_PREPARE_READ_ENC_PAGE:
2888 			prepare_read_enc_page(con);
2889 			ret = 0;
2890 			break;
2891 		case IN_S_HANDLE_EPILOGUE:
2892 			ret = handle_epilogue(con);
2893 			break;
2894 		case IN_S_FINISH_SKIP:
2895 			finish_skip(con);
2896 			ret = 0;
2897 			break;
2898 		default:
2899 			WARN(1, "bad in_state %d", con->v2.in_state);
2900 			return -EINVAL;
2901 		}
2902 	} else {
2903 		WARN(1, "bad state %d", con->state);
2904 		return -EINVAL;
2905 	}
2906 	if (ret) {
2907 		dout("%s con %p error %d\n", __func__, con, ret);
2908 		return ret;
2909 	}
2910 
2911 	if (WARN_ON(!iov_iter_count(&con->v2.in_iter)))
2912 		return -ENODATA;
2913 	dout("%s con %p populated %zu\n", __func__, con,
2914 	     iov_iter_count(&con->v2.in_iter));
2915 	return 1;
2916 }
2917 
2918 int ceph_con_v2_try_read(struct ceph_connection *con)
2919 {
2920 	int ret;
2921 
2922 	dout("%s con %p state %d need %zu\n", __func__, con, con->state,
2923 	     iov_iter_count(&con->v2.in_iter));
2924 
2925 	if (con->state == CEPH_CON_S_PREOPEN)
2926 		return 0;
2927 
2928 	/*
2929 	 * We should always have something pending here.  If not,
2930 	 * avoid calling populate_in_iter() as if we read something
2931 	 * (ceph_tcp_recv() would immediately return 1).
2932 	 */
2933 	if (WARN_ON(!iov_iter_count(&con->v2.in_iter)))
2934 		return -ENODATA;
2935 
2936 	for (;;) {
2937 		ret = ceph_tcp_recv(con);
2938 		if (ret <= 0)
2939 			return ret;
2940 
2941 		ret = populate_in_iter(con);
2942 		if (ret <= 0) {
2943 			if (ret && ret != -EAGAIN && !con->error_msg)
2944 				con->error_msg = "read processing error";
2945 			return ret;
2946 		}
2947 	}
2948 }
2949 
2950 static void queue_data(struct ceph_connection *con)
2951 {
2952 	struct bio_vec bv;
2953 
2954 	con->v2.out_epil.data_crc = -1;
2955 	ceph_msg_data_cursor_init(&con->v2.out_cursor, con->out_msg,
2956 				  data_len(con->out_msg));
2957 
2958 	get_bvec_at(&con->v2.out_cursor, &bv);
2959 	set_out_bvec(con, &bv, true);
2960 	con->v2.out_state = OUT_S_QUEUE_DATA_CONT;
2961 }
2962 
2963 static void queue_data_cont(struct ceph_connection *con)
2964 {
2965 	struct bio_vec bv;
2966 
2967 	con->v2.out_epil.data_crc = ceph_crc32c_page(
2968 		con->v2.out_epil.data_crc, con->v2.out_bvec.bv_page,
2969 		con->v2.out_bvec.bv_offset, con->v2.out_bvec.bv_len);
2970 
2971 	ceph_msg_data_advance(&con->v2.out_cursor, con->v2.out_bvec.bv_len);
2972 	if (con->v2.out_cursor.total_resid) {
2973 		get_bvec_at(&con->v2.out_cursor, &bv);
2974 		set_out_bvec(con, &bv, true);
2975 		WARN_ON(con->v2.out_state != OUT_S_QUEUE_DATA_CONT);
2976 		return;
2977 	}
2978 
2979 	/*
2980 	 * We've written all data.  Queue epilogue.  Once it's written,
2981 	 * we are done.
2982 	 */
2983 	reset_out_kvecs(con);
2984 	prepare_epilogue_plain(con, false);
2985 	con->v2.out_state = OUT_S_FINISH_MESSAGE;
2986 }
2987 
2988 static void queue_enc_page(struct ceph_connection *con)
2989 {
2990 	struct bio_vec bv;
2991 
2992 	dout("%s con %p i %d resid %d\n", __func__, con, con->v2.out_enc_i,
2993 	     con->v2.out_enc_resid);
2994 	WARN_ON(!con->v2.out_enc_resid);
2995 
2996 	bvec_set_page(&bv, con->v2.out_enc_pages[con->v2.out_enc_i],
2997 		      min(con->v2.out_enc_resid, (int)PAGE_SIZE), 0);
2998 
2999 	set_out_bvec(con, &bv, false);
3000 	con->v2.out_enc_i++;
3001 	con->v2.out_enc_resid -= bv.bv_len;
3002 
3003 	if (con->v2.out_enc_resid) {
3004 		WARN_ON(con->v2.out_state != OUT_S_QUEUE_ENC_PAGE);
3005 		return;
3006 	}
3007 
3008 	/*
3009 	 * We've queued the last piece of ciphertext (ending with
3010 	 * epilogue) + auth tag.  Once it's written, we are done.
3011 	 */
3012 	WARN_ON(con->v2.out_enc_i != con->v2.out_enc_page_cnt);
3013 	con->v2.out_state = OUT_S_FINISH_MESSAGE;
3014 }
3015 
3016 static void queue_zeros(struct ceph_connection *con)
3017 {
3018 	dout("%s con %p out_zero %d\n", __func__, con, con->v2.out_zero);
3019 
3020 	if (con->v2.out_zero) {
3021 		set_out_bvec_zero(con);
3022 		con->v2.out_zero -= con->v2.out_bvec.bv_len;
3023 		con->v2.out_state = OUT_S_QUEUE_ZEROS;
3024 		return;
3025 	}
3026 
3027 	/*
3028 	 * We've zero-filled everything up to epilogue.  Queue epilogue
3029 	 * with late_status set to ABORTED and crcs adjusted for zeros.
3030 	 * Once it's written, we are done patching up for the revoke.
3031 	 */
3032 	reset_out_kvecs(con);
3033 	prepare_epilogue_plain(con, true);
3034 	con->v2.out_state = OUT_S_FINISH_MESSAGE;
3035 }
3036 
3037 static void finish_message(struct ceph_connection *con)
3038 {
3039 	dout("%s con %p msg %p\n", __func__, con, con->out_msg);
3040 
3041 	/* we end up here both plain and secure modes */
3042 	if (con->v2.out_enc_pages) {
3043 		WARN_ON(!con->v2.out_enc_page_cnt);
3044 		ceph_release_page_vector(con->v2.out_enc_pages,
3045 					 con->v2.out_enc_page_cnt);
3046 		con->v2.out_enc_pages = NULL;
3047 		con->v2.out_enc_page_cnt = 0;
3048 	}
3049 	/* message may have been revoked */
3050 	if (con->out_msg) {
3051 		ceph_msg_put(con->out_msg);
3052 		con->out_msg = NULL;
3053 	}
3054 
3055 	con->v2.out_state = OUT_S_GET_NEXT;
3056 }
3057 
3058 static int populate_out_iter(struct ceph_connection *con)
3059 {
3060 	int ret;
3061 
3062 	dout("%s con %p state %d out_state %d\n", __func__, con, con->state,
3063 	     con->v2.out_state);
3064 	WARN_ON(iov_iter_count(&con->v2.out_iter));
3065 
3066 	if (con->state != CEPH_CON_S_OPEN) {
3067 		WARN_ON(con->state < CEPH_CON_S_V2_BANNER_PREFIX ||
3068 			con->state > CEPH_CON_S_V2_SESSION_RECONNECT);
3069 		goto nothing_pending;
3070 	}
3071 
3072 	switch (con->v2.out_state) {
3073 	case OUT_S_QUEUE_DATA:
3074 		WARN_ON(!con->out_msg);
3075 		queue_data(con);
3076 		goto populated;
3077 	case OUT_S_QUEUE_DATA_CONT:
3078 		WARN_ON(!con->out_msg);
3079 		queue_data_cont(con);
3080 		goto populated;
3081 	case OUT_S_QUEUE_ENC_PAGE:
3082 		queue_enc_page(con);
3083 		goto populated;
3084 	case OUT_S_QUEUE_ZEROS:
3085 		WARN_ON(con->out_msg);  /* revoked */
3086 		queue_zeros(con);
3087 		goto populated;
3088 	case OUT_S_FINISH_MESSAGE:
3089 		finish_message(con);
3090 		break;
3091 	case OUT_S_GET_NEXT:
3092 		break;
3093 	default:
3094 		WARN(1, "bad out_state %d", con->v2.out_state);
3095 		return -EINVAL;
3096 	}
3097 
3098 	WARN_ON(con->v2.out_state != OUT_S_GET_NEXT);
3099 	if (ceph_con_flag_test_and_clear(con, CEPH_CON_F_KEEPALIVE_PENDING)) {
3100 		ret = prepare_keepalive2(con);
3101 		if (ret) {
3102 			pr_err("prepare_keepalive2 failed: %d\n", ret);
3103 			return ret;
3104 		}
3105 	} else if (!list_empty(&con->out_queue)) {
3106 		ceph_con_get_out_msg(con);
3107 		ret = prepare_message(con);
3108 		if (ret) {
3109 			pr_err("prepare_message failed: %d\n", ret);
3110 			return ret;
3111 		}
3112 	} else if (con->in_seq > con->in_seq_acked) {
3113 		ret = prepare_ack(con);
3114 		if (ret) {
3115 			pr_err("prepare_ack failed: %d\n", ret);
3116 			return ret;
3117 		}
3118 	} else {
3119 		goto nothing_pending;
3120 	}
3121 
3122 populated:
3123 	if (WARN_ON(!iov_iter_count(&con->v2.out_iter)))
3124 		return -ENODATA;
3125 	dout("%s con %p populated %zu\n", __func__, con,
3126 	     iov_iter_count(&con->v2.out_iter));
3127 	return 1;
3128 
3129 nothing_pending:
3130 	WARN_ON(iov_iter_count(&con->v2.out_iter));
3131 	dout("%s con %p nothing pending\n", __func__, con);
3132 	ceph_con_flag_clear(con, CEPH_CON_F_WRITE_PENDING);
3133 	return 0;
3134 }
3135 
3136 int ceph_con_v2_try_write(struct ceph_connection *con)
3137 {
3138 	int ret;
3139 
3140 	dout("%s con %p state %d have %zu\n", __func__, con, con->state,
3141 	     iov_iter_count(&con->v2.out_iter));
3142 
3143 	/* open the socket first? */
3144 	if (con->state == CEPH_CON_S_PREOPEN) {
3145 		WARN_ON(con->peer_addr.type != CEPH_ENTITY_ADDR_TYPE_MSGR2);
3146 
3147 		/*
3148 		 * Always bump global_seq.  Bump connect_seq only if
3149 		 * there is a session (i.e. we are reconnecting and will
3150 		 * send session_reconnect instead of client_ident).
3151 		 */
3152 		con->v2.global_seq = ceph_get_global_seq(con->msgr, 0);
3153 		if (con->v2.server_cookie)
3154 			con->v2.connect_seq++;
3155 
3156 		ret = prepare_read_banner_prefix(con);
3157 		if (ret) {
3158 			pr_err("prepare_read_banner_prefix failed: %d\n", ret);
3159 			con->error_msg = "connect error";
3160 			return ret;
3161 		}
3162 
3163 		reset_out_kvecs(con);
3164 		ret = prepare_banner(con);
3165 		if (ret) {
3166 			pr_err("prepare_banner failed: %d\n", ret);
3167 			con->error_msg = "connect error";
3168 			return ret;
3169 		}
3170 
3171 		ret = ceph_tcp_connect(con);
3172 		if (ret) {
3173 			pr_err("ceph_tcp_connect failed: %d\n", ret);
3174 			con->error_msg = "connect error";
3175 			return ret;
3176 		}
3177 	}
3178 
3179 	if (!iov_iter_count(&con->v2.out_iter)) {
3180 		ret = populate_out_iter(con);
3181 		if (ret <= 0) {
3182 			if (ret && ret != -EAGAIN && !con->error_msg)
3183 				con->error_msg = "write processing error";
3184 			return ret;
3185 		}
3186 	}
3187 
3188 	tcp_sock_set_cork(con->sock->sk, true);
3189 	for (;;) {
3190 		ret = ceph_tcp_send(con);
3191 		if (ret <= 0)
3192 			break;
3193 
3194 		ret = populate_out_iter(con);
3195 		if (ret <= 0) {
3196 			if (ret && ret != -EAGAIN && !con->error_msg)
3197 				con->error_msg = "write processing error";
3198 			break;
3199 		}
3200 	}
3201 
3202 	tcp_sock_set_cork(con->sock->sk, false);
3203 	return ret;
3204 }
3205 
3206 static u32 crc32c_zeros(u32 crc, int zero_len)
3207 {
3208 	int len;
3209 
3210 	while (zero_len) {
3211 		len = min(zero_len, (int)PAGE_SIZE);
3212 		crc = crc32c(crc, page_address(ceph_zero_page), len);
3213 		zero_len -= len;
3214 	}
3215 
3216 	return crc;
3217 }
3218 
3219 static void prepare_zero_front(struct ceph_connection *con, int resid)
3220 {
3221 	int sent;
3222 
3223 	WARN_ON(!resid || resid > front_len(con->out_msg));
3224 	sent = front_len(con->out_msg) - resid;
3225 	dout("%s con %p sent %d resid %d\n", __func__, con, sent, resid);
3226 
3227 	if (sent) {
3228 		con->v2.out_epil.front_crc =
3229 			crc32c(-1, con->out_msg->front.iov_base, sent);
3230 		con->v2.out_epil.front_crc =
3231 			crc32c_zeros(con->v2.out_epil.front_crc, resid);
3232 	} else {
3233 		con->v2.out_epil.front_crc = crc32c_zeros(-1, resid);
3234 	}
3235 
3236 	con->v2.out_iter.count -= resid;
3237 	out_zero_add(con, resid);
3238 }
3239 
3240 static void prepare_zero_middle(struct ceph_connection *con, int resid)
3241 {
3242 	int sent;
3243 
3244 	WARN_ON(!resid || resid > middle_len(con->out_msg));
3245 	sent = middle_len(con->out_msg) - resid;
3246 	dout("%s con %p sent %d resid %d\n", __func__, con, sent, resid);
3247 
3248 	if (sent) {
3249 		con->v2.out_epil.middle_crc =
3250 			crc32c(-1, con->out_msg->middle->vec.iov_base, sent);
3251 		con->v2.out_epil.middle_crc =
3252 			crc32c_zeros(con->v2.out_epil.middle_crc, resid);
3253 	} else {
3254 		con->v2.out_epil.middle_crc = crc32c_zeros(-1, resid);
3255 	}
3256 
3257 	con->v2.out_iter.count -= resid;
3258 	out_zero_add(con, resid);
3259 }
3260 
3261 static void prepare_zero_data(struct ceph_connection *con)
3262 {
3263 	dout("%s con %p\n", __func__, con);
3264 	con->v2.out_epil.data_crc = crc32c_zeros(-1, data_len(con->out_msg));
3265 	out_zero_add(con, data_len(con->out_msg));
3266 }
3267 
3268 static void revoke_at_queue_data(struct ceph_connection *con)
3269 {
3270 	int boundary;
3271 	int resid;
3272 
3273 	WARN_ON(!data_len(con->out_msg));
3274 	WARN_ON(!iov_iter_is_kvec(&con->v2.out_iter));
3275 	resid = iov_iter_count(&con->v2.out_iter);
3276 
3277 	boundary = front_len(con->out_msg) + middle_len(con->out_msg);
3278 	if (resid > boundary) {
3279 		resid -= boundary;
3280 		WARN_ON(resid > MESSAGE_HEAD_PLAIN_LEN);
3281 		dout("%s con %p was sending head\n", __func__, con);
3282 		if (front_len(con->out_msg))
3283 			prepare_zero_front(con, front_len(con->out_msg));
3284 		if (middle_len(con->out_msg))
3285 			prepare_zero_middle(con, middle_len(con->out_msg));
3286 		prepare_zero_data(con);
3287 		WARN_ON(iov_iter_count(&con->v2.out_iter) != resid);
3288 		con->v2.out_state = OUT_S_QUEUE_ZEROS;
3289 		return;
3290 	}
3291 
3292 	boundary = middle_len(con->out_msg);
3293 	if (resid > boundary) {
3294 		resid -= boundary;
3295 		dout("%s con %p was sending front\n", __func__, con);
3296 		prepare_zero_front(con, resid);
3297 		if (middle_len(con->out_msg))
3298 			prepare_zero_middle(con, middle_len(con->out_msg));
3299 		prepare_zero_data(con);
3300 		queue_zeros(con);
3301 		return;
3302 	}
3303 
3304 	WARN_ON(!resid);
3305 	dout("%s con %p was sending middle\n", __func__, con);
3306 	prepare_zero_middle(con, resid);
3307 	prepare_zero_data(con);
3308 	queue_zeros(con);
3309 }
3310 
3311 static void revoke_at_queue_data_cont(struct ceph_connection *con)
3312 {
3313 	int sent, resid;  /* current piece of data */
3314 
3315 	WARN_ON(!data_len(con->out_msg));
3316 	WARN_ON(!iov_iter_is_bvec(&con->v2.out_iter));
3317 	resid = iov_iter_count(&con->v2.out_iter);
3318 	WARN_ON(!resid || resid > con->v2.out_bvec.bv_len);
3319 	sent = con->v2.out_bvec.bv_len - resid;
3320 	dout("%s con %p sent %d resid %d\n", __func__, con, sent, resid);
3321 
3322 	if (sent) {
3323 		con->v2.out_epil.data_crc = ceph_crc32c_page(
3324 			con->v2.out_epil.data_crc, con->v2.out_bvec.bv_page,
3325 			con->v2.out_bvec.bv_offset, sent);
3326 		ceph_msg_data_advance(&con->v2.out_cursor, sent);
3327 	}
3328 	WARN_ON(resid > con->v2.out_cursor.total_resid);
3329 	con->v2.out_epil.data_crc = crc32c_zeros(con->v2.out_epil.data_crc,
3330 						con->v2.out_cursor.total_resid);
3331 
3332 	con->v2.out_iter.count -= resid;
3333 	out_zero_add(con, con->v2.out_cursor.total_resid);
3334 	queue_zeros(con);
3335 }
3336 
3337 static void revoke_at_finish_message(struct ceph_connection *con)
3338 {
3339 	int boundary;
3340 	int resid;
3341 
3342 	WARN_ON(!iov_iter_is_kvec(&con->v2.out_iter));
3343 	resid = iov_iter_count(&con->v2.out_iter);
3344 
3345 	if (!front_len(con->out_msg) && !middle_len(con->out_msg) &&
3346 	    !data_len(con->out_msg)) {
3347 		WARN_ON(!resid || resid > MESSAGE_HEAD_PLAIN_LEN);
3348 		dout("%s con %p was sending head (empty message) - noop\n",
3349 		     __func__, con);
3350 		return;
3351 	}
3352 
3353 	boundary = front_len(con->out_msg) + middle_len(con->out_msg) +
3354 		   CEPH_EPILOGUE_PLAIN_LEN;
3355 	if (resid > boundary) {
3356 		resid -= boundary;
3357 		WARN_ON(resid > MESSAGE_HEAD_PLAIN_LEN);
3358 		dout("%s con %p was sending head\n", __func__, con);
3359 		if (front_len(con->out_msg))
3360 			prepare_zero_front(con, front_len(con->out_msg));
3361 		if (middle_len(con->out_msg))
3362 			prepare_zero_middle(con, middle_len(con->out_msg));
3363 		con->v2.out_iter.count -= CEPH_EPILOGUE_PLAIN_LEN;
3364 		WARN_ON(iov_iter_count(&con->v2.out_iter) != resid);
3365 		con->v2.out_state = OUT_S_QUEUE_ZEROS;
3366 		return;
3367 	}
3368 
3369 	boundary = middle_len(con->out_msg) + CEPH_EPILOGUE_PLAIN_LEN;
3370 	if (resid > boundary) {
3371 		resid -= boundary;
3372 		dout("%s con %p was sending front\n", __func__, con);
3373 		prepare_zero_front(con, resid);
3374 		if (middle_len(con->out_msg))
3375 			prepare_zero_middle(con, middle_len(con->out_msg));
3376 		con->v2.out_iter.count -= CEPH_EPILOGUE_PLAIN_LEN;
3377 		queue_zeros(con);
3378 		return;
3379 	}
3380 
3381 	boundary = CEPH_EPILOGUE_PLAIN_LEN;
3382 	if (resid > boundary) {
3383 		resid -= boundary;
3384 		dout("%s con %p was sending middle\n", __func__, con);
3385 		prepare_zero_middle(con, resid);
3386 		con->v2.out_iter.count -= CEPH_EPILOGUE_PLAIN_LEN;
3387 		queue_zeros(con);
3388 		return;
3389 	}
3390 
3391 	WARN_ON(!resid);
3392 	dout("%s con %p was sending epilogue - noop\n", __func__, con);
3393 }
3394 
3395 void ceph_con_v2_revoke(struct ceph_connection *con)
3396 {
3397 	WARN_ON(con->v2.out_zero);
3398 
3399 	if (con_secure(con)) {
3400 		WARN_ON(con->v2.out_state != OUT_S_QUEUE_ENC_PAGE &&
3401 			con->v2.out_state != OUT_S_FINISH_MESSAGE);
3402 		dout("%s con %p secure - noop\n", __func__, con);
3403 		return;
3404 	}
3405 
3406 	switch (con->v2.out_state) {
3407 	case OUT_S_QUEUE_DATA:
3408 		revoke_at_queue_data(con);
3409 		break;
3410 	case OUT_S_QUEUE_DATA_CONT:
3411 		revoke_at_queue_data_cont(con);
3412 		break;
3413 	case OUT_S_FINISH_MESSAGE:
3414 		revoke_at_finish_message(con);
3415 		break;
3416 	default:
3417 		WARN(1, "bad out_state %d", con->v2.out_state);
3418 		break;
3419 	}
3420 }
3421 
3422 static void revoke_at_prepare_read_data(struct ceph_connection *con)
3423 {
3424 	int remaining;
3425 	int resid;
3426 
3427 	WARN_ON(con_secure(con));
3428 	WARN_ON(!data_len(con->in_msg));
3429 	WARN_ON(!iov_iter_is_kvec(&con->v2.in_iter));
3430 	resid = iov_iter_count(&con->v2.in_iter);
3431 	WARN_ON(!resid);
3432 
3433 	remaining = data_len(con->in_msg) + CEPH_EPILOGUE_PLAIN_LEN;
3434 	dout("%s con %p resid %d remaining %d\n", __func__, con, resid,
3435 	     remaining);
3436 	con->v2.in_iter.count -= resid;
3437 	set_in_skip(con, resid + remaining);
3438 	con->v2.in_state = IN_S_FINISH_SKIP;
3439 }
3440 
3441 static void revoke_at_prepare_read_data_cont(struct ceph_connection *con)
3442 {
3443 	int recved, resid;  /* current piece of data */
3444 	int remaining;
3445 
3446 	WARN_ON(con_secure(con));
3447 	WARN_ON(!data_len(con->in_msg));
3448 	WARN_ON(!iov_iter_is_bvec(&con->v2.in_iter));
3449 	resid = iov_iter_count(&con->v2.in_iter);
3450 	WARN_ON(!resid || resid > con->v2.in_bvec.bv_len);
3451 	recved = con->v2.in_bvec.bv_len - resid;
3452 	dout("%s con %p recved %d resid %d\n", __func__, con, recved, resid);
3453 
3454 	if (recved)
3455 		ceph_msg_data_advance(&con->v2.in_cursor, recved);
3456 	WARN_ON(resid > con->v2.in_cursor.total_resid);
3457 
3458 	remaining = CEPH_EPILOGUE_PLAIN_LEN;
3459 	dout("%s con %p total_resid %zu remaining %d\n", __func__, con,
3460 	     con->v2.in_cursor.total_resid, remaining);
3461 	con->v2.in_iter.count -= resid;
3462 	set_in_skip(con, con->v2.in_cursor.total_resid + remaining);
3463 	con->v2.in_state = IN_S_FINISH_SKIP;
3464 }
3465 
3466 static void revoke_at_prepare_read_enc_page(struct ceph_connection *con)
3467 {
3468 	int resid;  /* current enc page (not necessarily data) */
3469 
3470 	WARN_ON(!con_secure(con));
3471 	WARN_ON(!iov_iter_is_bvec(&con->v2.in_iter));
3472 	resid = iov_iter_count(&con->v2.in_iter);
3473 	WARN_ON(!resid || resid > con->v2.in_bvec.bv_len);
3474 
3475 	dout("%s con %p resid %d enc_resid %d\n", __func__, con, resid,
3476 	     con->v2.in_enc_resid);
3477 	con->v2.in_iter.count -= resid;
3478 	set_in_skip(con, resid + con->v2.in_enc_resid);
3479 	con->v2.in_state = IN_S_FINISH_SKIP;
3480 }
3481 
3482 static void revoke_at_handle_epilogue(struct ceph_connection *con)
3483 {
3484 	int resid;
3485 
3486 	resid = iov_iter_count(&con->v2.in_iter);
3487 	WARN_ON(!resid);
3488 
3489 	dout("%s con %p resid %d\n", __func__, con, resid);
3490 	con->v2.in_iter.count -= resid;
3491 	set_in_skip(con, resid);
3492 	con->v2.in_state = IN_S_FINISH_SKIP;
3493 }
3494 
3495 void ceph_con_v2_revoke_incoming(struct ceph_connection *con)
3496 {
3497 	switch (con->v2.in_state) {
3498 	case IN_S_PREPARE_READ_DATA:
3499 		revoke_at_prepare_read_data(con);
3500 		break;
3501 	case IN_S_PREPARE_READ_DATA_CONT:
3502 		revoke_at_prepare_read_data_cont(con);
3503 		break;
3504 	case IN_S_PREPARE_READ_ENC_PAGE:
3505 		revoke_at_prepare_read_enc_page(con);
3506 		break;
3507 	case IN_S_HANDLE_EPILOGUE:
3508 		revoke_at_handle_epilogue(con);
3509 		break;
3510 	default:
3511 		WARN(1, "bad in_state %d", con->v2.in_state);
3512 		break;
3513 	}
3514 }
3515 
3516 bool ceph_con_v2_opened(struct ceph_connection *con)
3517 {
3518 	return con->v2.peer_global_seq;
3519 }
3520 
3521 void ceph_con_v2_reset_session(struct ceph_connection *con)
3522 {
3523 	con->v2.client_cookie = 0;
3524 	con->v2.server_cookie = 0;
3525 	con->v2.global_seq = 0;
3526 	con->v2.connect_seq = 0;
3527 	con->v2.peer_global_seq = 0;
3528 }
3529 
3530 void ceph_con_v2_reset_protocol(struct ceph_connection *con)
3531 {
3532 	iov_iter_truncate(&con->v2.in_iter, 0);
3533 	iov_iter_truncate(&con->v2.out_iter, 0);
3534 	con->v2.out_zero = 0;
3535 
3536 	clear_in_sign_kvecs(con);
3537 	clear_out_sign_kvecs(con);
3538 	free_conn_bufs(con);
3539 
3540 	if (con->v2.in_enc_pages) {
3541 		WARN_ON(!con->v2.in_enc_page_cnt);
3542 		ceph_release_page_vector(con->v2.in_enc_pages,
3543 					 con->v2.in_enc_page_cnt);
3544 		con->v2.in_enc_pages = NULL;
3545 		con->v2.in_enc_page_cnt = 0;
3546 	}
3547 	if (con->v2.out_enc_pages) {
3548 		WARN_ON(!con->v2.out_enc_page_cnt);
3549 		ceph_release_page_vector(con->v2.out_enc_pages,
3550 					 con->v2.out_enc_page_cnt);
3551 		con->v2.out_enc_pages = NULL;
3552 		con->v2.out_enc_page_cnt = 0;
3553 	}
3554 
3555 	con->v2.con_mode = CEPH_CON_MODE_UNKNOWN;
3556 	memzero_explicit(&con->v2.in_gcm_nonce, CEPH_GCM_IV_LEN);
3557 	memzero_explicit(&con->v2.out_gcm_nonce, CEPH_GCM_IV_LEN);
3558 
3559 	if (con->v2.hmac_tfm) {
3560 		crypto_free_shash(con->v2.hmac_tfm);
3561 		con->v2.hmac_tfm = NULL;
3562 	}
3563 	if (con->v2.gcm_req) {
3564 		aead_request_free(con->v2.gcm_req);
3565 		con->v2.gcm_req = NULL;
3566 	}
3567 	if (con->v2.gcm_tfm) {
3568 		crypto_free_aead(con->v2.gcm_tfm);
3569 		con->v2.gcm_tfm = NULL;
3570 	}
3571 }
3572