2 * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
8 * Copyright (c) 2007, The Storage Networking Industry Association.
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
13 * - Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
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
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
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.
38 /* Copyright (c) 2007, The Storage Networking Industry Association. */
39 /* Copyright (c) 1996, 1997 PDC, Network Appliance. All Rights Reserved */
40 /* Copyright 2014 Nexenta Systems, Inc. All rights reserved. */
44 #include <rpc/types.h>
46 #include <libnvpair.h>
52 /* NDMP supported versions */
58 #define NDMP_SINQ_SEQ_ACCESS_DEVICE 0x01
59 #define NDMP_SINQ_TAPE_ROBOT 0x08
61 extern int ndmp_errno
;
63 /* NDMP plugin module API */
64 #define NDMP_PLUGIN_VERSION 1
66 typedef struct ndmp_context
{
69 void *nc_pldata
; /* data private to the plugin */
72 void *nc_ddata
; /* data private to the daemon */
75 typedef struct ndmp_plugin
{
76 const char *np_plid
; /* plugin identifier */
77 uint_t np_plversion
; /* plugin version */
78 void *np_pldata
; /* for private use by the plugin */
80 /* Plugin entry points */
81 int (*np_pre_backup
)(struct ndmp_plugin
*, ndmp_context_t
*,
83 int (*np_post_backup
)(struct ndmp_plugin
*, ndmp_context_t
*,
85 int (*np_pre_restore
)(struct ndmp_plugin
*, ndmp_context_t
*,
86 const char *, const char *);
87 int (*np_post_restore
)(struct ndmp_plugin
*, ndmp_context_t
*,
91 typedef enum ndmp_log_dma_type
{
96 } ndmp_log_dma_type_t
;
102 } ndmpd_backup_type_t
;
104 extern ndmpd_backup_type_t
ndmp_get_backup_type(ndmp_context_t
*);
106 /* libndmp error codes */
107 #define ENDMP_BASE 2000
109 ENDMP_DOOR_SRV_TIMEOUT
= ENDMP_BASE
,
111 ENDMP_DOOR_SRV_OPERATION
,
114 ENDMP_DOOR_ENCODE_START
,
115 ENDMP_DOOR_ENCODE_FINISH
,
116 ENDMP_DOOR_DECODE_FINISH
,
123 /* Tape device open mode */
124 typedef enum ndmp_tp_open_mode
{
128 NDMP_TP_RAW1_MODE
= 0x7fffffff,
129 NDMP_TP_RAW2_MODE
= NDMP_TP_RAW_MODE
130 } ndmp_tp_open_mode_t
;
133 typedef enum ndmp_mv_state
{
135 NDMP_MV_STATE_LISTEN
,
136 NDMP_MV_STATE_ACTIVE
,
137 NDMP_MV_STATE_PAUSED
,
142 typedef enum ndmp_mv_mode
{
145 NDMP_MV_MODE_NOACTION
148 /* Mover pause reson */
149 typedef enum ndmp_mv_pause_reason
{
154 NDMP_MV_PAUSE_MEDIA_ERROR
,
156 } ndmp_mv_pause_reason_t
;
158 /* Mover halt reason */
159 typedef enum ndmp_mv_halt_reason
{
161 NDMP_MV_HALT_CONNECT_CLOSED
,
162 NDMP_MV_HALT_ABORTED
,
163 NDMP_MV_HALT_INTERNAL_ERROR
,
164 NDMP_MV_HALT_CONNECT_ERROR
,
165 NDMP_MV_HALT_MEDIA_ERROR
166 } ndmp_mv_halt_reason_t
;
169 typedef enum ndmp_ad_type
{
176 /* NDMP data operation */
177 typedef enum ndmp_dt_operation
{
181 NDMP_DT_OP_RECOVER_FILEHIST
182 } ndmp_dt_operation_t
;
184 /* NDMP data state */
185 typedef enum ndmp_dt_state
{
187 NDMP_DT_STATE_ACTIVE
,
188 NDMP_DT_STATE_HALTED
,
189 NDMP_DT_STATE_LISTEN
,
190 NDMP_DT_STATE_CONNECTED
193 /* NDMP data halt reason */
194 typedef enum ndmp_dt_halt_reason
{
196 NDMP_DT_HALT_SUCCESSFUL
,
197 NDMP_DT_HALT_ABORTED
,
198 NDMP_DT_HALT_INTERNAL_ERROR
,
199 NDMP_DT_HALT_CONNECT_ERROR
200 } ndmp_dt_halt_reason_t
;
202 /* Device information structure */
203 typedef struct ndmp_devinfo
{
204 uint_t nd_dev_type
; /* SCSI device type */
205 char *nd_name
; /* Device name */
206 uint_t nd_lun
; /* Lun number */
207 uint_t nd_sid
; /* Scsi id */
208 char *nd_vendor
; /* Vendor name */
209 char *nd_product
; /* Product name */
210 char *nd_revision
; /* Revision */
211 char *nd_serial
; /* Serial */
212 char *nd_wwn
; /* World wide name */
215 /* Scsi device info sturcture */
216 typedef struct ndmp_scsi
{
217 int ns_scsi_open
; /* Scsi device open */
219 char *ns_adapter_name
; /* Scsi adapter name */
220 int ns_valid_target_set
; /* Scsi valid target */
221 /* scsi_id and lun are set only if valid_target_set is set */
222 int ns_scsi_id
; /* Scsi id */
223 int ns_lun
; /* Scsi lun */
226 typedef struct ndmp_tape
{
227 int nt_fd
; /* Tape device file descriptor */
228 /* The data below is set only if "fd" is not -1 */
229 ulong_t nt_rec_count
; /* Number of records written */
230 ndmp_tp_open_mode_t nt_mode
; /* Tape device open mode */
231 char *nt_dev_name
; /* Device name */
232 char *nt_adapter_name
; /* Adapter name */
233 int nt_sid
; /* Scsi id */
234 int nt_lun
; /* Lun number */
237 /* NDMP mover info structure */
238 typedef struct ndmp_mover
{
239 ndmp_mv_state_t nm_state
; /* Current state */
240 ndmp_mv_mode_t nm_mode
; /* Current mode */
241 ndmp_mv_pause_reason_t nm_pause_reason
; /* Current reason */
242 ndmp_mv_halt_reason_t nm_halt_reason
; /* Current reason */
243 ulong_t nm_rec_size
; /* Tape I/O record size */
244 ulong_t nm_rec_num
; /* Current record num */
245 u_longlong_t nm_mov_pos
; /* Current data stream pos */
246 u_longlong_t nm_window_offset
; /* Valid data window begin */
247 u_longlong_t nm_window_length
; /* Valid data window length */
248 int nm_sock
; /* Data conn socket */
250 /* Filled in V3 and V4 only */
251 int nm_listen_sock
; /* Data conn listen socket */
252 ndmp_ad_type_t nm_addr_type
; /* Current address type */
253 char *nm_tcp_addr
; /* Only if addr_type is tcp */
256 typedef struct ndmp_dt_name
{
261 /* NDMP name/value pair structure */
262 typedef struct ndmp_dt_pval
{
267 typedef struct ndmp_dt_name_v3
{
270 u_longlong_t nn3_node
;
271 u_longlong_t nn3_fh_info
;
274 typedef struct ndmp_dt_v3
{
276 u_longlong_t dv3_bytes_processed
;
277 ndmp_dt_name_v3_t
*dv3_nlist
; /* V3 recover file list */
280 /* NDMP data structure */
281 typedef struct ndmp_data
{
282 ndmp_dt_operation_t nd_oper
; /* Current operation */
283 ndmp_dt_state_t nd_state
; /* Current state */
284 ndmp_dt_halt_reason_t nd_halt_reason
; /* Current reason */
285 int nd_sock
; /* Listen and data socket */
286 ndmp_ad_type_t nd_addr_type
; /* Current address type */
287 char *nd_tcp_addr
; /* Only if addr_type is tcp */
288 int nd_abort
; /* Abort operation flag */
289 /* 0 = No, otherwise Yes */
290 u_longlong_t nd_read_offset
; /* Data read seek offset */
291 u_longlong_t nd_read_length
; /* Data read length */
292 u_longlong_t nd_total_size
; /* Backup data size */
293 ulong_t nd_env_len
; /* Environment length */
294 ndmp_dt_pval_t
*nd_env
; /* Environment from backup */
295 /* or recover request */
296 ulong_t nld_nlist_len
; /* Recover file list length */
299 ndmp_dt_name_t
*nld_nlist
; /* Recover file list */
301 ndmp_dt_v3_t nld_dt_v3
; /* V3 data */
305 /* NDMP session information */
306 typedef struct ndmp_session_info
{
307 int nsi_sid
; /* Session id */
308 int nsi_pver
; /* NDMP protocol version */
309 int nsi_auth
; /* Authorized ? 0="no", else "yes" */
310 int nsi_eof
; /* Connection EOF flag */
311 /* 0="no", else "yes" */
312 char *nsi_cl_addr
; /* Client address */
313 ndmp_scsi_t nsi_scsi
; /* Scsi device information */
314 ndmp_tape_t nsi_tape
; /* Tape device information */
315 ndmp_mover_t nsi_mover
; /* Mover information */
316 ndmp_data_t nsi_data
; /* Data information */
317 } ndmp_session_info_t
;
320 typedef struct ndmp_stat
{
321 int ns_trun
; /* Number of worker threads running */
322 int ns_twait
; /* Number of blocked worker threads */
323 int ns_nbk
; /* Number of backups operations running */
324 int ns_nrs
; /* Number of restores operations running */
325 int ns_rfile
; /* Number of files being read */
326 int ns_wfile
; /* Number of files being written */
327 uint64_t ns_rdisk
; /* Number of disk blocks being read */
328 uint64_t ns_wdisk
; /* Number of disk blocks being written */
329 uint64_t ns_rtape
; /* Number of tape blocks being read */
330 uint64_t ns_wtape
; /* Number of tape blocks being written */
333 /* Common encode/decode functions used by door clients/servers. */
334 typedef struct ndmp_door_ctx
{
341 extern int ndmp_get_devinfo(ndmp_devinfo_t
**, size_t *);
342 extern void ndmp_get_devinfo_free(ndmp_devinfo_t
*, size_t);
343 extern int ndmp_get_dbglevel(void);
344 extern int ndmp_get_session_info(ndmp_session_info_t
**, size_t *);
345 extern void ndmp_get_session_info_free(ndmp_session_info_t
*, size_t);
346 extern int ndmp_get_stats(ndmp_stat_t
*);
347 extern int ndmp_terminate_session(int);
348 extern int ndmp_set_dbglevel(int);
349 extern const char *ndmp_strerror(int);
350 extern int ndmp_door_status(void);
351 extern int ndmp_get_prop(const char *, char **);
352 extern int ndmp_set_prop(const char *, const char *);
353 extern int ndmp_service_refresh(void);
354 extern char *ndmp_base64_encode(const char *);
355 extern char *ndmp_base64_decode(const char *);
356 extern ndmp_door_ctx_t
*ndmp_door_decode_start(char *, int);
357 extern int ndmp_door_decode_finish(ndmp_door_ctx_t
*);
358 extern ndmp_door_ctx_t
*ndmp_door_encode_start(char *, int);
359 extern int ndmp_door_encode_finish(ndmp_door_ctx_t
*, unsigned int *);
360 extern int32_t ndmp_door_get_int32(ndmp_door_ctx_t
*);
361 extern uint32_t ndmp_door_get_uint32(ndmp_door_ctx_t
*);
362 extern char *ndmp_door_get_string(ndmp_door_ctx_t
*);
363 extern void ndmp_door_put_int32(ndmp_door_ctx_t
*, int32_t);
364 extern void ndmp_door_put_uint32(ndmp_door_ctx_t
*, uint32_t);
365 extern void ndmp_door_put_string(ndmp_door_ctx_t
*, char *);
366 extern void ndmp_door_free_string(char *);
367 extern int64_t ndmp_door_get_int64(ndmp_door_ctx_t
*);
368 extern uint64_t ndmp_door_get_uint64(ndmp_door_ctx_t
*);
369 extern void ndmp_door_put_uint64(ndmp_door_ctx_t
*, uint64_t);
370 extern void ndmp_door_put_short(ndmp_door_ctx_t
*, short);
371 extern short ndmp_door_get_short(ndmp_door_ctx_t
*);
372 extern void ndmp_door_put_ushort(ndmp_door_ctx_t
*, unsigned short);
373 extern unsigned short ndmp_door_get_ushort(ndmp_door_ctx_t
*);
374 extern void ndmp_door_put_buf(ndmp_door_ctx_t
*, unsigned char *, int);
375 extern int ndmp_door_get_buf(ndmp_door_ctx_t
*, unsigned char *, int);
377 extern int ndmp_include_zfs(ndmp_context_t
*, const char *);
378 extern int ndmp_iter_zfs(ndmp_context_t
*, int (*)(nvlist_t
*, void *), void *);
379 extern uint_t
ndmp_context_get_version(ndmp_context_t
*);
380 extern void ndmp_context_set_specific(ndmp_context_t
*, void *);
381 extern void *ndmp_context_get_specific(ndmp_context_t
*);
382 void ndmp_log_dma(ndmp_context_t
*, ndmp_log_dma_type_t
, const char *, ...);
388 #endif /* _LIBNDMP_H */