qemu/include/block/nbd.h
<<
>>
Prefs
   1/*
   2 *  Copyright (C) 2005  Anthony Liguori <anthony@codemonkey.ws>
   3 *
   4 *  Network Block Device
   5 *
   6 *  This program is free software; you can redistribute it and/or modify
   7 *  it under the terms of the GNU General Public License as published by
   8 *  the Free Software Foundation; under version 2 of the License.
   9 *
  10 *  This program is distributed in the hope that it will be useful,
  11 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13 *  GNU General Public License for more details.
  14 *
  15 *  You should have received a copy of the GNU General Public License
  16 *  along with this program; if not, see <http://www.gnu.org/licenses/>.
  17 */
  18
  19#ifndef NBD_H
  20#define NBD_H
  21
  22#include <sys/types.h>
  23
  24#include "qemu-common.h"
  25
  26struct nbd_request {
  27    uint32_t magic;
  28    uint32_t type;
  29    uint64_t handle;
  30    uint64_t from;
  31    uint32_t len;
  32} QEMU_PACKED;
  33
  34struct nbd_reply {
  35    uint32_t magic;
  36    uint32_t error;
  37    uint64_t handle;
  38} QEMU_PACKED;
  39
  40#define NBD_FLAG_HAS_FLAGS      (1 << 0)        /* Flags are there */
  41#define NBD_FLAG_READ_ONLY      (1 << 1)        /* Device is read-only */
  42#define NBD_FLAG_SEND_FLUSH     (1 << 2)        /* Send FLUSH */
  43#define NBD_FLAG_SEND_FUA       (1 << 3)        /* Send FUA (Force Unit Access) */
  44#define NBD_FLAG_ROTATIONAL     (1 << 4)        /* Use elevator algorithm - rotational media */
  45#define NBD_FLAG_SEND_TRIM      (1 << 5)        /* Send TRIM (discard) */
  46
  47#define NBD_CMD_MASK_COMMAND    0x0000ffff
  48#define NBD_CMD_FLAG_FUA        (1 << 16)
  49
  50enum {
  51    NBD_CMD_READ = 0,
  52    NBD_CMD_WRITE = 1,
  53    NBD_CMD_DISC = 2,
  54    NBD_CMD_FLUSH = 3,
  55    NBD_CMD_TRIM = 4
  56};
  57
  58#define NBD_DEFAULT_PORT        10809
  59
  60#define NBD_BUFFER_SIZE (1024*1024)
  61
  62ssize_t nbd_wr_sync(int fd, void *buffer, size_t size, bool do_read);
  63int tcp_socket_outgoing(const char *address, uint16_t port);
  64int tcp_socket_incoming(const char *address, uint16_t port);
  65int tcp_socket_outgoing_spec(const char *address_and_port);
  66int tcp_socket_incoming_spec(const char *address_and_port);
  67int unix_socket_outgoing(const char *path);
  68int unix_socket_incoming(const char *path);
  69
  70int nbd_receive_negotiate(int csock, const char *name, uint32_t *flags,
  71                          off_t *size, size_t *blocksize);
  72int nbd_init(int fd, int csock, uint32_t flags, off_t size, size_t blocksize);
  73ssize_t nbd_send_request(int csock, struct nbd_request *request);
  74ssize_t nbd_receive_reply(int csock, struct nbd_reply *reply);
  75int nbd_client(int fd);
  76int nbd_disconnect(int fd);
  77
  78typedef struct NBDExport NBDExport;
  79typedef struct NBDClient NBDClient;
  80
  81NBDExport *nbd_export_new(BlockDriverState *bs, off_t dev_offset,
  82                          off_t size, uint32_t nbdflags,
  83                          void (*close)(NBDExport *));
  84void nbd_export_close(NBDExport *exp);
  85void nbd_export_get(NBDExport *exp);
  86void nbd_export_put(NBDExport *exp);
  87
  88BlockDriverState *nbd_export_get_blockdev(NBDExport *exp);
  89
  90NBDExport *nbd_export_find(const char *name);
  91void nbd_export_set_name(NBDExport *exp, const char *name);
  92void nbd_export_close_all(void);
  93
  94NBDClient *nbd_client_new(NBDExport *exp, int csock,
  95                          void (*close)(NBDClient *));
  96void nbd_client_close(NBDClient *client);
  97void nbd_client_get(NBDClient *client);
  98void nbd_client_put(NBDClient *client);
  99
 100#endif
 101