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 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 * 25 * itree.h -- public definitions for itree module 26 * 27 */ 28 29 #ifndef _EFT_ITREE_H 30 #define _EFT_ITREE_H 31 32 #ifdef __cplusplus 33 extern "C" { 34 #endif 35 36 /* the "fault" field in the event struct requires the definition of nvlist_t */ 37 #include <sys/fm/protocol.h> 38 #include <fm/fmd_api.h> 39 40 /* Numerical representation of propagation N value (A), short for All */ 41 #define N_IS_ALL -1 42 43 /* 44 * effects_test event cached_state bits 45 * - reset on each call to effects_test() 46 */ 47 #define CREDIBLE_EFFECT 1 48 #define WAIT_EFFECT 2 49 #define PARENT_WAIT 4 50 51 /* 52 * arrow mark bits (for K-count) 53 */ 54 #define EFFECTS_COUNTER 8 55 #define REQMNTS_COUNTER 16 56 57 /* 58 * requirements_test event cached_state bits 59 */ 60 #define REQMNTS_CREDIBLE 32 61 #define REQMNTS_DISPROVED 64 62 #define REQMNTS_WAIT 128 63 64 /* 65 * requirements_test bubble mark bits 66 */ 67 #define BUBBLE_ELIDED 256 68 #define BUBBLE_OK 512 69 70 /* 71 * causes_test event cached_state bits 72 */ 73 #define CAUSES_TESTED 1024 74 75 struct event { 76 struct event *suspects; 77 struct event *psuspects; 78 struct event *observations; /* for lists like suspect list */ 79 fmd_event_t *ffep; 80 nvlist_t *nvp; /* payload nvp for ereports */ 81 struct node *enode; /* event node in parse tree */ 82 const struct ipath *ipp; /* instanced version of event */ 83 const struct ipath *ipp_un; /* full version for Usednames */ 84 struct lut *props; /* instanced version of nvpairs */ 85 struct lut *payloadprops; /* nvpairs for problem payload */ 86 struct lut *serdprops; /* nvpairs for dynamic serd args */ 87 int count; /* for reports, number seen */ 88 enum nametype t:3; /* defined in tree.h */ 89 int is_suspect:1; /* true if on suspect list */ 90 int keep_in_tree:1; 91 int cached_state:11; 92 unsigned long long cached_delay; 93 struct bubble { 94 struct bubble *next; 95 struct event *myevent; 96 int gen; /* generation # */ 97 int nork; 98 int mark:11; 99 enum bubbletype { 100 B_FROM, 101 B_TO, 102 B_INHIBIT 103 } t:2; 104 struct arrowlist { 105 struct arrowlist *next; 106 struct arrow { 107 struct bubble *head; 108 struct bubble *tail; 109 /* prop node in parse tree */ 110 struct node *pnode; 111 struct constraintlist { 112 struct constraintlist *next; 113 /* deferred constraints */ 114 struct node *cnode; 115 } *constraints; 116 int forever_false:1; 117 int forever_true:1; 118 int arrow_marked:1; 119 int mark:11; 120 unsigned long long mindelay; 121 unsigned long long maxdelay; 122 } *arrowp; 123 } *arrows; 124 } *bubbles; 125 }; 126 127 /* 128 * struct iterinfo is the stuff we store in the dictionary of iterators 129 * when we assign a value to an iterator. it not only contains the value 130 * we assigned to the iterator, it contains a node pointer which we use to 131 * determine if we're the one that defined the value when popping [vh]match() 132 * recursion. 133 */ 134 struct iterinfo { 135 int num; 136 struct node *np; 137 }; 138 139 struct lut *itree_create(struct config *croot); 140 void itree_free(struct lut *itp); 141 void itree_prune(struct lut *itp); 142 struct event *itree_lookup(struct lut *itp, 143 const char *ename, const struct ipath *ipp); 144 145 struct arrowlist *itree_next_arrow(struct bubble *bubblep, 146 struct arrowlist *last); 147 struct bubble *itree_next_bubble(struct event *eventp, struct bubble *last); 148 struct constraintlist *itree_next_constraint(struct arrow *arrowp, 149 struct constraintlist *last); 150 151 void itree_pevent_brief(int flags, struct event *eventp); 152 void itree_ptree(int flags, struct lut *itp); 153 154 const char *itree_bubbletype2str(enum bubbletype t); 155 156 void itree_fini(void); 157 158 #ifdef __cplusplus 159 } 160 #endif 161 162 #endif /* _EFT_ITREE_H */ 163