12654012fSReza Sabdar /*
28c4f9701SJanice Chang  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
32654012fSReza Sabdar  */
42654012fSReza Sabdar 
52654012fSReza Sabdar /*
62654012fSReza Sabdar  * BSD 3 Clause License
72654012fSReza Sabdar  *
82654012fSReza Sabdar  * Copyright (c) 2007, The Storage Networking Industry Association.
92654012fSReza Sabdar  *
102654012fSReza Sabdar  * Redistribution and use in source and binary forms, with or without
112654012fSReza Sabdar  * modification, are permitted provided that the following conditions
122654012fSReza Sabdar  * are met:
13*82049ff5SToomas Soome  *	- Redistributions of source code must retain the above copyright
142654012fSReza Sabdar  *	  notice, this list of conditions and the following disclaimer.
152654012fSReza Sabdar  *
16*82049ff5SToomas Soome  *	- Redistributions in binary form must reproduce the above copyright
172654012fSReza Sabdar  *	  notice, this list of conditions and the following disclaimer in
182654012fSReza Sabdar  *	  the documentation and/or other materials provided with the
192654012fSReza Sabdar  *	  distribution.
202654012fSReza Sabdar  *
212654012fSReza Sabdar  *	- Neither the name of The Storage Networking Industry Association (SNIA)
222654012fSReza Sabdar  *	  nor the names of its contributors may be used to endorse or promote
232654012fSReza Sabdar  *	  products derived from this software without specific prior written
242654012fSReza Sabdar  *	  permission.
252654012fSReza Sabdar  *
262654012fSReza Sabdar  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
272654012fSReza Sabdar  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
282654012fSReza Sabdar  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
292654012fSReza Sabdar  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
302654012fSReza Sabdar  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
312654012fSReza Sabdar  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
322654012fSReza Sabdar  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
332654012fSReza Sabdar  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
342654012fSReza Sabdar  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
352654012fSReza Sabdar  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
362654012fSReza Sabdar  * POSSIBILITY OF SUCH DAMAGE.
372654012fSReza Sabdar  */
382654012fSReza Sabdar /* Copyright (c) 2007, The Storage Networking Industry Association. */
392654012fSReza Sabdar /* Copyright (c) 1996, 1997 PDC, Network Appliance. All Rights Reserved */
40faac71c0SJan Kryl /*
41faac71c0SJan Kryl  * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
42faac71c0SJan Kryl  */
432654012fSReza Sabdar 
442654012fSReza Sabdar #ifndef	_NDMP_COMMON_H
452654012fSReza Sabdar #define	_NDMP_COMMON_H
462654012fSReza Sabdar 
472654012fSReza Sabdar #include <thread.h>
482654012fSReza Sabdar #include <synch.h>
492654012fSReza Sabdar #include "ndmpd_log.h"
502654012fSReza Sabdar #include "ndmp.h"
512654012fSReza Sabdar #include <unistd.h>
522654012fSReza Sabdar #include <sys/types.h>
532654012fSReza Sabdar #include <rpc/rpc.h>
542654012fSReza Sabdar #include <sys/stat.h>
552654012fSReza Sabdar #include <stdio.h>
562654012fSReza Sabdar #include <bsm/adt.h>
572654012fSReza Sabdar #include <bsm/adt_event.h>
582654012fSReza Sabdar 
592654012fSReza Sabdar 
602654012fSReza Sabdar #define	XDR_AND_SIZE(func) (bool_t(*)(XDR*, ...))xdr_##func, sizeof (func)
612654012fSReza Sabdar #define	AUTH_REQUIRED	TRUE
622654012fSReza Sabdar #define	AUTH_NOT_REQUIRED	FALSE
632654012fSReza Sabdar #define	NDMP_EOM_MAGIC	"PRCMEOM"
642654012fSReza Sabdar #define	KILOBYTE	1024
652654012fSReza Sabdar 
662654012fSReza Sabdar #define	INT_MAXCMD	12
672654012fSReza Sabdar 
688c4f9701SJanice Chang extern mutex_t ndmpd_zfs_fd_lock;
692654012fSReza Sabdar 
702654012fSReza Sabdar /* Connection data structure. */
712654012fSReza Sabdar typedef struct msg_info {
722654012fSReza Sabdar 	ndmp_header mi_hdr;
732654012fSReza Sabdar 	struct ndmp_msg_handler *mi_handler;
742654012fSReza Sabdar 	void *mi_body;
752654012fSReza Sabdar } msg_info_t;
762654012fSReza Sabdar 
772654012fSReza Sabdar typedef struct ndmp_connection {
782654012fSReza Sabdar 	int conn_sock;
792654012fSReza Sabdar 	XDR conn_xdrs;
802654012fSReza Sabdar 	ulong_t conn_my_sequence;
812654012fSReza Sabdar 	boolean_t conn_authorized;
822654012fSReza Sabdar 	boolean_t conn_eof;
832654012fSReza Sabdar 	msg_info_t conn_msginfo; /* received request or reply message */
842654012fSReza Sabdar 	ushort_t conn_version;
852654012fSReza Sabdar 	void *conn_client_data;
862654012fSReza Sabdar 	mutex_t conn_lock;
872654012fSReza Sabdar 	adt_session_data_t *conn_ah;
882654012fSReza Sabdar } ndmp_connection_t;
892654012fSReza Sabdar 
902654012fSReza Sabdar typedef void (*ndmp_con_handler_func_t) (struct ndmp_connection *);
912654012fSReza Sabdar 
922654012fSReza Sabdar typedef void ndmp_msg_handler_func_t(struct ndmp_connection *, void *);
932654012fSReza Sabdar 
942654012fSReza Sabdar 
952654012fSReza Sabdar typedef struct ndmp_msg_handler {
962654012fSReza Sabdar 	ndmp_msg_handler_func_t *mh_func;
972654012fSReza Sabdar 	bool_t(*mh_xdr_request) (XDR *xdrs, ...);
982654012fSReza Sabdar 	int mh_sizeof_request;
992654012fSReza Sabdar 	bool_t(*mh_xdr_reply) (XDR *xdrs, ...);
1002654012fSReza Sabdar 	int mh_sizeof_reply;
1012654012fSReza Sabdar } ndmp_msg_handler_t;
1022654012fSReza Sabdar 
1032654012fSReza Sabdar typedef struct ndmp_handler {
1042654012fSReza Sabdar 	int hd_cnt;
1052654012fSReza Sabdar 	struct hd_messages {
1062654012fSReza Sabdar 		ndmp_message hm_message;
1072654012fSReza Sabdar 		boolean_t hm_auth_required;
1082654012fSReza Sabdar 		ndmp_msg_handler_t hm_msg_v[3];
1092654012fSReza Sabdar 	} hd_msgs[INT_MAXCMD];
1102654012fSReza Sabdar } ndmp_handler_t;
1112654012fSReza Sabdar 
1122654012fSReza Sabdar /*
1132654012fSReza Sabdar  * Function prototypes.
1142654012fSReza Sabdar  */
1152654012fSReza Sabdar extern ndmp_connection_t *ndmp_create_connection(void);
1162654012fSReza Sabdar 
1172654012fSReza Sabdar extern void ndmp_destroy_connection(ndmp_connection_t *);
1182654012fSReza Sabdar 
1192654012fSReza Sabdar extern void ndmp_close(ndmp_connection_t *);
1202654012fSReza Sabdar 
1212654012fSReza Sabdar extern int ndmp_connect(ndmp_connection_t *,
1222654012fSReza Sabdar     char *,
1232654012fSReza Sabdar     ulong_t);
1242654012fSReza Sabdar 
1252654012fSReza Sabdar extern int ndmp_run(ulong_t,
1262654012fSReza Sabdar     ndmp_con_handler_func_t);
1272654012fSReza Sabdar 
1282654012fSReza Sabdar extern int ndmp_process_requests(ndmp_connection_t *);
1292654012fSReza Sabdar 
1302654012fSReza Sabdar extern int ndmp_send_response(ndmp_connection_t *,
1312654012fSReza Sabdar     ndmp_error,
1322654012fSReza Sabdar     void *);
1332654012fSReza Sabdar 
1342654012fSReza Sabdar extern int ndmp_send_request(ndmp_connection_t *,
1352654012fSReza Sabdar     ndmp_message,
1362654012fSReza Sabdar     ndmp_error,
1372654012fSReza Sabdar     void *,
1382654012fSReza Sabdar     void **);
1392654012fSReza Sabdar 
1402654012fSReza Sabdar extern int ndmp_send_request_lock(ndmp_connection_t *,
1412654012fSReza Sabdar     ndmp_message,
1422654012fSReza Sabdar     ndmp_error,
1432654012fSReza Sabdar     void *,
1442654012fSReza Sabdar     void **);
1452654012fSReza Sabdar 
1462654012fSReza Sabdar extern void ndmp_free_message(ndmp_connection_t *);
1472654012fSReza Sabdar 
1482654012fSReza Sabdar extern int ndmp_get_fd(ndmp_connection_t *);
1492654012fSReza Sabdar 
1502654012fSReza Sabdar extern void ndmp_set_client_data(ndmp_connection_t *,
1512654012fSReza Sabdar     void *);
1522654012fSReza Sabdar 
1532654012fSReza Sabdar extern void *ndmp_get_client_data(ndmp_connection_t *);
1542654012fSReza Sabdar 
1552654012fSReza Sabdar extern void ndmp_set_version(ndmp_connection_t *,
1562654012fSReza Sabdar     ushort_t);
1572654012fSReza Sabdar 
1582654012fSReza Sabdar extern ushort_t ndmp_get_version(ndmp_connection_t *);
1592654012fSReza Sabdar 
1602654012fSReza Sabdar extern void ndmp_set_authorized(ndmp_connection_t *,
1612654012fSReza Sabdar     boolean_t);
1622654012fSReza Sabdar 
1632654012fSReza Sabdar 
1642654012fSReza Sabdar /*
1652654012fSReza Sabdar  * NDMP daemon callback functions.
1662654012fSReza Sabdar  * Called by backup/recover modules.
1672654012fSReza Sabdar  */
1682654012fSReza Sabdar typedef char *ndmpd_get_env_func_t(void *, char *);
1692654012fSReza Sabdar typedef int ndmpd_add_env_func_t(void *, char *, char *);
1702654012fSReza Sabdar typedef void *ndmpd_get_name_func_t(void *, ulong_t);
1712654012fSReza Sabdar typedef int ndmpd_dispatch_func_t(void *, boolean_t);
1722654012fSReza Sabdar typedef void ndmpd_done_func_t(void *, int);
1732654012fSReza Sabdar typedef int ndmpd_log_func_t(void *, char *, ...);
1742654012fSReza Sabdar 
1752654012fSReza Sabdar typedef int ndmpd_log_func_v3_t(void *, ndmp_log_type, ulong_t,
1762654012fSReza Sabdar     char *, ...);
1772654012fSReza Sabdar 
1782654012fSReza Sabdar 
1792654012fSReza Sabdar #define	NDMPD_SELECT_MODE_READ		1
1802654012fSReza Sabdar #define	NDMPD_SELECT_MODE_WRITE		2
1812654012fSReza Sabdar #define	NDMPD_SELECT_MODE_EXCEPTION	4
1822654012fSReza Sabdar 
1832654012fSReza Sabdar typedef void ndmpd_file_handler_func_t(void *, int, ulong_t);
1842654012fSReza Sabdar 
1852654012fSReza Sabdar typedef int ndmpd_add_file_handler_func_t(void *, void *, int, ulong_t,
1862654012fSReza Sabdar     ndmpd_file_handler_func_t *);
1872654012fSReza Sabdar 
1882654012fSReza Sabdar typedef int ndmpd_remove_file_handler_func_t(void *, int);
1892654012fSReza Sabdar 
1902654012fSReza Sabdar typedef int ndmpd_write_func_t(void *, char *, ulong_t);
1912654012fSReza Sabdar 
1922654012fSReza Sabdar typedef int ndmpd_file_history_path_func_t(void *, char *, struct stat64 *,
1932654012fSReza Sabdar     u_longlong_t);
1942654012fSReza Sabdar 
1952654012fSReza Sabdar typedef int ndmpd_file_history_dir_func_t(void *, char *, ulong_t,
1962654012fSReza Sabdar     ulong_t);
1972654012fSReza Sabdar 
1982654012fSReza Sabdar typedef int ndmpd_file_history_node_func_t(void *, ulong_t, struct stat64 *,
1992654012fSReza Sabdar     u_longlong_t);
2002654012fSReza Sabdar 
2012654012fSReza Sabdar typedef int ndmpd_seek_func_t(void *, u_longlong_t, u_longlong_t);
2022654012fSReza Sabdar 
2032654012fSReza Sabdar typedef int ndmpd_read_func_t(void *, char *, ulong_t);
2042654012fSReza Sabdar 
2052654012fSReza Sabdar typedef int ndmpd_file_recovered_func_t(void *, char *, int);
2062654012fSReza Sabdar 
2072654012fSReza Sabdar typedef struct ndmpd_module_stats {
2082654012fSReza Sabdar 	u_longlong_t ms_bytes_processed;
2092654012fSReza Sabdar 	u_longlong_t ms_est_bytes_remaining;
2102654012fSReza Sabdar 	ulong_t ms_est_time_remaining;
2112654012fSReza Sabdar } ndmpd_module_stats;
2122654012fSReza Sabdar 
2132654012fSReza Sabdar /*
2142654012fSReza Sabdar  * Parameter structure passed to module start function.
2152654012fSReza Sabdar  */
2162654012fSReza Sabdar typedef struct ndmpd_module_params {
2172654012fSReza Sabdar 	void *mp_daemon_cookie;
2182654012fSReza Sabdar 	void **mp_module_cookie;
2192654012fSReza Sabdar 	ushort_t mp_protocol_version;
2202654012fSReza Sabdar 	ndmp_data_operation mp_operation;
2212654012fSReza Sabdar 	ndmpd_module_stats *mp_stats;
2222654012fSReza Sabdar 	ndmpd_get_env_func_t *mp_get_env_func;
2232654012fSReza Sabdar 	ndmpd_add_env_func_t *mp_add_env_func;
2242654012fSReza Sabdar 	ndmpd_add_env_func_t *mp_set_env_func;
2252654012fSReza Sabdar 	ndmpd_get_name_func_t *mp_get_name_func;
2262654012fSReza Sabdar 	ndmpd_dispatch_func_t *mp_dispatch_func;
2272654012fSReza Sabdar 	ndmpd_done_func_t *mp_done_func;
2282654012fSReza Sabdar 	ndmpd_log_func_t *mp_log_func;
2292654012fSReza Sabdar 	ndmpd_add_file_handler_func_t *mp_add_file_handler_func;
2302654012fSReza Sabdar 	ndmpd_remove_file_handler_func_t *mp_remove_file_handler_func;
2312654012fSReza Sabdar 	ndmpd_write_func_t *mp_write_func;
2322654012fSReza Sabdar 	ndmpd_file_history_path_func_t *mp_file_history_path_func;
2332654012fSReza Sabdar 	ndmpd_file_history_dir_func_t *mp_file_history_dir_func;
2342654012fSReza Sabdar 	ndmpd_file_history_node_func_t *mp_file_history_node_func;
2352654012fSReza Sabdar 	ndmpd_read_func_t *mp_read_func;
2362654012fSReza Sabdar 	ndmpd_seek_func_t *mp_seek_func;
2372654012fSReza Sabdar 	ndmpd_file_recovered_func_t *mp_file_recovered_func;
2382654012fSReza Sabdar 	/*
2392654012fSReza Sabdar 	 * NDMP V3 params.
2402654012fSReza Sabdar 	 */
2412654012fSReza Sabdar 	ndmpd_log_func_v3_t *mp_log_func_v3;
2422654012fSReza Sabdar } ndmpd_module_params_t;
2432654012fSReza Sabdar 
244c1a2c731SJanice Chang #define	MOD_ADDENV(m, n, v) \
245c1a2c731SJanice Chang 	(*(m)->mp_add_env_func)((m)->mp_daemon_cookie, n, v)
2462654012fSReza Sabdar 
2472654012fSReza Sabdar #define	MOD_SETENV(m, n, v) \
2482654012fSReza Sabdar 	(*(m)->mp_set_env_func)((m)->mp_daemon_cookie, n, v)
2492654012fSReza Sabdar 
2502654012fSReza Sabdar #define	MOD_GETENV(m, e) \
2512654012fSReza Sabdar 	(*(m)->mp_get_env_func)((m)->mp_daemon_cookie, e)
2522654012fSReza Sabdar 
2532654012fSReza Sabdar #define	MOD_GETNAME(m, i) \
2542654012fSReza Sabdar 	(*(m)->mp_get_name_func)((m)->mp_daemon_cookie, i)
2552654012fSReza Sabdar 
2562654012fSReza Sabdar #define	MOD_LOG(m, ...)	\
2572654012fSReza Sabdar 	(*(m)->mp_log_func)((m)->mp_daemon_cookie, __VA_ARGS__)
2582654012fSReza Sabdar 
2592654012fSReza Sabdar #define	MOD_READ(m, b, s) \
2602654012fSReza Sabdar 	(*(m)->mp_read_func)((m)->mp_daemon_cookie, b, s)
2612654012fSReza Sabdar 
2622654012fSReza Sabdar #define	MOD_WRITE(m, b, s) \
2632654012fSReza Sabdar 	(*(m)->mp_write_func)((m)->mp_daemon_cookie, b, s)
2642654012fSReza Sabdar 
2652654012fSReza Sabdar #define	MOD_DONE(m, e) \
2662654012fSReza Sabdar 	(*(m)->mp_done_func)((m)->mp_daemon_cookie, e)
2672654012fSReza Sabdar 
2682654012fSReza Sabdar #define	MOD_FILERECOVERD(m, n, e) \
2692654012fSReza Sabdar 	(*(m)->mp_file_recovered_func)((m)->mp_daemon_cookie, n, e)
2702654012fSReza Sabdar 
2712654012fSReza Sabdar extern int ndmp_log_msg_id;
2722654012fSReza Sabdar 
2732654012fSReza Sabdar #define	MOD_LOGV3(m, t, ...) \
2742654012fSReza Sabdar 	(*(m)->mp_log_func_v3)((m)->mp_daemon_cookie, (t), \
2752654012fSReza Sabdar 	++ndmp_log_msg_id, __VA_ARGS__)
2762654012fSReza Sabdar 
2772654012fSReza Sabdar #define	MOD_LOGCONTV3(m, t, ...) \
2782654012fSReza Sabdar 	(*(m)->mp_log_func_v3)((m)->mp_daemon_cookie, \
2792654012fSReza Sabdar 	(t), ndmp_log_msg_id, __VA_ARGS__)
2802654012fSReza Sabdar 
2812654012fSReza Sabdar /*
2822654012fSReza Sabdar  * Module function prototypes.
2832654012fSReza Sabdar  */
284*82049ff5SToomas Soome typedef void *module_start_func_t(void *);
2852654012fSReza Sabdar typedef int module_abort_func_t(void *);
2862654012fSReza Sabdar #endif	/* _NDMP_COMMON_H */
287