1 /*
2 * This file and its contents are supplied under the terms of the
3 * Common Development and Distribution License ("CDDL"), version 1.0.
4 * You may only use this file in accordance with the terms of version
5 * 1.0 of the CDDL.
6 *
7 * A full copy of the text of the CDDL should have accompanied this
8 * source. A copy of the CDDL is also available via the Internet at
9 * http://www.illumos.org/license/CDDL.
10 */
11
12 /*
13 * Copyright 2017 Nexenta Systems, Inc. All rights reserved.
14 */
15
16 #ifndef _LIBKRRP_H_
17 #define _LIBKRRP_H_
18
19 #include <sys/types.h>
20 #include <sys/nvpair.h>
21 #include <uuid/uuid.h>
22 #include <sys/krrp.h>
23 #include <netdb.h>
24 #include <errno.h>
25
26 #ifdef __cplusplus
27 extern "C" {
28 #endif
29
30 typedef char libkrrp_error_descr_t[1024];
31
32 typedef struct {
33 char address[MAXHOSTNAMELEN];
34 uint16_t port;
35 } libkrrp_srv_config_t;
36
37 typedef struct {
38 boolean_t enabled;
39 boolean_t running;
40 } libkrrp_svc_state_t;
41
42 typedef unsigned long krrp_sess_stream_flags_t;
43
44 #define KRRP_STREAM_ZFS_EMBEDDED 0x0001
45 #define KRRP_STREAM_ZFS_CHKSUM 0x0002
46 #define KRRP_STREAM_INCLUDE_ALL_SNAPS 0x0004
47 #define KRRP_STREAM_SEND_RECURSIVE 0x0008
48 #define KRRP_STREAM_SEND_PROPERTIES 0x0010
49 #define KRRP_STREAM_FORCE_RECEIVE 0x0020
50 #define KRRP_STREAM_DISCARD_HEAD 0x0040
51 #define KRRP_STREAM_LEAVE_TAIL 0x0080
52 #define KRRP_STREAM_ZFS_COMPRESSED 0x0100
53 #define KRRP_STREAM_ZFS_LARGE_BLOCKS 0x0200
54
55 typedef struct libkrrp_handle_s libkrrp_handle_t;
56 typedef struct libkrrp_evc_handle_s libkrrp_evc_handle_t;
57 typedef struct libkrrp_event_s libkrrp_event_t;
58
59 #define LIBKRRP_ERRF_REMOTE 0x1
60 #define LIBKRRP_ERRF_KERNEL 0x80000000
61
62 #define KRNKRRP_ERRNO_MAP(X) \
63 X(INTR) \
64 X(INVAL) \
65 X(BUSY) \
66 X(NOMEM) \
67 X(SESS) \
68 X(CONN) \
69 X(PDUENGINE) \
70 X(STREAM) \
71 X(SESSID) \
72 X(KSTATID) \
73 X(ADDR) \
74 X(PORT) \
75 X(DBLKSZ) \
76 X(MAXMEMSZ) \
77 X(FAKEDSZ) \
78 X(SRCDS) \
79 X(DSTDS) \
80 X(CMNSNAP) \
81 X(SRCSNAP) \
82 X(BADRESP) \
83 X(BIGPAYLOAD) \
84 X(UNEXPCLOSE) \
85 X(UNEXPEND) \
86 X(ZFSGCTXFAIL) \
87 X(CREATEFAIL) \
88 X(BINDFAIL) \
89 X(LISTENFAIL) \
90 X(CONNFAIL) \
91 X(ACCEPTFAIL) \
92 X(SENDFAIL) \
93 X(SENDMBLKFAIL) \
94 X(RECVFAIL) \
95 X(READFAIL) \
96 X(WRITEFAIL) \
97 X(FLCTRLVIOL) \
98 X(PINGTIMEOUT) \
99 X(SETSOCKOPTFAIL) \
100 X(PROTO) \
101 X(AUTH) \
102 X(CFGTYPE) \
103 X(SNAPFAIL) \
104 X(CONNTIMEOUT) \
105 X(THROTTLE) \
106 X(AUTOSNAP) \
107 X(RESUMETOKEN) \
108 X(KEEPSNAPS) \
109 X(SKIP_SNAPS_MASK) \
110
111 #define LIBKRRP_ERRNO_MAP(X) \
112 X(IOCTLFAIL) \
113 X(NOTSUP) \
114 X(IOCTLDATAFAIL) \
115 X(SVCACTIVE) \
116 X(SVCNOTACTIVE) \
117 X(EVBINDFAIL) \
118 X(EVSUBSRIBEFAIL) \
119 X(EVREADFAIL) \
120 X(SESSERR) \
121 X(PROPS) \
122
123 #define LIBKRRP_ERRNO_EXPAND(enum_name) LIBKRRP_ERRNO_##enum_name,
124 typedef enum {
125 LIBKRRP_ERRNO_OK = 0,
126 LIBKRRP_ERRNO_UNKNOWN = 1000,
127 KRNKRRP_ERRNO_MAP(LIBKRRP_ERRNO_EXPAND)
128 LIBKRRP_ERRNO_RESERVED = 2000,
129 LIBKRRP_ERRNO_MAP(LIBKRRP_ERRNO_EXPAND)
130 LIBKRRP_ERRNO_LAST
131 } libkrrp_errno_t;
132 #undef LIBKRRP_ERRNO_EXPAND
133
134 typedef enum {
135 LIBKRRP_SESS_TYPE_SENDER,
136 LIBKRRP_SESS_TYPE_RECEIVER,
137 LIBKRRP_SESS_TYPE_COMPOUND
138 } libkrrp_sess_type_t;
139
140 typedef struct libkrrp_error_s {
141 libkrrp_errno_t libkrrp_errno;
142 int unix_errno;
143 uint32_t flags;
144 } libkrrp_error_t;
145
146 typedef struct libkrrp_sess_list_s {
147 uuid_t sess_id;
148 char *sess_kstat_id;
149 boolean_t sess_started;
150 boolean_t sess_running;
151 struct libkrrp_sess_list_s *sl_next;
152 } libkrrp_sess_list_t;
153
154 #define LIBKRRP_EV_TYPE_MAP(X) \
155 X(SESS_SEND_DONE) \
156 X(SESS_ERROR) \
157 X(SERVER_ERROR) \
158
159 #define LIBKRRP_EV_TYPE_EXPAND(enum_name) LIBKRRP_EV_TYPE_##enum_name,
160 typedef enum {
161 LIBKRRP_EV_TYPE_UNKNOWN,
162 LIBKRRP_EV_TYPE_MAP(LIBKRRP_EV_TYPE_EXPAND)
163 LIBKRRP_EV_TYPE_LAST
164 } libkrrp_ev_type_t;
165 #undef LIBKRRP_EV_TYPE_EXPAND
166
167 typedef struct libkrrp_ev_sess_send_done_data_s {
168 uuid_t sess_id;
169 } libkrrp_ev_sess_send_done_data_t;
170
171 typedef struct libkrrp_ev_sess_error_data_s {
172 uuid_t sess_id;
173 libkrrp_error_t libkrrp_error;
174 } libkrrp_ev_sess_error_data_t;
175
176 typedef union {
177 libkrrp_ev_sess_send_done_data_t sess_send_done;
178 libkrrp_ev_sess_error_data_t sess_error;
179 libkrrp_error_t server_error;
180 } libkrrp_ev_data_t;
181
182 typedef struct libkrrp_sess_status_s {
183 uuid_t sess_id;
184 libkrrp_sess_type_t sess_type;
185 boolean_t sess_running;
186 boolean_t sess_started;
187 char sess_kstat_id[KRRP_KSTAT_ID_STRING_LENGTH];
188 libkrrp_error_t libkrrp_error;
189 } libkrrp_sess_status_t;
190
191 typedef struct libkrrp_sess_conn_info_s {
192 uint32_t blk_sz;
193 } libkrrp_sess_conn_info_t;
194
195 boolean_t is_krrp_supported(void);
196
197 libkrrp_handle_t *libkrrp_init(void);
198 void libkrrp_fini(libkrrp_handle_t *);
199
200 int krrp_set_srv_config(libkrrp_handle_t *, const char *, const uint16_t);
201 int krrp_get_srv_config(libkrrp_handle_t *, libkrrp_srv_config_t *);
202
203 int krrp_sess_create_sender(libkrrp_handle_t *, uuid_t, const char *,
204 const char *, boolean_t);
205 int krrp_sess_create_receiver(libkrrp_handle_t *, uuid_t, const char *,
206 const char *, boolean_t);
207 int krrp_sess_create_compound(libkrrp_handle_t *, uuid_t, const char *,
208 boolean_t);
209
210 int krrp_sess_destroy(libkrrp_handle_t *, uuid_t);
211
212 int krrp_sess_set_private_data(libkrrp_handle_t *hdl, uuid_t sess_id,
213 nvlist_t *private_data);
214 int krrp_sess_get_private_data(libkrrp_handle_t *hdl, uuid_t sess_id,
215 nvlist_t **private_data);
216
217 int krrp_sess_create_conn(libkrrp_handle_t *, uuid_t, const char *,
218 const uint16_t, const uint32_t);
219 int krrp_sess_conn_throttle(libkrrp_handle_t *, uuid_t, const uint32_t);
220 int krrp_sess_create_pdu_engine(libkrrp_handle_t *, uuid_t, const int,
221 const int, boolean_t);
222
223 int krrp_sess_create_read_stream(libkrrp_handle_t *, uuid_t, const char *,
224 const char *, const char *, uint64_t, krrp_sess_stream_flags_t,
225 const char *, uint32_t, const char *);
226 int krrp_sess_create_write_stream(libkrrp_handle_t *, uuid_t, const char *,
227 const char *, krrp_sess_stream_flags_t, nvlist_t *ignore_props,
228 nvlist_t *replace_props, const char *, uint32_t);
229
230 int krrp_sess_run(libkrrp_handle_t *, uuid_t, boolean_t);
231 int krrp_sess_send_stop(libkrrp_handle_t *, uuid_t);
232
233 int krrp_sess_list(libkrrp_handle_t *, libkrrp_sess_list_t **);
234 void krrp_sess_list_free(libkrrp_sess_list_t *);
235
236 int krrp_sess_get_conn_info(libkrrp_handle_t *hdl, uuid_t sess_id,
237 libkrrp_sess_conn_info_t *sess_conn_info);
238
239 int krrp_sess_status(libkrrp_handle_t *, uuid_t, libkrrp_sess_status_t *);
240 void libkrrp_sess_error_description(libkrrp_error_t *, libkrrp_error_descr_t);
241
242 int krrp_svc_enable(libkrrp_handle_t *);
243 int krrp_svc_disable(libkrrp_handle_t *);
244 int krrp_svc_state(libkrrp_handle_t *, libkrrp_svc_state_t *);
245
246 const libkrrp_error_t *libkrrp_error(libkrrp_handle_t *);
247 const char *libkrrp_error_description(libkrrp_handle_t *);
248
249 int libkrrp_evc_subscribe(libkrrp_evc_handle_t **,
250 int(*)(libkrrp_event_t *, void *), void *);
251 void libkrrp_evc_unsubscribe(libkrrp_evc_handle_t *);
252 libkrrp_error_t *libkrrp_evc_error(libkrrp_evc_handle_t *);
253 const char *libkrrp_evc_error_description(libkrrp_evc_handle_t *);
254
255 libkrrp_event_t *libkrrp_ev_dup(libkrrp_event_t *);
256 libkrrp_ev_type_t libkrrp_ev_type(libkrrp_event_t *);
257 libkrrp_ev_data_t *libkrrp_ev_data(libkrrp_event_t *);
258 libkrrp_error_t *libkrrp_ev_error(libkrrp_event_t *);
259 const char *libkrrp_ev_error_description(libkrrp_event_t *);
260 void libkrrp_ev_data_error_description(libkrrp_ev_type_t, libkrrp_error_t *,
261 libkrrp_error_descr_t);
262 void libkrrp_ev_free(libkrrp_event_t *);
263
264 #ifdef __cplusplus
265 }
266 #endif
267
268 #endif /* _LIBKRRP_H_ */