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" 14 #include "io/channel-tls.h" 15 16 #include "qemu/coroutine.h" 17 #include "qemu/iov.h" 18 19 #ifndef _WIN32 20 #include <sys/ioctl.h> 21 #endif 22 #if defined(__sun__) || defined(__HAIKU__) 23 #include <sys/ioccom.h> 24 #endif 25 26 #ifdef __linux__ 27 #include <linux/fs.h> 28 #endif 29 30 #include "qemu/bswap.h" 31 #include "qemu/queue.h" 32 #include "qemu/main-loop.h" 33 34 /* #define DEBUG_NBD */ 35 36 #ifdef DEBUG_NBD 37 #define DEBUG_NBD_PRINT 1 38 #else 39 #define DEBUG_NBD_PRINT 0 40 #endif 41 42 #define TRACE(msg, ...) do { \ 43 if (DEBUG_NBD_PRINT) { \ 44 LOG(msg, ## __VA_ARGS__); \ 45 } \ 46 } while (0) 47 48 #define LOG(msg, ...) do { \ 49 fprintf(stderr, "%s:%s():L%d: " msg "\n", \ 50 __FILE__, __FUNCTION__, __LINE__, ## __VA_ARGS__); \ 51 } while (0) 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) 82 #define NBD_OPT_PEEK_EXPORT (4) 83 #define NBD_OPT_STARTTLS (5) 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 96 static inline ssize_t read_sync(QIOChannel *ioc, void *buffer, size_t size) 97 { 98 struct iovec iov = { .iov_base = buffer, .iov_len = size }; 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 */ 104 return nbd_wr_syncv(ioc, &iov, 1, 0, size, true); 105 } 106 107 static inline ssize_t write_sync(QIOChannel *ioc, void *buffer, size_t size) 108 { 109 struct iovec iov = { .iov_base = buffer, .iov_len = size }; 110 111 return nbd_wr_syncv(ioc, &iov, 1, 0, size, false); 112 } 113 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 125 #endif 126