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: 132654012fSReza Sabdar * - Redistributions of source code must retain the above copyright 142654012fSReza Sabdar * notice, this list of conditions and the following disclaimer. 152654012fSReza Sabdar * 162654012fSReza Sabdar * - 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 */ 40*faac71c0SJan Kryl /* 41*faac71c0SJan Kryl * Copyright 2014 Nexenta Systems, Inc. All rights reserved. 42*faac71c0SJan 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 */ 2848c4f9701SJanice Chang typedef int module_start_func_t(void *); 2852654012fSReza Sabdar typedef int module_abort_func_t(void *); 2862654012fSReza Sabdar #endif /* _NDMP_COMMON_H */ 287