1*94c4a1e1SFrank Piva // SPDX-License-Identifier: GPL-2.0 2*94c4a1e1SFrank Piva 3*94c4a1e1SFrank Piva #ifndef UBLK_NBD_CLISERV_INC_H 4*94c4a1e1SFrank Piva #define UBLK_NBD_CLISERV_INC_H 5*94c4a1e1SFrank Piva 6*94c4a1e1SFrank Piva /* This header file is shared by client & server. They really have 7*94c4a1e1SFrank Piva * something to share... 8*94c4a1e1SFrank Piva * */ 9*94c4a1e1SFrank Piva 10*94c4a1e1SFrank Piva /* Client/server protocol is as follows: 11*94c4a1e1SFrank Piva Send INIT_PASSWD 12*94c4a1e1SFrank Piva Send 64-bit cliserv_magic 13*94c4a1e1SFrank Piva Send 64-bit size of exported device 14*94c4a1e1SFrank Piva Send 128 bytes of zeros (reserved for future use) 15*94c4a1e1SFrank Piva */ 16*94c4a1e1SFrank Piva 17*94c4a1e1SFrank Piva #include <errno.h> 18*94c4a1e1SFrank Piva #include <string.h> 19*94c4a1e1SFrank Piva #include <netdb.h> 20*94c4a1e1SFrank Piva #include <netinet/tcp.h> 21*94c4a1e1SFrank Piva #include <netinet/in.h> 22*94c4a1e1SFrank Piva #include <stdlib.h> 23*94c4a1e1SFrank Piva 24*94c4a1e1SFrank Piva #ifdef __cplusplus 25*94c4a1e1SFrank Piva extern "C" { 26*94c4a1e1SFrank Piva #endif 27*94c4a1e1SFrank Piva 28*94c4a1e1SFrank Piva #define NOTLS 29*94c4a1e1SFrank Piva 30*94c4a1e1SFrank Piva #define u64 uint64_t 31*94c4a1e1SFrank Piva #define u32 uint32_t 32*94c4a1e1SFrank Piva #define u16 uint16_t 33*94c4a1e1SFrank Piva #define u8 uint8_t 34*94c4a1e1SFrank Piva 35*94c4a1e1SFrank Piva #define s64 int64_t 36*94c4a1e1SFrank Piva #define s32 int32_t 37*94c4a1e1SFrank Piva #define s16 int16_t 38*94c4a1e1SFrank Piva #define s8 int8_t 39*94c4a1e1SFrank Piva 40*94c4a1e1SFrank Piva #define __be32 u32 41*94c4a1e1SFrank Piva #define __be64 u64 42*94c4a1e1SFrank Piva #include "nbd.h" 43*94c4a1e1SFrank Piva 44*94c4a1e1SFrank Piva #ifndef HAVE_FDATASYNC 45*94c4a1e1SFrank Piva #define fdatasync(arg) fsync(arg) 46*94c4a1e1SFrank Piva #endif 47*94c4a1e1SFrank Piva 48*94c4a1e1SFrank Piva #if NBD_LFS==1 49*94c4a1e1SFrank Piva /* /usr/include/features.h (included from /usr/include/sys/types.h) 50*94c4a1e1SFrank Piva defines this when _GNU_SOURCE is defined 51*94c4a1e1SFrank Piva */ 52*94c4a1e1SFrank Piva #ifndef _LARGEFILE_SOURCE 53*94c4a1e1SFrank Piva #define _LARGEFILE_SOURCE 54*94c4a1e1SFrank Piva #endif 55*94c4a1e1SFrank Piva #define _FILE_OFFSET_BITS 64 56*94c4a1e1SFrank Piva #endif 57*94c4a1e1SFrank Piva 58*94c4a1e1SFrank Piva #ifndef G_GNUC_NORETURN 59*94c4a1e1SFrank Piva #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4) 60*94c4a1e1SFrank Piva #define G_GNUC_NORETURN __attribute__((__noreturn__)) 61*94c4a1e1SFrank Piva #define G_GNUC_UNUSED __attribute__((unused)) 62*94c4a1e1SFrank Piva #else 63*94c4a1e1SFrank Piva #define G_GNUC_NORETURN 64*94c4a1e1SFrank Piva #define G_GNUC_UNUSED 65*94c4a1e1SFrank Piva #endif 66*94c4a1e1SFrank Piva #endif 67*94c4a1e1SFrank Piva 68*94c4a1e1SFrank Piva extern const u64 cliserv_magic; 69*94c4a1e1SFrank Piva extern const u64 opts_magic; 70*94c4a1e1SFrank Piva extern const u64 rep_magic; 71*94c4a1e1SFrank Piva 72*94c4a1e1SFrank Piva #define INIT_PASSWD "NBDMAGIC" 73*94c4a1e1SFrank Piva 74*94c4a1e1SFrank Piva #define INFO(a) do { } while(0) 75*94c4a1e1SFrank Piva 76*94c4a1e1SFrank Piva int set_nonblocking(int fd, int nb); 77*94c4a1e1SFrank Piva void setmysockopt(int sock); 78*94c4a1e1SFrank Piva void err_nonfatal(const char *s); 79*94c4a1e1SFrank Piva 80*94c4a1e1SFrank Piva void nbd_err(const char *s) G_GNUC_NORETURN; 81*94c4a1e1SFrank Piva #define err(S) nbd_err(S) 82*94c4a1e1SFrank Piva 83*94c4a1e1SFrank Piva void logging(const char* name); 84*94c4a1e1SFrank Piva 85*94c4a1e1SFrank Piva #ifndef ntohll 86*94c4a1e1SFrank Piva uint64_t ntohll(uint64_t a); 87*94c4a1e1SFrank Piva #endif 88*94c4a1e1SFrank Piva #ifndef htonll 89*94c4a1e1SFrank Piva #define htonll ntohll 90*94c4a1e1SFrank Piva #endif 91*94c4a1e1SFrank Piva 92*94c4a1e1SFrank Piva int readit(int f, void *buf, size_t len); 93*94c4a1e1SFrank Piva int writeit(int f, void *buf, size_t len); 94*94c4a1e1SFrank Piva 95*94c4a1e1SFrank Piva #define NBD_DEFAULT_PORT "10809" /* Port on which named exports are 96*94c4a1e1SFrank Piva * served */ 97*94c4a1e1SFrank Piva 98*94c4a1e1SFrank Piva /* Options that the client can select to the server */ 99*94c4a1e1SFrank Piva #define NBD_OPT_EXPORT_NAME (1) /**< Client wants to select a named export (is followed by name of export) */ 100*94c4a1e1SFrank Piva #define NBD_OPT_ABORT (2) /**< Client wishes to abort negotiation */ 101*94c4a1e1SFrank Piva #define NBD_OPT_LIST (3) /**< Client request list of supported exports (not followed by data) */ 102*94c4a1e1SFrank Piva #define NBD_OPT_STARTTLS (5) /**< Client wishes to initiate TLS */ 103*94c4a1e1SFrank Piva #define NBD_OPT_INFO (6) /**< Client wants information about the given export */ 104*94c4a1e1SFrank Piva #define NBD_OPT_GO (7) /**< Client wants to select the given and move to the transmission phase */ 105*94c4a1e1SFrank Piva 106*94c4a1e1SFrank Piva /* Replies the server can send during negotiation */ 107*94c4a1e1SFrank Piva #define NBD_REP_ACK (1) /**< ACK a request. Data: option number to be acked */ 108*94c4a1e1SFrank Piva #define NBD_REP_SERVER (2) /**< Reply to NBD_OPT_LIST (one of these per server; must be followed by NBD_REP_ACK to signal the end of the list */ 109*94c4a1e1SFrank Piva #define NBD_REP_INFO (3) /**< Reply to NBD_OPT_INFO */ 110*94c4a1e1SFrank Piva #define NBD_REP_FLAG_ERROR (1 << 31) /** If the high bit is set, the reply is an error */ 111*94c4a1e1SFrank Piva #define NBD_REP_ERR_UNSUP (1U | NBD_REP_FLAG_ERROR) /**< Client requested an option not understood by this version of the server */ 112*94c4a1e1SFrank Piva #define NBD_REP_ERR_POLICY (2U | NBD_REP_FLAG_ERROR) /**< Client requested an option not allowed by server configuration. (e.g., the option was disabled) */ 113*94c4a1e1SFrank Piva #define NBD_REP_ERR_INVALID (3U | NBD_REP_FLAG_ERROR) /**< Client issued an invalid request */ 114*94c4a1e1SFrank Piva #define NBD_REP_ERR_PLATFORM (4U | NBD_REP_FLAG_ERROR) /**< Option not supported on this platform */ 115*94c4a1e1SFrank Piva #define NBD_REP_ERR_TLS_REQD (5U | NBD_REP_FLAG_ERROR) /**< TLS required */ 116*94c4a1e1SFrank Piva #define NBD_REP_ERR_UNKNOWN (6U | NBD_REP_FLAG_ERROR) /**< NBD_OPT_INFO or ..._GO requested on unknown export */ 117*94c4a1e1SFrank Piva #define NBD_REP_ERR_BLOCK_SIZE_REQD (8 | NBD_REP_FLAG_ERROR) /**< Server is not willing to serve the export without the block size being negotiated */ 118*94c4a1e1SFrank Piva 119*94c4a1e1SFrank Piva /* Global flags */ 120*94c4a1e1SFrank Piva #define NBD_FLAG_FIXED_NEWSTYLE (1 << 0) /**< new-style export that actually supports extending */ 121*94c4a1e1SFrank Piva #define NBD_FLAG_NO_ZEROES (1 << 1) /**< we won't send the 128 bits of zeroes if the client sends NBD_FLAG_C_NO_ZEROES */ 122*94c4a1e1SFrank Piva /* Flags from client to server. */ 123*94c4a1e1SFrank Piva #define NBD_FLAG_C_FIXED_NEWSTYLE NBD_FLAG_FIXED_NEWSTYLE 124*94c4a1e1SFrank Piva #define NBD_FLAG_C_NO_ZEROES NBD_FLAG_NO_ZEROES 125*94c4a1e1SFrank Piva 126*94c4a1e1SFrank Piva /* Info types */ 127*94c4a1e1SFrank Piva #define NBD_INFO_EXPORT (0) 128*94c4a1e1SFrank Piva #define NBD_INFO_NAME (1) 129*94c4a1e1SFrank Piva #define NBD_INFO_DESCRIPTION (2) 130*94c4a1e1SFrank Piva #define NBD_INFO_BLOCK_SIZE (3) 131*94c4a1e1SFrank Piva 132*94c4a1e1SFrank Piva #ifdef __cplusplus 133*94c4a1e1SFrank Piva } 134*94c4a1e1SFrank Piva #endif 135*94c4a1e1SFrank Piva #endif 136