Lines Matching refs:ioc
67 static int nbd_send_option_request(QIOChannel *ioc, uint32_t opt, in nbd_send_option_request() argument
84 if (nbd_write(ioc, &req, sizeof(req), errp) < 0) { in nbd_send_option_request()
89 if (len && nbd_write(ioc, (char *) data, len, errp) < 0) { in nbd_send_option_request()
99 static void nbd_send_opt_abort(QIOChannel *ioc) in nbd_send_opt_abort() argument
106 nbd_send_option_request(ioc, NBD_OPT_ABORT, 0, NULL, NULL); in nbd_send_opt_abort()
114 static int nbd_receive_option_reply(QIOChannel *ioc, uint32_t opt, in nbd_receive_option_reply() argument
118 if (nbd_read(ioc, reply, sizeof(*reply), "option reply", errp) < 0) { in nbd_receive_option_reply()
119 nbd_send_opt_abort(ioc); in nbd_receive_option_reply()
133 nbd_send_opt_abort(ioc); in nbd_receive_option_reply()
140 nbd_send_opt_abort(ioc); in nbd_receive_option_reply()
154 static int nbd_handle_reply_err(QIOChannel *ioc, NBDOptionReply *reply, in nbd_handle_reply_err() argument
172 if (nbd_read(ioc, msg, reply->length, NULL, errp) < 0) { in nbd_handle_reply_err()
237 nbd_send_opt_abort(ioc); in nbd_handle_reply_err()
250 static int nbd_receive_list(QIOChannel *ioc, char **name, char **description, in nbd_receive_list() argument
260 if (nbd_receive_option_reply(ioc, NBD_OPT_LIST, &reply, errp) < 0) { in nbd_receive_list()
263 error = nbd_handle_reply_err(ioc, &reply, true, errp); in nbd_receive_list()
272 nbd_send_opt_abort(ioc); in nbd_receive_list()
280 nbd_send_opt_abort(ioc); in nbd_receive_list()
286 nbd_send_opt_abort(ioc); in nbd_receive_list()
289 if (nbd_read32(ioc, &namelen, "option name length", errp) < 0) { in nbd_receive_list()
290 nbd_send_opt_abort(ioc); in nbd_receive_list()
296 nbd_send_opt_abort(ioc); in nbd_receive_list()
301 if (nbd_read(ioc, local_name, namelen, "export name", errp) < 0) { in nbd_receive_list()
302 nbd_send_opt_abort(ioc); in nbd_receive_list()
311 nbd_send_opt_abort(ioc); in nbd_receive_list()
315 if (nbd_read(ioc, local_desc, len, "export description", errp) < 0) { in nbd_receive_list()
316 nbd_send_opt_abort(ioc); in nbd_receive_list()
339 static int nbd_opt_info_or_go(QIOChannel *ioc, uint32_t opt, in nbd_opt_info_or_go() argument
364 error = nbd_send_option_request(ioc, opt, in nbd_opt_info_or_go()
373 if (nbd_receive_option_reply(ioc, opt, &reply, errp) < 0) { in nbd_opt_info_or_go()
376 error = nbd_handle_reply_err(ioc, &reply, true, errp); in nbd_opt_info_or_go()
402 nbd_send_opt_abort(ioc); in nbd_opt_info_or_go()
408 nbd_send_opt_abort(ioc); in nbd_opt_info_or_go()
411 if (nbd_read16(ioc, &type, "info type", errp) < 0) { in nbd_opt_info_or_go()
412 nbd_send_opt_abort(ioc); in nbd_opt_info_or_go()
421 nbd_send_opt_abort(ioc); in nbd_opt_info_or_go()
424 if (nbd_read64(ioc, &info->size, "info size", errp) < 0) { in nbd_opt_info_or_go()
425 nbd_send_opt_abort(ioc); in nbd_opt_info_or_go()
428 if (nbd_read16(ioc, &info->flags, "info flags", errp) < 0) { in nbd_opt_info_or_go()
429 nbd_send_opt_abort(ioc); in nbd_opt_info_or_go()
437 nbd_send_opt_abort(ioc); in nbd_opt_info_or_go()
447 nbd_send_opt_abort(ioc); in nbd_opt_info_or_go()
450 if (nbd_read32(ioc, &info->min_block, "info minimum block size", in nbd_opt_info_or_go()
452 nbd_send_opt_abort(ioc); in nbd_opt_info_or_go()
458 nbd_send_opt_abort(ioc); in nbd_opt_info_or_go()
461 if (nbd_read32(ioc, &info->opt_block, "info preferred block size", in nbd_opt_info_or_go()
464 nbd_send_opt_abort(ioc); in nbd_opt_info_or_go()
471 nbd_send_opt_abort(ioc); in nbd_opt_info_or_go()
474 if (nbd_read32(ioc, &info->max_block, "info maximum block size", in nbd_opt_info_or_go()
477 nbd_send_opt_abort(ioc); in nbd_opt_info_or_go()
483 nbd_send_opt_abort(ioc); in nbd_opt_info_or_go()
496 if (nbd_drop(ioc, len, errp) < 0) { in nbd_opt_info_or_go()
498 nbd_send_opt_abort(ioc); in nbd_opt_info_or_go()
507 static int nbd_receive_query_exports(QIOChannel *ioc, in nbd_receive_query_exports() argument
515 if (nbd_send_option_request(ioc, NBD_OPT_LIST, 0, NULL, errp) < 0) { in nbd_receive_query_exports()
521 int ret = nbd_receive_list(ioc, &name, NULL, errp); in nbd_receive_query_exports()
541 nbd_send_opt_abort(ioc); in nbd_receive_query_exports()
562 static int nbd_request_simple_option(QIOChannel *ioc, int opt, bool strict, in nbd_request_simple_option() argument
568 if (nbd_send_option_request(ioc, opt, 0, NULL, errp) < 0) { in nbd_request_simple_option()
572 if (nbd_receive_option_reply(ioc, opt, &reply, errp) < 0) { in nbd_request_simple_option()
575 error = nbd_handle_reply_err(ioc, &reply, strict, errp); in nbd_request_simple_option()
584 nbd_send_opt_abort(ioc); in nbd_request_simple_option()
592 nbd_send_opt_abort(ioc); in nbd_request_simple_option()
617 static QIOChannel *nbd_receive_starttls(QIOChannel *ioc, in nbd_receive_starttls() argument
625 ret = nbd_request_simple_option(ioc, NBD_OPT_STARTTLS, true, errp); in nbd_receive_starttls()
629 nbd_send_opt_abort(ioc); in nbd_receive_starttls()
635 tioc = qio_channel_tls_new_client(ioc, tlscreds, hostname, errp); in nbd_receive_starttls()
668 static int nbd_send_meta_query(QIOChannel *ioc, uint32_t opt, in nbd_send_meta_query() argument
701 ret = nbd_send_option_request(ioc, opt, data_len, data, errp); in nbd_send_meta_query()
715 static int nbd_receive_one_meta_context(QIOChannel *ioc, in nbd_receive_one_meta_context() argument
726 if (nbd_receive_option_reply(ioc, opt, &reply, errp) < 0) { in nbd_receive_one_meta_context()
730 ret = nbd_handle_reply_err(ioc, &reply, false, errp); in nbd_receive_one_meta_context()
738 nbd_send_opt_abort(ioc); in nbd_receive_one_meta_context()
746 nbd_send_opt_abort(ioc); in nbd_receive_one_meta_context()
755 nbd_send_opt_abort(ioc); in nbd_receive_one_meta_context()
759 if (nbd_read32(ioc, &local_id, "context id", errp) < 0) { in nbd_receive_one_meta_context()
765 if (nbd_read(ioc, local_name, reply.length, "context name", errp) < 0) { in nbd_receive_one_meta_context()
794 static int nbd_negotiate_simple_meta_context(QIOChannel *ioc, in nbd_negotiate_simple_meta_context() argument
809 if (nbd_send_meta_query(ioc, NBD_OPT_SET_META_CONTEXT, in nbd_negotiate_simple_meta_context()
814 ret = nbd_receive_one_meta_context(ioc, NBD_OPT_SET_META_CONTEXT, in nbd_negotiate_simple_meta_context()
825 nbd_send_opt_abort(ioc); in nbd_negotiate_simple_meta_context()
831 ret = nbd_receive_one_meta_context(ioc, NBD_OPT_SET_META_CONTEXT, in nbd_negotiate_simple_meta_context()
839 nbd_send_opt_abort(ioc); in nbd_negotiate_simple_meta_context()
851 static int nbd_list_meta_contexts(QIOChannel *ioc, in nbd_list_meta_contexts() argument
859 if (nbd_send_meta_query(ioc, NBD_OPT_LIST_META_CONTEXT, in nbd_list_meta_contexts()
867 ret = nbd_receive_one_meta_context(ioc, NBD_OPT_LIST_META_CONTEXT, in nbd_list_meta_contexts()
877 if (nbd_send_meta_query(ioc, NBD_OPT_LIST_META_CONTEXT, in nbd_list_meta_contexts()
900 static int nbd_start_negotiate(QIOChannel *ioc, QCryptoTLSCreds *tlscreds, in nbd_start_negotiate() argument
921 if (nbd_read64(ioc, &magic, "initial magic", errp) < 0) { in nbd_start_negotiate()
931 if (nbd_read64(ioc, &magic, "server magic", errp) < 0) { in nbd_start_negotiate()
941 if (nbd_read16(ioc, &globalflags, "server flags", errp) < 0) { in nbd_start_negotiate()
957 if (nbd_write(ioc, &clientflags, sizeof(clientflags), errp) < 0) { in nbd_start_negotiate()
963 *outioc = nbd_receive_starttls(ioc, tlscreds, hostname, errp); in nbd_start_negotiate()
967 ioc = *outioc; in nbd_start_negotiate()
977 result = nbd_request_simple_option(ioc, in nbd_start_negotiate()
985 result = nbd_request_simple_option(ioc, in nbd_start_negotiate()
1014 static int nbd_negotiate_finish_oldstyle(QIOChannel *ioc, NBDExportInfo *info, in nbd_negotiate_finish_oldstyle() argument
1019 if (nbd_read64(ioc, &info->size, "export length", errp) < 0) { in nbd_negotiate_finish_oldstyle()
1023 if (nbd_read32(ioc, &oldflags, "export flags", errp) < 0) { in nbd_negotiate_finish_oldstyle()
1040 int nbd_receive_negotiate(QIOChannel *ioc, QCryptoTLSCreds *tlscreds, in nbd_receive_negotiate() argument
1052 result = nbd_start_negotiate(ioc, tlscreds, hostname, outioc, in nbd_receive_negotiate()
1061 ioc = *outioc; in nbd_receive_negotiate()
1068 result = nbd_negotiate_simple_meta_context(ioc, info, errp); in nbd_receive_negotiate()
1081 result = nbd_opt_info_or_go(ioc, NBD_OPT_GO, info, errp); in nbd_receive_negotiate()
1094 if (nbd_receive_query_exports(ioc, info->name, errp) < 0) { in nbd_receive_negotiate()
1100 if (nbd_send_option_request(ioc, NBD_OPT_EXPORT_NAME, -1, info->name, in nbd_receive_negotiate()
1106 if (nbd_read64(ioc, &info->size, "export length", errp) < 0) { in nbd_receive_negotiate()
1110 if (nbd_read16(ioc, &info->flags, "export flags", errp) < 0) { in nbd_receive_negotiate()
1119 if (nbd_negotiate_finish_oldstyle(ioc, info, errp) < 0) { in nbd_receive_negotiate()
1128 if (zeroes && nbd_drop(ioc, 124, errp) < 0) { in nbd_receive_negotiate()
1162 int nbd_receive_export_list(QIOChannel *ioc, QCryptoTLSCreds *tlscreds, in nbd_receive_export_list() argument
1175 result = nbd_start_negotiate(ioc, tlscreds, hostname, &sioc, in nbd_receive_export_list()
1178 ioc = sioc; in nbd_receive_export_list()
1191 if (nbd_send_option_request(ioc, NBD_OPT_LIST, 0, NULL, errp) < 0) { in nbd_receive_export_list()
1198 rc = nbd_receive_list(ioc, &name, &desc, errp); in nbd_receive_export_list()
1213 rc = nbd_opt_info_or_go(ioc, NBD_OPT_INFO, &array[i], errp); in nbd_receive_export_list()
1225 nbd_list_meta_contexts(ioc, &array[i], errp) < 0) { in nbd_receive_export_list()
1231 nbd_send_opt_abort(ioc); in nbd_receive_export_list()
1244 if (nbd_negotiate_finish_oldstyle(ioc, array, errp) < 0) { in nbd_receive_export_list()
1250 if (nbd_drop(ioc, 124, NULL) == 0) { in nbd_receive_export_list()
1253 nbd_send_request(ioc, &request); in nbd_receive_export_list()
1265 qio_channel_shutdown(ioc, QIO_CHANNEL_SHUTDOWN_BOTH, NULL); in nbd_receive_export_list()
1266 qio_channel_close(ioc, NULL); in nbd_receive_export_list()
1377 int nbd_send_request(QIOChannel *ioc, NBDRequest *request) in nbd_send_request() argument
1401 return nbd_write(ioc, buf, len, NULL); in nbd_send_request()
1409 static int nbd_receive_simple_reply(QIOChannel *ioc, NBDSimpleReply *reply, in nbd_receive_simple_reply() argument
1416 ret = nbd_read(ioc, (uint8_t *)reply + sizeof(reply->magic), in nbd_receive_simple_reply()
1433 static int nbd_receive_reply_chunk_header(QIOChannel *ioc, NBDReply *chunk, in nbd_receive_reply_chunk_header() argument
1447 ret = nbd_read(ioc, (uint8_t *)chunk + sizeof(chunk->magic), in nbd_receive_reply_chunk_header()
1490 nbd_read_eof(BlockDriverState *bs, QIOChannel *ioc, void *buffer, size_t size, in nbd_read_eof() argument
1500 len = qio_channel_readv(ioc, &iov, 1, errp); in nbd_read_eof()
1502 qio_channel_yield(ioc, G_IO_IN); in nbd_read_eof()
1534 int coroutine_fn nbd_receive_reply(BlockDriverState *bs, QIOChannel *ioc, in nbd_receive_reply() argument
1541 ret = nbd_read_eof(bs, ioc, &reply->magic, sizeof(reply->magic), errp); in nbd_receive_reply()
1555 ret = nbd_receive_simple_reply(ioc, &reply->simple, errp); in nbd_receive_reply()
1571 ret = nbd_receive_reply_chunk_header(ioc, reply, errp); in nbd_receive_reply()