libndmp.h revision 11170:349270d482cf
1/* 2 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 3 * Use is subject to license terms. 4 */ 5 6/* 7 * BSD 3 Clause License 8 * 9 * Copyright (c) 2007, The Storage Networking Industry Association. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * - Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 17 * - Redistributions in binary form must reproduce the above copyright 18 * notice, this list of conditions and the following disclaimer in 19 * the documentation and/or other materials provided with the 20 * distribution. 21 * 22 * - Neither the name of The Storage Networking Industry Association (SNIA) 23 * nor the names of its contributors may be used to endorse or promote 24 * products derived from this software without specific prior written 25 * permission. 26 * 27 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 28 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 29 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 30 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 31 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 32 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 33 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 34 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 35 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 36 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 37 * POSSIBILITY OF SUCH DAMAGE. 38 */ 39#ifndef _LIBNDMP_H 40#define _LIBNDMP_H 41 42#include <rpc/types.h> 43#include <libscf.h> 44#include <libnvpair.h> 45 46#ifdef __cplusplus 47extern "C" { 48#endif 49 50/* NDMP supported versions */ 51#define NDMP_V2 2 52#define NDMP_V3 3 53#define NDMP_V4 4 54 55/* Device type */ 56#define NDMP_SINQ_SEQ_ACCESS_DEVICE 0x01 57#define NDMP_SINQ_TAPE_ROBOT 0x08 58 59extern int ndmp_errno; 60 61/* NDMP plugin module API */ 62#define NDMP_PLUGIN_VERSION 1 63 64typedef struct ndmp_context { 65 char *nc_plname; 66 uint_t nc_plversion; 67 void *nc_pldata; 68 void *nc_cmds; 69 void *nc_params; 70} ndmp_context_t; 71 72typedef struct ndmp_plugin { 73 const char *np_plid; /* plugin identifier */ 74 uint_t np_plversion; /* plugin version */ 75 void *np_pldata; /* for private use by the plugin */ 76 77 /* Plugin entry points */ 78 int (*np_pre_backup)(struct ndmp_plugin *, ndmp_context_t *, 79 const char *); 80 int (*np_post_backup)(struct ndmp_plugin *, ndmp_context_t *, 81 int); 82 int (*np_pre_restore)(struct ndmp_plugin *, ndmp_context_t *, 83 const char *, const char *); 84 int (*np_post_restore)(struct ndmp_plugin *, ndmp_context_t *, 85 int); 86} ndmp_plugin_t; 87 88typedef enum ndmp_log_dma_type { 89 NDMP_LOGD_NORMAL = 0, 90 NDMP_LOGD_DEBUG = 1, 91 NDMP_LOGD_ERROR = 2, 92 NDMP_LOGD_WARNING = 3 93} ndmp_log_dma_type_t; 94 95/* libndmp error codes */ 96#define ENDMP_BASE 2000 97enum { 98 ENDMP_DOOR_SRV_TIMEOUT = ENDMP_BASE, 99 ENDMP_INVALID_ARG, 100 ENDMP_DOOR_SRV_OPERATION, 101 ENDMP_DOOR_OPEN, 102 ENDMP_MEM_ALLOC, 103 ENDMP_DOOR_ENCODE_START, 104 ENDMP_DOOR_ENCODE_FINISH, 105 ENDMP_DOOR_DECODE_FINISH, 106 ENDMP_SMF_PERM, 107 ENDMP_SMF_INTERNAL, 108 ENDMP_SMF_PROP, 109 ENDMP_SMF_PROP_GRP 110}; 111 112/* Tape device open mode */ 113typedef enum ndmp_tp_open_mode { 114 NDMP_TP_READ_MODE, 115 NDMP_TP_WRITE_MODE, 116 NDMP_TP_RAW_MODE, 117 NDMP_TP_RAW1_MODE = 0x7fffffff, 118 NDMP_TP_RAW2_MODE = NDMP_TP_RAW_MODE 119} ndmp_tp_open_mode_t; 120 121/* Mover state */ 122typedef enum ndmp_mv_state { 123 NDMP_MV_STATE_IDLE, 124 NDMP_MV_STATE_LISTEN, 125 NDMP_MV_STATE_ACTIVE, 126 NDMP_MV_STATE_PAUSED, 127 NDMP_MV_STATE_HALTED 128} ndmp_mv_state_t; 129 130/* Mover mode */ 131typedef enum ndmp_mv_mode { 132 NDMP_MV_MODE_READ, 133 NDMP_MV_MODE_WRITE, 134 NDMP_MV_MODE_NOACTION 135} ndmp_mv_mode_t; 136 137/* Mover pause reson */ 138typedef enum ndmp_mv_pause_reason { 139 NDMP_MV_PAUSE_NA, 140 NDMP_MV_PAUSE_EOM, 141 NDMP_MV_PAUSE_EOF, 142 NDMP_MV_PAUSE_SEEK, 143 NDMP_MV_PAUSE_MEDIA_ERROR, 144 NDMP_MV_PAUSE_EOW 145} ndmp_mv_pause_reason_t; 146 147/* Mover halt reason */ 148typedef enum ndmp_mv_halt_reason { 149 NDMP_MV_HALT_NA, 150 NDMP_MV_HALT_CONNECT_CLOSED, 151 NDMP_MV_HALT_ABORTED, 152 NDMP_MV_HALT_INTERNAL_ERROR, 153 NDMP_MV_HALT_CONNECT_ERROR, 154 NDMP_MV_HALT_MEDIA_ERROR 155} ndmp_mv_halt_reason_t; 156 157/* Address type */ 158typedef enum ndmp_ad_type { 159 NDMP_AD_LOCAL, 160 NDMP_AD_TCP, 161 NDMP_AD_FC, 162 NDMP_AD_IPC 163} ndmp_ad_type_t; 164 165/* NDMP data operation */ 166typedef enum ndmp_dt_operation { 167 NDMP_DT_OP_NOACTION, 168 NDMP_DT_OP_BACKUP, 169 NDMP_DT_OP_RECOVER, 170 NDMP_DT_OP_RECOVER_FILEHIST 171} ndmp_dt_operation_t; 172 173/* NDMP data state */ 174typedef enum ndmp_dt_state { 175 NDMP_DT_STATE_IDLE, 176 NDMP_DT_STATE_ACTIVE, 177 NDMP_DT_STATE_HALTED, 178 NDMP_DT_STATE_LISTEN, 179 NDMP_DT_STATE_CONNECTED 180} ndmp_dt_state_t; 181 182/* NDMP data halt reason */ 183typedef enum ndmp_dt_halt_reason { 184 NDMP_DT_HALT_NA, 185 NDMP_DT_HALT_SUCCESSFUL, 186 NDMP_DT_HALT_ABORTED, 187 NDMP_DT_HALT_INTERNAL_ERROR, 188 NDMP_DT_HALT_CONNECT_ERROR 189} ndmp_dt_halt_reason_t; 190 191/* Device information structure */ 192typedef struct ndmp_devinfo { 193 uint_t nd_dev_type; /* SCSI device type */ 194 char *nd_name; /* Device name */ 195 uint_t nd_lun; /* Lun number */ 196 uint_t nd_sid; /* Scsi id */ 197 char *nd_vendor; /* Vendor name */ 198 char *nd_product; /* Product name */ 199 char *nd_revision; /* Revision */ 200 char *nd_serial; /* Serial */ 201 char *nd_wwn; /* World wide name */ 202} ndmp_devinfo_t; 203 204/* Scsi device info sturcture */ 205typedef struct ndmp_scsi { 206 int ns_scsi_open; /* Scsi device open */ 207 /* -1 if not open */ 208 char *ns_adapter_name; /* Scsi adapter name */ 209 int ns_valid_target_set; /* Scsi valid target */ 210 /* scsi_id and lun are set only if valid_target_set is set */ 211 int ns_scsi_id; /* Scsi id */ 212 int ns_lun; /* Scsi lun */ 213} ndmp_scsi_t; 214 215typedef struct ndmp_tape { 216 int nt_fd; /* Tape device file descriptor */ 217 /* The data below is set only if "fd" is not -1 */ 218 ulong_t nt_rec_count; /* Number of records written */ 219 ndmp_tp_open_mode_t nt_mode; /* Tape device open mode */ 220 char *nt_dev_name; /* Device name */ 221 char *nt_adapter_name; /* Adapter name */ 222 int nt_sid; /* Scsi id */ 223 int nt_lun; /* Lun number */ 224} ndmp_tape_t; 225 226/* NDMP mover info structure */ 227typedef struct ndmp_mover { 228 ndmp_mv_state_t nm_state; /* Current state */ 229 ndmp_mv_mode_t nm_mode; /* Current mode */ 230 ndmp_mv_pause_reason_t nm_pause_reason; /* Current reason */ 231 ndmp_mv_halt_reason_t nm_halt_reason; /* Current reason */ 232 ulong_t nm_rec_size; /* Tape I/O record size */ 233 ulong_t nm_rec_num; /* Current record num */ 234 u_longlong_t nm_mov_pos; /* Current data stream pos */ 235 u_longlong_t nm_window_offset; /* Valid data window begin */ 236 u_longlong_t nm_window_length; /* Valid data window length */ 237 int nm_sock; /* Data conn socket */ 238 239 /* Filled in V3 and V4 only */ 240 int nm_listen_sock; /* Data conn listen socket */ 241 ndmp_ad_type_t nm_addr_type; /* Current address type */ 242 char *nm_tcp_addr; /* Only if addr_type is tcp */ 243} ndmp_mover_t; 244 245typedef struct ndmp_dt_name { 246 char *nn_name; 247 char *nn_dest; 248} ndmp_dt_name_t; 249 250/* NDMP name/value pair structure */ 251typedef struct ndmp_dt_pval { 252 char *np_name; 253 char *np_value; 254} ndmp_dt_pval_t; 255 256typedef struct ndmp_dt_name_v3 { 257 char *nn3_opath; 258 char *nn3_dpath; 259 u_longlong_t nn3_node; 260 u_longlong_t nn3_fh_info; 261} ndmp_dt_name_v3_t; 262 263typedef struct ndmp_dt_v3 { 264 int dv3_listen_sock; 265 u_longlong_t dv3_bytes_processed; 266 ndmp_dt_name_v3_t *dv3_nlist; /* V3 recover file list */ 267} ndmp_dt_v3_t; 268 269/* NDMP data structure */ 270typedef struct ndmp_data { 271 ndmp_dt_operation_t nd_oper; /* Current operation */ 272 ndmp_dt_state_t nd_state; /* Current state */ 273 ndmp_dt_halt_reason_t nd_halt_reason; /* Current reason */ 274 int nd_sock; /* Listen and data socket */ 275 ndmp_ad_type_t nd_addr_type; /* Current address type */ 276 char *nd_tcp_addr; /* Only if addr_type is tcp */ 277 int nd_abort; /* Abort operation flag */ 278 /* 0 = No, otherwise Yes */ 279 u_longlong_t nd_read_offset; /* Data read seek offset */ 280 u_longlong_t nd_read_length; /* Data read length */ 281 u_longlong_t nd_total_size; /* Backup data size */ 282 ulong_t nd_env_len; /* Environment length */ 283 ndmp_dt_pval_t *nd_env; /* Environment from backup */ 284 /* or recover request */ 285 ulong_t nld_nlist_len; /* Recover file list length */ 286 union { 287 /* Filled in V2 */ 288 ndmp_dt_name_t *nld_nlist; /* Recover file list */ 289 /* Filled in V3 */ 290 ndmp_dt_v3_t nld_dt_v3; /* V3 data */ 291 } nd_nlist; 292} ndmp_data_t; 293 294/* NDMP session information */ 295typedef struct ndmp_session_info { 296 int nsi_sid; /* Session id */ 297 int nsi_pver; /* NDMP protocol version */ 298 int nsi_auth; /* Authorized ? 0="no", else "yes" */ 299 int nsi_eof; /* Connection EOF flag */ 300 /* 0="no", else "yes" */ 301 char *nsi_cl_addr; /* Client address */ 302 ndmp_scsi_t nsi_scsi; /* Scsi device information */ 303 ndmp_tape_t nsi_tape; /* Tape device information */ 304 ndmp_mover_t nsi_mover; /* Mover information */ 305 ndmp_data_t nsi_data; /* Data information */ 306} ndmp_session_info_t; 307 308/* Stats data */ 309typedef struct ndmp_stat { 310 int ns_trun; /* Number of worker threads running */ 311 int ns_twait; /* Number of blocked worker threads */ 312 int ns_nbk; /* Number of backups operations running */ 313 int ns_nrs; /* Number of restores operations running */ 314 int ns_rfile; /* Number of files being read */ 315 int ns_wfile; /* Number of files being written */ 316 uint64_t ns_rdisk; /* Number of disk blocks being read */ 317 uint64_t ns_wdisk; /* Number of disk blocks being written */ 318 uint64_t ns_rtape; /* Number of tape blocks being read */ 319 uint64_t ns_wtape; /* Number of tape blocks being written */ 320} ndmp_stat_t; 321 322/* Common encode/decode functions used by door clients/servers. */ 323typedef struct ndmp_door_ctx { 324 char *ptr; 325 char *start_ptr; 326 char *end_ptr; 327 int status; 328} ndmp_door_ctx_t; 329 330extern int ndmp_get_devinfo(ndmp_devinfo_t **, size_t *); 331extern void ndmp_get_devinfo_free(ndmp_devinfo_t *, size_t); 332extern int ndmp_get_dbglevel(void); 333extern int ndmp_get_session_info(ndmp_session_info_t **, size_t *); 334extern void ndmp_get_session_info_free(ndmp_session_info_t *, size_t); 335extern int ndmp_get_stats(ndmp_stat_t *); 336extern int ndmp_terminate_session(int); 337extern int ndmp_set_dbglevel(int); 338extern const char *ndmp_strerror(int); 339extern int ndmp_door_status(void); 340extern int ndmp_get_prop(char *, char **); 341extern int ndmp_set_prop(char *, char *); 342extern int ndmp_service_refresh(void); 343extern char *ndmp_base64_encode(char *); 344extern char *ndmp_base64_decode(char *); 345extern ndmp_door_ctx_t *ndmp_door_decode_start(char *, int); 346extern int ndmp_door_decode_finish(ndmp_door_ctx_t *); 347extern ndmp_door_ctx_t *ndmp_door_encode_start(char *, int); 348extern int ndmp_door_encode_finish(ndmp_door_ctx_t *, unsigned int *); 349extern int32_t ndmp_door_get_int32(ndmp_door_ctx_t *); 350extern uint32_t ndmp_door_get_uint32(ndmp_door_ctx_t *); 351extern char *ndmp_door_get_string(ndmp_door_ctx_t *); 352extern void ndmp_door_put_int32(ndmp_door_ctx_t *, int32_t); 353extern void ndmp_door_put_uint32(ndmp_door_ctx_t *, uint32_t); 354extern void ndmp_door_put_string(ndmp_door_ctx_t *, char *); 355extern void ndmp_door_free_string(char *); 356extern int64_t ndmp_door_get_int64(ndmp_door_ctx_t *); 357extern uint64_t ndmp_door_get_uint64(ndmp_door_ctx_t *); 358extern void ndmp_door_put_uint64(ndmp_door_ctx_t *, uint64_t); 359extern void ndmp_door_put_short(ndmp_door_ctx_t *, short); 360extern short ndmp_door_get_short(ndmp_door_ctx_t *); 361extern void ndmp_door_put_ushort(ndmp_door_ctx_t *, unsigned short); 362extern unsigned short ndmp_door_get_ushort(ndmp_door_ctx_t *); 363extern void ndmp_door_put_buf(ndmp_door_ctx_t *, unsigned char *, int); 364extern int ndmp_door_get_buf(ndmp_door_ctx_t *, unsigned char *, int); 365 366extern int ndmp_include_zfs(ndmp_context_t *, const char *); 367extern int ndmp_iter_zfs(ndmp_context_t *, int (*)(nvlist_t *, void *), void *); 368extern uint_t ndmp_context_get_version(ndmp_context_t *); 369extern void ndmp_context_set_specific(ndmp_context_t *, void *); 370extern void *ndmp_context_get_specific(ndmp_context_t *); 371void ndmp_log_dma(ndmp_context_t *, ndmp_log_dma_type_t, const char *, ...); 372 373#ifdef __cplusplus 374} 375#endif 376 377#endif /* _LIBNDMP_H */ 378