1 /* 2 * Copyright (C) 2016-2018 Red Hat, Inc. 3 * Copyright (C) 2005 Anthony Liguori <anthony@codemonkey.ws> 4 * 5 * Network Block Device Client Side 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; under version 2 of the License. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, see <http://www.gnu.org/licenses/>. 18 */ 19 20 #include "qemu/osdep.h" 21 #include "qapi/error.h" 22 #include "trace.h" 23 #include "nbd-internal.h" 24 #include "qemu/cutils.h" 25 26 /* Definitions for opaque data types */ 27 28 static QTAILQ_HEAD(, NBDExport) exports = QTAILQ_HEAD_INITIALIZER(exports); 29 30 /* That's all folks */ 31 32 /* Basic flow for negotiation 33 34 Server Client 35 Negotiate 36 37 or 38 39 Server Client 40 Negotiate #1 41 Option 42 Negotiate #2 43 44 ---- 45 46 followed by 47 48 Server Client 49 Request 50 Response 51 Request 52 Response 53 ... 54 ... 55 Request (type == 2) 56 57 */ 58 59 /* Send an option request. 60 * 61 * The request is for option @opt, with @data containing @len bytes of 62 * additional payload for the request (@len may be -1 to treat @data as 63 * a C string; and @data may be NULL if @len is 0). 64 * Return 0 if successful, -1 with errp set if it is impossible to 65 * continue. */ 66 static int nbd_send_option_request(QIOChannel *ioc, uint32_t opt, 67 uint32_t len, const char *data, 68 Error **errp) 69 { 70 NBDOption req; 71 QEMU_BUILD_BUG_ON(sizeof(req) != 16); 72 73 if (len == -1) { 74 req.length = len = strlen(data); 75 } 76 trace_nbd_send_option_request(opt, nbd_opt_lookup(opt), len); 77 78 stq_be_p(&req.magic, NBD_OPTS_MAGIC); 79 stl_be_p(&req.option, opt); 80 stl_be_p(&req.length, len); 81 82 if (nbd_write(ioc, &req, sizeof(req), errp) < 0) { 83 error_prepend(errp, "Failed to send option request header: "); 84 return -1; 85 } 86 87 if (len && nbd_write(ioc, (char *) data, len, errp) < 0) { 88 error_prepend(errp, "Failed to send option request data: "); 89 return -1; 90 } 91 92 return 0; 93 } 94 95 /* Send NBD_OPT_ABORT as a courtesy to let the server know that we are 96 * not going to attempt further negotiation. */ 97 static void nbd_send_opt_abort(QIOChannel *ioc) 98 { 99 /* Technically, a compliant server is supposed to reply to us; but 100 * older servers disconnected instead. At any rate, we're allowed 101 * to disconnect without waiting for the server reply, so we don't 102 * even care if the request makes it to the server, let alone 103 * waiting around for whether the server replies. */ 104 nbd_send_option_request(ioc, NBD_OPT_ABORT, 0, NULL, NULL); 105 } 106 107 108 /* Receive the header of an option reply, which should match the given 109 * opt. Read through the length field, but NOT the length bytes of 110 * payload. Return 0 if successful, -1 with errp set if it is 111 * impossible to continue. */ 112 static int nbd_receive_option_reply(QIOChannel *ioc, uint32_t opt, 113 NBDOptionReply *reply, Error **errp) 114 { 115 QEMU_BUILD_BUG_ON(sizeof(*reply) != 20); 116 if (nbd_read(ioc, reply, sizeof(*reply), errp) < 0) { 117 error_prepend(errp, "failed to read option reply: "); 118 nbd_send_opt_abort(ioc); 119 return -1; 120 } 121 reply->magic = be64_to_cpu(reply->magic); 122 reply->option = be32_to_cpu(reply->option); 123 reply->type = be32_to_cpu(reply->type); 124 reply->length = be32_to_cpu(reply->length); 125 126 trace_nbd_receive_option_reply(reply->option, nbd_opt_lookup(reply->option), 127 reply->type, nbd_rep_lookup(reply->type), 128 reply->length); 129 130 if (reply->magic != NBD_REP_MAGIC) { 131 error_setg(errp, "Unexpected option reply magic"); 132 nbd_send_opt_abort(ioc); 133 return -1; 134 } 135 if (reply->option != opt) { 136 error_setg(errp, "Unexpected option type %u (%s), expected %u (%s)", 137 reply->option, nbd_opt_lookup(reply->option), 138 opt, nbd_opt_lookup(opt)); 139 nbd_send_opt_abort(ioc); 140 return -1; 141 } 142 return 0; 143 } 144 145 /* If reply represents success, return 1 without further action. 146 * If reply represents an error, consume the optional payload of 147 * the packet on ioc. Then return 0 for unsupported (so the client 148 * can fall back to other approaches), or -1 with errp set for other 149 * errors. 150 */ 151 static int nbd_handle_reply_err(QIOChannel *ioc, NBDOptionReply *reply, 152 Error **errp) 153 { 154 char *msg = NULL; 155 int result = -1; 156 157 if (!(reply->type & (1 << 31))) { 158 return 1; 159 } 160 161 if (reply->length) { 162 if (reply->length > NBD_MAX_BUFFER_SIZE) { 163 error_setg(errp, "server error %" PRIu32 164 " (%s) message is too long", 165 reply->type, nbd_rep_lookup(reply->type)); 166 goto cleanup; 167 } 168 msg = g_malloc(reply->length + 1); 169 if (nbd_read(ioc, msg, reply->length, errp) < 0) { 170 error_prepend(errp, "failed to read option error %" PRIu32 171 " (%s) message: ", 172 reply->type, nbd_rep_lookup(reply->type)); 173 goto cleanup; 174 } 175 msg[reply->length] = '\0'; 176 trace_nbd_server_error_msg(reply->type, 177 nbd_reply_type_lookup(reply->type), msg); 178 } 179 180 switch (reply->type) { 181 case NBD_REP_ERR_UNSUP: 182 trace_nbd_reply_err_unsup(reply->option, nbd_opt_lookup(reply->option)); 183 result = 0; 184 goto cleanup; 185 186 case NBD_REP_ERR_POLICY: 187 error_setg(errp, "Denied by server for option %" PRIu32 " (%s)", 188 reply->option, nbd_opt_lookup(reply->option)); 189 break; 190 191 case NBD_REP_ERR_INVALID: 192 error_setg(errp, "Invalid parameters for option %" PRIu32 " (%s)", 193 reply->option, nbd_opt_lookup(reply->option)); 194 break; 195 196 case NBD_REP_ERR_PLATFORM: 197 error_setg(errp, "Server lacks support for option %" PRIu32 " (%s)", 198 reply->option, nbd_opt_lookup(reply->option)); 199 break; 200 201 case NBD_REP_ERR_TLS_REQD: 202 error_setg(errp, "TLS negotiation required before option %" PRIu32 203 " (%s)", reply->option, nbd_opt_lookup(reply->option)); 204 break; 205 206 case NBD_REP_ERR_UNKNOWN: 207 error_setg(errp, "Requested export not available"); 208 break; 209 210 case NBD_REP_ERR_SHUTDOWN: 211 error_setg(errp, "Server shutting down before option %" PRIu32 " (%s)", 212 reply->option, nbd_opt_lookup(reply->option)); 213 break; 214 215 case NBD_REP_ERR_BLOCK_SIZE_REQD: 216 error_setg(errp, "Server requires INFO_BLOCK_SIZE for option %" PRIu32 217 " (%s)", reply->option, nbd_opt_lookup(reply->option)); 218 break; 219 220 default: 221 error_setg(errp, "Unknown error code when asking for option %" PRIu32 222 " (%s)", reply->option, nbd_opt_lookup(reply->option)); 223 break; 224 } 225 226 if (msg) { 227 error_append_hint(errp, "server reported: %s\n", msg); 228 } 229 230 cleanup: 231 g_free(msg); 232 if (result < 0) { 233 nbd_send_opt_abort(ioc); 234 } 235 return result; 236 } 237 238 /* nbd_receive_list: 239 * Process another portion of the NBD_OPT_LIST reply, populating any 240 * name received into *@name. If @description is non-NULL, and the 241 * server provided a description, that is also populated. The caller 242 * must eventually call g_free() on success. 243 * Returns 1 if name and description were set and iteration must continue, 244 * 0 if iteration is complete (including if OPT_LIST unsupported), 245 * -1 with @errp set if an unrecoverable error occurred. 246 */ 247 static int nbd_receive_list(QIOChannel *ioc, char **name, char **description, 248 Error **errp) 249 { 250 int ret = -1; 251 NBDOptionReply reply; 252 uint32_t len; 253 uint32_t namelen; 254 char *local_name = NULL; 255 char *local_desc = NULL; 256 int error; 257 258 if (nbd_receive_option_reply(ioc, NBD_OPT_LIST, &reply, errp) < 0) { 259 return -1; 260 } 261 error = nbd_handle_reply_err(ioc, &reply, errp); 262 if (error <= 0) { 263 return error; 264 } 265 len = reply.length; 266 267 if (reply.type == NBD_REP_ACK) { 268 if (len != 0) { 269 error_setg(errp, "length too long for option end"); 270 nbd_send_opt_abort(ioc); 271 return -1; 272 } 273 return 0; 274 } else if (reply.type != NBD_REP_SERVER) { 275 error_setg(errp, "Unexpected reply type %u (%s), expected %u (%s)", 276 reply.type, nbd_rep_lookup(reply.type), 277 NBD_REP_SERVER, nbd_rep_lookup(NBD_REP_SERVER)); 278 nbd_send_opt_abort(ioc); 279 return -1; 280 } 281 282 if (len < sizeof(namelen) || len > NBD_MAX_BUFFER_SIZE) { 283 error_setg(errp, "incorrect option length %" PRIu32, len); 284 nbd_send_opt_abort(ioc); 285 return -1; 286 } 287 if (nbd_read(ioc, &namelen, sizeof(namelen), errp) < 0) { 288 error_prepend(errp, "failed to read option name length: "); 289 nbd_send_opt_abort(ioc); 290 return -1; 291 } 292 namelen = be32_to_cpu(namelen); 293 len -= sizeof(namelen); 294 if (len < namelen) { 295 error_setg(errp, "incorrect option name length"); 296 nbd_send_opt_abort(ioc); 297 return -1; 298 } 299 300 local_name = g_malloc(namelen + 1); 301 if (nbd_read(ioc, local_name, namelen, errp) < 0) { 302 error_prepend(errp, "failed to read export name: "); 303 nbd_send_opt_abort(ioc); 304 goto out; 305 } 306 local_name[namelen] = '\0'; 307 len -= namelen; 308 if (len) { 309 local_desc = g_malloc(len + 1); 310 if (nbd_read(ioc, local_desc, len, errp) < 0) { 311 error_prepend(errp, "failed to read export description: "); 312 nbd_send_opt_abort(ioc); 313 goto out; 314 } 315 local_desc[len] = '\0'; 316 } 317 318 trace_nbd_receive_list(local_name, local_desc ?: ""); 319 *name = local_name; 320 local_name = NULL; 321 if (description) { 322 *description = local_desc; 323 local_desc = NULL; 324 } 325 ret = 1; 326 327 out: 328 g_free(local_name); 329 g_free(local_desc); 330 return ret; 331 } 332 333 334 /* 335 * nbd_opt_info_or_go: 336 * Send option for NBD_OPT_INFO or NBD_OPT_GO and parse the reply. 337 * Returns -1 if the option proves the export @info->name cannot be 338 * used, 0 if the option is unsupported (fall back to NBD_OPT_LIST and 339 * NBD_OPT_EXPORT_NAME in that case), and > 0 if the export is good to 340 * go (with the rest of @info populated). 341 */ 342 static int nbd_opt_info_or_go(QIOChannel *ioc, uint32_t opt, 343 NBDExportInfo *info, Error **errp) 344 { 345 NBDOptionReply reply; 346 uint32_t len = strlen(info->name); 347 uint16_t type; 348 int error; 349 char *buf; 350 351 /* The protocol requires that the server send NBD_INFO_EXPORT with 352 * a non-zero flags (at least NBD_FLAG_HAS_FLAGS must be set); so 353 * flags still 0 is a witness of a broken server. */ 354 info->flags = 0; 355 356 assert(opt == NBD_OPT_GO || opt == NBD_OPT_INFO); 357 trace_nbd_opt_info_go_start(nbd_opt_lookup(opt), info->name); 358 buf = g_malloc(4 + len + 2 + 2 * info->request_sizes + 1); 359 stl_be_p(buf, len); 360 memcpy(buf + 4, info->name, len); 361 /* At most one request, everything else up to server */ 362 stw_be_p(buf + 4 + len, info->request_sizes); 363 if (info->request_sizes) { 364 stw_be_p(buf + 4 + len + 2, NBD_INFO_BLOCK_SIZE); 365 } 366 error = nbd_send_option_request(ioc, opt, 367 4 + len + 2 + 2 * info->request_sizes, 368 buf, errp); 369 g_free(buf); 370 if (error < 0) { 371 return -1; 372 } 373 374 while (1) { 375 if (nbd_receive_option_reply(ioc, opt, &reply, errp) < 0) { 376 return -1; 377 } 378 error = nbd_handle_reply_err(ioc, &reply, errp); 379 if (error <= 0) { 380 return error; 381 } 382 len = reply.length; 383 384 if (reply.type == NBD_REP_ACK) { 385 /* 386 * Server is done sending info, and moved into transmission 387 * phase for NBD_OPT_GO, but make sure it sent flags 388 */ 389 if (len) { 390 error_setg(errp, "server sent invalid NBD_REP_ACK"); 391 return -1; 392 } 393 if (!info->flags) { 394 error_setg(errp, "broken server omitted NBD_INFO_EXPORT"); 395 return -1; 396 } 397 trace_nbd_opt_info_go_success(nbd_opt_lookup(opt)); 398 return 1; 399 } 400 if (reply.type != NBD_REP_INFO) { 401 error_setg(errp, "unexpected reply type %u (%s), expected %u (%s)", 402 reply.type, nbd_rep_lookup(reply.type), 403 NBD_REP_INFO, nbd_rep_lookup(NBD_REP_INFO)); 404 nbd_send_opt_abort(ioc); 405 return -1; 406 } 407 if (len < sizeof(type)) { 408 error_setg(errp, "NBD_REP_INFO length %" PRIu32 " is too short", 409 len); 410 nbd_send_opt_abort(ioc); 411 return -1; 412 } 413 if (nbd_read(ioc, &type, sizeof(type), errp) < 0) { 414 error_prepend(errp, "failed to read info type: "); 415 nbd_send_opt_abort(ioc); 416 return -1; 417 } 418 len -= sizeof(type); 419 type = be16_to_cpu(type); 420 switch (type) { 421 case NBD_INFO_EXPORT: 422 if (len != sizeof(info->size) + sizeof(info->flags)) { 423 error_setg(errp, "remaining export info len %" PRIu32 424 " is unexpected size", len); 425 nbd_send_opt_abort(ioc); 426 return -1; 427 } 428 if (nbd_read(ioc, &info->size, sizeof(info->size), errp) < 0) { 429 error_prepend(errp, "failed to read info size: "); 430 nbd_send_opt_abort(ioc); 431 return -1; 432 } 433 info->size = be64_to_cpu(info->size); 434 if (nbd_read(ioc, &info->flags, sizeof(info->flags), errp) < 0) { 435 error_prepend(errp, "failed to read info flags: "); 436 nbd_send_opt_abort(ioc); 437 return -1; 438 } 439 info->flags = be16_to_cpu(info->flags); 440 trace_nbd_receive_negotiate_size_flags(info->size, info->flags); 441 break; 442 443 case NBD_INFO_BLOCK_SIZE: 444 if (len != sizeof(info->min_block) * 3) { 445 error_setg(errp, "remaining export info len %" PRIu32 446 " is unexpected size", len); 447 nbd_send_opt_abort(ioc); 448 return -1; 449 } 450 if (nbd_read(ioc, &info->min_block, sizeof(info->min_block), 451 errp) < 0) { 452 error_prepend(errp, "failed to read info minimum block size: "); 453 nbd_send_opt_abort(ioc); 454 return -1; 455 } 456 info->min_block = be32_to_cpu(info->min_block); 457 if (!is_power_of_2(info->min_block)) { 458 error_setg(errp, "server minimum block size %" PRIu32 459 " is not a power of two", info->min_block); 460 nbd_send_opt_abort(ioc); 461 return -1; 462 } 463 if (nbd_read(ioc, &info->opt_block, sizeof(info->opt_block), 464 errp) < 0) { 465 error_prepend(errp, 466 "failed to read info preferred block size: "); 467 nbd_send_opt_abort(ioc); 468 return -1; 469 } 470 info->opt_block = be32_to_cpu(info->opt_block); 471 if (!is_power_of_2(info->opt_block) || 472 info->opt_block < info->min_block) { 473 error_setg(errp, "server preferred block size %" PRIu32 474 " is not valid", info->opt_block); 475 nbd_send_opt_abort(ioc); 476 return -1; 477 } 478 if (nbd_read(ioc, &info->max_block, sizeof(info->max_block), 479 errp) < 0) { 480 error_prepend(errp, "failed to read info maximum block size: "); 481 nbd_send_opt_abort(ioc); 482 return -1; 483 } 484 info->max_block = be32_to_cpu(info->max_block); 485 if (info->max_block < info->min_block) { 486 error_setg(errp, "server maximum block size %" PRIu32 487 " is not valid", info->max_block); 488 nbd_send_opt_abort(ioc); 489 return -1; 490 } 491 trace_nbd_opt_info_block_size(info->min_block, info->opt_block, 492 info->max_block); 493 break; 494 495 default: 496 trace_nbd_opt_info_unknown(type, nbd_info_lookup(type)); 497 if (nbd_drop(ioc, len, errp) < 0) { 498 error_prepend(errp, "Failed to read info payload: "); 499 nbd_send_opt_abort(ioc); 500 return -1; 501 } 502 break; 503 } 504 } 505 } 506 507 /* Return -1 on failure, 0 if wantname is an available export. */ 508 static int nbd_receive_query_exports(QIOChannel *ioc, 509 const char *wantname, 510 Error **errp) 511 { 512 bool list_empty = true; 513 bool found_export = false; 514 515 trace_nbd_receive_query_exports_start(wantname); 516 if (nbd_send_option_request(ioc, NBD_OPT_LIST, 0, NULL, errp) < 0) { 517 return -1; 518 } 519 520 while (1) { 521 char *name; 522 int ret = nbd_receive_list(ioc, &name, NULL, errp); 523 524 if (ret < 0) { 525 /* Server gave unexpected reply */ 526 return -1; 527 } else if (ret == 0) { 528 /* Done iterating. */ 529 if (list_empty) { 530 /* 531 * We don't have enough context to tell a server that 532 * sent an empty list apart from a server that does 533 * not support the list command; but as this function 534 * is just used to trigger a nicer error message 535 * before trying NBD_OPT_EXPORT_NAME, assume the 536 * export is available. 537 */ 538 return 0; 539 } else if (!found_export) { 540 error_setg(errp, "No export with name '%s' available", 541 wantname); 542 nbd_send_opt_abort(ioc); 543 return -1; 544 } 545 trace_nbd_receive_query_exports_success(wantname); 546 return 0; 547 } 548 list_empty = false; 549 if (!strcmp(name, wantname)) { 550 found_export = true; 551 } 552 g_free(name); 553 } 554 } 555 556 /* nbd_request_simple_option: Send an option request, and parse the reply 557 * return 1 for successful negotiation, 558 * 0 if operation is unsupported, 559 * -1 with errp set for any other error 560 */ 561 static int nbd_request_simple_option(QIOChannel *ioc, int opt, Error **errp) 562 { 563 NBDOptionReply reply; 564 int error; 565 566 if (nbd_send_option_request(ioc, opt, 0, NULL, errp) < 0) { 567 return -1; 568 } 569 570 if (nbd_receive_option_reply(ioc, opt, &reply, errp) < 0) { 571 return -1; 572 } 573 error = nbd_handle_reply_err(ioc, &reply, errp); 574 if (error <= 0) { 575 return error; 576 } 577 578 if (reply.type != NBD_REP_ACK) { 579 error_setg(errp, "Server answered option %d (%s) with unexpected " 580 "reply %" PRIu32 " (%s)", opt, nbd_opt_lookup(opt), 581 reply.type, nbd_rep_lookup(reply.type)); 582 nbd_send_opt_abort(ioc); 583 return -1; 584 } 585 586 if (reply.length != 0) { 587 error_setg(errp, "Option %d ('%s') response length is %" PRIu32 588 " (it should be zero)", opt, nbd_opt_lookup(opt), 589 reply.length); 590 nbd_send_opt_abort(ioc); 591 return -1; 592 } 593 594 return 1; 595 } 596 597 static QIOChannel *nbd_receive_starttls(QIOChannel *ioc, 598 QCryptoTLSCreds *tlscreds, 599 const char *hostname, Error **errp) 600 { 601 int ret; 602 QIOChannelTLS *tioc; 603 struct NBDTLSHandshakeData data = { 0 }; 604 605 ret = nbd_request_simple_option(ioc, NBD_OPT_STARTTLS, errp); 606 if (ret <= 0) { 607 if (ret == 0) { 608 error_setg(errp, "Server don't support STARTTLS option"); 609 nbd_send_opt_abort(ioc); 610 } 611 return NULL; 612 } 613 614 trace_nbd_receive_starttls_new_client(); 615 tioc = qio_channel_tls_new_client(ioc, tlscreds, hostname, errp); 616 if (!tioc) { 617 return NULL; 618 } 619 qio_channel_set_name(QIO_CHANNEL(tioc), "nbd-client-tls"); 620 data.loop = g_main_loop_new(g_main_context_default(), FALSE); 621 trace_nbd_receive_starttls_tls_handshake(); 622 qio_channel_tls_handshake(tioc, 623 nbd_tls_handshake, 624 &data, 625 NULL, 626 NULL); 627 628 if (!data.complete) { 629 g_main_loop_run(data.loop); 630 } 631 g_main_loop_unref(data.loop); 632 if (data.error) { 633 error_propagate(errp, data.error); 634 object_unref(OBJECT(tioc)); 635 return NULL; 636 } 637 638 return QIO_CHANNEL(tioc); 639 } 640 641 /* 642 * nbd_send_meta_query: 643 * Send 0 or 1 set/list meta context queries. 644 * Return 0 on success, -1 with errp set for any error 645 */ 646 static int nbd_send_meta_query(QIOChannel *ioc, uint32_t opt, 647 const char *export, const char *query, 648 Error **errp) 649 { 650 int ret; 651 uint32_t export_len = strlen(export); 652 uint32_t queries = !!query; 653 uint32_t query_len = 0; 654 uint32_t data_len; 655 char *data; 656 char *p; 657 658 data_len = sizeof(export_len) + export_len + sizeof(queries); 659 if (query) { 660 query_len = strlen(query); 661 data_len += sizeof(query_len) + query_len; 662 } else { 663 assert(opt == NBD_OPT_LIST_META_CONTEXT); 664 } 665 p = data = g_malloc(data_len); 666 667 trace_nbd_opt_meta_request(nbd_opt_lookup(opt), query ?: "(all)", export); 668 stl_be_p(p, export_len); 669 memcpy(p += sizeof(export_len), export, export_len); 670 stl_be_p(p += export_len, queries); 671 if (query) { 672 stl_be_p(p += sizeof(queries), query_len); 673 memcpy(p += sizeof(query_len), query, query_len); 674 } 675 676 ret = nbd_send_option_request(ioc, opt, data_len, data, errp); 677 g_free(data); 678 return ret; 679 } 680 681 /* 682 * nbd_receive_one_meta_context: 683 * Called in a loop to receive and trace one set/list meta context reply. 684 * Pass non-NULL @name or @id to collect results back to the caller, which 685 * must eventually call g_free(). 686 * return 1 if name is set and iteration must continue, 687 * 0 if iteration is complete (including if option is unsupported), 688 * -1 with errp set for any error 689 */ 690 static int nbd_receive_one_meta_context(QIOChannel *ioc, 691 uint32_t opt, 692 char **name, 693 uint32_t *id, 694 Error **errp) 695 { 696 int ret; 697 NBDOptionReply reply; 698 char *local_name = NULL; 699 uint32_t local_id; 700 701 if (nbd_receive_option_reply(ioc, opt, &reply, errp) < 0) { 702 return -1; 703 } 704 705 ret = nbd_handle_reply_err(ioc, &reply, errp); 706 if (ret <= 0) { 707 return ret; 708 } 709 710 if (reply.type == NBD_REP_ACK) { 711 if (reply.length != 0) { 712 error_setg(errp, "Unexpected length to ACK response"); 713 nbd_send_opt_abort(ioc); 714 return -1; 715 } 716 return 0; 717 } else if (reply.type != NBD_REP_META_CONTEXT) { 718 error_setg(errp, "Unexpected reply type %u (%s), expected %u (%s)", 719 reply.type, nbd_rep_lookup(reply.type), 720 NBD_REP_META_CONTEXT, nbd_rep_lookup(NBD_REP_META_CONTEXT)); 721 nbd_send_opt_abort(ioc); 722 return -1; 723 } 724 725 if (reply.length <= sizeof(local_id) || 726 reply.length > NBD_MAX_BUFFER_SIZE) { 727 error_setg(errp, "Failed to negotiate meta context, server " 728 "answered with unexpected length %" PRIu32, 729 reply.length); 730 nbd_send_opt_abort(ioc); 731 return -1; 732 } 733 734 if (nbd_read(ioc, &local_id, sizeof(local_id), errp) < 0) { 735 return -1; 736 } 737 local_id = be32_to_cpu(local_id); 738 739 reply.length -= sizeof(local_id); 740 local_name = g_malloc(reply.length + 1); 741 if (nbd_read(ioc, local_name, reply.length, errp) < 0) { 742 g_free(local_name); 743 return -1; 744 } 745 local_name[reply.length] = '\0'; 746 trace_nbd_opt_meta_reply(nbd_opt_lookup(opt), local_name, local_id); 747 748 if (name) { 749 *name = local_name; 750 } else { 751 g_free(local_name); 752 } 753 if (id) { 754 *id = local_id; 755 } 756 return 1; 757 } 758 759 /* 760 * nbd_negotiate_simple_meta_context: 761 * Request the server to set the meta context for export @info->name 762 * using @info->x_dirty_bitmap with a fallback to "base:allocation", 763 * setting @info->context_id to the resulting id. Fail if the server 764 * responds with more than one context or with a context different 765 * than the query. 766 * return 1 for successful negotiation, 767 * 0 if operation is unsupported, 768 * -1 with errp set for any other error 769 */ 770 static int nbd_negotiate_simple_meta_context(QIOChannel *ioc, 771 NBDExportInfo *info, 772 Error **errp) 773 { 774 /* 775 * TODO: Removing the x_dirty_bitmap hack will mean refactoring 776 * this function to request and store ids for multiple contexts 777 * (both base:allocation and a dirty bitmap), at which point this 778 * function should lose the term _simple. 779 */ 780 int ret; 781 const char *context = info->x_dirty_bitmap ?: "base:allocation"; 782 bool received = false; 783 char *name = NULL; 784 785 if (nbd_send_meta_query(ioc, NBD_OPT_SET_META_CONTEXT, 786 info->name, context, errp) < 0) { 787 return -1; 788 } 789 790 ret = nbd_receive_one_meta_context(ioc, NBD_OPT_SET_META_CONTEXT, 791 &name, &info->context_id, errp); 792 if (ret < 0) { 793 return -1; 794 } 795 if (ret == 1) { 796 if (strcmp(context, name)) { 797 error_setg(errp, "Failed to negotiate meta context '%s', server " 798 "answered with different context '%s'", context, 799 name); 800 g_free(name); 801 nbd_send_opt_abort(ioc); 802 return -1; 803 } 804 g_free(name); 805 received = true; 806 807 ret = nbd_receive_one_meta_context(ioc, NBD_OPT_SET_META_CONTEXT, 808 NULL, NULL, errp); 809 if (ret < 0) { 810 return -1; 811 } 812 } 813 if (ret != 0) { 814 error_setg(errp, "Server answered with more than one context"); 815 nbd_send_opt_abort(ioc); 816 return -1; 817 } 818 return received; 819 } 820 821 /* 822 * nbd_list_meta_contexts: 823 * Request the server to list all meta contexts for export @info->name. 824 * return 0 if list is complete (even if empty), 825 * -1 with errp set for any error 826 */ 827 static int nbd_list_meta_contexts(QIOChannel *ioc, 828 NBDExportInfo *info, 829 Error **errp) 830 { 831 int ret; 832 int seen_any = false; 833 int seen_qemu = false; 834 835 if (nbd_send_meta_query(ioc, NBD_OPT_LIST_META_CONTEXT, 836 info->name, NULL, errp) < 0) { 837 return -1; 838 } 839 840 while (1) { 841 char *context; 842 843 ret = nbd_receive_one_meta_context(ioc, NBD_OPT_LIST_META_CONTEXT, 844 &context, NULL, errp); 845 if (ret == 0 && seen_any && !seen_qemu) { 846 /* 847 * Work around qemu 3.0 bug: the server forgot to send 848 * "qemu:" replies to 0 queries. If we saw at least one 849 * reply (probably base:allocation), but none of them were 850 * qemu:, then run a more specific query to make sure. 851 */ 852 seen_qemu = true; 853 if (nbd_send_meta_query(ioc, NBD_OPT_LIST_META_CONTEXT, 854 info->name, "qemu:", errp) < 0) { 855 return -1; 856 } 857 continue; 858 } 859 if (ret <= 0) { 860 return ret; 861 } 862 seen_any = true; 863 seen_qemu |= strstart(context, "qemu:", NULL); 864 info->contexts = g_renew(char *, info->contexts, ++info->n_contexts); 865 info->contexts[info->n_contexts - 1] = context; 866 } 867 } 868 869 /* 870 * nbd_start_negotiate: 871 * Start the handshake to the server. After a positive return, the server 872 * is ready to accept additional NBD_OPT requests. 873 * Returns: negative errno: failure talking to server 874 * 0: server is oldstyle, must call nbd_negotiate_finish_oldstyle 875 * 1: server is newstyle, but can only accept EXPORT_NAME 876 * 2: server is newstyle, but lacks structured replies 877 * 3: server is newstyle and set up for structured replies 878 */ 879 static int nbd_start_negotiate(QIOChannel *ioc, QCryptoTLSCreds *tlscreds, 880 const char *hostname, QIOChannel **outioc, 881 bool structured_reply, bool *zeroes, 882 Error **errp) 883 { 884 uint64_t magic; 885 886 trace_nbd_start_negotiate(tlscreds, hostname ? hostname : "<null>"); 887 888 if (zeroes) { 889 *zeroes = true; 890 } 891 if (outioc) { 892 *outioc = NULL; 893 } 894 if (tlscreds && !outioc) { 895 error_setg(errp, "Output I/O channel required for TLS"); 896 return -EINVAL; 897 } 898 899 if (nbd_read(ioc, &magic, sizeof(magic), errp) < 0) { 900 error_prepend(errp, "Failed to read initial magic: "); 901 return -EINVAL; 902 } 903 magic = be64_to_cpu(magic); 904 trace_nbd_receive_negotiate_magic(magic); 905 906 if (magic != NBD_INIT_MAGIC) { 907 error_setg(errp, "Bad initial magic received: 0x%" PRIx64, magic); 908 return -EINVAL; 909 } 910 911 if (nbd_read(ioc, &magic, sizeof(magic), errp) < 0) { 912 error_prepend(errp, "Failed to read server magic: "); 913 return -EINVAL; 914 } 915 magic = be64_to_cpu(magic); 916 trace_nbd_receive_negotiate_magic(magic); 917 918 if (magic == NBD_OPTS_MAGIC) { 919 uint32_t clientflags = 0; 920 uint16_t globalflags; 921 bool fixedNewStyle = false; 922 923 if (nbd_read(ioc, &globalflags, sizeof(globalflags), errp) < 0) { 924 error_prepend(errp, "Failed to read server flags: "); 925 return -EINVAL; 926 } 927 globalflags = be16_to_cpu(globalflags); 928 trace_nbd_receive_negotiate_server_flags(globalflags); 929 if (globalflags & NBD_FLAG_FIXED_NEWSTYLE) { 930 fixedNewStyle = true; 931 clientflags |= NBD_FLAG_C_FIXED_NEWSTYLE; 932 } 933 if (globalflags & NBD_FLAG_NO_ZEROES) { 934 if (zeroes) { 935 *zeroes = false; 936 } 937 clientflags |= NBD_FLAG_C_NO_ZEROES; 938 } 939 /* client requested flags */ 940 clientflags = cpu_to_be32(clientflags); 941 if (nbd_write(ioc, &clientflags, sizeof(clientflags), errp) < 0) { 942 error_prepend(errp, "Failed to send clientflags field: "); 943 return -EINVAL; 944 } 945 if (tlscreds) { 946 if (fixedNewStyle) { 947 *outioc = nbd_receive_starttls(ioc, tlscreds, hostname, errp); 948 if (!*outioc) { 949 return -EINVAL; 950 } 951 ioc = *outioc; 952 } else { 953 error_setg(errp, "Server does not support STARTTLS"); 954 return -EINVAL; 955 } 956 } 957 if (fixedNewStyle) { 958 int result = 0; 959 960 if (structured_reply) { 961 result = nbd_request_simple_option(ioc, 962 NBD_OPT_STRUCTURED_REPLY, 963 errp); 964 if (result < 0) { 965 return -EINVAL; 966 } 967 } 968 return 2 + result; 969 } else { 970 return 1; 971 } 972 } else if (magic == NBD_CLIENT_MAGIC) { 973 if (tlscreds) { 974 error_setg(errp, "Server does not support STARTTLS"); 975 return -EINVAL; 976 } 977 return 0; 978 } else { 979 error_setg(errp, "Bad server magic received: 0x%" PRIx64, magic); 980 return -EINVAL; 981 } 982 } 983 984 /* 985 * nbd_negotiate_finish_oldstyle: 986 * Populate @info with the size and export flags from an oldstyle server, 987 * but does not consume 124 bytes of reserved zero padding. 988 * Returns 0 on success, -1 with @errp set on failure 989 */ 990 static int nbd_negotiate_finish_oldstyle(QIOChannel *ioc, NBDExportInfo *info, 991 Error **errp) 992 { 993 uint32_t oldflags; 994 995 if (nbd_read(ioc, &info->size, sizeof(info->size), errp) < 0) { 996 error_prepend(errp, "Failed to read export length: "); 997 return -EINVAL; 998 } 999 info->size = be64_to_cpu(info->size); 1000 1001 if (nbd_read(ioc, &oldflags, sizeof(oldflags), errp) < 0) { 1002 error_prepend(errp, "Failed to read export flags: "); 1003 return -EINVAL; 1004 } 1005 oldflags = be32_to_cpu(oldflags); 1006 if (oldflags & ~0xffff) { 1007 error_setg(errp, "Unexpected export flags %0x" PRIx32, oldflags); 1008 return -EINVAL; 1009 } 1010 info->flags = oldflags; 1011 return 0; 1012 } 1013 1014 /* 1015 * nbd_receive_negotiate: 1016 * Connect to server, complete negotiation, and move into transmission phase. 1017 * Returns: negative errno: failure talking to server 1018 * 0: server is connected 1019 */ 1020 int nbd_receive_negotiate(QIOChannel *ioc, QCryptoTLSCreds *tlscreds, 1021 const char *hostname, QIOChannel **outioc, 1022 NBDExportInfo *info, Error **errp) 1023 { 1024 int result; 1025 bool zeroes; 1026 bool base_allocation = info->base_allocation; 1027 1028 assert(info->name); 1029 trace_nbd_receive_negotiate_name(info->name); 1030 1031 result = nbd_start_negotiate(ioc, tlscreds, hostname, outioc, 1032 info->structured_reply, &zeroes, errp); 1033 1034 info->structured_reply = false; 1035 info->base_allocation = false; 1036 if (tlscreds && *outioc) { 1037 ioc = *outioc; 1038 } 1039 1040 switch (result) { 1041 case 3: /* newstyle, with structured replies */ 1042 info->structured_reply = true; 1043 if (base_allocation) { 1044 result = nbd_negotiate_simple_meta_context(ioc, info, errp); 1045 if (result < 0) { 1046 return -EINVAL; 1047 } 1048 info->base_allocation = result == 1; 1049 } 1050 /* fall through */ 1051 case 2: /* newstyle, try OPT_GO */ 1052 /* Try NBD_OPT_GO first - if it works, we are done (it 1053 * also gives us a good message if the server requires 1054 * TLS). If it is not available, fall back to 1055 * NBD_OPT_LIST for nicer error messages about a missing 1056 * export, then use NBD_OPT_EXPORT_NAME. */ 1057 result = nbd_opt_info_or_go(ioc, NBD_OPT_GO, info, errp); 1058 if (result < 0) { 1059 return -EINVAL; 1060 } 1061 if (result > 0) { 1062 return 0; 1063 } 1064 /* Check our desired export is present in the 1065 * server export list. Since NBD_OPT_EXPORT_NAME 1066 * cannot return an error message, running this 1067 * query gives us better error reporting if the 1068 * export name is not available. 1069 */ 1070 if (nbd_receive_query_exports(ioc, info->name, errp) < 0) { 1071 return -EINVAL; 1072 } 1073 /* fall through */ 1074 case 1: /* newstyle, but limited to EXPORT_NAME */ 1075 /* write the export name request */ 1076 if (nbd_send_option_request(ioc, NBD_OPT_EXPORT_NAME, -1, info->name, 1077 errp) < 0) { 1078 return -EINVAL; 1079 } 1080 1081 /* Read the response */ 1082 if (nbd_read(ioc, &info->size, sizeof(info->size), errp) < 0) { 1083 error_prepend(errp, "Failed to read export length: "); 1084 return -EINVAL; 1085 } 1086 info->size = be64_to_cpu(info->size); 1087 1088 if (nbd_read(ioc, &info->flags, sizeof(info->flags), errp) < 0) { 1089 error_prepend(errp, "Failed to read export flags: "); 1090 return -EINVAL; 1091 } 1092 info->flags = be16_to_cpu(info->flags); 1093 break; 1094 case 0: /* oldstyle, parse length and flags */ 1095 if (*info->name) { 1096 error_setg(errp, "Server does not support non-empty export names"); 1097 return -EINVAL; 1098 } 1099 if (nbd_negotiate_finish_oldstyle(ioc, info, errp) < 0) { 1100 return -EINVAL; 1101 } 1102 break; 1103 default: 1104 return result; 1105 } 1106 1107 trace_nbd_receive_negotiate_size_flags(info->size, info->flags); 1108 if (zeroes && nbd_drop(ioc, 124, errp) < 0) { 1109 error_prepend(errp, "Failed to read reserved block: "); 1110 return -EINVAL; 1111 } 1112 return 0; 1113 } 1114 1115 /* Clean up result of nbd_receive_export_list */ 1116 void nbd_free_export_list(NBDExportInfo *info, int count) 1117 { 1118 int i, j; 1119 1120 if (!info) { 1121 return; 1122 } 1123 1124 for (i = 0; i < count; i++) { 1125 g_free(info[i].name); 1126 g_free(info[i].description); 1127 for (j = 0; j < info[i].n_contexts; j++) { 1128 g_free(info[i].contexts[j]); 1129 } 1130 g_free(info[i].contexts); 1131 } 1132 g_free(info); 1133 } 1134 1135 /* 1136 * nbd_receive_export_list: 1137 * Query details about a server's exports, then disconnect without 1138 * going into transmission phase. Return a count of the exports listed 1139 * in @info by the server, or -1 on error. Caller must free @info using 1140 * nbd_free_export_list(). 1141 */ 1142 int nbd_receive_export_list(QIOChannel *ioc, QCryptoTLSCreds *tlscreds, 1143 const char *hostname, NBDExportInfo **info, 1144 Error **errp) 1145 { 1146 int result; 1147 int count = 0; 1148 int i; 1149 int rc; 1150 int ret = -1; 1151 NBDExportInfo *array = NULL; 1152 QIOChannel *sioc = NULL; 1153 1154 *info = NULL; 1155 result = nbd_start_negotiate(ioc, tlscreds, hostname, &sioc, true, NULL, 1156 errp); 1157 if (tlscreds && sioc) { 1158 ioc = sioc; 1159 } 1160 1161 switch (result) { 1162 case 2: 1163 case 3: 1164 /* newstyle - use NBD_OPT_LIST to populate array, then try 1165 * NBD_OPT_INFO on each array member. If structured replies 1166 * are enabled, also try NBD_OPT_LIST_META_CONTEXT. */ 1167 if (nbd_send_option_request(ioc, NBD_OPT_LIST, 0, NULL, errp) < 0) { 1168 goto out; 1169 } 1170 while (1) { 1171 char *name; 1172 char *desc; 1173 1174 rc = nbd_receive_list(ioc, &name, &desc, errp); 1175 if (rc < 0) { 1176 goto out; 1177 } else if (rc == 0) { 1178 break; 1179 } 1180 array = g_renew(NBDExportInfo, array, ++count); 1181 memset(&array[count - 1], 0, sizeof(*array)); 1182 array[count - 1].name = name; 1183 array[count - 1].description = desc; 1184 array[count - 1].structured_reply = result == 3; 1185 } 1186 1187 for (i = 0; i < count; i++) { 1188 array[i].request_sizes = true; 1189 rc = nbd_opt_info_or_go(ioc, NBD_OPT_INFO, &array[i], errp); 1190 if (rc < 0) { 1191 goto out; 1192 } else if (rc == 0) { 1193 /* 1194 * Pointless to try rest of loop. If OPT_INFO doesn't work, 1195 * it's unlikely that meta contexts work either 1196 */ 1197 break; 1198 } 1199 1200 if (result == 3 && 1201 nbd_list_meta_contexts(ioc, &array[i], errp) < 0) { 1202 goto out; 1203 } 1204 } 1205 1206 /* Send NBD_OPT_ABORT as a courtesy before hanging up */ 1207 nbd_send_opt_abort(ioc); 1208 break; 1209 case 1: /* newstyle, but limited to EXPORT_NAME */ 1210 error_setg(errp, "Server does not support export lists"); 1211 /* We can't even send NBD_OPT_ABORT, so merely hang up */ 1212 goto out; 1213 case 0: /* oldstyle, parse length and flags */ 1214 array = g_new0(NBDExportInfo, 1); 1215 array->name = g_strdup(""); 1216 count = 1; 1217 1218 if (nbd_negotiate_finish_oldstyle(ioc, array, errp) < 0) { 1219 goto out; 1220 } 1221 1222 /* Send NBD_CMD_DISC as a courtesy to the server, but ignore all 1223 * errors now that we have the information we wanted. */ 1224 if (nbd_drop(ioc, 124, NULL) == 0) { 1225 NBDRequest request = { .type = NBD_CMD_DISC }; 1226 1227 nbd_send_request(ioc, &request); 1228 } 1229 break; 1230 default: 1231 goto out; 1232 } 1233 1234 *info = array; 1235 array = NULL; 1236 ret = count; 1237 1238 out: 1239 qio_channel_shutdown(ioc, QIO_CHANNEL_SHUTDOWN_BOTH, NULL); 1240 qio_channel_close(ioc, NULL); 1241 object_unref(OBJECT(sioc)); 1242 nbd_free_export_list(array, count); 1243 return ret; 1244 } 1245 1246 #ifdef __linux__ 1247 int nbd_init(int fd, QIOChannelSocket *sioc, NBDExportInfo *info, 1248 Error **errp) 1249 { 1250 unsigned long sector_size = MAX(BDRV_SECTOR_SIZE, info->min_block); 1251 unsigned long sectors = info->size / sector_size; 1252 1253 /* FIXME: Once the kernel module is patched to honor block sizes, 1254 * and to advertise that fact to user space, we should update the 1255 * hand-off to the kernel to use any block sizes we learned. */ 1256 assert(!info->request_sizes); 1257 if (info->size / sector_size != sectors) { 1258 error_setg(errp, "Export size %" PRIu64 " too large for 32-bit kernel", 1259 info->size); 1260 return -E2BIG; 1261 } 1262 1263 trace_nbd_init_set_socket(); 1264 1265 if (ioctl(fd, NBD_SET_SOCK, (unsigned long) sioc->fd) < 0) { 1266 int serrno = errno; 1267 error_setg(errp, "Failed to set NBD socket"); 1268 return -serrno; 1269 } 1270 1271 trace_nbd_init_set_block_size(sector_size); 1272 1273 if (ioctl(fd, NBD_SET_BLKSIZE, sector_size) < 0) { 1274 int serrno = errno; 1275 error_setg(errp, "Failed setting NBD block size"); 1276 return -serrno; 1277 } 1278 1279 trace_nbd_init_set_size(sectors); 1280 if (info->size % sector_size) { 1281 trace_nbd_init_trailing_bytes(info->size % sector_size); 1282 } 1283 1284 if (ioctl(fd, NBD_SET_SIZE_BLOCKS, sectors) < 0) { 1285 int serrno = errno; 1286 error_setg(errp, "Failed setting size (in blocks)"); 1287 return -serrno; 1288 } 1289 1290 if (ioctl(fd, NBD_SET_FLAGS, (unsigned long) info->flags) < 0) { 1291 if (errno == ENOTTY) { 1292 int read_only = (info->flags & NBD_FLAG_READ_ONLY) != 0; 1293 trace_nbd_init_set_readonly(); 1294 1295 if (ioctl(fd, BLKROSET, (unsigned long) &read_only) < 0) { 1296 int serrno = errno; 1297 error_setg(errp, "Failed setting read-only attribute"); 1298 return -serrno; 1299 } 1300 } else { 1301 int serrno = errno; 1302 error_setg(errp, "Failed setting flags"); 1303 return -serrno; 1304 } 1305 } 1306 1307 trace_nbd_init_finish(); 1308 1309 return 0; 1310 } 1311 1312 int nbd_client(int fd) 1313 { 1314 int ret; 1315 int serrno; 1316 1317 trace_nbd_client_loop(); 1318 1319 ret = ioctl(fd, NBD_DO_IT); 1320 if (ret < 0 && errno == EPIPE) { 1321 /* NBD_DO_IT normally returns EPIPE when someone has disconnected 1322 * the socket via NBD_DISCONNECT. We do not want to return 1 in 1323 * that case. 1324 */ 1325 ret = 0; 1326 } 1327 serrno = errno; 1328 1329 trace_nbd_client_loop_ret(ret, strerror(serrno)); 1330 1331 trace_nbd_client_clear_queue(); 1332 ioctl(fd, NBD_CLEAR_QUE); 1333 1334 trace_nbd_client_clear_socket(); 1335 ioctl(fd, NBD_CLEAR_SOCK); 1336 1337 errno = serrno; 1338 return ret; 1339 } 1340 1341 int nbd_disconnect(int fd) 1342 { 1343 ioctl(fd, NBD_CLEAR_QUE); 1344 ioctl(fd, NBD_DISCONNECT); 1345 ioctl(fd, NBD_CLEAR_SOCK); 1346 return 0; 1347 } 1348 1349 #endif /* __linux__ */ 1350 1351 int nbd_send_request(QIOChannel *ioc, NBDRequest *request) 1352 { 1353 uint8_t buf[NBD_REQUEST_SIZE]; 1354 1355 trace_nbd_send_request(request->from, request->len, request->handle, 1356 request->flags, request->type, 1357 nbd_cmd_lookup(request->type)); 1358 1359 stl_be_p(buf, NBD_REQUEST_MAGIC); 1360 stw_be_p(buf + 4, request->flags); 1361 stw_be_p(buf + 6, request->type); 1362 stq_be_p(buf + 8, request->handle); 1363 stq_be_p(buf + 16, request->from); 1364 stl_be_p(buf + 24, request->len); 1365 1366 return nbd_write(ioc, buf, sizeof(buf), NULL); 1367 } 1368 1369 /* nbd_receive_simple_reply 1370 * Read simple reply except magic field (which should be already read). 1371 * Payload is not read (payload is possible for CMD_READ, but here we even 1372 * don't know whether it take place or not). 1373 */ 1374 static int nbd_receive_simple_reply(QIOChannel *ioc, NBDSimpleReply *reply, 1375 Error **errp) 1376 { 1377 int ret; 1378 1379 assert(reply->magic == NBD_SIMPLE_REPLY_MAGIC); 1380 1381 ret = nbd_read(ioc, (uint8_t *)reply + sizeof(reply->magic), 1382 sizeof(*reply) - sizeof(reply->magic), errp); 1383 if (ret < 0) { 1384 return ret; 1385 } 1386 1387 reply->error = be32_to_cpu(reply->error); 1388 reply->handle = be64_to_cpu(reply->handle); 1389 1390 return 0; 1391 } 1392 1393 /* nbd_receive_structured_reply_chunk 1394 * Read structured reply chunk except magic field (which should be already 1395 * read). 1396 * Payload is not read. 1397 */ 1398 static int nbd_receive_structured_reply_chunk(QIOChannel *ioc, 1399 NBDStructuredReplyChunk *chunk, 1400 Error **errp) 1401 { 1402 int ret; 1403 1404 assert(chunk->magic == NBD_STRUCTURED_REPLY_MAGIC); 1405 1406 ret = nbd_read(ioc, (uint8_t *)chunk + sizeof(chunk->magic), 1407 sizeof(*chunk) - sizeof(chunk->magic), errp); 1408 if (ret < 0) { 1409 return ret; 1410 } 1411 1412 chunk->flags = be16_to_cpu(chunk->flags); 1413 chunk->type = be16_to_cpu(chunk->type); 1414 chunk->handle = be64_to_cpu(chunk->handle); 1415 chunk->length = be32_to_cpu(chunk->length); 1416 1417 return 0; 1418 } 1419 1420 /* nbd_receive_reply 1421 * Returns 1 on success 1422 * 0 on eof, when no data was read (errp is not set) 1423 * negative errno on failure (errp is set) 1424 */ 1425 int nbd_receive_reply(QIOChannel *ioc, NBDReply *reply, Error **errp) 1426 { 1427 int ret; 1428 const char *type; 1429 1430 ret = nbd_read_eof(ioc, &reply->magic, sizeof(reply->magic), errp); 1431 if (ret <= 0) { 1432 return ret; 1433 } 1434 1435 reply->magic = be32_to_cpu(reply->magic); 1436 1437 switch (reply->magic) { 1438 case NBD_SIMPLE_REPLY_MAGIC: 1439 ret = nbd_receive_simple_reply(ioc, &reply->simple, errp); 1440 if (ret < 0) { 1441 break; 1442 } 1443 trace_nbd_receive_simple_reply(reply->simple.error, 1444 nbd_err_lookup(reply->simple.error), 1445 reply->handle); 1446 break; 1447 case NBD_STRUCTURED_REPLY_MAGIC: 1448 ret = nbd_receive_structured_reply_chunk(ioc, &reply->structured, errp); 1449 if (ret < 0) { 1450 break; 1451 } 1452 type = nbd_reply_type_lookup(reply->structured.type); 1453 trace_nbd_receive_structured_reply_chunk(reply->structured.flags, 1454 reply->structured.type, type, 1455 reply->structured.handle, 1456 reply->structured.length); 1457 break; 1458 default: 1459 error_setg(errp, "invalid magic (got 0x%" PRIx32 ")", reply->magic); 1460 return -EINVAL; 1461 } 1462 if (ret < 0) { 1463 return ret; 1464 } 1465 1466 return 1; 1467 } 1468 1469