1eda14cbcSMatt Macy /* 2eda14cbcSMatt Macy * CDDL HEADER START 3eda14cbcSMatt Macy * 4eda14cbcSMatt Macy * The contents of this file are subject to the terms of the 5eda14cbcSMatt Macy * Common Development and Distribution License (the "License"). 6eda14cbcSMatt Macy * You may not use this file except in compliance with the License. 7eda14cbcSMatt Macy * 8eda14cbcSMatt Macy * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9271171e0SMartin Matuska * or https://opensource.org/licenses/CDDL-1.0. 10eda14cbcSMatt Macy * See the License for the specific language governing permissions 11eda14cbcSMatt Macy * and limitations under the License. 12eda14cbcSMatt Macy * 13eda14cbcSMatt Macy * When distributing Covered Code, include this CDDL HEADER in each 14eda14cbcSMatt Macy * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15eda14cbcSMatt Macy * If applicable, add the following below this CDDL HEADER, with the 16eda14cbcSMatt Macy * fields enclosed by brackets "[]" replaced with your own identifying 17eda14cbcSMatt Macy * information: Portions Copyright [yyyy] [name of copyright owner] 18eda14cbcSMatt Macy * 19eda14cbcSMatt Macy * CDDL HEADER END 20eda14cbcSMatt Macy */ 21eda14cbcSMatt Macy 22eda14cbcSMatt Macy /* 23eda14cbcSMatt Macy * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. 24eda14cbcSMatt Macy * 25eda14cbcSMatt Macy * Copyright (c) 2016, Intel Corporation. 26eda14cbcSMatt Macy */ 27eda14cbcSMatt Macy 28eda14cbcSMatt Macy #ifndef _FMD_API_H 29eda14cbcSMatt Macy #define _FMD_API_H 30eda14cbcSMatt Macy 31eda14cbcSMatt Macy #include <sys/types.h> 32eda14cbcSMatt Macy #include <sys/time.h> 33eda14cbcSMatt Macy #include <time.h> 34eda14cbcSMatt Macy #include <libnvpair.h> 35eda14cbcSMatt Macy #include <stdarg.h> 36eda14cbcSMatt Macy #include <umem.h> 37eda14cbcSMatt Macy 38eda14cbcSMatt Macy #ifdef __cplusplus 39eda14cbcSMatt Macy extern "C" { 40eda14cbcSMatt Macy #endif 41eda14cbcSMatt Macy 42eda14cbcSMatt Macy /* 43eda14cbcSMatt Macy * Fault Management Daemon Client Interfaces 44eda14cbcSMatt Macy */ 45eda14cbcSMatt Macy 46eda14cbcSMatt Macy #define FMD_API_VERSION 5 47eda14cbcSMatt Macy 48eda14cbcSMatt Macy typedef struct fmd_hdl fmd_hdl_t; 49eda14cbcSMatt Macy 50eda14cbcSMatt Macy typedef struct fmd_timer { 51eda14cbcSMatt Macy timer_t ft_tid; 52eda14cbcSMatt Macy void *ft_arg; 53eda14cbcSMatt Macy fmd_hdl_t *ft_hdl; 54eda14cbcSMatt Macy } fmd_timer_t; 55eda14cbcSMatt Macy 56eda14cbcSMatt Macy #define id_t fmd_timer_t * 57eda14cbcSMatt Macy 58eda14cbcSMatt Macy 59eda14cbcSMatt Macy typedef struct fmd_event { 60eda14cbcSMatt Macy hrtime_t ev_hrt; /* event time used by SERD engines */ 61eda14cbcSMatt Macy } fmd_event_t; 62eda14cbcSMatt Macy 63eda14cbcSMatt Macy typedef struct fmd_case { 64eda14cbcSMatt Macy char ci_uuid[48]; /* uuid string for this case */ 65eda14cbcSMatt Macy fmd_hdl_t *ci_mod; /* module that owns this case */ 66eda14cbcSMatt Macy void *ci_data; /* data from fmd_case_setspecific() */ 67eda14cbcSMatt Macy ushort_t ci_state; /* case state (see below) */ 68eda14cbcSMatt Macy ushort_t ci_flags; /* case flags (see below) */ 69eda14cbcSMatt Macy struct timeval ci_tv; /* time of original diagnosis */ 70eda14cbcSMatt Macy void *ci_bufptr; /* case data serialization buffer */ 71eda14cbcSMatt Macy size_t ci_bufsiz; 72eda14cbcSMatt Macy } fmd_case_t; 73eda14cbcSMatt Macy 74eda14cbcSMatt Macy 75eda14cbcSMatt Macy #define FMD_CASE_UNSOLVED 0 /* case is not yet solved (waiting) */ 76eda14cbcSMatt Macy #define FMD_CASE_SOLVED 1 /* case is solved (suspects added) */ 77eda14cbcSMatt Macy #define FMD_CASE_CLOSE_WAIT 2 /* case is executing fmdo_close() */ 78eda14cbcSMatt Macy #define FMD_CASE_CLOSED 3 /* case is closed (reconfig done) */ 79eda14cbcSMatt Macy #define FMD_CASE_REPAIRED 4 /* case is repaired */ 80eda14cbcSMatt Macy #define FMD_CASE_RESOLVED 5 /* case is resolved (can be freed) */ 81eda14cbcSMatt Macy 82eda14cbcSMatt Macy #define FMD_CF_DIRTY 0x01 /* case is in need of checkpoint */ 83eda14cbcSMatt Macy #define FMD_CF_SOLVED 0x02 /* case has been solved */ 84eda14cbcSMatt Macy #define FMD_CF_ISOLATED 0x04 /* case has been isolated */ 85eda14cbcSMatt Macy #define FMD_CF_REPAIRED 0x08 /* case has been repaired */ 86eda14cbcSMatt Macy #define FMD_CF_RESOLVED 0x10 /* case has been resolved */ 87eda14cbcSMatt Macy 88eda14cbcSMatt Macy 89eda14cbcSMatt Macy #define FMD_TYPE_BOOL 0 /* int */ 90eda14cbcSMatt Macy #define FMD_TYPE_INT32 1 /* int32_t */ 91eda14cbcSMatt Macy #define FMD_TYPE_UINT32 2 /* uint32_t */ 92eda14cbcSMatt Macy #define FMD_TYPE_INT64 3 /* int64_t */ 93eda14cbcSMatt Macy #define FMD_TYPE_UINT64 4 /* uint64_t */ 94eda14cbcSMatt Macy #define FMD_TYPE_TIME 5 /* uint64_t */ 95eda14cbcSMatt Macy #define FMD_TYPE_SIZE 6 /* uint64_t */ 96eda14cbcSMatt Macy 97eda14cbcSMatt Macy typedef struct fmd_prop { 98eda14cbcSMatt Macy const char *fmdp_name; /* property name */ 99eda14cbcSMatt Macy uint_t fmdp_type; /* property type (see above) */ 100eda14cbcSMatt Macy const char *fmdp_defv; /* default value */ 101eda14cbcSMatt Macy } fmd_prop_t; 102eda14cbcSMatt Macy 103eda14cbcSMatt Macy typedef struct fmd_stat { 104eda14cbcSMatt Macy char fmds_name[32]; /* statistic name */ 105eda14cbcSMatt Macy uint_t fmds_type; /* statistic type (see above) */ 106eda14cbcSMatt Macy char fmds_desc[64]; /* statistic description */ 107eda14cbcSMatt Macy union { 108eda14cbcSMatt Macy int bool; /* FMD_TYPE_BOOL */ 109eda14cbcSMatt Macy int32_t i32; /* FMD_TYPE_INT32 */ 110eda14cbcSMatt Macy uint32_t ui32; /* FMD_TYPE_UINT32 */ 111eda14cbcSMatt Macy int64_t i64; /* FMD_TYPE_INT64 */ 112eda14cbcSMatt Macy uint64_t ui64; /* FMD_TYPE_UINT64 */ 113eda14cbcSMatt Macy } fmds_value; 114eda14cbcSMatt Macy } fmd_stat_t; 115eda14cbcSMatt Macy 116eda14cbcSMatt Macy typedef struct fmd_hdl_ops { 117eda14cbcSMatt Macy void (*fmdo_recv)(fmd_hdl_t *, fmd_event_t *, nvlist_t *, const char *); 118eda14cbcSMatt Macy void (*fmdo_timeout)(fmd_hdl_t *, id_t, void *); 119eda14cbcSMatt Macy void (*fmdo_close)(fmd_hdl_t *, fmd_case_t *); 120eda14cbcSMatt Macy void (*fmdo_stats)(fmd_hdl_t *); 121eda14cbcSMatt Macy void (*fmdo_gc)(fmd_hdl_t *); 122eda14cbcSMatt Macy } fmd_hdl_ops_t; 123eda14cbcSMatt Macy 124eda14cbcSMatt Macy #define FMD_SEND_SUCCESS 0 /* fmdo_send queued event */ 125eda14cbcSMatt Macy #define FMD_SEND_FAILED 1 /* fmdo_send unrecoverable error */ 126eda14cbcSMatt Macy #define FMD_SEND_RETRY 2 /* fmdo_send requests retry */ 127eda14cbcSMatt Macy 128eda14cbcSMatt Macy typedef struct fmd_hdl_info { 129eda14cbcSMatt Macy const char *fmdi_desc; /* fmd client description string */ 130eda14cbcSMatt Macy const char *fmdi_vers; /* fmd client version string */ 131eda14cbcSMatt Macy const fmd_hdl_ops_t *fmdi_ops; /* ops vector for client */ 132eda14cbcSMatt Macy const fmd_prop_t *fmdi_props; /* array of configuration props */ 133eda14cbcSMatt Macy } fmd_hdl_info_t; 134eda14cbcSMatt Macy 135eda14cbcSMatt Macy extern int fmd_hdl_register(fmd_hdl_t *, int, const fmd_hdl_info_t *); 136eda14cbcSMatt Macy extern void fmd_hdl_unregister(fmd_hdl_t *); 137eda14cbcSMatt Macy 138eda14cbcSMatt Macy extern void fmd_hdl_setspecific(fmd_hdl_t *, void *); 139eda14cbcSMatt Macy extern void *fmd_hdl_getspecific(fmd_hdl_t *); 140eda14cbcSMatt Macy 141eda14cbcSMatt Macy #define FMD_SLEEP UMEM_NOFAIL 142eda14cbcSMatt Macy 143eda14cbcSMatt Macy extern void *fmd_hdl_alloc(fmd_hdl_t *, size_t, int); 144eda14cbcSMatt Macy extern void *fmd_hdl_zalloc(fmd_hdl_t *, size_t, int); 145eda14cbcSMatt Macy extern void fmd_hdl_free(fmd_hdl_t *, void *, size_t); 146eda14cbcSMatt Macy 147eda14cbcSMatt Macy extern char *fmd_hdl_strdup(fmd_hdl_t *, const char *, int); 148eda14cbcSMatt Macy extern void fmd_hdl_strfree(fmd_hdl_t *, char *); 149eda14cbcSMatt Macy 150eda14cbcSMatt Macy extern void fmd_hdl_vdebug(fmd_hdl_t *, const char *, va_list); 151eda14cbcSMatt Macy extern void fmd_hdl_debug(fmd_hdl_t *, const char *, ...); 152eda14cbcSMatt Macy 153eda14cbcSMatt Macy extern int32_t fmd_prop_get_int32(fmd_hdl_t *, const char *); 154eda14cbcSMatt Macy 155eda14cbcSMatt Macy #define FMD_STAT_NOALLOC 0x0 /* fmd should use caller's memory */ 156eda14cbcSMatt Macy #define FMD_STAT_ALLOC 0x1 /* fmd should allocate stats memory */ 157eda14cbcSMatt Macy 158eda14cbcSMatt Macy extern fmd_stat_t *fmd_stat_create(fmd_hdl_t *, uint_t, uint_t, fmd_stat_t *); 159eda14cbcSMatt Macy extern void fmd_stat_destroy(fmd_hdl_t *, uint_t, fmd_stat_t *); 160eda14cbcSMatt Macy extern void fmd_stat_setstr(fmd_hdl_t *, fmd_stat_t *, const char *); 161eda14cbcSMatt Macy 162eda14cbcSMatt Macy extern fmd_case_t *fmd_case_open(fmd_hdl_t *, void *); 163eda14cbcSMatt Macy extern void fmd_case_reset(fmd_hdl_t *, fmd_case_t *); 164eda14cbcSMatt Macy extern void fmd_case_solve(fmd_hdl_t *, fmd_case_t *); 165eda14cbcSMatt Macy extern void fmd_case_close(fmd_hdl_t *, fmd_case_t *); 166eda14cbcSMatt Macy 167eda14cbcSMatt Macy extern const char *fmd_case_uuid(fmd_hdl_t *, fmd_case_t *); 168eda14cbcSMatt Macy extern fmd_case_t *fmd_case_uulookup(fmd_hdl_t *, const char *); 169eda14cbcSMatt Macy extern void fmd_case_uuclose(fmd_hdl_t *, const char *); 170eda14cbcSMatt Macy extern int fmd_case_uuclosed(fmd_hdl_t *, const char *); 171eda14cbcSMatt Macy extern int fmd_case_uuisresolved(fmd_hdl_t *, const char *); 172eda14cbcSMatt Macy extern void fmd_case_uuresolved(fmd_hdl_t *, const char *); 173eda14cbcSMatt Macy 174da5137abSMartin Matuska extern boolean_t fmd_case_solved(fmd_hdl_t *, fmd_case_t *); 175eda14cbcSMatt Macy 176eda14cbcSMatt Macy extern void fmd_case_add_ereport(fmd_hdl_t *, fmd_case_t *, fmd_event_t *); 177eda14cbcSMatt Macy extern void fmd_case_add_serd(fmd_hdl_t *, fmd_case_t *, const char *); 178eda14cbcSMatt Macy extern void fmd_case_add_suspect(fmd_hdl_t *, fmd_case_t *, nvlist_t *); 179eda14cbcSMatt Macy 180eda14cbcSMatt Macy extern void fmd_case_setspecific(fmd_hdl_t *, fmd_case_t *, void *); 181eda14cbcSMatt Macy extern void *fmd_case_getspecific(fmd_hdl_t *, fmd_case_t *); 182eda14cbcSMatt Macy 183eda14cbcSMatt Macy extern fmd_case_t *fmd_case_next(fmd_hdl_t *, fmd_case_t *); 184eda14cbcSMatt Macy extern fmd_case_t *fmd_case_prev(fmd_hdl_t *, fmd_case_t *); 185eda14cbcSMatt Macy 186eda14cbcSMatt Macy extern void fmd_buf_create(fmd_hdl_t *, fmd_case_t *, const char *, size_t); 187eda14cbcSMatt Macy extern void fmd_buf_destroy(fmd_hdl_t *, fmd_case_t *, const char *); 188eda14cbcSMatt Macy extern void fmd_buf_read(fmd_hdl_t *, fmd_case_t *, 189eda14cbcSMatt Macy const char *, void *, size_t); 190eda14cbcSMatt Macy extern void fmd_buf_write(fmd_hdl_t *, fmd_case_t *, 191eda14cbcSMatt Macy const char *, const void *, size_t); 192eda14cbcSMatt Macy extern size_t fmd_buf_size(fmd_hdl_t *, fmd_case_t *, const char *); 193eda14cbcSMatt Macy 194eda14cbcSMatt Macy extern void fmd_serd_create(fmd_hdl_t *, const char *, uint_t, hrtime_t); 195eda14cbcSMatt Macy extern void fmd_serd_destroy(fmd_hdl_t *, const char *); 196eda14cbcSMatt Macy extern int fmd_serd_exists(fmd_hdl_t *, const char *); 197*e2257b31SMartin Matuska extern int fmd_serd_active(fmd_hdl_t *, const char *); 198eda14cbcSMatt Macy extern void fmd_serd_reset(fmd_hdl_t *, const char *); 199eda14cbcSMatt Macy extern int fmd_serd_record(fmd_hdl_t *, const char *, fmd_event_t *); 200eda14cbcSMatt Macy extern int fmd_serd_fired(fmd_hdl_t *, const char *); 201eda14cbcSMatt Macy extern int fmd_serd_empty(fmd_hdl_t *, const char *); 202*e2257b31SMartin Matuska extern void fmd_serd_gc(fmd_hdl_t *); 203eda14cbcSMatt Macy 204eda14cbcSMatt Macy extern id_t fmd_timer_install(fmd_hdl_t *, void *, fmd_event_t *, hrtime_t); 205eda14cbcSMatt Macy extern void fmd_timer_remove(fmd_hdl_t *, id_t); 206eda14cbcSMatt Macy 207eda14cbcSMatt Macy extern nvlist_t *fmd_nvl_create_fault(fmd_hdl_t *, 208eda14cbcSMatt Macy const char *, uint8_t, nvlist_t *, nvlist_t *, nvlist_t *); 209eda14cbcSMatt Macy 210eda14cbcSMatt Macy extern int fmd_nvl_class_match(fmd_hdl_t *, nvlist_t *, const char *); 211eda14cbcSMatt Macy 212eda14cbcSMatt Macy #define FMD_HAS_FAULT_FRU 0 213eda14cbcSMatt Macy #define FMD_HAS_FAULT_ASRU 1 214eda14cbcSMatt Macy #define FMD_HAS_FAULT_RESOURCE 2 215eda14cbcSMatt Macy 216eda14cbcSMatt Macy extern void fmd_repair_fru(fmd_hdl_t *, const char *); 217eda14cbcSMatt Macy extern int fmd_repair_asru(fmd_hdl_t *, const char *); 218eda14cbcSMatt Macy 219eda14cbcSMatt Macy extern nvlist_t *fmd_nvl_alloc(fmd_hdl_t *, int); 220eda14cbcSMatt Macy extern nvlist_t *fmd_nvl_dup(fmd_hdl_t *, nvlist_t *, int); 221eda14cbcSMatt Macy 222eda14cbcSMatt Macy /* 223eda14cbcSMatt Macy * ZED Specific Interfaces 224eda14cbcSMatt Macy */ 225eda14cbcSMatt Macy 226eda14cbcSMatt Macy extern fmd_hdl_t *fmd_module_hdl(const char *); 227eda14cbcSMatt Macy extern boolean_t fmd_module_initialized(fmd_hdl_t *); 228eda14cbcSMatt Macy extern void fmd_module_recv(fmd_hdl_t *, nvlist_t *, const char *); 229eda14cbcSMatt Macy 230eda14cbcSMatt Macy /* ZFS FMA Retire Agent */ 231eda14cbcSMatt Macy extern void _zfs_retire_init(fmd_hdl_t *); 232eda14cbcSMatt Macy extern void _zfs_retire_fini(fmd_hdl_t *); 233eda14cbcSMatt Macy 234eda14cbcSMatt Macy /* ZFS FMA Diagnosis Engine */ 235eda14cbcSMatt Macy extern void _zfs_diagnosis_init(fmd_hdl_t *); 236eda14cbcSMatt Macy extern void _zfs_diagnosis_fini(fmd_hdl_t *); 237eda14cbcSMatt Macy 238eda14cbcSMatt Macy #ifdef __cplusplus 239eda14cbcSMatt Macy } 240eda14cbcSMatt Macy #endif 241eda14cbcSMatt Macy 242eda14cbcSMatt Macy #endif /* _FMD_API_H */ 243