Lines Matching refs:con
106 static int ceph_tcp_recv(struct ceph_connection *con) in ceph_tcp_recv() argument
110 dout("%s con %p %s %zu\n", __func__, con, in ceph_tcp_recv()
111 iov_iter_is_discard(&con->v2.in_iter) ? "discard" : "need", in ceph_tcp_recv()
112 iov_iter_count(&con->v2.in_iter)); in ceph_tcp_recv()
113 ret = do_recvmsg(con->sock, &con->v2.in_iter); in ceph_tcp_recv()
114 dout("%s con %p ret %d left %zu\n", __func__, con, ret, in ceph_tcp_recv()
115 iov_iter_count(&con->v2.in_iter)); in ceph_tcp_recv()
194 static int ceph_tcp_send(struct ceph_connection *con) in ceph_tcp_send() argument
198 dout("%s con %p have %zu try_sendpage %d\n", __func__, con, in ceph_tcp_send()
199 iov_iter_count(&con->v2.out_iter), con->v2.out_iter_sendpage); in ceph_tcp_send()
200 if (con->v2.out_iter_sendpage) in ceph_tcp_send()
201 ret = do_try_sendpage(con->sock, &con->v2.out_iter); in ceph_tcp_send()
203 ret = do_sendmsg(con->sock, &con->v2.out_iter); in ceph_tcp_send()
204 dout("%s con %p ret %d left %zu\n", __func__, con, ret, in ceph_tcp_send()
205 iov_iter_count(&con->v2.out_iter)); in ceph_tcp_send()
209 static void add_in_kvec(struct ceph_connection *con, void *buf, int len) in add_in_kvec() argument
211 BUG_ON(con->v2.in_kvec_cnt >= ARRAY_SIZE(con->v2.in_kvecs)); in add_in_kvec()
212 WARN_ON(!iov_iter_is_kvec(&con->v2.in_iter)); in add_in_kvec()
214 con->v2.in_kvecs[con->v2.in_kvec_cnt].iov_base = buf; in add_in_kvec()
215 con->v2.in_kvecs[con->v2.in_kvec_cnt].iov_len = len; in add_in_kvec()
216 con->v2.in_kvec_cnt++; in add_in_kvec()
218 con->v2.in_iter.nr_segs++; in add_in_kvec()
219 con->v2.in_iter.count += len; in add_in_kvec()
222 static void reset_in_kvecs(struct ceph_connection *con) in reset_in_kvecs() argument
224 WARN_ON(iov_iter_count(&con->v2.in_iter)); in reset_in_kvecs()
226 con->v2.in_kvec_cnt = 0; in reset_in_kvecs()
227 iov_iter_kvec(&con->v2.in_iter, READ, con->v2.in_kvecs, 0, 0); in reset_in_kvecs()
230 static void set_in_bvec(struct ceph_connection *con, const struct bio_vec *bv) in set_in_bvec() argument
232 WARN_ON(iov_iter_count(&con->v2.in_iter)); in set_in_bvec()
234 con->v2.in_bvec = *bv; in set_in_bvec()
235 iov_iter_bvec(&con->v2.in_iter, READ, &con->v2.in_bvec, 1, bv->bv_len); in set_in_bvec()
238 static void set_in_skip(struct ceph_connection *con, int len) in set_in_skip() argument
240 WARN_ON(iov_iter_count(&con->v2.in_iter)); in set_in_skip()
242 dout("%s con %p len %d\n", __func__, con, len); in set_in_skip()
243 iov_iter_discard(&con->v2.in_iter, READ, len); in set_in_skip()
246 static void add_out_kvec(struct ceph_connection *con, void *buf, int len) in add_out_kvec() argument
248 BUG_ON(con->v2.out_kvec_cnt >= ARRAY_SIZE(con->v2.out_kvecs)); in add_out_kvec()
249 WARN_ON(!iov_iter_is_kvec(&con->v2.out_iter)); in add_out_kvec()
250 WARN_ON(con->v2.out_zero); in add_out_kvec()
252 con->v2.out_kvecs[con->v2.out_kvec_cnt].iov_base = buf; in add_out_kvec()
253 con->v2.out_kvecs[con->v2.out_kvec_cnt].iov_len = len; in add_out_kvec()
254 con->v2.out_kvec_cnt++; in add_out_kvec()
256 con->v2.out_iter.nr_segs++; in add_out_kvec()
257 con->v2.out_iter.count += len; in add_out_kvec()
260 static void reset_out_kvecs(struct ceph_connection *con) in reset_out_kvecs() argument
262 WARN_ON(iov_iter_count(&con->v2.out_iter)); in reset_out_kvecs()
263 WARN_ON(con->v2.out_zero); in reset_out_kvecs()
265 con->v2.out_kvec_cnt = 0; in reset_out_kvecs()
267 iov_iter_kvec(&con->v2.out_iter, WRITE, con->v2.out_kvecs, 0, 0); in reset_out_kvecs()
268 con->v2.out_iter_sendpage = false; in reset_out_kvecs()
271 static void set_out_bvec(struct ceph_connection *con, const struct bio_vec *bv, in set_out_bvec() argument
274 WARN_ON(iov_iter_count(&con->v2.out_iter)); in set_out_bvec()
275 WARN_ON(con->v2.out_zero); in set_out_bvec()
277 con->v2.out_bvec = *bv; in set_out_bvec()
278 con->v2.out_iter_sendpage = zerocopy; in set_out_bvec()
279 iov_iter_bvec(&con->v2.out_iter, WRITE, &con->v2.out_bvec, 1, in set_out_bvec()
280 con->v2.out_bvec.bv_len); in set_out_bvec()
283 static void set_out_bvec_zero(struct ceph_connection *con) in set_out_bvec_zero() argument
285 WARN_ON(iov_iter_count(&con->v2.out_iter)); in set_out_bvec_zero()
286 WARN_ON(!con->v2.out_zero); in set_out_bvec_zero()
288 con->v2.out_bvec.bv_page = ceph_zero_page; in set_out_bvec_zero()
289 con->v2.out_bvec.bv_offset = 0; in set_out_bvec_zero()
290 con->v2.out_bvec.bv_len = min(con->v2.out_zero, (int)PAGE_SIZE); in set_out_bvec_zero()
291 con->v2.out_iter_sendpage = true; in set_out_bvec_zero()
292 iov_iter_bvec(&con->v2.out_iter, WRITE, &con->v2.out_bvec, 1, in set_out_bvec_zero()
293 con->v2.out_bvec.bv_len); in set_out_bvec_zero()
296 static void out_zero_add(struct ceph_connection *con, int len) in out_zero_add() argument
298 dout("%s con %p len %d\n", __func__, con, len); in out_zero_add()
299 con->v2.out_zero += len; in out_zero_add()
302 static void *alloc_conn_buf(struct ceph_connection *con, int len) in alloc_conn_buf() argument
306 dout("%s con %p len %d\n", __func__, con, len); in alloc_conn_buf()
308 if (WARN_ON(con->v2.conn_buf_cnt >= ARRAY_SIZE(con->v2.conn_bufs))) in alloc_conn_buf()
315 con->v2.conn_bufs[con->v2.conn_buf_cnt++] = buf; in alloc_conn_buf()
319 static void free_conn_bufs(struct ceph_connection *con) in free_conn_bufs() argument
321 while (con->v2.conn_buf_cnt) in free_conn_bufs()
322 kvfree(con->v2.conn_bufs[--con->v2.conn_buf_cnt]); in free_conn_bufs()
325 static void add_in_sign_kvec(struct ceph_connection *con, void *buf, int len) in add_in_sign_kvec() argument
327 BUG_ON(con->v2.in_sign_kvec_cnt >= ARRAY_SIZE(con->v2.in_sign_kvecs)); in add_in_sign_kvec()
329 con->v2.in_sign_kvecs[con->v2.in_sign_kvec_cnt].iov_base = buf; in add_in_sign_kvec()
330 con->v2.in_sign_kvecs[con->v2.in_sign_kvec_cnt].iov_len = len; in add_in_sign_kvec()
331 con->v2.in_sign_kvec_cnt++; in add_in_sign_kvec()
334 static void clear_in_sign_kvecs(struct ceph_connection *con) in clear_in_sign_kvecs() argument
336 con->v2.in_sign_kvec_cnt = 0; in clear_in_sign_kvecs()
339 static void add_out_sign_kvec(struct ceph_connection *con, void *buf, int len) in add_out_sign_kvec() argument
341 BUG_ON(con->v2.out_sign_kvec_cnt >= ARRAY_SIZE(con->v2.out_sign_kvecs)); in add_out_sign_kvec()
343 con->v2.out_sign_kvecs[con->v2.out_sign_kvec_cnt].iov_base = buf; in add_out_sign_kvec()
344 con->v2.out_sign_kvecs[con->v2.out_sign_kvec_cnt].iov_len = len; in add_out_sign_kvec()
345 con->v2.out_sign_kvec_cnt++; in add_out_sign_kvec()
348 static void clear_out_sign_kvecs(struct ceph_connection *con) in clear_out_sign_kvecs() argument
350 con->v2.out_sign_kvec_cnt = 0; in clear_out_sign_kvecs()
353 static bool con_secure(struct ceph_connection *con) in con_secure() argument
355 return con->v2.con_mode == CEPH_CON_MODE_SECURE; in con_secure()
553 static void encode_epilogue_plain(struct ceph_connection *con, bool aborted) in encode_epilogue_plain() argument
555 con->v2.out_epil.late_status = aborted ? FRAME_LATE_STATUS_ABORTED : in encode_epilogue_plain()
557 cpu_to_le32s(&con->v2.out_epil.front_crc); in encode_epilogue_plain()
558 cpu_to_le32s(&con->v2.out_epil.middle_crc); in encode_epilogue_plain()
559 cpu_to_le32s(&con->v2.out_epil.data_crc); in encode_epilogue_plain()
562 static void encode_epilogue_secure(struct ceph_connection *con, bool aborted) in encode_epilogue_secure() argument
564 memset(&con->v2.out_epil, 0, sizeof(con->v2.out_epil)); in encode_epilogue_secure()
565 con->v2.out_epil.late_status = aborted ? FRAME_LATE_STATUS_ABORTED : in encode_epilogue_secure()
627 static int verify_control_crc(struct ceph_connection *con) in verify_control_crc() argument
629 int ctrl_len = con->v2.in_desc.fd_lens[0]; in verify_control_crc()
632 WARN_ON(con->v2.in_kvecs[0].iov_len != ctrl_len); in verify_control_crc()
633 WARN_ON(con->v2.in_kvecs[1].iov_len != CEPH_CRC_LEN); in verify_control_crc()
635 crc = crc32c(-1, con->v2.in_kvecs[0].iov_base, ctrl_len); in verify_control_crc()
636 expected_crc = get_unaligned_le32(con->v2.in_kvecs[1].iov_base); in verify_control_crc()
646 static int verify_epilogue_crcs(struct ceph_connection *con, u32 front_crc, in verify_epilogue_crcs() argument
649 if (front_len(con->in_msg)) { in verify_epilogue_crcs()
650 con->in_front_crc = crc32c(-1, con->in_msg->front.iov_base, in verify_epilogue_crcs()
651 front_len(con->in_msg)); in verify_epilogue_crcs()
653 WARN_ON(!middle_len(con->in_msg) && !data_len(con->in_msg)); in verify_epilogue_crcs()
654 con->in_front_crc = -1; in verify_epilogue_crcs()
657 if (middle_len(con->in_msg)) in verify_epilogue_crcs()
658 con->in_middle_crc = crc32c(-1, in verify_epilogue_crcs()
659 con->in_msg->middle->vec.iov_base, in verify_epilogue_crcs()
660 middle_len(con->in_msg)); in verify_epilogue_crcs()
661 else if (data_len(con->in_msg)) in verify_epilogue_crcs()
662 con->in_middle_crc = -1; in verify_epilogue_crcs()
664 con->in_middle_crc = 0; in verify_epilogue_crcs()
666 if (!data_len(con->in_msg)) in verify_epilogue_crcs()
667 con->in_data_crc = 0; in verify_epilogue_crcs()
669 dout("%s con %p msg %p crcs %u %u %u\n", __func__, con, con->in_msg, in verify_epilogue_crcs()
670 con->in_front_crc, con->in_middle_crc, con->in_data_crc); in verify_epilogue_crcs()
672 if (con->in_front_crc != front_crc) { in verify_epilogue_crcs()
674 con->in_front_crc, front_crc); in verify_epilogue_crcs()
677 if (con->in_middle_crc != middle_crc) { in verify_epilogue_crcs()
679 con->in_middle_crc, middle_crc); in verify_epilogue_crcs()
682 if (con->in_data_crc != data_crc) { in verify_epilogue_crcs()
684 con->in_data_crc, data_crc); in verify_epilogue_crcs()
691 static int setup_crypto(struct ceph_connection *con, in setup_crypto() argument
699 __func__, con, con->v2.con_mode, session_key_len, con_secret_len); in setup_crypto()
700 WARN_ON(con->v2.hmac_tfm || con->v2.gcm_tfm || con->v2.gcm_req); in setup_crypto()
702 if (con->v2.con_mode != CEPH_CON_MODE_CRC && in setup_crypto()
703 con->v2.con_mode != CEPH_CON_MODE_SECURE) { in setup_crypto()
704 pr_err("bad con_mode %d\n", con->v2.con_mode); in setup_crypto()
709 WARN_ON(con->v2.con_mode != CEPH_CON_MODE_CRC); in setup_crypto()
715 con->v2.hmac_tfm = crypto_alloc_shash("hmac(sha256)", 0, 0); in setup_crypto()
717 if (IS_ERR(con->v2.hmac_tfm)) { in setup_crypto()
718 ret = PTR_ERR(con->v2.hmac_tfm); in setup_crypto()
719 con->v2.hmac_tfm = NULL; in setup_crypto()
725 crypto_shash_alignmask(con->v2.hmac_tfm)); in setup_crypto()
726 ret = crypto_shash_setkey(con->v2.hmac_tfm, session_key, in setup_crypto()
733 if (con->v2.con_mode == CEPH_CON_MODE_CRC) { in setup_crypto()
744 con->v2.gcm_tfm = crypto_alloc_aead("gcm(aes)", 0, 0); in setup_crypto()
746 if (IS_ERR(con->v2.gcm_tfm)) { in setup_crypto()
747 ret = PTR_ERR(con->v2.gcm_tfm); in setup_crypto()
748 con->v2.gcm_tfm = NULL; in setup_crypto()
754 crypto_aead_alignmask(con->v2.gcm_tfm)); in setup_crypto()
755 ret = crypto_aead_setkey(con->v2.gcm_tfm, con_secret, CEPH_GCM_KEY_LEN); in setup_crypto()
761 WARN_ON(crypto_aead_ivsize(con->v2.gcm_tfm) != CEPH_GCM_IV_LEN); in setup_crypto()
762 ret = crypto_aead_setauthsize(con->v2.gcm_tfm, CEPH_GCM_TAG_LEN); in setup_crypto()
768 con->v2.gcm_req = aead_request_alloc(con->v2.gcm_tfm, GFP_NOIO); in setup_crypto()
769 if (!con->v2.gcm_req) { in setup_crypto()
774 crypto_init_wait(&con->v2.gcm_wait); in setup_crypto()
775 aead_request_set_callback(con->v2.gcm_req, CRYPTO_TFM_REQ_MAY_BACKLOG, in setup_crypto()
776 crypto_req_done, &con->v2.gcm_wait); in setup_crypto()
778 memcpy(&con->v2.in_gcm_nonce, con_secret + CEPH_GCM_KEY_LEN, in setup_crypto()
780 memcpy(&con->v2.out_gcm_nonce, in setup_crypto()
786 static int hmac_sha256(struct ceph_connection *con, const struct kvec *kvecs, in hmac_sha256() argument
789 SHASH_DESC_ON_STACK(desc, con->v2.hmac_tfm); /* tfm arg is ignored */ in hmac_sha256()
793 dout("%s con %p hmac_tfm %p kvec_cnt %d\n", __func__, con, in hmac_sha256()
794 con->v2.hmac_tfm, kvec_cnt); in hmac_sha256()
796 if (!con->v2.hmac_tfm) { in hmac_sha256()
801 desc->tfm = con->v2.hmac_tfm; in hmac_sha256()
808 crypto_shash_alignmask(con->v2.hmac_tfm)); in hmac_sha256()
830 static int gcm_crypt(struct ceph_connection *con, bool encrypt, in gcm_crypt() argument
837 nonce = encrypt ? &con->v2.out_gcm_nonce : &con->v2.in_gcm_nonce; in gcm_crypt()
839 aead_request_set_ad(con->v2.gcm_req, 0); /* no AAD */ in gcm_crypt()
840 aead_request_set_crypt(con->v2.gcm_req, src, dst, src_len, (u8 *)nonce); in gcm_crypt()
841 ret = crypto_wait_req(encrypt ? crypto_aead_encrypt(con->v2.gcm_req) : in gcm_crypt()
842 crypto_aead_decrypt(con->v2.gcm_req), in gcm_crypt()
843 &con->v2.gcm_wait); in gcm_crypt()
1009 static int decrypt_preamble(struct ceph_connection *con) in decrypt_preamble() argument
1013 sg_init_one(&sg, con->v2.in_buf, CEPH_PREAMBLE_SECURE_LEN); in decrypt_preamble()
1014 return gcm_crypt(con, false, &sg, &sg, CEPH_PREAMBLE_SECURE_LEN); in decrypt_preamble()
1017 static int decrypt_control_remainder(struct ceph_connection *con) in decrypt_control_remainder() argument
1019 int ctrl_len = con->v2.in_desc.fd_lens[0]; in decrypt_control_remainder()
1024 WARN_ON(con->v2.in_kvecs[0].iov_len != rem_len); in decrypt_control_remainder()
1025 WARN_ON(con->v2.in_kvecs[1].iov_len != pt_len); in decrypt_control_remainder()
1028 sg_set_buf(&sgs[0], con->v2.in_kvecs[0].iov_base, rem_len); in decrypt_control_remainder()
1029 sg_set_buf(&sgs[1], con->v2.in_buf, pt_len); in decrypt_control_remainder()
1031 return gcm_crypt(con, false, sgs, sgs, in decrypt_control_remainder()
1035 static int decrypt_message(struct ceph_connection *con) in decrypt_message() argument
1040 ret = setup_message_sgs(&sgt, con->in_msg, FRONT_PAD(con->v2.in_buf), in decrypt_message()
1041 MIDDLE_PAD(con->v2.in_buf), DATA_PAD(con->v2.in_buf), in decrypt_message()
1042 con->v2.in_buf, true); in decrypt_message()
1046 ret = gcm_crypt(con, false, sgt.sgl, sgt.sgl, in decrypt_message()
1047 tail_onwire_len(con->in_msg, true)); in decrypt_message()
1054 static int prepare_banner(struct ceph_connection *con) in prepare_banner() argument
1059 buf = alloc_conn_buf(con, buf_len); in prepare_banner()
1070 add_out_kvec(con, buf, buf_len); in prepare_banner()
1071 add_out_sign_kvec(con, buf, buf_len); in prepare_banner()
1072 ceph_con_flag_set(con, CEPH_CON_F_WRITE_PENDING); in prepare_banner()
1093 static void prepare_head_plain(struct ceph_connection *con, void *base, in prepare_head_plain() argument
1107 add_out_kvec(con, base, base_len); in prepare_head_plain()
1109 add_out_sign_kvec(con, base, base_len); in prepare_head_plain()
1113 add_out_kvec(con, base, crcp - base); in prepare_head_plain()
1114 add_out_kvec(con, extdata, extdata_len); in prepare_head_plain()
1115 add_out_kvec(con, crcp, CEPH_CRC_LEN); in prepare_head_plain()
1117 add_out_sign_kvec(con, base, crcp - base); in prepare_head_plain()
1118 add_out_sign_kvec(con, extdata, extdata_len); in prepare_head_plain()
1119 add_out_sign_kvec(con, crcp, CEPH_CRC_LEN); in prepare_head_plain()
1123 static int prepare_head_secure_small(struct ceph_connection *con, in prepare_head_secure_small() argument
1135 ret = gcm_crypt(con, true, &sg, &sg, in prepare_head_secure_small()
1140 add_out_kvec(con, base, CEPH_PREAMBLE_SECURE_LEN); in prepare_head_secure_small()
1164 static int prepare_head_secure_big(struct ceph_connection *con, in prepare_head_secure_big() argument
1177 ret = gcm_crypt(con, true, sgs, sgs, rem - base); in prepare_head_secure_big()
1186 ret = gcm_crypt(con, true, sgs, sgs, rem_tag - rem); in prepare_head_secure_big()
1190 add_out_kvec(con, base, rem - base); in prepare_head_secure_big()
1191 add_out_kvec(con, pmbl_tag, CEPH_GCM_TAG_LEN); in prepare_head_secure_big()
1192 add_out_kvec(con, rem, pmbl_tag - rem); in prepare_head_secure_big()
1196 static int __prepare_control(struct ceph_connection *con, int tag, in __prepare_control() argument
1204 dout("%s con %p tag %d len %d (%d+%d)\n", __func__, con, tag, in __prepare_control()
1214 if (con_secure(con)) { in __prepare_control()
1220 ret = prepare_head_secure_small(con, base, ctrl_len); in __prepare_control()
1223 ret = prepare_head_secure_big(con, base, ctrl_len); in __prepare_control()
1227 prepare_head_plain(con, base, ctrl_len, extdata, extdata_len, in __prepare_control()
1231 ceph_con_flag_set(con, CEPH_CON_F_WRITE_PENDING); in __prepare_control()
1235 static int prepare_control(struct ceph_connection *con, int tag, in prepare_control() argument
1238 return __prepare_control(con, tag, base, ctrl_len, NULL, 0, false); in prepare_control()
1241 static int prepare_hello(struct ceph_connection *con) in prepare_hello() argument
1246 ctrl_len = 1 + ceph_entity_addr_encoding_len(&con->peer_addr); in prepare_hello()
1247 buf = alloc_conn_buf(con, head_onwire_len(ctrl_len, false)); in prepare_hello()
1253 ceph_encode_entity_addr(&p, &con->peer_addr); in prepare_hello()
1256 return __prepare_control(con, FRAME_TAG_HELLO, buf, ctrl_len, in prepare_hello()
1263 static int prepare_auth_request(struct ceph_connection *con) in prepare_auth_request() argument
1271 buf = alloc_conn_buf(con, head_onwire_len(ctrl_len, false)); in prepare_auth_request()
1275 mutex_unlock(&con->mutex); in prepare_auth_request()
1276 ret = con->ops->get_auth_request(con, CTRL_BODY(buf), &ctrl_len, in prepare_auth_request()
1278 mutex_lock(&con->mutex); in prepare_auth_request()
1279 if (con->state != CEPH_CON_S_V2_HELLO) { in prepare_auth_request()
1280 dout("%s con %p state changed to %d\n", __func__, con, in prepare_auth_request()
1281 con->state); in prepare_auth_request()
1285 dout("%s con %p get_auth_request ret %d\n", __func__, con, ret); in prepare_auth_request()
1289 authorizer_copy = alloc_conn_buf(con, authorizer_len); in prepare_auth_request()
1295 return __prepare_control(con, FRAME_TAG_AUTH_REQUEST, buf, ctrl_len, in prepare_auth_request()
1299 static int prepare_auth_request_more(struct ceph_connection *con, in prepare_auth_request_more() argument
1308 buf = alloc_conn_buf(con, head_onwire_len(ctrl_len, false)); in prepare_auth_request_more()
1312 mutex_unlock(&con->mutex); in prepare_auth_request_more()
1313 ret = con->ops->handle_auth_reply_more(con, reply, reply_len, in prepare_auth_request_more()
1316 mutex_lock(&con->mutex); in prepare_auth_request_more()
1317 if (con->state != CEPH_CON_S_V2_AUTH) { in prepare_auth_request_more()
1318 dout("%s con %p state changed to %d\n", __func__, con, in prepare_auth_request_more()
1319 con->state); in prepare_auth_request_more()
1323 dout("%s con %p handle_auth_reply_more ret %d\n", __func__, con, ret); in prepare_auth_request_more()
1327 return __prepare_control(con, FRAME_TAG_AUTH_REQUEST_MORE, buf, in prepare_auth_request_more()
1331 static int prepare_auth_signature(struct ceph_connection *con) in prepare_auth_signature() argument
1336 buf = alloc_conn_buf(con, head_onwire_len(SHA256_DIGEST_SIZE, in prepare_auth_signature()
1337 con_secure(con))); in prepare_auth_signature()
1341 ret = hmac_sha256(con, con->v2.in_sign_kvecs, con->v2.in_sign_kvec_cnt, in prepare_auth_signature()
1346 return prepare_control(con, FRAME_TAG_AUTH_SIGNATURE, buf, in prepare_auth_signature()
1350 static int prepare_client_ident(struct ceph_connection *con) in prepare_client_ident() argument
1352 struct ceph_entity_addr *my_addr = &con->msgr->inst.addr; in prepare_client_ident()
1353 struct ceph_client *client = from_msgr(con->msgr); in prepare_client_ident()
1358 WARN_ON(con->v2.server_cookie); in prepare_client_ident()
1359 WARN_ON(con->v2.connect_seq); in prepare_client_ident()
1360 WARN_ON(con->v2.peer_global_seq); in prepare_client_ident()
1362 if (!con->v2.client_cookie) { in prepare_client_ident()
1364 get_random_bytes(&con->v2.client_cookie, in prepare_client_ident()
1365 sizeof(con->v2.client_cookie)); in prepare_client_ident()
1366 } while (!con->v2.client_cookie); in prepare_client_ident()
1367 dout("%s con %p generated cookie 0x%llx\n", __func__, con, in prepare_client_ident()
1368 con->v2.client_cookie); in prepare_client_ident()
1370 dout("%s con %p cookie already set 0x%llx\n", __func__, con, in prepare_client_ident()
1371 con->v2.client_cookie); in prepare_client_ident()
1375 __func__, con, ceph_pr_addr(my_addr), le32_to_cpu(my_addr->nonce), in prepare_client_ident()
1376 ceph_pr_addr(&con->peer_addr), le32_to_cpu(con->peer_addr.nonce), in prepare_client_ident()
1377 global_id, con->v2.global_seq, client->supported_features, in prepare_client_ident()
1378 client->required_features, con->v2.client_cookie); in prepare_client_ident()
1381 ceph_entity_addr_encoding_len(&con->peer_addr) + 6 * 8; in prepare_client_ident()
1382 buf = alloc_conn_buf(con, head_onwire_len(ctrl_len, con_secure(con))); in prepare_client_ident()
1390 ceph_encode_entity_addr(&p, &con->peer_addr); in prepare_client_ident()
1392 ceph_encode_64(&p, con->v2.global_seq); in prepare_client_ident()
1396 ceph_encode_64(&p, con->v2.client_cookie); in prepare_client_ident()
1399 return prepare_control(con, FRAME_TAG_CLIENT_IDENT, buf, ctrl_len); in prepare_client_ident()
1402 static int prepare_session_reconnect(struct ceph_connection *con) in prepare_session_reconnect() argument
1404 struct ceph_entity_addr *my_addr = &con->msgr->inst.addr; in prepare_session_reconnect()
1408 WARN_ON(!con->v2.client_cookie); in prepare_session_reconnect()
1409 WARN_ON(!con->v2.server_cookie); in prepare_session_reconnect()
1410 WARN_ON(!con->v2.connect_seq); in prepare_session_reconnect()
1411 WARN_ON(!con->v2.peer_global_seq); in prepare_session_reconnect()
1414 __func__, con, ceph_pr_addr(my_addr), le32_to_cpu(my_addr->nonce), in prepare_session_reconnect()
1415 con->v2.client_cookie, con->v2.server_cookie, con->v2.global_seq, in prepare_session_reconnect()
1416 con->v2.connect_seq, con->in_seq); in prepare_session_reconnect()
1419 buf = alloc_conn_buf(con, head_onwire_len(ctrl_len, con_secure(con))); in prepare_session_reconnect()
1427 ceph_encode_64(&p, con->v2.client_cookie); in prepare_session_reconnect()
1428 ceph_encode_64(&p, con->v2.server_cookie); in prepare_session_reconnect()
1429 ceph_encode_64(&p, con->v2.global_seq); in prepare_session_reconnect()
1430 ceph_encode_64(&p, con->v2.connect_seq); in prepare_session_reconnect()
1431 ceph_encode_64(&p, con->in_seq); in prepare_session_reconnect()
1434 return prepare_control(con, FRAME_TAG_SESSION_RECONNECT, buf, ctrl_len); in prepare_session_reconnect()
1437 static int prepare_keepalive2(struct ceph_connection *con) in prepare_keepalive2() argument
1439 struct ceph_timespec *ts = CTRL_BODY(con->v2.out_buf); in prepare_keepalive2()
1443 dout("%s con %p timestamp %lld.%09ld\n", __func__, con, now.tv_sec, in prepare_keepalive2()
1448 reset_out_kvecs(con); in prepare_keepalive2()
1449 return prepare_control(con, FRAME_TAG_KEEPALIVE2, con->v2.out_buf, in prepare_keepalive2()
1453 static int prepare_ack(struct ceph_connection *con) in prepare_ack() argument
1457 dout("%s con %p in_seq_acked %llu -> %llu\n", __func__, con, in prepare_ack()
1458 con->in_seq_acked, con->in_seq); in prepare_ack()
1459 con->in_seq_acked = con->in_seq; in prepare_ack()
1461 p = CTRL_BODY(con->v2.out_buf); in prepare_ack()
1462 ceph_encode_64(&p, con->in_seq_acked); in prepare_ack()
1464 reset_out_kvecs(con); in prepare_ack()
1465 return prepare_control(con, FRAME_TAG_ACK, con->v2.out_buf, 8); in prepare_ack()
1468 static void prepare_epilogue_plain(struct ceph_connection *con, bool aborted) in prepare_epilogue_plain() argument
1470 dout("%s con %p msg %p aborted %d crcs %u %u %u\n", __func__, con, in prepare_epilogue_plain()
1471 con->out_msg, aborted, con->v2.out_epil.front_crc, in prepare_epilogue_plain()
1472 con->v2.out_epil.middle_crc, con->v2.out_epil.data_crc); in prepare_epilogue_plain()
1474 encode_epilogue_plain(con, aborted); in prepare_epilogue_plain()
1475 add_out_kvec(con, &con->v2.out_epil, CEPH_EPILOGUE_PLAIN_LEN); in prepare_epilogue_plain()
1482 static void prepare_message_plain(struct ceph_connection *con) in prepare_message_plain() argument
1484 struct ceph_msg *msg = con->out_msg; in prepare_message_plain()
1486 prepare_head_plain(con, con->v2.out_buf, in prepare_message_plain()
1495 con->v2.out_state = OUT_S_FINISH_MESSAGE; in prepare_message_plain()
1499 con->v2.out_epil.front_crc = -1; in prepare_message_plain()
1500 con->v2.out_epil.middle_crc = -1; in prepare_message_plain()
1501 con->v2.out_state = OUT_S_QUEUE_DATA; in prepare_message_plain()
1506 con->v2.out_epil.front_crc = crc32c(-1, msg->front.iov_base, in prepare_message_plain()
1508 add_out_kvec(con, msg->front.iov_base, front_len(msg)); in prepare_message_plain()
1511 con->v2.out_epil.front_crc = -1; in prepare_message_plain()
1515 con->v2.out_epil.middle_crc = in prepare_message_plain()
1517 add_out_kvec(con, msg->middle->vec.iov_base, middle_len(msg)); in prepare_message_plain()
1519 con->v2.out_epil.middle_crc = data_len(msg) ? -1 : 0; in prepare_message_plain()
1523 con->v2.out_state = OUT_S_QUEUE_DATA; in prepare_message_plain()
1525 con->v2.out_epil.data_crc = 0; in prepare_message_plain()
1526 prepare_epilogue_plain(con, false); in prepare_message_plain()
1527 con->v2.out_state = OUT_S_FINISH_MESSAGE; in prepare_message_plain()
1538 static int prepare_message_secure(struct ceph_connection *con) in prepare_message_secure() argument
1548 ret = prepare_head_secure_small(con, con->v2.out_buf, in prepare_message_secure()
1553 tail_len = tail_onwire_len(con->out_msg, true); in prepare_message_secure()
1559 con->v2.out_state = OUT_S_FINISH_MESSAGE; in prepare_message_secure()
1563 encode_epilogue_secure(con, false); in prepare_message_secure()
1564 ret = setup_message_sgs(&sgt, con->out_msg, zerop, zerop, zerop, in prepare_message_secure()
1565 &con->v2.out_epil, false); in prepare_message_secure()
1576 WARN_ON(con->v2.out_enc_pages || con->v2.out_enc_page_cnt); in prepare_message_secure()
1577 con->v2.out_enc_pages = enc_pages; in prepare_message_secure()
1578 con->v2.out_enc_page_cnt = enc_page_cnt; in prepare_message_secure()
1579 con->v2.out_enc_resid = tail_len; in prepare_message_secure()
1580 con->v2.out_enc_i = 0; in prepare_message_secure()
1587 ret = gcm_crypt(con, true, sgt.sgl, enc_sgt.sgl, in prepare_message_secure()
1592 dout("%s con %p msg %p sg_cnt %d enc_page_cnt %d\n", __func__, con, in prepare_message_secure()
1593 con->out_msg, sgt.orig_nents, enc_page_cnt); in prepare_message_secure()
1594 con->v2.out_state = OUT_S_QUEUE_ENC_PAGE; in prepare_message_secure()
1602 static int prepare_message(struct ceph_connection *con) in prepare_message() argument
1606 front_len(con->out_msg), in prepare_message()
1607 middle_len(con->out_msg), in prepare_message()
1608 data_len(con->out_msg) in prepare_message()
1613 dout("%s con %p msg %p logical %d+%d+%d+%d\n", __func__, con, in prepare_message()
1614 con->out_msg, lens[0], lens[1], lens[2], lens[3]); in prepare_message()
1616 if (con->in_seq > con->in_seq_acked) { in prepare_message()
1617 dout("%s con %p in_seq_acked %llu -> %llu\n", __func__, con, in prepare_message()
1618 con->in_seq_acked, con->in_seq); in prepare_message()
1619 con->in_seq_acked = con->in_seq; in prepare_message()
1622 reset_out_kvecs(con); in prepare_message()
1624 encode_preamble(&desc, con->v2.out_buf); in prepare_message()
1625 fill_header2(CTRL_BODY(con->v2.out_buf), &con->out_msg->hdr, in prepare_message()
1626 con->in_seq_acked); in prepare_message()
1628 if (con_secure(con)) { in prepare_message()
1629 ret = prepare_message_secure(con); in prepare_message()
1633 prepare_message_plain(con); in prepare_message()
1636 ceph_con_flag_set(con, CEPH_CON_F_WRITE_PENDING); in prepare_message()
1640 static int prepare_read_banner_prefix(struct ceph_connection *con) in prepare_read_banner_prefix() argument
1644 buf = alloc_conn_buf(con, CEPH_BANNER_V2_PREFIX_LEN); in prepare_read_banner_prefix()
1648 reset_in_kvecs(con); in prepare_read_banner_prefix()
1649 add_in_kvec(con, buf, CEPH_BANNER_V2_PREFIX_LEN); in prepare_read_banner_prefix()
1650 add_in_sign_kvec(con, buf, CEPH_BANNER_V2_PREFIX_LEN); in prepare_read_banner_prefix()
1651 con->state = CEPH_CON_S_V2_BANNER_PREFIX; in prepare_read_banner_prefix()
1655 static int prepare_read_banner_payload(struct ceph_connection *con, in prepare_read_banner_payload() argument
1660 buf = alloc_conn_buf(con, payload_len); in prepare_read_banner_payload()
1664 reset_in_kvecs(con); in prepare_read_banner_payload()
1665 add_in_kvec(con, buf, payload_len); in prepare_read_banner_payload()
1666 add_in_sign_kvec(con, buf, payload_len); in prepare_read_banner_payload()
1667 con->state = CEPH_CON_S_V2_BANNER_PAYLOAD; in prepare_read_banner_payload()
1671 static void prepare_read_preamble(struct ceph_connection *con) in prepare_read_preamble() argument
1673 reset_in_kvecs(con); in prepare_read_preamble()
1674 add_in_kvec(con, con->v2.in_buf, in prepare_read_preamble()
1675 con_secure(con) ? CEPH_PREAMBLE_SECURE_LEN : in prepare_read_preamble()
1677 con->v2.in_state = IN_S_HANDLE_PREAMBLE; in prepare_read_preamble()
1680 static int prepare_read_control(struct ceph_connection *con) in prepare_read_control() argument
1682 int ctrl_len = con->v2.in_desc.fd_lens[0]; in prepare_read_control()
1686 reset_in_kvecs(con); in prepare_read_control()
1687 if (con->state == CEPH_CON_S_V2_HELLO || in prepare_read_control()
1688 con->state == CEPH_CON_S_V2_AUTH) { in prepare_read_control()
1690 buf = alloc_conn_buf(con, head_len); in prepare_read_control()
1695 memcpy(buf, con->v2.in_buf, CEPH_PREAMBLE_LEN); in prepare_read_control()
1697 add_in_kvec(con, CTRL_BODY(buf), ctrl_len); in prepare_read_control()
1698 add_in_kvec(con, CTRL_BODY(buf) + ctrl_len, CEPH_CRC_LEN); in prepare_read_control()
1699 add_in_sign_kvec(con, buf, head_len); in prepare_read_control()
1702 buf = alloc_conn_buf(con, ctrl_len); in prepare_read_control()
1706 add_in_kvec(con, buf, ctrl_len); in prepare_read_control()
1708 add_in_kvec(con, CTRL_BODY(con->v2.in_buf), ctrl_len); in prepare_read_control()
1710 add_in_kvec(con, con->v2.in_buf, CEPH_CRC_LEN); in prepare_read_control()
1712 con->v2.in_state = IN_S_HANDLE_CONTROL; in prepare_read_control()
1716 static int prepare_read_control_remainder(struct ceph_connection *con) in prepare_read_control_remainder() argument
1718 int ctrl_len = con->v2.in_desc.fd_lens[0]; in prepare_read_control_remainder()
1722 buf = alloc_conn_buf(con, ctrl_len); in prepare_read_control_remainder()
1726 memcpy(buf, CTRL_BODY(con->v2.in_buf), CEPH_PREAMBLE_INLINE_LEN); in prepare_read_control_remainder()
1728 reset_in_kvecs(con); in prepare_read_control_remainder()
1729 add_in_kvec(con, buf + CEPH_PREAMBLE_INLINE_LEN, rem_len); in prepare_read_control_remainder()
1730 add_in_kvec(con, con->v2.in_buf, in prepare_read_control_remainder()
1732 con->v2.in_state = IN_S_HANDLE_CONTROL_REMAINDER; in prepare_read_control_remainder()
1736 static void prepare_read_data(struct ceph_connection *con) in prepare_read_data() argument
1740 if (!con_secure(con)) in prepare_read_data()
1741 con->in_data_crc = -1; in prepare_read_data()
1742 ceph_msg_data_cursor_init(&con->v2.in_cursor, con->in_msg, in prepare_read_data()
1743 data_len(con->in_msg)); in prepare_read_data()
1745 get_bvec_at(&con->v2.in_cursor, &bv); in prepare_read_data()
1746 set_in_bvec(con, &bv); in prepare_read_data()
1747 con->v2.in_state = IN_S_PREPARE_READ_DATA_CONT; in prepare_read_data()
1750 static void prepare_read_data_cont(struct ceph_connection *con) in prepare_read_data_cont() argument
1754 if (!con_secure(con)) in prepare_read_data_cont()
1755 con->in_data_crc = ceph_crc32c_page(con->in_data_crc, in prepare_read_data_cont()
1756 con->v2.in_bvec.bv_page, in prepare_read_data_cont()
1757 con->v2.in_bvec.bv_offset, in prepare_read_data_cont()
1758 con->v2.in_bvec.bv_len); in prepare_read_data_cont()
1760 ceph_msg_data_advance(&con->v2.in_cursor, con->v2.in_bvec.bv_len); in prepare_read_data_cont()
1761 if (con->v2.in_cursor.total_resid) { in prepare_read_data_cont()
1762 get_bvec_at(&con->v2.in_cursor, &bv); in prepare_read_data_cont()
1763 set_in_bvec(con, &bv); in prepare_read_data_cont()
1764 WARN_ON(con->v2.in_state != IN_S_PREPARE_READ_DATA_CONT); in prepare_read_data_cont()
1772 reset_in_kvecs(con); in prepare_read_data_cont()
1773 if (con_secure(con)) { in prepare_read_data_cont()
1774 if (need_padding(data_len(con->in_msg))) in prepare_read_data_cont()
1775 add_in_kvec(con, DATA_PAD(con->v2.in_buf), in prepare_read_data_cont()
1776 padding_len(data_len(con->in_msg))); in prepare_read_data_cont()
1777 add_in_kvec(con, con->v2.in_buf, CEPH_EPILOGUE_SECURE_LEN); in prepare_read_data_cont()
1779 add_in_kvec(con, con->v2.in_buf, CEPH_EPILOGUE_PLAIN_LEN); in prepare_read_data_cont()
1781 con->v2.in_state = IN_S_HANDLE_EPILOGUE; in prepare_read_data_cont()
1784 static void __finish_skip(struct ceph_connection *con) in __finish_skip() argument
1786 con->in_seq++; in __finish_skip()
1787 prepare_read_preamble(con); in __finish_skip()
1790 static void prepare_skip_message(struct ceph_connection *con) in prepare_skip_message() argument
1792 struct ceph_frame_desc *desc = &con->v2.in_desc; in prepare_skip_message()
1795 dout("%s con %p %d+%d+%d\n", __func__, con, desc->fd_lens[1], in prepare_skip_message()
1799 desc->fd_lens[3], con_secure(con)); in prepare_skip_message()
1801 __finish_skip(con); in prepare_skip_message()
1803 set_in_skip(con, tail_len); in prepare_skip_message()
1804 con->v2.in_state = IN_S_FINISH_SKIP; in prepare_skip_message()
1808 static int process_banner_prefix(struct ceph_connection *con) in process_banner_prefix() argument
1813 WARN_ON(con->v2.in_kvecs[0].iov_len != CEPH_BANNER_V2_PREFIX_LEN); in process_banner_prefix()
1815 p = con->v2.in_kvecs[0].iov_base; in process_banner_prefix()
1818 con->error_msg = "server is speaking msgr1 protocol"; in process_banner_prefix()
1820 con->error_msg = "protocol error, bad banner"; in process_banner_prefix()
1826 dout("%s con %p payload_len %d\n", __func__, con, payload_len); in process_banner_prefix()
1828 return prepare_read_banner_payload(con, payload_len); in process_banner_prefix()
1831 static int process_banner_payload(struct ceph_connection *con) in process_banner_payload() argument
1833 void *end = con->v2.in_kvecs[0].iov_base + con->v2.in_kvecs[0].iov_len; in process_banner_payload()
1840 p = con->v2.in_kvecs[0].iov_base; in process_banner_payload()
1845 __func__, con, server_feat, server_req_feat); in process_banner_payload()
1850 con->error_msg = "missing required protocol features"; in process_banner_payload()
1856 con->error_msg = "missing required protocol features"; in process_banner_payload()
1861 ret = prepare_hello(con); in process_banner_payload()
1867 con->state = CEPH_CON_S_V2_HELLO; in process_banner_payload()
1868 prepare_read_preamble(con); in process_banner_payload()
1876 static int process_hello(struct ceph_connection *con, void *p, void *end) in process_hello() argument
1878 struct ceph_entity_addr *my_addr = &con->msgr->inst.addr; in process_hello()
1883 if (con->state != CEPH_CON_S_V2_HELLO) { in process_hello()
1884 con->error_msg = "protocol error, unexpected hello"; in process_hello()
1895 dout("%s con %p entity_type %d addr_for_me %s\n", __func__, con, in process_hello()
1898 if (entity_type != con->peer_name.type) { in process_hello()
1900 con->peer_name.type, entity_type); in process_hello()
1901 con->error_msg = "wrong peer at address"; in process_hello()
1916 __func__, con, ceph_pr_addr(my_addr), in process_hello()
1917 ceph_pr_addr(&con->peer_addr)); in process_hello()
1920 __func__, con, ceph_pr_addr(my_addr)); in process_hello()
1928 ret = prepare_auth_request(con); in process_hello()
1935 con->state = CEPH_CON_S_V2_AUTH; in process_hello()
1943 static int process_auth_bad_method(struct ceph_connection *con, in process_auth_bad_method() argument
1952 if (con->state != CEPH_CON_S_V2_AUTH) { in process_auth_bad_method()
1953 con->error_msg = "protocol error, unexpected auth_bad_method"; in process_auth_bad_method()
1959 dout("%s con %p used_proto %d result %d\n", __func__, con, used_proto, in process_auth_bad_method()
1969 dout("%s con %p allowed_protos[%d] %d\n", __func__, con, in process_auth_bad_method()
1980 dout("%s con %p allowed_modes[%d] %d\n", __func__, con, in process_auth_bad_method()
1984 mutex_unlock(&con->mutex); in process_auth_bad_method()
1985 ret = con->ops->handle_auth_bad_method(con, used_proto, result, in process_auth_bad_method()
1990 mutex_lock(&con->mutex); in process_auth_bad_method()
1991 if (con->state != CEPH_CON_S_V2_AUTH) { in process_auth_bad_method()
1992 dout("%s con %p state changed to %d\n", __func__, con, in process_auth_bad_method()
1993 con->state); in process_auth_bad_method()
1997 dout("%s con %p handle_auth_bad_method ret %d\n", __func__, con, ret); in process_auth_bad_method()
2005 static int process_auth_reply_more(struct ceph_connection *con, in process_auth_reply_more() argument
2011 if (con->state != CEPH_CON_S_V2_AUTH) { in process_auth_reply_more()
2012 con->error_msg = "protocol error, unexpected auth_reply_more"; in process_auth_reply_more()
2019 dout("%s con %p payload_len %d\n", __func__, con, payload_len); in process_auth_reply_more()
2021 reset_out_kvecs(con); in process_auth_reply_more()
2022 ret = prepare_auth_request_more(con, p, payload_len); in process_auth_reply_more()
2042 static int process_auth_done(struct ceph_connection *con, void *p, void *end) in process_auth_done() argument
2053 if (con->state != CEPH_CON_S_V2_AUTH) { in process_auth_done()
2054 con->error_msg = "protocol error, unexpected auth_done"; in process_auth_done()
2059 ceph_decode_32_safe(&p, end, con->v2.con_mode, bad); in process_auth_done()
2063 __func__, con, global_id, con->v2.con_mode, payload_len); in process_auth_done()
2065 mutex_unlock(&con->mutex); in process_auth_done()
2068 ret = con->ops->handle_auth_done(con, global_id, p, payload_len, in process_auth_done()
2071 mutex_lock(&con->mutex); in process_auth_done()
2072 if (con->state != CEPH_CON_S_V2_AUTH) { in process_auth_done()
2073 dout("%s con %p state changed to %d\n", __func__, con, in process_auth_done()
2074 con->state); in process_auth_done()
2079 dout("%s con %p handle_auth_done ret %d\n", __func__, con, ret); in process_auth_done()
2083 ret = setup_crypto(con, session_key, session_key_len, con_secret, in process_auth_done()
2088 reset_out_kvecs(con); in process_auth_done()
2089 ret = prepare_auth_signature(con); in process_auth_done()
2095 con->state = CEPH_CON_S_V2_AUTH_SIGNATURE; in process_auth_done()
2107 static int process_auth_signature(struct ceph_connection *con, in process_auth_signature() argument
2113 if (con->state != CEPH_CON_S_V2_AUTH_SIGNATURE) { in process_auth_signature()
2114 con->error_msg = "protocol error, unexpected auth_signature"; in process_auth_signature()
2118 ret = hmac_sha256(con, con->v2.out_sign_kvecs, in process_auth_signature()
2119 con->v2.out_sign_kvec_cnt, hmac); in process_auth_signature()
2125 con->error_msg = "integrity error, bad auth signature"; in process_auth_signature()
2129 dout("%s con %p auth signature ok\n", __func__, con); in process_auth_signature()
2132 if (!con->v2.server_cookie) { in process_auth_signature()
2133 ret = prepare_client_ident(con); in process_auth_signature()
2139 con->state = CEPH_CON_S_V2_SESSION_CONNECT; in process_auth_signature()
2141 ret = prepare_session_reconnect(con); in process_auth_signature()
2147 con->state = CEPH_CON_S_V2_SESSION_RECONNECT; in process_auth_signature()
2157 static int process_server_ident(struct ceph_connection *con, in process_server_ident() argument
2160 struct ceph_client *client = from_msgr(con->msgr); in process_server_ident()
2169 if (con->state != CEPH_CON_S_V2_SESSION_CONNECT) { in process_server_ident()
2170 con->error_msg = "protocol error, unexpected server_ident"; in process_server_ident()
2188 __func__, con, ceph_pr_addr(&addr), le32_to_cpu(addr.nonce), in process_server_ident()
2192 if (memcmp(&addr, &con->peer_addr, sizeof(con->peer_addr))) { in process_server_ident()
2194 ceph_pr_addr(&con->peer_addr), in process_server_ident()
2195 le32_to_cpu(con->peer_addr.nonce), in process_server_ident()
2197 con->error_msg = "wrong peer at address"; in process_server_ident()
2204 con->error_msg = "missing required protocol features"; in process_server_ident()
2213 WARN_ON(!con->peer_name.type); in process_server_ident()
2214 con->peer_name.num = cpu_to_le64(global_id); in process_server_ident()
2215 con->v2.peer_global_seq = global_seq; in process_server_ident()
2216 con->peer_features = features; in process_server_ident()
2218 con->v2.server_cookie = cookie; in process_server_ident()
2221 ceph_con_flag_set(con, CEPH_CON_F_LOSSYTX); in process_server_ident()
2222 WARN_ON(con->v2.server_cookie); in process_server_ident()
2224 WARN_ON(!con->v2.server_cookie); in process_server_ident()
2227 clear_in_sign_kvecs(con); in process_server_ident()
2228 clear_out_sign_kvecs(con); in process_server_ident()
2229 free_conn_bufs(con); in process_server_ident()
2230 con->delay = 0; /* reset backoff memory */ in process_server_ident()
2232 con->state = CEPH_CON_S_OPEN; in process_server_ident()
2233 con->v2.out_state = OUT_S_GET_NEXT; in process_server_ident()
2241 static int process_ident_missing_features(struct ceph_connection *con, in process_ident_missing_features() argument
2244 struct ceph_client *client = from_msgr(con->msgr); in process_ident_missing_features()
2247 if (con->state != CEPH_CON_S_V2_SESSION_CONNECT) { in process_ident_missing_features()
2248 con->error_msg = "protocol error, unexpected ident_missing_features"; in process_ident_missing_features()
2255 con->error_msg = "missing required protocol features"; in process_ident_missing_features()
2263 static int process_session_reconnect_ok(struct ceph_connection *con, in process_session_reconnect_ok() argument
2268 if (con->state != CEPH_CON_S_V2_SESSION_RECONNECT) { in process_session_reconnect_ok()
2269 con->error_msg = "protocol error, unexpected session_reconnect_ok"; in process_session_reconnect_ok()
2275 dout("%s con %p seq %llu\n", __func__, con, seq); in process_session_reconnect_ok()
2276 ceph_con_discard_requeued(con, seq); in process_session_reconnect_ok()
2278 clear_in_sign_kvecs(con); in process_session_reconnect_ok()
2279 clear_out_sign_kvecs(con); in process_session_reconnect_ok()
2280 free_conn_bufs(con); in process_session_reconnect_ok()
2281 con->delay = 0; /* reset backoff memory */ in process_session_reconnect_ok()
2283 con->state = CEPH_CON_S_OPEN; in process_session_reconnect_ok()
2284 con->v2.out_state = OUT_S_GET_NEXT; in process_session_reconnect_ok()
2292 static int process_session_retry(struct ceph_connection *con, in process_session_retry() argument
2298 if (con->state != CEPH_CON_S_V2_SESSION_RECONNECT) { in process_session_retry()
2299 con->error_msg = "protocol error, unexpected session_retry"; in process_session_retry()
2305 dout("%s con %p connect_seq %llu\n", __func__, con, connect_seq); in process_session_retry()
2306 WARN_ON(connect_seq <= con->v2.connect_seq); in process_session_retry()
2307 con->v2.connect_seq = connect_seq + 1; in process_session_retry()
2309 free_conn_bufs(con); in process_session_retry()
2311 reset_out_kvecs(con); in process_session_retry()
2312 ret = prepare_session_reconnect(con); in process_session_retry()
2325 static int process_session_retry_global(struct ceph_connection *con, in process_session_retry_global() argument
2331 if (con->state != CEPH_CON_S_V2_SESSION_RECONNECT) { in process_session_retry_global()
2332 con->error_msg = "protocol error, unexpected session_retry_global"; in process_session_retry_global()
2338 dout("%s con %p global_seq %llu\n", __func__, con, global_seq); in process_session_retry_global()
2339 WARN_ON(global_seq <= con->v2.global_seq); in process_session_retry_global()
2340 con->v2.global_seq = ceph_get_global_seq(con->msgr, global_seq); in process_session_retry_global()
2342 free_conn_bufs(con); in process_session_retry_global()
2344 reset_out_kvecs(con); in process_session_retry_global()
2345 ret = prepare_session_reconnect(con); in process_session_retry_global()
2358 static int process_session_reset(struct ceph_connection *con, in process_session_reset() argument
2364 if (con->state != CEPH_CON_S_V2_SESSION_RECONNECT) { in process_session_reset()
2365 con->error_msg = "protocol error, unexpected session_reset"; in process_session_reset()
2371 con->error_msg = "protocol error, bad session_reset"; in process_session_reset()
2375 pr_info("%s%lld %s session reset\n", ENTITY_NAME(con->peer_name), in process_session_reset()
2376 ceph_pr_addr(&con->peer_addr)); in process_session_reset()
2377 ceph_con_reset_session(con); in process_session_reset()
2379 mutex_unlock(&con->mutex); in process_session_reset()
2380 if (con->ops->peer_reset) in process_session_reset()
2381 con->ops->peer_reset(con); in process_session_reset()
2382 mutex_lock(&con->mutex); in process_session_reset()
2383 if (con->state != CEPH_CON_S_V2_SESSION_RECONNECT) { in process_session_reset()
2384 dout("%s con %p state changed to %d\n", __func__, con, in process_session_reset()
2385 con->state); in process_session_reset()
2389 free_conn_bufs(con); in process_session_reset()
2391 reset_out_kvecs(con); in process_session_reset()
2392 ret = prepare_client_ident(con); in process_session_reset()
2398 con->state = CEPH_CON_S_V2_SESSION_CONNECT; in process_session_reset()
2406 static int process_keepalive2_ack(struct ceph_connection *con, in process_keepalive2_ack() argument
2409 if (con->state != CEPH_CON_S_OPEN) { in process_keepalive2_ack()
2410 con->error_msg = "protocol error, unexpected keepalive2_ack"; in process_keepalive2_ack()
2415 ceph_decode_timespec64(&con->last_keepalive_ack, p); in process_keepalive2_ack()
2417 dout("%s con %p timestamp %lld.%09ld\n", __func__, con, in process_keepalive2_ack()
2418 con->last_keepalive_ack.tv_sec, con->last_keepalive_ack.tv_nsec); in process_keepalive2_ack()
2427 static int process_ack(struct ceph_connection *con, void *p, void *end) in process_ack() argument
2431 if (con->state != CEPH_CON_S_OPEN) { in process_ack()
2432 con->error_msg = "protocol error, unexpected ack"; in process_ack()
2438 dout("%s con %p seq %llu\n", __func__, con, seq); in process_ack()
2439 ceph_con_discard_sent(con, seq); in process_ack()
2447 static int process_control(struct ceph_connection *con, void *p, void *end) in process_control() argument
2449 int tag = con->v2.in_desc.fd_tag; in process_control()
2452 dout("%s con %p tag %d len %d\n", __func__, con, tag, (int)(end - p)); in process_control()
2456 ret = process_hello(con, p, end); in process_control()
2459 ret = process_auth_bad_method(con, p, end); in process_control()
2462 ret = process_auth_reply_more(con, p, end); in process_control()
2465 ret = process_auth_done(con, p, end); in process_control()
2468 ret = process_auth_signature(con, p, end); in process_control()
2471 ret = process_server_ident(con, p, end); in process_control()
2474 ret = process_ident_missing_features(con, p, end); in process_control()
2477 ret = process_session_reconnect_ok(con, p, end); in process_control()
2480 ret = process_session_retry(con, p, end); in process_control()
2483 ret = process_session_retry_global(con, p, end); in process_control()
2486 ret = process_session_reset(con, p, end); in process_control()
2489 ret = process_keepalive2_ack(con, p, end); in process_control()
2492 ret = process_ack(con, p, end); in process_control()
2496 con->error_msg = "protocol error, bad tag"; in process_control()
2500 dout("%s con %p error %d\n", __func__, con, ret); in process_control()
2504 prepare_read_preamble(con); in process_control()
2514 static int process_message_header(struct ceph_connection *con, in process_message_header() argument
2517 struct ceph_frame_desc *desc = &con->v2.in_desc; in process_message_header()
2526 if ((s64)seq - (s64)con->in_seq < 1) { in process_message_header()
2528 ENTITY_NAME(con->peer_name), in process_message_header()
2529 ceph_pr_addr(&con->peer_addr), in process_message_header()
2530 seq, con->in_seq + 1); in process_message_header()
2533 if ((s64)seq - (s64)con->in_seq > 1) { in process_message_header()
2534 pr_err("bad seq %llu, expected %llu\n", seq, con->in_seq + 1); in process_message_header()
2535 con->error_msg = "bad message sequence # for incoming message"; in process_message_header()
2539 ceph_con_discard_sent(con, le64_to_cpu(hdr2->ack_seq)); in process_message_header()
2542 desc->fd_lens[3], &con->peer_name); in process_message_header()
2543 ret = ceph_con_in_msg_alloc(con, &hdr, &skip); in process_message_header()
2547 WARN_ON(!con->in_msg ^ skip); in process_message_header()
2551 WARN_ON(!con->in_msg); in process_message_header()
2552 WARN_ON(con->in_msg->con != con); in process_message_header()
2556 static int process_message(struct ceph_connection *con) in process_message() argument
2558 ceph_con_process_message(con); in process_message()
2564 if (con->state != CEPH_CON_S_OPEN) { in process_message()
2565 dout("%s con %p state changed to %d\n", __func__, con, in process_message()
2566 con->state); in process_message()
2570 prepare_read_preamble(con); in process_message()
2574 static int __handle_control(struct ceph_connection *con, void *p) in __handle_control() argument
2576 void *end = p + con->v2.in_desc.fd_lens[0]; in __handle_control()
2580 if (con->v2.in_desc.fd_tag != FRAME_TAG_MESSAGE) in __handle_control()
2581 return process_control(con, p, end); in __handle_control()
2583 ret = process_message_header(con, p, end); in __handle_control()
2587 prepare_skip_message(con); in __handle_control()
2591 msg = con->in_msg; /* set in process_message_header() */ in __handle_control()
2594 return process_message(con); in __handle_control()
2596 prepare_read_data(con); in __handle_control()
2600 reset_in_kvecs(con); in __handle_control()
2603 add_in_kvec(con, msg->front.iov_base, front_len(msg)); in __handle_control()
2606 if (con_secure(con) && need_padding(front_len(msg))) in __handle_control()
2607 add_in_kvec(con, FRONT_PAD(con->v2.in_buf), in __handle_control()
2614 add_in_kvec(con, msg->middle->vec.iov_base, middle_len(msg)); in __handle_control()
2617 if (con_secure(con) && need_padding(middle_len(msg))) in __handle_control()
2618 add_in_kvec(con, MIDDLE_PAD(con->v2.in_buf), in __handle_control()
2625 con->v2.in_state = IN_S_PREPARE_READ_DATA; in __handle_control()
2627 add_in_kvec(con, con->v2.in_buf, in __handle_control()
2628 con_secure(con) ? CEPH_EPILOGUE_SECURE_LEN : in __handle_control()
2630 con->v2.in_state = IN_S_HANDLE_EPILOGUE; in __handle_control()
2635 static int handle_preamble(struct ceph_connection *con) in handle_preamble() argument
2637 struct ceph_frame_desc *desc = &con->v2.in_desc; in handle_preamble()
2640 if (con_secure(con)) { in handle_preamble()
2641 ret = decrypt_preamble(con); in handle_preamble()
2644 con->error_msg = "integrity error, bad preamble auth tag"; in handle_preamble()
2649 ret = decode_preamble(con->v2.in_buf, desc); in handle_preamble()
2652 con->error_msg = "integrity error, bad crc"; in handle_preamble()
2654 con->error_msg = "protocol error, bad preamble"; in handle_preamble()
2659 con, desc->fd_tag, desc->fd_seg_cnt, desc->fd_lens[0], in handle_preamble()
2662 if (!con_secure(con)) in handle_preamble()
2663 return prepare_read_control(con); in handle_preamble()
2666 return prepare_read_control_remainder(con); in handle_preamble()
2668 return __handle_control(con, CTRL_BODY(con->v2.in_buf)); in handle_preamble()
2671 static int handle_control(struct ceph_connection *con) in handle_control() argument
2673 int ctrl_len = con->v2.in_desc.fd_lens[0]; in handle_control()
2677 WARN_ON(con_secure(con)); in handle_control()
2679 ret = verify_control_crc(con); in handle_control()
2681 con->error_msg = "integrity error, bad crc"; in handle_control()
2685 if (con->state == CEPH_CON_S_V2_AUTH) { in handle_control()
2686 buf = alloc_conn_buf(con, ctrl_len); in handle_control()
2690 memcpy(buf, con->v2.in_kvecs[0].iov_base, ctrl_len); in handle_control()
2691 return __handle_control(con, buf); in handle_control()
2694 return __handle_control(con, con->v2.in_kvecs[0].iov_base); in handle_control()
2697 static int handle_control_remainder(struct ceph_connection *con) in handle_control_remainder() argument
2701 WARN_ON(!con_secure(con)); in handle_control_remainder()
2703 ret = decrypt_control_remainder(con); in handle_control_remainder()
2706 con->error_msg = "integrity error, bad control remainder auth tag"; in handle_control_remainder()
2710 return __handle_control(con, con->v2.in_kvecs[0].iov_base - in handle_control_remainder()
2714 static int handle_epilogue(struct ceph_connection *con) in handle_epilogue() argument
2719 if (con_secure(con)) { in handle_epilogue()
2720 ret = decrypt_message(con); in handle_epilogue()
2723 con->error_msg = "integrity error, bad epilogue auth tag"; in handle_epilogue()
2728 ret = decode_epilogue(con->v2.in_buf, NULL, NULL, NULL); in handle_epilogue()
2730 con->error_msg = "protocol error, bad epilogue"; in handle_epilogue()
2734 ret = decode_epilogue(con->v2.in_buf, &front_crc, in handle_epilogue()
2737 con->error_msg = "protocol error, bad epilogue"; in handle_epilogue()
2741 ret = verify_epilogue_crcs(con, front_crc, middle_crc, in handle_epilogue()
2744 con->error_msg = "integrity error, bad crc"; in handle_epilogue()
2749 return process_message(con); in handle_epilogue()
2752 static void finish_skip(struct ceph_connection *con) in finish_skip() argument
2754 dout("%s con %p\n", __func__, con); in finish_skip()
2756 if (con_secure(con)) in finish_skip()
2757 gcm_inc_nonce(&con->v2.in_gcm_nonce); in finish_skip()
2759 __finish_skip(con); in finish_skip()
2762 static int populate_in_iter(struct ceph_connection *con) in populate_in_iter() argument
2766 dout("%s con %p state %d in_state %d\n", __func__, con, con->state, in populate_in_iter()
2767 con->v2.in_state); in populate_in_iter()
2768 WARN_ON(iov_iter_count(&con->v2.in_iter)); in populate_in_iter()
2770 if (con->state == CEPH_CON_S_V2_BANNER_PREFIX) { in populate_in_iter()
2771 ret = process_banner_prefix(con); in populate_in_iter()
2772 } else if (con->state == CEPH_CON_S_V2_BANNER_PAYLOAD) { in populate_in_iter()
2773 ret = process_banner_payload(con); in populate_in_iter()
2774 } else if ((con->state >= CEPH_CON_S_V2_HELLO && in populate_in_iter()
2775 con->state <= CEPH_CON_S_V2_SESSION_RECONNECT) || in populate_in_iter()
2776 con->state == CEPH_CON_S_OPEN) { in populate_in_iter()
2777 switch (con->v2.in_state) { in populate_in_iter()
2779 ret = handle_preamble(con); in populate_in_iter()
2782 ret = handle_control(con); in populate_in_iter()
2785 ret = handle_control_remainder(con); in populate_in_iter()
2788 prepare_read_data(con); in populate_in_iter()
2792 prepare_read_data_cont(con); in populate_in_iter()
2796 ret = handle_epilogue(con); in populate_in_iter()
2799 finish_skip(con); in populate_in_iter()
2803 WARN(1, "bad in_state %d", con->v2.in_state); in populate_in_iter()
2807 WARN(1, "bad state %d", con->state); in populate_in_iter()
2811 dout("%s con %p error %d\n", __func__, con, ret); in populate_in_iter()
2815 if (WARN_ON(!iov_iter_count(&con->v2.in_iter))) in populate_in_iter()
2817 dout("%s con %p populated %zu\n", __func__, con, in populate_in_iter()
2818 iov_iter_count(&con->v2.in_iter)); in populate_in_iter()
2822 int ceph_con_v2_try_read(struct ceph_connection *con) in ceph_con_v2_try_read() argument
2826 dout("%s con %p state %d need %zu\n", __func__, con, con->state, in ceph_con_v2_try_read()
2827 iov_iter_count(&con->v2.in_iter)); in ceph_con_v2_try_read()
2829 if (con->state == CEPH_CON_S_PREOPEN) in ceph_con_v2_try_read()
2837 if (WARN_ON(!iov_iter_count(&con->v2.in_iter))) in ceph_con_v2_try_read()
2841 ret = ceph_tcp_recv(con); in ceph_con_v2_try_read()
2845 ret = populate_in_iter(con); in ceph_con_v2_try_read()
2847 if (ret && ret != -EAGAIN && !con->error_msg) in ceph_con_v2_try_read()
2848 con->error_msg = "read processing error"; in ceph_con_v2_try_read()
2854 static void queue_data(struct ceph_connection *con) in queue_data() argument
2858 con->v2.out_epil.data_crc = -1; in queue_data()
2859 ceph_msg_data_cursor_init(&con->v2.out_cursor, con->out_msg, in queue_data()
2860 data_len(con->out_msg)); in queue_data()
2862 get_bvec_at(&con->v2.out_cursor, &bv); in queue_data()
2863 set_out_bvec(con, &bv, true); in queue_data()
2864 con->v2.out_state = OUT_S_QUEUE_DATA_CONT; in queue_data()
2867 static void queue_data_cont(struct ceph_connection *con) in queue_data_cont() argument
2871 con->v2.out_epil.data_crc = ceph_crc32c_page( in queue_data_cont()
2872 con->v2.out_epil.data_crc, con->v2.out_bvec.bv_page, in queue_data_cont()
2873 con->v2.out_bvec.bv_offset, con->v2.out_bvec.bv_len); in queue_data_cont()
2875 ceph_msg_data_advance(&con->v2.out_cursor, con->v2.out_bvec.bv_len); in queue_data_cont()
2876 if (con->v2.out_cursor.total_resid) { in queue_data_cont()
2877 get_bvec_at(&con->v2.out_cursor, &bv); in queue_data_cont()
2878 set_out_bvec(con, &bv, true); in queue_data_cont()
2879 WARN_ON(con->v2.out_state != OUT_S_QUEUE_DATA_CONT); in queue_data_cont()
2887 reset_out_kvecs(con); in queue_data_cont()
2888 prepare_epilogue_plain(con, false); in queue_data_cont()
2889 con->v2.out_state = OUT_S_FINISH_MESSAGE; in queue_data_cont()
2892 static void queue_enc_page(struct ceph_connection *con) in queue_enc_page() argument
2896 dout("%s con %p i %d resid %d\n", __func__, con, con->v2.out_enc_i, in queue_enc_page()
2897 con->v2.out_enc_resid); in queue_enc_page()
2898 WARN_ON(!con->v2.out_enc_resid); in queue_enc_page()
2900 bv.bv_page = con->v2.out_enc_pages[con->v2.out_enc_i]; in queue_enc_page()
2902 bv.bv_len = min(con->v2.out_enc_resid, (int)PAGE_SIZE); in queue_enc_page()
2904 set_out_bvec(con, &bv, false); in queue_enc_page()
2905 con->v2.out_enc_i++; in queue_enc_page()
2906 con->v2.out_enc_resid -= bv.bv_len; in queue_enc_page()
2908 if (con->v2.out_enc_resid) { in queue_enc_page()
2909 WARN_ON(con->v2.out_state != OUT_S_QUEUE_ENC_PAGE); in queue_enc_page()
2917 WARN_ON(con->v2.out_enc_i != con->v2.out_enc_page_cnt); in queue_enc_page()
2918 con->v2.out_state = OUT_S_FINISH_MESSAGE; in queue_enc_page()
2921 static void queue_zeros(struct ceph_connection *con) in queue_zeros() argument
2923 dout("%s con %p out_zero %d\n", __func__, con, con->v2.out_zero); in queue_zeros()
2925 if (con->v2.out_zero) { in queue_zeros()
2926 set_out_bvec_zero(con); in queue_zeros()
2927 con->v2.out_zero -= con->v2.out_bvec.bv_len; in queue_zeros()
2928 con->v2.out_state = OUT_S_QUEUE_ZEROS; in queue_zeros()
2937 reset_out_kvecs(con); in queue_zeros()
2938 prepare_epilogue_plain(con, true); in queue_zeros()
2939 con->v2.out_state = OUT_S_FINISH_MESSAGE; in queue_zeros()
2942 static void finish_message(struct ceph_connection *con) in finish_message() argument
2944 dout("%s con %p msg %p\n", __func__, con, con->out_msg); in finish_message()
2947 if (con->v2.out_enc_pages) { in finish_message()
2948 WARN_ON(!con->v2.out_enc_page_cnt); in finish_message()
2949 ceph_release_page_vector(con->v2.out_enc_pages, in finish_message()
2950 con->v2.out_enc_page_cnt); in finish_message()
2951 con->v2.out_enc_pages = NULL; in finish_message()
2952 con->v2.out_enc_page_cnt = 0; in finish_message()
2955 if (con->out_msg) { in finish_message()
2956 ceph_msg_put(con->out_msg); in finish_message()
2957 con->out_msg = NULL; in finish_message()
2960 con->v2.out_state = OUT_S_GET_NEXT; in finish_message()
2963 static int populate_out_iter(struct ceph_connection *con) in populate_out_iter() argument
2967 dout("%s con %p state %d out_state %d\n", __func__, con, con->state, in populate_out_iter()
2968 con->v2.out_state); in populate_out_iter()
2969 WARN_ON(iov_iter_count(&con->v2.out_iter)); in populate_out_iter()
2971 if (con->state != CEPH_CON_S_OPEN) { in populate_out_iter()
2972 WARN_ON(con->state < CEPH_CON_S_V2_BANNER_PREFIX || in populate_out_iter()
2973 con->state > CEPH_CON_S_V2_SESSION_RECONNECT); in populate_out_iter()
2977 switch (con->v2.out_state) { in populate_out_iter()
2979 WARN_ON(!con->out_msg); in populate_out_iter()
2980 queue_data(con); in populate_out_iter()
2983 WARN_ON(!con->out_msg); in populate_out_iter()
2984 queue_data_cont(con); in populate_out_iter()
2987 queue_enc_page(con); in populate_out_iter()
2990 WARN_ON(con->out_msg); /* revoked */ in populate_out_iter()
2991 queue_zeros(con); in populate_out_iter()
2994 finish_message(con); in populate_out_iter()
2999 WARN(1, "bad out_state %d", con->v2.out_state); in populate_out_iter()
3003 WARN_ON(con->v2.out_state != OUT_S_GET_NEXT); in populate_out_iter()
3004 if (ceph_con_flag_test_and_clear(con, CEPH_CON_F_KEEPALIVE_PENDING)) { in populate_out_iter()
3005 ret = prepare_keepalive2(con); in populate_out_iter()
3010 } else if (!list_empty(&con->out_queue)) { in populate_out_iter()
3011 ceph_con_get_out_msg(con); in populate_out_iter()
3012 ret = prepare_message(con); in populate_out_iter()
3017 } else if (con->in_seq > con->in_seq_acked) { in populate_out_iter()
3018 ret = prepare_ack(con); in populate_out_iter()
3028 if (WARN_ON(!iov_iter_count(&con->v2.out_iter))) in populate_out_iter()
3030 dout("%s con %p populated %zu\n", __func__, con, in populate_out_iter()
3031 iov_iter_count(&con->v2.out_iter)); in populate_out_iter()
3035 WARN_ON(iov_iter_count(&con->v2.out_iter)); in populate_out_iter()
3036 dout("%s con %p nothing pending\n", __func__, con); in populate_out_iter()
3037 ceph_con_flag_clear(con, CEPH_CON_F_WRITE_PENDING); in populate_out_iter()
3041 int ceph_con_v2_try_write(struct ceph_connection *con) in ceph_con_v2_try_write() argument
3045 dout("%s con %p state %d have %zu\n", __func__, con, con->state, in ceph_con_v2_try_write()
3046 iov_iter_count(&con->v2.out_iter)); in ceph_con_v2_try_write()
3049 if (con->state == CEPH_CON_S_PREOPEN) { in ceph_con_v2_try_write()
3050 WARN_ON(con->peer_addr.type != CEPH_ENTITY_ADDR_TYPE_MSGR2); in ceph_con_v2_try_write()
3057 con->v2.global_seq = ceph_get_global_seq(con->msgr, 0); in ceph_con_v2_try_write()
3058 if (con->v2.server_cookie) in ceph_con_v2_try_write()
3059 con->v2.connect_seq++; in ceph_con_v2_try_write()
3061 ret = prepare_read_banner_prefix(con); in ceph_con_v2_try_write()
3064 con->error_msg = "connect error"; in ceph_con_v2_try_write()
3068 reset_out_kvecs(con); in ceph_con_v2_try_write()
3069 ret = prepare_banner(con); in ceph_con_v2_try_write()
3072 con->error_msg = "connect error"; in ceph_con_v2_try_write()
3076 ret = ceph_tcp_connect(con); in ceph_con_v2_try_write()
3079 con->error_msg = "connect error"; in ceph_con_v2_try_write()
3084 if (!iov_iter_count(&con->v2.out_iter)) { in ceph_con_v2_try_write()
3085 ret = populate_out_iter(con); in ceph_con_v2_try_write()
3087 if (ret && ret != -EAGAIN && !con->error_msg) in ceph_con_v2_try_write()
3088 con->error_msg = "write processing error"; in ceph_con_v2_try_write()
3093 tcp_sock_set_cork(con->sock->sk, true); in ceph_con_v2_try_write()
3095 ret = ceph_tcp_send(con); in ceph_con_v2_try_write()
3099 ret = populate_out_iter(con); in ceph_con_v2_try_write()
3101 if (ret && ret != -EAGAIN && !con->error_msg) in ceph_con_v2_try_write()
3102 con->error_msg = "write processing error"; in ceph_con_v2_try_write()
3107 tcp_sock_set_cork(con->sock->sk, false); in ceph_con_v2_try_write()
3124 static void prepare_zero_front(struct ceph_connection *con, int resid) in prepare_zero_front() argument
3128 WARN_ON(!resid || resid > front_len(con->out_msg)); in prepare_zero_front()
3129 sent = front_len(con->out_msg) - resid; in prepare_zero_front()
3130 dout("%s con %p sent %d resid %d\n", __func__, con, sent, resid); in prepare_zero_front()
3133 con->v2.out_epil.front_crc = in prepare_zero_front()
3134 crc32c(-1, con->out_msg->front.iov_base, sent); in prepare_zero_front()
3135 con->v2.out_epil.front_crc = in prepare_zero_front()
3136 crc32c_zeros(con->v2.out_epil.front_crc, resid); in prepare_zero_front()
3138 con->v2.out_epil.front_crc = crc32c_zeros(-1, resid); in prepare_zero_front()
3141 con->v2.out_iter.count -= resid; in prepare_zero_front()
3142 out_zero_add(con, resid); in prepare_zero_front()
3145 static void prepare_zero_middle(struct ceph_connection *con, int resid) in prepare_zero_middle() argument
3149 WARN_ON(!resid || resid > middle_len(con->out_msg)); in prepare_zero_middle()
3150 sent = middle_len(con->out_msg) - resid; in prepare_zero_middle()
3151 dout("%s con %p sent %d resid %d\n", __func__, con, sent, resid); in prepare_zero_middle()
3154 con->v2.out_epil.middle_crc = in prepare_zero_middle()
3155 crc32c(-1, con->out_msg->middle->vec.iov_base, sent); in prepare_zero_middle()
3156 con->v2.out_epil.middle_crc = in prepare_zero_middle()
3157 crc32c_zeros(con->v2.out_epil.middle_crc, resid); in prepare_zero_middle()
3159 con->v2.out_epil.middle_crc = crc32c_zeros(-1, resid); in prepare_zero_middle()
3162 con->v2.out_iter.count -= resid; in prepare_zero_middle()
3163 out_zero_add(con, resid); in prepare_zero_middle()
3166 static void prepare_zero_data(struct ceph_connection *con) in prepare_zero_data() argument
3168 dout("%s con %p\n", __func__, con); in prepare_zero_data()
3169 con->v2.out_epil.data_crc = crc32c_zeros(-1, data_len(con->out_msg)); in prepare_zero_data()
3170 out_zero_add(con, data_len(con->out_msg)); in prepare_zero_data()
3173 static void revoke_at_queue_data(struct ceph_connection *con) in revoke_at_queue_data() argument
3178 WARN_ON(!data_len(con->out_msg)); in revoke_at_queue_data()
3179 WARN_ON(!iov_iter_is_kvec(&con->v2.out_iter)); in revoke_at_queue_data()
3180 resid = iov_iter_count(&con->v2.out_iter); in revoke_at_queue_data()
3182 boundary = front_len(con->out_msg) + middle_len(con->out_msg); in revoke_at_queue_data()
3186 dout("%s con %p was sending head\n", __func__, con); in revoke_at_queue_data()
3187 if (front_len(con->out_msg)) in revoke_at_queue_data()
3188 prepare_zero_front(con, front_len(con->out_msg)); in revoke_at_queue_data()
3189 if (middle_len(con->out_msg)) in revoke_at_queue_data()
3190 prepare_zero_middle(con, middle_len(con->out_msg)); in revoke_at_queue_data()
3191 prepare_zero_data(con); in revoke_at_queue_data()
3192 WARN_ON(iov_iter_count(&con->v2.out_iter) != resid); in revoke_at_queue_data()
3193 con->v2.out_state = OUT_S_QUEUE_ZEROS; in revoke_at_queue_data()
3197 boundary = middle_len(con->out_msg); in revoke_at_queue_data()
3200 dout("%s con %p was sending front\n", __func__, con); in revoke_at_queue_data()
3201 prepare_zero_front(con, resid); in revoke_at_queue_data()
3202 if (middle_len(con->out_msg)) in revoke_at_queue_data()
3203 prepare_zero_middle(con, middle_len(con->out_msg)); in revoke_at_queue_data()
3204 prepare_zero_data(con); in revoke_at_queue_data()
3205 queue_zeros(con); in revoke_at_queue_data()
3210 dout("%s con %p was sending middle\n", __func__, con); in revoke_at_queue_data()
3211 prepare_zero_middle(con, resid); in revoke_at_queue_data()
3212 prepare_zero_data(con); in revoke_at_queue_data()
3213 queue_zeros(con); in revoke_at_queue_data()
3216 static void revoke_at_queue_data_cont(struct ceph_connection *con) in revoke_at_queue_data_cont() argument
3220 WARN_ON(!data_len(con->out_msg)); in revoke_at_queue_data_cont()
3221 WARN_ON(!iov_iter_is_bvec(&con->v2.out_iter)); in revoke_at_queue_data_cont()
3222 resid = iov_iter_count(&con->v2.out_iter); in revoke_at_queue_data_cont()
3223 WARN_ON(!resid || resid > con->v2.out_bvec.bv_len); in revoke_at_queue_data_cont()
3224 sent = con->v2.out_bvec.bv_len - resid; in revoke_at_queue_data_cont()
3225 dout("%s con %p sent %d resid %d\n", __func__, con, sent, resid); in revoke_at_queue_data_cont()
3228 con->v2.out_epil.data_crc = ceph_crc32c_page( in revoke_at_queue_data_cont()
3229 con->v2.out_epil.data_crc, con->v2.out_bvec.bv_page, in revoke_at_queue_data_cont()
3230 con->v2.out_bvec.bv_offset, sent); in revoke_at_queue_data_cont()
3231 ceph_msg_data_advance(&con->v2.out_cursor, sent); in revoke_at_queue_data_cont()
3233 WARN_ON(resid > con->v2.out_cursor.total_resid); in revoke_at_queue_data_cont()
3234 con->v2.out_epil.data_crc = crc32c_zeros(con->v2.out_epil.data_crc, in revoke_at_queue_data_cont()
3235 con->v2.out_cursor.total_resid); in revoke_at_queue_data_cont()
3237 con->v2.out_iter.count -= resid; in revoke_at_queue_data_cont()
3238 out_zero_add(con, con->v2.out_cursor.total_resid); in revoke_at_queue_data_cont()
3239 queue_zeros(con); in revoke_at_queue_data_cont()
3242 static void revoke_at_finish_message(struct ceph_connection *con) in revoke_at_finish_message() argument
3247 WARN_ON(!iov_iter_is_kvec(&con->v2.out_iter)); in revoke_at_finish_message()
3248 resid = iov_iter_count(&con->v2.out_iter); in revoke_at_finish_message()
3250 if (!front_len(con->out_msg) && !middle_len(con->out_msg) && in revoke_at_finish_message()
3251 !data_len(con->out_msg)) { in revoke_at_finish_message()
3254 __func__, con); in revoke_at_finish_message()
3258 boundary = front_len(con->out_msg) + middle_len(con->out_msg) + in revoke_at_finish_message()
3263 dout("%s con %p was sending head\n", __func__, con); in revoke_at_finish_message()
3264 if (front_len(con->out_msg)) in revoke_at_finish_message()
3265 prepare_zero_front(con, front_len(con->out_msg)); in revoke_at_finish_message()
3266 if (middle_len(con->out_msg)) in revoke_at_finish_message()
3267 prepare_zero_middle(con, middle_len(con->out_msg)); in revoke_at_finish_message()
3268 con->v2.out_iter.count -= CEPH_EPILOGUE_PLAIN_LEN; in revoke_at_finish_message()
3269 WARN_ON(iov_iter_count(&con->v2.out_iter) != resid); in revoke_at_finish_message()
3270 con->v2.out_state = OUT_S_QUEUE_ZEROS; in revoke_at_finish_message()
3274 boundary = middle_len(con->out_msg) + CEPH_EPILOGUE_PLAIN_LEN; in revoke_at_finish_message()
3277 dout("%s con %p was sending front\n", __func__, con); in revoke_at_finish_message()
3278 prepare_zero_front(con, resid); in revoke_at_finish_message()
3279 if (middle_len(con->out_msg)) in revoke_at_finish_message()
3280 prepare_zero_middle(con, middle_len(con->out_msg)); in revoke_at_finish_message()
3281 con->v2.out_iter.count -= CEPH_EPILOGUE_PLAIN_LEN; in revoke_at_finish_message()
3282 queue_zeros(con); in revoke_at_finish_message()
3289 dout("%s con %p was sending middle\n", __func__, con); in revoke_at_finish_message()
3290 prepare_zero_middle(con, resid); in revoke_at_finish_message()
3291 con->v2.out_iter.count -= CEPH_EPILOGUE_PLAIN_LEN; in revoke_at_finish_message()
3292 queue_zeros(con); in revoke_at_finish_message()
3297 dout("%s con %p was sending epilogue - noop\n", __func__, con); in revoke_at_finish_message()
3300 void ceph_con_v2_revoke(struct ceph_connection *con) in ceph_con_v2_revoke() argument
3302 WARN_ON(con->v2.out_zero); in ceph_con_v2_revoke()
3304 if (con_secure(con)) { in ceph_con_v2_revoke()
3305 WARN_ON(con->v2.out_state != OUT_S_QUEUE_ENC_PAGE && in ceph_con_v2_revoke()
3306 con->v2.out_state != OUT_S_FINISH_MESSAGE); in ceph_con_v2_revoke()
3307 dout("%s con %p secure - noop\n", __func__, con); in ceph_con_v2_revoke()
3311 switch (con->v2.out_state) { in ceph_con_v2_revoke()
3313 revoke_at_queue_data(con); in ceph_con_v2_revoke()
3316 revoke_at_queue_data_cont(con); in ceph_con_v2_revoke()
3319 revoke_at_finish_message(con); in ceph_con_v2_revoke()
3322 WARN(1, "bad out_state %d", con->v2.out_state); in ceph_con_v2_revoke()
3327 static void revoke_at_prepare_read_data(struct ceph_connection *con) in revoke_at_prepare_read_data() argument
3332 WARN_ON(!data_len(con->in_msg)); in revoke_at_prepare_read_data()
3333 WARN_ON(!iov_iter_is_kvec(&con->v2.in_iter)); in revoke_at_prepare_read_data()
3334 resid = iov_iter_count(&con->v2.in_iter); in revoke_at_prepare_read_data()
3337 if (con_secure(con)) in revoke_at_prepare_read_data()
3338 remaining = padded_len(data_len(con->in_msg)) + in revoke_at_prepare_read_data()
3341 remaining = data_len(con->in_msg) + CEPH_EPILOGUE_PLAIN_LEN; in revoke_at_prepare_read_data()
3343 dout("%s con %p resid %d remaining %d\n", __func__, con, resid, in revoke_at_prepare_read_data()
3345 con->v2.in_iter.count -= resid; in revoke_at_prepare_read_data()
3346 set_in_skip(con, resid + remaining); in revoke_at_prepare_read_data()
3347 con->v2.in_state = IN_S_FINISH_SKIP; in revoke_at_prepare_read_data()
3350 static void revoke_at_prepare_read_data_cont(struct ceph_connection *con) in revoke_at_prepare_read_data_cont() argument
3355 WARN_ON(!data_len(con->in_msg)); in revoke_at_prepare_read_data_cont()
3356 WARN_ON(!iov_iter_is_bvec(&con->v2.in_iter)); in revoke_at_prepare_read_data_cont()
3357 resid = iov_iter_count(&con->v2.in_iter); in revoke_at_prepare_read_data_cont()
3358 WARN_ON(!resid || resid > con->v2.in_bvec.bv_len); in revoke_at_prepare_read_data_cont()
3359 recved = con->v2.in_bvec.bv_len - resid; in revoke_at_prepare_read_data_cont()
3360 dout("%s con %p recved %d resid %d\n", __func__, con, recved, resid); in revoke_at_prepare_read_data_cont()
3363 ceph_msg_data_advance(&con->v2.in_cursor, recved); in revoke_at_prepare_read_data_cont()
3364 WARN_ON(resid > con->v2.in_cursor.total_resid); in revoke_at_prepare_read_data_cont()
3366 if (con_secure(con)) in revoke_at_prepare_read_data_cont()
3367 remaining = padding_len(data_len(con->in_msg)) + in revoke_at_prepare_read_data_cont()
3372 dout("%s con %p total_resid %zu remaining %d\n", __func__, con, in revoke_at_prepare_read_data_cont()
3373 con->v2.in_cursor.total_resid, remaining); in revoke_at_prepare_read_data_cont()
3374 con->v2.in_iter.count -= resid; in revoke_at_prepare_read_data_cont()
3375 set_in_skip(con, con->v2.in_cursor.total_resid + remaining); in revoke_at_prepare_read_data_cont()
3376 con->v2.in_state = IN_S_FINISH_SKIP; in revoke_at_prepare_read_data_cont()
3379 static void revoke_at_handle_epilogue(struct ceph_connection *con) in revoke_at_handle_epilogue() argument
3383 WARN_ON(!iov_iter_is_kvec(&con->v2.in_iter)); in revoke_at_handle_epilogue()
3384 resid = iov_iter_count(&con->v2.in_iter); in revoke_at_handle_epilogue()
3387 dout("%s con %p resid %d\n", __func__, con, resid); in revoke_at_handle_epilogue()
3388 con->v2.in_iter.count -= resid; in revoke_at_handle_epilogue()
3389 set_in_skip(con, resid); in revoke_at_handle_epilogue()
3390 con->v2.in_state = IN_S_FINISH_SKIP; in revoke_at_handle_epilogue()
3393 void ceph_con_v2_revoke_incoming(struct ceph_connection *con) in ceph_con_v2_revoke_incoming() argument
3395 switch (con->v2.in_state) { in ceph_con_v2_revoke_incoming()
3397 revoke_at_prepare_read_data(con); in ceph_con_v2_revoke_incoming()
3400 revoke_at_prepare_read_data_cont(con); in ceph_con_v2_revoke_incoming()
3403 revoke_at_handle_epilogue(con); in ceph_con_v2_revoke_incoming()
3406 WARN(1, "bad in_state %d", con->v2.in_state); in ceph_con_v2_revoke_incoming()
3411 bool ceph_con_v2_opened(struct ceph_connection *con) in ceph_con_v2_opened() argument
3413 return con->v2.peer_global_seq; in ceph_con_v2_opened()
3416 void ceph_con_v2_reset_session(struct ceph_connection *con) in ceph_con_v2_reset_session() argument
3418 con->v2.client_cookie = 0; in ceph_con_v2_reset_session()
3419 con->v2.server_cookie = 0; in ceph_con_v2_reset_session()
3420 con->v2.global_seq = 0; in ceph_con_v2_reset_session()
3421 con->v2.connect_seq = 0; in ceph_con_v2_reset_session()
3422 con->v2.peer_global_seq = 0; in ceph_con_v2_reset_session()
3425 void ceph_con_v2_reset_protocol(struct ceph_connection *con) in ceph_con_v2_reset_protocol() argument
3427 iov_iter_truncate(&con->v2.in_iter, 0); in ceph_con_v2_reset_protocol()
3428 iov_iter_truncate(&con->v2.out_iter, 0); in ceph_con_v2_reset_protocol()
3429 con->v2.out_zero = 0; in ceph_con_v2_reset_protocol()
3431 clear_in_sign_kvecs(con); in ceph_con_v2_reset_protocol()
3432 clear_out_sign_kvecs(con); in ceph_con_v2_reset_protocol()
3433 free_conn_bufs(con); in ceph_con_v2_reset_protocol()
3435 if (con->v2.out_enc_pages) { in ceph_con_v2_reset_protocol()
3436 WARN_ON(!con->v2.out_enc_page_cnt); in ceph_con_v2_reset_protocol()
3437 ceph_release_page_vector(con->v2.out_enc_pages, in ceph_con_v2_reset_protocol()
3438 con->v2.out_enc_page_cnt); in ceph_con_v2_reset_protocol()
3439 con->v2.out_enc_pages = NULL; in ceph_con_v2_reset_protocol()
3440 con->v2.out_enc_page_cnt = 0; in ceph_con_v2_reset_protocol()
3443 con->v2.con_mode = CEPH_CON_MODE_UNKNOWN; in ceph_con_v2_reset_protocol()
3444 memzero_explicit(&con->v2.in_gcm_nonce, CEPH_GCM_IV_LEN); in ceph_con_v2_reset_protocol()
3445 memzero_explicit(&con->v2.out_gcm_nonce, CEPH_GCM_IV_LEN); in ceph_con_v2_reset_protocol()
3447 if (con->v2.hmac_tfm) { in ceph_con_v2_reset_protocol()
3448 crypto_free_shash(con->v2.hmac_tfm); in ceph_con_v2_reset_protocol()
3449 con->v2.hmac_tfm = NULL; in ceph_con_v2_reset_protocol()
3451 if (con->v2.gcm_req) { in ceph_con_v2_reset_protocol()
3452 aead_request_free(con->v2.gcm_req); in ceph_con_v2_reset_protocol()
3453 con->v2.gcm_req = NULL; in ceph_con_v2_reset_protocol()
3455 if (con->v2.gcm_tfm) { in ceph_con_v2_reset_protocol()
3456 crypto_free_aead(con->v2.gcm_tfm); in ceph_con_v2_reset_protocol()
3457 con->v2.gcm_tfm = NULL; in ceph_con_v2_reset_protocol()