xref: /titanic_50/usr/src/cmd/fm/fmd/common/fmd_case.h (revision 6a634c9dca3093f3922e4b7ab826d7bdf17bf78e)
17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5749f21d3Swesolows  * Common Development and Distribution License (the "License").
6749f21d3Swesolows  * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate  *
87c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate  * and limitations under the License.
127c478bd9Sstevel@tonic-gate  *
137c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate  *
197c478bd9Sstevel@tonic-gate  * CDDL HEADER END
207c478bd9Sstevel@tonic-gate  */
21d9638e54Smws 
227c478bd9Sstevel@tonic-gate /*
23*f6e214c7SGavin Maltby  * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
247c478bd9Sstevel@tonic-gate  */
257c478bd9Sstevel@tonic-gate 
267c478bd9Sstevel@tonic-gate #ifndef	_FMD_CASE_H
277c478bd9Sstevel@tonic-gate #define	_FMD_CASE_H
287c478bd9Sstevel@tonic-gate 
297c478bd9Sstevel@tonic-gate #include <pthread.h>
307c478bd9Sstevel@tonic-gate #include <libnvpair.h>
317c478bd9Sstevel@tonic-gate 
327c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
337c478bd9Sstevel@tonic-gate extern "C" {
347c478bd9Sstevel@tonic-gate #endif
357c478bd9Sstevel@tonic-gate 
367c478bd9Sstevel@tonic-gate #include <fmd_list.h>
377c478bd9Sstevel@tonic-gate #include <fmd_api.h>
387c478bd9Sstevel@tonic-gate #include <fmd_buf.h>
397c478bd9Sstevel@tonic-gate 
407c478bd9Sstevel@tonic-gate struct fmd_module;			/* see <fmd_module.h> */
417c478bd9Sstevel@tonic-gate 
427c478bd9Sstevel@tonic-gate typedef struct fmd_case_item {
437c478bd9Sstevel@tonic-gate 	struct fmd_case_item *cit_next;	/* pointer to next element in list */
447c478bd9Sstevel@tonic-gate 	fmd_event_t *cit_event;		/* pointer to held event */
457c478bd9Sstevel@tonic-gate } fmd_case_item_t;
467c478bd9Sstevel@tonic-gate 
477c478bd9Sstevel@tonic-gate typedef struct fmd_case_susp {
487c478bd9Sstevel@tonic-gate 	struct fmd_case_susp *cis_next;	/* pointer to next element in list */
497c478bd9Sstevel@tonic-gate 	nvlist_t *cis_nvl;		/* nvpair representing fault event */
507c478bd9Sstevel@tonic-gate } fmd_case_susp_t;
517c478bd9Sstevel@tonic-gate 
527c478bd9Sstevel@tonic-gate typedef struct fmd_case_impl {
537c478bd9Sstevel@tonic-gate 	fmd_list_t ci_list;		/* linked list next/prev pointers */
547c478bd9Sstevel@tonic-gate 	struct fmd_case_impl *ci_next;	/* next pointer for hash bucket chain */
55567cc2e6Sstephh 	struct fmd_case_impl *ci_code_next;	/* ci_code hash bucket chain */
567c478bd9Sstevel@tonic-gate 	char *ci_uuid;			/* uuid string for this case */
577c478bd9Sstevel@tonic-gate 	uint_t ci_uuidlen;		/* length of ci_uuid (not incl. \0) */
58d9638e54Smws 	char *ci_code;			/* code associated with this case */
59d9638e54Smws 	size_t ci_codelen;		/* size of ci_code buffer in bytes */
607c478bd9Sstevel@tonic-gate 	struct fmd_module *ci_mod;	/* module that owns this case */
61d9638e54Smws 	fmd_xprt_t *ci_xprt;		/* transport for this case (or NULL) */
62cbf75e67SStephen Hanson 	uint8_t ci_precanned;		/* precanned code from injection */
63cbf75e67SStephen Hanson 	nvlist_t *ci_diag_de;		/* diag side de fmri */
64cbf75e67SStephen Hanson 	uint8_t *ci_diag_asru;		/* is asru valid on diag side */
65cbf75e67SStephen Hanson 	uint8_t *ci_proxy_asru;		/* is asru valid on proxy side */
667c478bd9Sstevel@tonic-gate 	void *ci_data;			/* data from fmd_case_setspecific() */
677c478bd9Sstevel@tonic-gate 	pthread_mutex_t ci_lock;	/* lock for remainder of contents */
687c478bd9Sstevel@tonic-gate 	uint_t ci_refs;			/* reference count */
697c478bd9Sstevel@tonic-gate 	ushort_t ci_state;		/* case state (see below) */
707c478bd9Sstevel@tonic-gate 	ushort_t ci_flags;		/* case flags (see below) */
717c478bd9Sstevel@tonic-gate 	fmd_case_item_t *ci_items;	/* list of items in this case */
727c478bd9Sstevel@tonic-gate 	uint_t ci_nitems;		/* number of ci_items */
737c478bd9Sstevel@tonic-gate 	fmd_event_t *ci_principal;	/* principal event (if any) */
747c478bd9Sstevel@tonic-gate 	fmd_case_susp_t *ci_suspects;	/* list of suspects in this case */
757c478bd9Sstevel@tonic-gate 	uint_t ci_nsuspects;		/* number of ci_suspects */
767c478bd9Sstevel@tonic-gate 	size_t ci_nvsz;			/* packed suspect nvlist array size */
777c478bd9Sstevel@tonic-gate 	fmd_buf_hash_t ci_bufs;		/* hash of bufs associated with case */
7844743693Sstephh 	struct timeval ci_tv;		/* time of original diagnosis */
7944743693Sstephh 	int ci_tv_valid;		/* time of original diagnosis valid */
80540db9a9SStephen Hanson 	int ci_injected;		/* was the fault injected */
817c478bd9Sstevel@tonic-gate } fmd_case_impl_t;
827c478bd9Sstevel@tonic-gate 
83d9638e54Smws #define	FMD_CASE_CURRENT	-1u	/* flag for current state */
84d9638e54Smws 
857c478bd9Sstevel@tonic-gate #define	FMD_CASE_UNSOLVED	0	/* case is not yet solved (waiting) */
867c478bd9Sstevel@tonic-gate #define	FMD_CASE_SOLVED		1	/* case is solved (suspects added) */
87d9638e54Smws #define	FMD_CASE_CLOSE_WAIT	2	/* case is executing fmdo_close() */
88d9638e54Smws #define	FMD_CASE_CLOSED		3	/* case is closed (reconfig done) */
8925c6ff4bSstephh #define	FMD_CASE_REPAIRED	4	/* case is repaired */
9025c6ff4bSstephh #define	FMD_CASE_RESOLVED	5	/* case is resolved (can be freed) */
917c478bd9Sstevel@tonic-gate 
92162ba6eaSmws #define	FMD_CF_DIRTY		0x01	/* case is in need of checkpoint */
93162ba6eaSmws #define	FMD_CF_SOLVED		0x02	/* case has been solved */
94162ba6eaSmws #define	FMD_CF_ISOLATED		0x04	/* case has been isolated */
95162ba6eaSmws #define	FMD_CF_REPAIRED		0x08	/* case has been repaired */
96cbf75e67SStephen Hanson #define	FMD_CF_RESOLVED		0x10	/* case has been resolved */
9744743693Sstephh #define	FMD_CF_INVISIBLE	0x20	/* case should be invisible */
9897c04605Scy152378 #define	FMD_CF_DELETING		0x40	/* case is about to be deleted */
995750ef5cSStephen Hanson #define	FMD_CF_RES_CMPL		0x80	/* transition to resolved is complete */
1007c478bd9Sstevel@tonic-gate 
101cbf75e67SStephen Hanson /*
102cbf75e67SStephen Hanson  * ci_proxy_asru flags record if we created a new asru on the proxy side and
103cbf75e67SStephen Hanson  * if so whether it is derived from the received asru or received resource.
104cbf75e67SStephen Hanson  */
105cbf75e67SStephen Hanson #define	FMD_PROXY_ASRU_NOT_NEEDED	0
106cbf75e67SStephen Hanson #define	FMD_PROXY_ASRU_FROM_ASRU	1
107cbf75e67SStephen Hanson #define	FMD_PROXY_ASRU_FROM_RSRC	2
108cbf75e67SStephen Hanson 
1097c478bd9Sstevel@tonic-gate typedef struct fmd_case_hash {
1107c478bd9Sstevel@tonic-gate 	pthread_rwlock_t ch_lock;	/* lock protecting case hash */
1117c478bd9Sstevel@tonic-gate 	fmd_case_impl_t **ch_hash;	/* hash bucket array for cases */
112567cc2e6Sstephh 	fmd_case_impl_t **ch_code_hash;	/* ci_code hash bucket array */
1137c478bd9Sstevel@tonic-gate 	uint_t ch_hashlen;		/* size of hash bucket array */
114d9638e54Smws 	uint_t ch_count;		/* number of cases in hash */
1157c478bd9Sstevel@tonic-gate } fmd_case_hash_t;
1167c478bd9Sstevel@tonic-gate 
1177c478bd9Sstevel@tonic-gate extern fmd_case_hash_t *fmd_case_hash_create(void);
1187c478bd9Sstevel@tonic-gate extern void fmd_case_hash_destroy(fmd_case_hash_t *);
1197c478bd9Sstevel@tonic-gate extern fmd_case_t *fmd_case_hash_lookup(fmd_case_hash_t *, const char *);
120d9638e54Smws extern void fmd_case_hash_apply(fmd_case_hash_t *,
121d9638e54Smws     void (*)(fmd_case_t *, void *), void *);
1227c478bd9Sstevel@tonic-gate 
123*f6e214c7SGavin Maltby extern fmd_case_t *fmd_case_create(struct fmd_module *, const char *, void *);
124d9638e54Smws extern fmd_case_t *fmd_case_recreate(struct fmd_module *,
125d9638e54Smws     struct fmd_xprt *, uint_t, const char *, const char *);
126d9638e54Smws extern void fmd_case_destroy(fmd_case_t *, int);
1277c478bd9Sstevel@tonic-gate extern void fmd_case_hold(fmd_case_t *);
128d9638e54Smws extern void fmd_case_hold_locked(fmd_case_t *);
1297c478bd9Sstevel@tonic-gate extern void fmd_case_rele(fmd_case_t *);
130567cc2e6Sstephh extern void fmd_case_rele_locked(fmd_case_t *);
131567cc2e6Sstephh extern void fmd_case_update(fmd_case_t *);
1327c478bd9Sstevel@tonic-gate 
1337aec1d6eScindi extern int fmd_case_insert_principal(fmd_case_t *, fmd_event_t *);
1347aec1d6eScindi extern int fmd_case_insert_event(fmd_case_t *, fmd_event_t *);
1357aec1d6eScindi 
1367c478bd9Sstevel@tonic-gate extern void fmd_case_insert_suspect(fmd_case_t *, nvlist_t *);
137d9638e54Smws extern void fmd_case_recreate_suspect(fmd_case_t *, nvlist_t *);
1387c478bd9Sstevel@tonic-gate extern void fmd_case_reset_suspects(fmd_case_t *);
1397c478bd9Sstevel@tonic-gate 
140d9638e54Smws extern nvlist_t *fmd_case_mkevent(fmd_case_t *, const char *);
141d9638e54Smws extern void fmd_case_publish(fmd_case_t *, uint_t);
142d9638e54Smws extern void fmd_case_transition(fmd_case_t *, uint_t, uint_t);
1430b9e3e76Smws extern void fmd_case_transition_update(fmd_case_t *, uint_t, uint_t);
1447c478bd9Sstevel@tonic-gate extern void fmd_case_setdirty(fmd_case_t *);
1457c478bd9Sstevel@tonic-gate extern void fmd_case_clrdirty(fmd_case_t *);
1467c478bd9Sstevel@tonic-gate extern void fmd_case_commit(fmd_case_t *);
1477c478bd9Sstevel@tonic-gate extern void fmd_case_update(fmd_case_t *);
148d9638e54Smws extern void fmd_case_delete(fmd_case_t *);
149cbf75e67SStephen Hanson extern void fmd_case_discard(fmd_case_t *, boolean_t);
15044743693Sstephh extern void fmd_case_settime(fmd_case_t *, time_t, suseconds_t);
151cbf75e67SStephen Hanson extern void fmd_case_setcode(fmd_case_t *, char *);
152cbf75e67SStephen Hanson extern void fmd_case_set_de_fmri(fmd_case_t *, nvlist_t *);
153540db9a9SStephen Hanson extern void fmd_case_set_injected(fmd_case_t *);
154cbf75e67SStephen Hanson extern void fmd_case_update_status(fmd_case_t *, uint8_t *, uint8_t *,
155cbf75e67SStephen Hanson     uint8_t *);
156cbf75e67SStephen Hanson extern void fmd_case_update_containees(fmd_case_t *);
157cbf75e67SStephen Hanson extern void fmd_case_xprt_updated(fmd_case_t *);
158cbf75e67SStephen Hanson extern void fmd_case_close_status(fmd_case_t *);
1597c478bd9Sstevel@tonic-gate 
1607c478bd9Sstevel@tonic-gate extern int fmd_case_repair(fmd_case_t *);
16125c6ff4bSstephh extern int fmd_case_acquit(fmd_case_t *);
1627c478bd9Sstevel@tonic-gate extern int fmd_case_contains(fmd_case_t *, fmd_event_t *);
163d9638e54Smws extern int fmd_case_orphaned(fmd_case_t *);
16425c6ff4bSstephh extern void fmd_case_repair_replay(void);
1655750ef5cSStephen Hanson extern void fmd_case_discard_resolved(fmd_case_t *, void *);
1667c478bd9Sstevel@tonic-gate 
1677c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
1687c478bd9Sstevel@tonic-gate }
1697c478bd9Sstevel@tonic-gate #endif
1707c478bd9Sstevel@tonic-gate 
1717c478bd9Sstevel@tonic-gate #endif	/* _FMD_CASE_H */
172