1 /*
   2  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
   3  */
   4 
   5 /*
   6  * BSD 3 Clause License
   7  *
   8  * Copyright (c) 2007, The Storage Networking Industry Association.
   9  *
  10  * Redistribution and use in source and binary forms, with or without
  11  * modification, are permitted provided that the following conditions
  12  * are met:
  13  *      - Redistributions of source code must retain the above copyright
  14  *        notice, this list of conditions and the following disclaimer.
  15  *
  16  *      - Redistributions in binary form must reproduce the above copyright
  17  *        notice, this list of conditions and the following disclaimer in
  18  *        the documentation and/or other materials provided with the
  19  *        distribution.
  20  *
  21  *      - Neither the name of The Storage Networking Industry Association (SNIA)
  22  *        nor the names of its contributors may be used to endorse or promote
  23  *        products derived from this software without specific prior written
  24  *        permission.
  25  *
  26  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  27  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  28  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  29  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  30  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  31  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  32  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  33  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  34  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  35  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  36  * POSSIBILITY OF SUCH DAMAGE.
  37  */
  38 /* Copyright (c) 2007, The Storage Networking Industry Association. */
  39 /* Copyright (c) 1996, 1997 PDC, Network Appliance. All Rights Reserved */
  40 /*
  41  * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
  42  */
  43 
  44 #ifndef _NDMP_COMMON_H
  45 #define _NDMP_COMMON_H
  46 
  47 #include <thread.h>
  48 #include <synch.h>
  49 #include "ndmp.h"
  50 #include <unistd.h>
  51 #include <sys/types.h>
  52 #include <rpc/rpc.h>
  53 #include <sys/stat.h>
  54 #include <stdio.h>
  55 #include <bsm/adt.h>
  56 #include <bsm/adt_event.h>
  57 
  58 
  59 #define XDR_AND_SIZE(func) (bool_t(*)(XDR*, ...))xdr_##func, sizeof (func)
  60 #define AUTH_REQUIRED   TRUE
  61 #define AUTH_NOT_REQUIRED       FALSE
  62 #define NDMP_EOM_MAGIC  "PRCMEOM"
  63 #define NDMP_RCF_BASENAME       "NdmpBackup"
  64 #define KILOBYTE        1024
  65 
  66 #define INT_MAXCMD      12
  67 
  68 extern mutex_t ndmpd_zfs_fd_lock;
  69 
  70 /* Connection data structure. */
  71 typedef struct msg_info {
  72         ndmp_header mi_hdr;
  73         struct ndmp_msg_handler *mi_handler;
  74         void *mi_body;
  75 } msg_info_t;
  76 
  77 typedef struct ndmp_connection {
  78         int conn_sock;
  79         XDR conn_xdrs;
  80         ulong_t conn_my_sequence;
  81         boolean_t conn_authorized;
  82         boolean_t conn_eof;
  83         msg_info_t conn_msginfo; /* received request or reply message */
  84         ushort_t conn_version;
  85         void *conn_client_data;
  86         mutex_t conn_lock;
  87         adt_session_data_t *conn_ah;
  88 } ndmp_connection_t;
  89 
  90 typedef void (*ndmp_con_handler_func_t) (struct ndmp_connection *);
  91 
  92 typedef void ndmp_msg_handler_func_t(struct ndmp_connection *, void *);
  93 
  94 
  95 typedef struct ndmp_msg_handler {
  96         ndmp_msg_handler_func_t *mh_func;
  97         bool_t(*mh_xdr_request) (XDR *xdrs, ...);
  98         int mh_sizeof_request;
  99         bool_t(*mh_xdr_reply) (XDR *xdrs, ...);
 100         int mh_sizeof_reply;
 101 } ndmp_msg_handler_t;
 102 
 103 typedef struct ndmp_handler {
 104         int hd_cnt;
 105         struct hd_messages {
 106                 ndmp_message hm_message;
 107                 boolean_t hm_auth_required;
 108                 ndmp_msg_handler_t hm_msg_v[3];
 109         } hd_msgs[INT_MAXCMD];
 110 } ndmp_handler_t;
 111 
 112 /*
 113  * Function prototypes.
 114  */
 115 extern ndmp_connection_t *ndmp_create_connection(void);
 116 
 117 extern void ndmp_destroy_connection(ndmp_connection_t *);
 118 
 119 extern void ndmp_close(ndmp_connection_t *);
 120 
 121 extern int ndmp_connect(ndmp_connection_t *,
 122     char *,
 123     ulong_t);
 124 
 125 extern int ndmp_run(ulong_t,
 126     ndmp_con_handler_func_t);
 127 
 128 extern int ndmp_process_requests(ndmp_connection_t *);
 129 
 130 extern int ndmp_send_response(ndmp_connection_t *,
 131     ndmp_error,
 132     void *);
 133 
 134 extern int ndmp_send_request(ndmp_connection_t *,
 135     ndmp_message,
 136     ndmp_error,
 137     void *,
 138     void **);
 139 
 140 extern int ndmp_send_request_lock(ndmp_connection_t *,
 141     ndmp_message,
 142     ndmp_error,
 143     void *,
 144     void **);
 145 
 146 extern void ndmp_free_message(ndmp_connection_t *);
 147 
 148 extern int ndmp_get_fd(ndmp_connection_t *);
 149 
 150 extern void ndmp_set_client_data(ndmp_connection_t *,
 151     void *);
 152 
 153 extern void *ndmp_get_client_data(ndmp_connection_t *);
 154 
 155 extern void ndmp_set_version(ndmp_connection_t *,
 156     ushort_t);
 157 
 158 extern ushort_t ndmp_get_version(ndmp_connection_t *);
 159 
 160 extern void ndmp_set_authorized(ndmp_connection_t *,
 161     boolean_t);
 162 
 163 
 164 /*
 165  * NDMP daemon callback functions.
 166  * Called by backup/recover modules.
 167  */
 168 typedef char *ndmpd_get_env_func_t(void *, char *);
 169 typedef int ndmpd_add_env_func_t(void *, char *, char *);
 170 typedef void *ndmpd_get_name_func_t(void *, ulong_t);
 171 typedef int ndmpd_dispatch_func_t(void *, boolean_t);
 172 typedef void ndmpd_done_func_t(void *, int);
 173 typedef int ndmpd_log_func_t(void *, char *, ...);
 174 
 175 typedef int ndmpd_log_func_v3_t(void *, ndmp_log_type, ulong_t,
 176     char *, ...);
 177 
 178 
 179 #define NDMPD_SELECT_MODE_READ          1
 180 #define NDMPD_SELECT_MODE_WRITE         2
 181 #define NDMPD_SELECT_MODE_EXCEPTION     4
 182 
 183 typedef void ndmpd_file_handler_func_t(void *, int, ulong_t);
 184 
 185 typedef int ndmpd_add_file_handler_func_t(void *, void *, int, ulong_t,
 186     ndmpd_file_handler_func_t *);
 187 
 188 typedef int ndmpd_remove_file_handler_func_t(void *, int);
 189 
 190 typedef int ndmpd_write_func_t(void *, char *, ulong_t);
 191 
 192 typedef int ndmpd_file_history_path_func_t(void *, char *, struct stat64 *,
 193     u_longlong_t);
 194 
 195 typedef int ndmpd_file_history_dir_func_t(void *, char *, ulong_t,
 196     ulong_t);
 197 
 198 typedef int ndmpd_file_history_node_func_t(void *, ulong_t, struct stat64 *,
 199     u_longlong_t);
 200 
 201 typedef int ndmpd_seek_func_t(void *, u_longlong_t, u_longlong_t);
 202 
 203 typedef int ndmpd_read_func_t(void *, char *, ulong_t);
 204 
 205 typedef int ndmpd_file_recovered_func_t(void *, char *, int);
 206 
 207 typedef struct ndmpd_module_stats {
 208         u_longlong_t ms_bytes_processed;
 209         u_longlong_t ms_est_bytes_remaining;
 210         ulong_t ms_est_time_remaining;
 211 } ndmpd_module_stats;
 212 
 213 /*
 214  * Parameter structure passed to module start function.
 215  */
 216 typedef struct ndmpd_module_params {
 217         void *mp_daemon_cookie;
 218         void **mp_module_cookie;
 219         ushort_t mp_protocol_version;
 220         ndmp_data_operation mp_operation;
 221         ndmpd_module_stats *mp_stats;
 222         ndmpd_get_env_func_t *mp_get_env_func;
 223         ndmpd_add_env_func_t *mp_add_env_func;
 224         ndmpd_add_env_func_t *mp_set_env_func;
 225         ndmpd_get_name_func_t *mp_get_name_func;
 226         ndmpd_dispatch_func_t *mp_dispatch_func;
 227         ndmpd_done_func_t *mp_done_func;
 228         ndmpd_log_func_t *mp_log_func;
 229         ndmpd_add_file_handler_func_t *mp_add_file_handler_func;
 230         ndmpd_remove_file_handler_func_t *mp_remove_file_handler_func;
 231         ndmpd_write_func_t *mp_write_func;
 232         ndmpd_file_history_path_func_t *mp_file_history_path_func;
 233         ndmpd_file_history_dir_func_t *mp_file_history_dir_func;
 234         ndmpd_file_history_node_func_t *mp_file_history_node_func;
 235         ndmpd_read_func_t *mp_read_func;
 236         ndmpd_seek_func_t *mp_seek_func;
 237         ndmpd_file_recovered_func_t *mp_file_recovered_func;
 238         /*
 239          * NDMP V3 params.
 240          */
 241         ndmpd_log_func_v3_t *mp_log_func_v3;
 242 } ndmpd_module_params_t;
 243 
 244 #define MOD_ADDENV(m, n, v) \
 245         (*(m)->mp_add_env_func)((m)->mp_daemon_cookie, n, v)
 246 
 247 #define MOD_SETENV(m, n, v) \
 248         (*(m)->mp_set_env_func)((m)->mp_daemon_cookie, n, v)
 249 
 250 #define MOD_GETENV(m, e) \
 251         (*(m)->mp_get_env_func)((m)->mp_daemon_cookie, e)
 252 
 253 #define MOD_GETNAME(m, i) \
 254         (*(m)->mp_get_name_func)((m)->mp_daemon_cookie, i)
 255 
 256 #define MOD_LOG(m, ...) \
 257         (*(m)->mp_log_func)((m)->mp_daemon_cookie, __VA_ARGS__)
 258 
 259 #define MOD_READ(m, b, s) \
 260         (*(m)->mp_read_func)((m)->mp_daemon_cookie, b, s)
 261 
 262 #define MOD_WRITE(m, b, s) \
 263         (*(m)->mp_write_func)((m)->mp_daemon_cookie, b, s)
 264 
 265 #define MOD_DONE(m, e) \
 266         (*(m)->mp_done_func)((m)->mp_daemon_cookie, e)
 267 
 268 #define MOD_FILERECOVERD(m, n, e) \
 269         (*(m)->mp_file_recovered_func)((m)->mp_daemon_cookie, n, e)
 270 
 271 extern int ndmp_log_msg_id;
 272 
 273 #define MOD_LOGV3(m, t, ...) \
 274         (*(m)->mp_log_func_v3)((m)->mp_daemon_cookie, (t), \
 275         ++ndmp_log_msg_id, __VA_ARGS__)
 276 
 277 #define MOD_LOGCONTV3(m, t, ...) \
 278         (*(m)->mp_log_func_v3)((m)->mp_daemon_cookie, \
 279         (t), ndmp_log_msg_id, __VA_ARGS__)
 280 
 281 /*
 282  * Module function prototypes.
 283  */
 284 typedef int module_start_func_t(void *);
 285 typedef int module_abort_func_t(void *);
 286 #endif  /* _NDMP_COMMON_H */