1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _FMD_CASE_H 28 #define _FMD_CASE_H 29 30 #include <pthread.h> 31 #include <libnvpair.h> 32 33 #ifdef __cplusplus 34 extern "C" { 35 #endif 36 37 #include <fmd_list.h> 38 #include <fmd_api.h> 39 #include <fmd_buf.h> 40 41 struct fmd_module; /* see <fmd_module.h> */ 42 43 typedef struct fmd_case_item { 44 struct fmd_case_item *cit_next; /* pointer to next element in list */ 45 fmd_event_t *cit_event; /* pointer to held event */ 46 } fmd_case_item_t; 47 48 typedef struct fmd_case_susp { 49 struct fmd_case_susp *cis_next; /* pointer to next element in list */ 50 nvlist_t *cis_nvl; /* nvpair representing fault event */ 51 } fmd_case_susp_t; 52 53 typedef struct fmd_case_impl { 54 fmd_list_t ci_list; /* linked list next/prev pointers */ 55 struct fmd_case_impl *ci_next; /* next pointer for hash bucket chain */ 56 struct fmd_case_impl *ci_code_next; /* ci_code hash bucket chain */ 57 char *ci_uuid; /* uuid string for this case */ 58 uint_t ci_uuidlen; /* length of ci_uuid (not incl. \0) */ 59 char *ci_code; /* code associated with this case */ 60 size_t ci_codelen; /* size of ci_code buffer in bytes */ 61 struct fmd_module *ci_mod; /* module that owns this case */ 62 fmd_xprt_t *ci_xprt; /* transport for this case (or NULL) */ 63 uint8_t ci_precanned; /* precanned code from injection */ 64 nvlist_t *ci_diag_de; /* diag side de fmri */ 65 uint8_t *ci_diag_asru; /* is asru valid on diag side */ 66 uint8_t *ci_proxy_asru; /* is asru valid on proxy side */ 67 void *ci_data; /* data from fmd_case_setspecific() */ 68 pthread_mutex_t ci_lock; /* lock for remainder of contents */ 69 uint_t ci_refs; /* reference count */ 70 ushort_t ci_state; /* case state (see below) */ 71 ushort_t ci_flags; /* case flags (see below) */ 72 fmd_case_item_t *ci_items; /* list of items in this case */ 73 uint_t ci_nitems; /* number of ci_items */ 74 fmd_event_t *ci_principal; /* principal event (if any) */ 75 fmd_case_susp_t *ci_suspects; /* list of suspects in this case */ 76 uint_t ci_nsuspects; /* number of ci_suspects */ 77 size_t ci_nvsz; /* packed suspect nvlist array size */ 78 fmd_buf_hash_t ci_bufs; /* hash of bufs associated with case */ 79 struct timeval ci_tv; /* time of original diagnosis */ 80 int ci_tv_valid; /* time of original diagnosis valid */ 81 } fmd_case_impl_t; 82 83 #define FMD_CASE_CURRENT -1u /* flag for current state */ 84 85 #define FMD_CASE_UNSOLVED 0 /* case is not yet solved (waiting) */ 86 #define FMD_CASE_SOLVED 1 /* case is solved (suspects added) */ 87 #define FMD_CASE_CLOSE_WAIT 2 /* case is executing fmdo_close() */ 88 #define FMD_CASE_CLOSED 3 /* case is closed (reconfig done) */ 89 #define FMD_CASE_REPAIRED 4 /* case is repaired */ 90 #define FMD_CASE_RESOLVED 5 /* case is resolved (can be freed) */ 91 92 #define FMD_CF_DIRTY 0x01 /* case is in need of checkpoint */ 93 #define FMD_CF_SOLVED 0x02 /* case has been solved */ 94 #define FMD_CF_ISOLATED 0x04 /* case has been isolated */ 95 #define FMD_CF_REPAIRED 0x08 /* case has been repaired */ 96 #define FMD_CF_RESOLVED 0x10 /* case has been resolved */ 97 #define FMD_CF_INVISIBLE 0x20 /* case should be invisible */ 98 #define FMD_CF_DELETING 0x40 /* case is about to be deleted */ 99 100 /* 101 * ci_proxy_asru flags record if we created a new asru on the proxy side and 102 * if so whether it is derived from the received asru or received resource. 103 */ 104 #define FMD_PROXY_ASRU_NOT_NEEDED 0 105 #define FMD_PROXY_ASRU_FROM_ASRU 1 106 #define FMD_PROXY_ASRU_FROM_RSRC 2 107 108 typedef struct fmd_case_hash { 109 pthread_rwlock_t ch_lock; /* lock protecting case hash */ 110 fmd_case_impl_t **ch_hash; /* hash bucket array for cases */ 111 fmd_case_impl_t **ch_code_hash; /* ci_code hash bucket array */ 112 uint_t ch_hashlen; /* size of hash bucket array */ 113 uint_t ch_count; /* number of cases in hash */ 114 } fmd_case_hash_t; 115 116 extern fmd_case_hash_t *fmd_case_hash_create(void); 117 extern void fmd_case_hash_destroy(fmd_case_hash_t *); 118 extern fmd_case_t *fmd_case_hash_lookup(fmd_case_hash_t *, const char *); 119 extern void fmd_case_hash_apply(fmd_case_hash_t *, 120 void (*)(fmd_case_t *, void *), void *); 121 122 extern fmd_case_t *fmd_case_create(struct fmd_module *, void *); 123 extern fmd_case_t *fmd_case_recreate(struct fmd_module *, 124 struct fmd_xprt *, uint_t, const char *, const char *); 125 extern void fmd_case_destroy(fmd_case_t *, int); 126 extern void fmd_case_hold(fmd_case_t *); 127 extern void fmd_case_hold_locked(fmd_case_t *); 128 extern void fmd_case_rele(fmd_case_t *); 129 extern void fmd_case_rele_locked(fmd_case_t *); 130 extern void fmd_case_update(fmd_case_t *); 131 132 extern int fmd_case_insert_principal(fmd_case_t *, fmd_event_t *); 133 extern int fmd_case_insert_event(fmd_case_t *, fmd_event_t *); 134 135 extern void fmd_case_insert_suspect(fmd_case_t *, nvlist_t *); 136 extern void fmd_case_recreate_suspect(fmd_case_t *, nvlist_t *); 137 extern void fmd_case_reset_suspects(fmd_case_t *); 138 139 extern nvlist_t *fmd_case_mkevent(fmd_case_t *, const char *); 140 extern void fmd_case_publish(fmd_case_t *, uint_t); 141 extern void fmd_case_transition(fmd_case_t *, uint_t, uint_t); 142 extern void fmd_case_transition_update(fmd_case_t *, uint_t, uint_t); 143 extern void fmd_case_setdirty(fmd_case_t *); 144 extern void fmd_case_clrdirty(fmd_case_t *); 145 extern void fmd_case_commit(fmd_case_t *); 146 extern void fmd_case_update(fmd_case_t *); 147 extern void fmd_case_delete(fmd_case_t *); 148 extern void fmd_case_discard(fmd_case_t *, boolean_t); 149 extern void fmd_case_settime(fmd_case_t *, time_t, suseconds_t); 150 extern void fmd_case_setcode(fmd_case_t *, char *); 151 extern void fmd_case_set_de_fmri(fmd_case_t *, nvlist_t *); 152 extern void fmd_case_update_status(fmd_case_t *, uint8_t *, uint8_t *, 153 uint8_t *); 154 extern void fmd_case_update_containees(fmd_case_t *); 155 extern void fmd_case_xprt_updated(fmd_case_t *); 156 extern void fmd_case_close_status(fmd_case_t *); 157 158 extern int fmd_case_repair(fmd_case_t *); 159 extern int fmd_case_acquit(fmd_case_t *); 160 extern int fmd_case_contains(fmd_case_t *, fmd_event_t *); 161 extern int fmd_case_orphaned(fmd_case_t *); 162 extern void fmd_case_repair_replay(void); 163 164 #ifdef __cplusplus 165 } 166 #endif 167 168 #endif /* _FMD_CASE_H */ 169