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_ */