xref: /aosp_15_r20/external/ublksrv/nbd/cliserv.h (revision 94c4a1e103eb1715230460aab379dff275992c20)
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