Fam Zheng | 798bfe0 | 2016-01-14 16:41:02 +0800 | [diff] [blame] | 1 | /* |
| 2 | * NBD Internal Declarations |
| 3 | * |
| 4 | * Copyright (C) 2016 Red Hat, Inc. |
| 5 | * |
| 6 | * This work is licensed under the terms of the GNU GPL, version 2 or later. |
| 7 | * See the COPYING file in the top-level directory. |
| 8 | */ |
| 9 | |
| 10 | #ifndef NBD_INTERNAL_H |
| 11 | #define NBD_INTERNAL_H |
| 12 | #include "block/nbd.h" |
| 13 | #include "sysemu/block-backend.h" |
Daniel P. Berrange | f95910f | 2016-02-10 18:41:11 +0000 | [diff] [blame] | 14 | #include "io/channel-tls.h" |
Fam Zheng | 798bfe0 | 2016-01-14 16:41:02 +0800 | [diff] [blame] | 15 | |
| 16 | #include "qemu/coroutine.h" |
Daniel P. Berrange | 1c778ef | 2016-02-10 18:41:04 +0000 | [diff] [blame] | 17 | #include "qemu/iov.h" |
Fam Zheng | 798bfe0 | 2016-01-14 16:41:02 +0800 | [diff] [blame] | 18 | |
Fam Zheng | 798bfe0 | 2016-01-14 16:41:02 +0800 | [diff] [blame] | 19 | #ifndef _WIN32 |
| 20 | #include <sys/ioctl.h> |
| 21 | #endif |
| 22 | #if defined(__sun__) || defined(__HAIKU__) |
| 23 | #include <sys/ioccom.h> |
| 24 | #endif |
Fam Zheng | 798bfe0 | 2016-01-14 16:41:02 +0800 | [diff] [blame] | 25 | |
| 26 | #ifdef __linux__ |
| 27 | #include <linux/fs.h> |
| 28 | #endif |
| 29 | |
Paolo Bonzini | 58369e2 | 2016-03-15 17:22:36 +0100 | [diff] [blame] | 30 | #include "qemu/bswap.h" |
Fam Zheng | 798bfe0 | 2016-01-14 16:41:02 +0800 | [diff] [blame] | 31 | #include "qemu/queue.h" |
| 32 | #include "qemu/main-loop.h" |
| 33 | |
| 34 | /* #define DEBUG_NBD */ |
| 35 | |
| 36 | #ifdef DEBUG_NBD |
Eric Blake | 8c65971 | 2016-04-05 21:35:03 -0600 | [diff] [blame] | 37 | #define DEBUG_NBD_PRINT 1 |
Fam Zheng | 798bfe0 | 2016-01-14 16:41:02 +0800 | [diff] [blame] | 38 | #else |
Eric Blake | 8c65971 | 2016-04-05 21:35:03 -0600 | [diff] [blame] | 39 | #define DEBUG_NBD_PRINT 0 |
Fam Zheng | 798bfe0 | 2016-01-14 16:41:02 +0800 | [diff] [blame] | 40 | #endif |
| 41 | |
Eric Blake | 8c65971 | 2016-04-05 21:35:03 -0600 | [diff] [blame] | 42 | #define TRACE(msg, ...) do { \ |
| 43 | if (DEBUG_NBD_PRINT) { \ |
| 44 | LOG(msg, ## __VA_ARGS__); \ |
| 45 | } \ |
| 46 | } while (0) |
| 47 | |
Fam Zheng | 798bfe0 | 2016-01-14 16:41:02 +0800 | [diff] [blame] | 48 | #define LOG(msg, ...) do { \ |
| 49 | fprintf(stderr, "%s:%s():L%d: " msg "\n", \ |
| 50 | __FILE__, __FUNCTION__, __LINE__, ## __VA_ARGS__); \ |
Eric Blake | 8c65971 | 2016-04-05 21:35:03 -0600 | [diff] [blame] | 51 | } while (0) |
Fam Zheng | 798bfe0 | 2016-01-14 16:41:02 +0800 | [diff] [blame] | 52 | |
| 53 | /* This is all part of the "official" NBD API. |
| 54 | * |
| 55 | * The most up-to-date documentation is available at: |
| 56 | * https://github.com/yoe/nbd/blob/master/doc/proto.txt |
| 57 | */ |
| 58 | |
| 59 | #define NBD_REQUEST_SIZE (4 + 4 + 8 + 8 + 4) |
| 60 | #define NBD_REPLY_SIZE (4 + 4 + 8) |
| 61 | #define NBD_REQUEST_MAGIC 0x25609513 |
| 62 | #define NBD_REPLY_MAGIC 0x67446698 |
| 63 | #define NBD_OPTS_MAGIC 0x49484156454F5054LL |
| 64 | #define NBD_CLIENT_MAGIC 0x0000420281861253LL |
| 65 | #define NBD_REP_MAGIC 0x3e889045565a9LL |
| 66 | |
| 67 | #define NBD_SET_SOCK _IO(0xab, 0) |
| 68 | #define NBD_SET_BLKSIZE _IO(0xab, 1) |
| 69 | #define NBD_SET_SIZE _IO(0xab, 2) |
| 70 | #define NBD_DO_IT _IO(0xab, 3) |
| 71 | #define NBD_CLEAR_SOCK _IO(0xab, 4) |
| 72 | #define NBD_CLEAR_QUE _IO(0xab, 5) |
| 73 | #define NBD_PRINT_DEBUG _IO(0xab, 6) |
| 74 | #define NBD_SET_SIZE_BLOCKS _IO(0xab, 7) |
| 75 | #define NBD_DISCONNECT _IO(0xab, 8) |
| 76 | #define NBD_SET_TIMEOUT _IO(0xab, 9) |
| 77 | #define NBD_SET_FLAGS _IO(0xab, 10) |
| 78 | |
| 79 | #define NBD_OPT_EXPORT_NAME (1) |
| 80 | #define NBD_OPT_ABORT (2) |
| 81 | #define NBD_OPT_LIST (3) |
Daniel P. Berrange | f95910f | 2016-02-10 18:41:11 +0000 | [diff] [blame] | 82 | #define NBD_OPT_PEEK_EXPORT (4) |
| 83 | #define NBD_OPT_STARTTLS (5) |
Fam Zheng | 798bfe0 | 2016-01-14 16:41:02 +0800 | [diff] [blame] | 84 | |
| 85 | /* NBD errors are based on errno numbers, so there is a 1:1 mapping, |
| 86 | * but only a limited set of errno values is specified in the protocol. |
| 87 | * Everything else is squashed to EINVAL. |
| 88 | */ |
| 89 | #define NBD_SUCCESS 0 |
| 90 | #define NBD_EPERM 1 |
| 91 | #define NBD_EIO 5 |
| 92 | #define NBD_ENOMEM 12 |
| 93 | #define NBD_EINVAL 22 |
| 94 | #define NBD_ENOSPC 28 |
| 95 | |
Daniel P. Berrange | 1c778ef | 2016-02-10 18:41:04 +0000 | [diff] [blame] | 96 | static inline ssize_t read_sync(QIOChannel *ioc, void *buffer, size_t size) |
Fam Zheng | 798bfe0 | 2016-01-14 16:41:02 +0800 | [diff] [blame] | 97 | { |
Daniel P. Berrange | 1c778ef | 2016-02-10 18:41:04 +0000 | [diff] [blame] | 98 | struct iovec iov = { .iov_base = buffer, .iov_len = size }; |
Fam Zheng | 798bfe0 | 2016-01-14 16:41:02 +0800 | [diff] [blame] | 99 | /* Sockets are kept in blocking mode in the negotiation phase. After |
| 100 | * that, a non-readable socket simply means that another thread stole |
| 101 | * our request/reply. Synchronization is done with recv_coroutine, so |
| 102 | * that this is coroutine-safe. |
| 103 | */ |
Eric Blake | 1e2a77a | 2016-07-15 12:32:03 -0600 | [diff] [blame] | 104 | return nbd_wr_syncv(ioc, &iov, 1, size, true); |
Fam Zheng | 798bfe0 | 2016-01-14 16:41:02 +0800 | [diff] [blame] | 105 | } |
| 106 | |
Daniel P. Berrange | 1c778ef | 2016-02-10 18:41:04 +0000 | [diff] [blame] | 107 | static inline ssize_t write_sync(QIOChannel *ioc, void *buffer, size_t size) |
Fam Zheng | 798bfe0 | 2016-01-14 16:41:02 +0800 | [diff] [blame] | 108 | { |
Daniel P. Berrange | 1c778ef | 2016-02-10 18:41:04 +0000 | [diff] [blame] | 109 | struct iovec iov = { .iov_base = buffer, .iov_len = size }; |
| 110 | |
Eric Blake | 1e2a77a | 2016-07-15 12:32:03 -0600 | [diff] [blame] | 111 | return nbd_wr_syncv(ioc, &iov, 1, size, false); |
Fam Zheng | 798bfe0 | 2016-01-14 16:41:02 +0800 | [diff] [blame] | 112 | } |
| 113 | |
Daniel P. Berrange | f95910f | 2016-02-10 18:41:11 +0000 | [diff] [blame] | 114 | struct NBDTLSHandshakeData { |
| 115 | GMainLoop *loop; |
| 116 | bool complete; |
| 117 | Error *error; |
| 118 | }; |
| 119 | |
| 120 | |
| 121 | void nbd_tls_handshake(Object *src, |
| 122 | Error *err, |
| 123 | void *opaque); |
| 124 | |
Fam Zheng | 798bfe0 | 2016-01-14 16:41:02 +0800 | [diff] [blame] | 125 | #endif |