1*94c4a1e1SFrank Piva // SPDX-License-Identifier: GPL-2.0 2*94c4a1e1SFrank Piva /* 3*94c4a1e1SFrank Piva * 1999 Copyright (C) Pavel Machek, [email protected]. This code is GPL. 4*94c4a1e1SFrank Piva * 1999/11/04 Copyright (C) 1999 VMware, Inc. (Regis "HPReg" Duchesne) 5*94c4a1e1SFrank Piva * Made nbd_end_request() use the io_request_lock 6*94c4a1e1SFrank Piva * 2001 Copyright (C) Steven Whitehouse 7*94c4a1e1SFrank Piva * New nbd_end_request() for compatibility with new linux block 8*94c4a1e1SFrank Piva * layer code. 9*94c4a1e1SFrank Piva * 2003/06/24 Louis D. Langholtz <[email protected]> 10*94c4a1e1SFrank Piva * Removed unneeded blksize_bits field from nbd_device struct. 11*94c4a1e1SFrank Piva * Cleanup PARANOIA usage & code. 12*94c4a1e1SFrank Piva * 2004/02/19 Paul Clements 13*94c4a1e1SFrank Piva * Removed PARANOIA, plus various cleanup and comments 14*94c4a1e1SFrank Piva */ 15*94c4a1e1SFrank Piva 16*94c4a1e1SFrank Piva #ifndef LINUX_NBD_H 17*94c4a1e1SFrank Piva #define LINUX_NBD_H 18*94c4a1e1SFrank Piva 19*94c4a1e1SFrank Piva #include <stdbool.h> 20*94c4a1e1SFrank Piva 21*94c4a1e1SFrank Piva #ifdef __cplusplus 22*94c4a1e1SFrank Piva extern "C" { 23*94c4a1e1SFrank Piva #endif 24*94c4a1e1SFrank Piva 25*94c4a1e1SFrank Piva //#include <linux/types.h> 26*94c4a1e1SFrank Piva 27*94c4a1e1SFrank Piva #if 0 28*94c4a1e1SFrank Piva #define NBD_SET_SOCK _IO( 0xab, 0 ) 29*94c4a1e1SFrank Piva #define NBD_SET_BLKSIZE _IO( 0xab, 1 ) 30*94c4a1e1SFrank Piva #define NBD_SET_SIZE _IO( 0xab, 2 ) 31*94c4a1e1SFrank Piva #define NBD_DO_IT _IO( 0xab, 3 ) 32*94c4a1e1SFrank Piva #define NBD_CLEAR_SOCK _IO( 0xab, 4 ) 33*94c4a1e1SFrank Piva #define NBD_CLEAR_QUE _IO( 0xab, 5 ) 34*94c4a1e1SFrank Piva #define NBD_PRINT_DEBUG _IO( 0xab, 6 ) 35*94c4a1e1SFrank Piva #define NBD_SET_SIZE_BLOCKS _IO( 0xab, 7 ) 36*94c4a1e1SFrank Piva #define NBD_DISCONNECT _IO( 0xab, 8 ) 37*94c4a1e1SFrank Piva #define NBD_SET_TIMEOUT _IO( 0xab, 9 ) 38*94c4a1e1SFrank Piva #define NBD_SET_FLAGS _IO( 0xab, 10 ) 39*94c4a1e1SFrank Piva #endif 40*94c4a1e1SFrank Piva 41*94c4a1e1SFrank Piva enum { 42*94c4a1e1SFrank Piva NBD_CMD_READ = 0, 43*94c4a1e1SFrank Piva NBD_CMD_WRITE = 1, 44*94c4a1e1SFrank Piva NBD_CMD_DISC = 2, 45*94c4a1e1SFrank Piva NBD_CMD_FLUSH = 3, 46*94c4a1e1SFrank Piva NBD_CMD_TRIM = 4, 47*94c4a1e1SFrank Piva NBD_CMD_CACHE = 5, 48*94c4a1e1SFrank Piva NBD_CMD_WRITE_ZEROES = 6, 49*94c4a1e1SFrank Piva NBD_CMD_BLOCK_STATUS = 7, 50*94c4a1e1SFrank Piva NBD_CMD_RESIZE = 8 51*94c4a1e1SFrank Piva }; 52*94c4a1e1SFrank Piva 53*94c4a1e1SFrank Piva #define NBD_CMD_MASK_COMMAND 0x0000ffff 54*94c4a1e1SFrank Piva #define NBD_CMD_SHIFT (16) 55*94c4a1e1SFrank Piva #define NBD_CMD_FLAG_FUA ((1 << 0) << NBD_CMD_SHIFT) 56*94c4a1e1SFrank Piva #define NBD_CMD_FLAG_NO_HOLE ((1 << 1) << NBD_CMD_SHIFT) 57*94c4a1e1SFrank Piva 58*94c4a1e1SFrank Piva /* values for flags field */ 59*94c4a1e1SFrank Piva #define NBD_FLAG_HAS_FLAGS (1 << 0) /* Flags are there */ 60*94c4a1e1SFrank Piva #define NBD_FLAG_READ_ONLY (1 << 1) /* Device is read-only */ 61*94c4a1e1SFrank Piva #define NBD_FLAG_SEND_FLUSH (1 << 2) /* Send FLUSH */ 62*94c4a1e1SFrank Piva #define NBD_FLAG_SEND_FUA (1 << 3) /* Send FUA (Force Unit Access) */ 63*94c4a1e1SFrank Piva #define NBD_FLAG_ROTATIONAL (1 << 4) /* Use elevator algorithm - rotational media */ 64*94c4a1e1SFrank Piva #define NBD_FLAG_SEND_TRIM (1 << 5) /* Send TRIM (discard) */ 65*94c4a1e1SFrank Piva #define NBD_FLAG_SEND_WRITE_ZEROES (1 << 6) /* Send NBD_CMD_WRITE_ZEROES */ 66*94c4a1e1SFrank Piva #define NBD_FLAG_CAN_MULTI_CONN (1 << 8) /* multiple connections are okay */ 67*94c4a1e1SFrank Piva 68*94c4a1e1SFrank Piva /* from libnbd/lib/nbd-protocol.h */ 69*94c4a1e1SFrank Piva #define NBD_FLAG_SEND_DF (1 << 7) 70*94c4a1e1SFrank Piva #define NBD_FLAG_SEND_CACHE (1 << 10) 71*94c4a1e1SFrank Piva #define NBD_FLAG_SEND_FAST_ZERO (1 << 11) 72*94c4a1e1SFrank Piva 73*94c4a1e1SFrank Piva #define nbd_cmd(req) ((req)->cmd[0]) 74*94c4a1e1SFrank Piva 75*94c4a1e1SFrank Piva /* userspace doesn't need the nbd_device structure */ 76*94c4a1e1SFrank Piva 77*94c4a1e1SFrank Piva /* These are sent over the network in the request/reply magic fields */ 78*94c4a1e1SFrank Piva 79*94c4a1e1SFrank Piva #define NBD_REQUEST_MAGIC 0x25609513 80*94c4a1e1SFrank Piva #define NBD_REPLY_MAGIC 0x67446698 81*94c4a1e1SFrank Piva #define NBD_STRUCTURED_REPLY_MAGIC 0x668e33ef 82*94c4a1e1SFrank Piva 83*94c4a1e1SFrank Piva /* for the trace log, not part of the protocol, not sent over the wire */ 84*94c4a1e1SFrank Piva #define NBD_TRACELOG_MAGIC 0x25609514 85*94c4a1e1SFrank Piva 86*94c4a1e1SFrank Piva #define NBD_OPT_REPLY_MAGIC 0x3e889045565a9LL 87*94c4a1e1SFrank Piva 88*94c4a1e1SFrank Piva /* 89*94c4a1e1SFrank Piva * This is the packet used for communication between client and 90*94c4a1e1SFrank Piva * server. All data are in network byte order. 91*94c4a1e1SFrank Piva */ 92*94c4a1e1SFrank Piva struct nbd_request { 93*94c4a1e1SFrank Piva uint32_t magic; 94*94c4a1e1SFrank Piva uint32_t type; /* == READ || == WRITE */ 95*94c4a1e1SFrank Piva char handle[8]; 96*94c4a1e1SFrank Piva uint64_t from; 97*94c4a1e1SFrank Piva uint32_t len; 98*94c4a1e1SFrank Piva } __attribute__ ((packed)); 99*94c4a1e1SFrank Piva 100*94c4a1e1SFrank Piva /* 101*94c4a1e1SFrank Piva * This is the reply packet that nbd-server sends back to the client after 102*94c4a1e1SFrank Piva * it has completed an I/O request (or an error occurs). 103*94c4a1e1SFrank Piva */ 104*94c4a1e1SFrank Piva struct nbd_reply { 105*94c4a1e1SFrank Piva uint32_t magic; 106*94c4a1e1SFrank Piva uint32_t error; /* 0 = ok, else error */ 107*94c4a1e1SFrank Piva char handle[8]; /* handle you got from request */ 108*94c4a1e1SFrank Piva }; 109*94c4a1e1SFrank Piva 110*94c4a1e1SFrank Piva extern int opennet(const char *name, const char* portstr, int sdp); 111*94c4a1e1SFrank Piva extern int openunix(const char *path); 112*94c4a1e1SFrank Piva extern void negotiate(int *sockp, u64 *rsize64, uint16_t *flags, char* name, 113*94c4a1e1SFrank Piva uint32_t needed_flags, uint32_t client_flags, uint32_t do_opts, 114*94c4a1e1SFrank Piva char *certfile, char *keyfile, char *cacertfile, 115*94c4a1e1SFrank Piva char *tlshostname, bool tls, bool can_opt_go); 116*94c4a1e1SFrank Piva 117*94c4a1e1SFrank Piva #ifdef __cplusplus 118*94c4a1e1SFrank Piva } 119*94c4a1e1SFrank Piva #endif 120*94c4a1e1SFrank Piva #endif 121