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 2007 Sun Microsystems, Inc.  All rights reserved.
  24  * Use is subject to license terms.
  25  */
  26 
  27 #ifndef _DISKMOND_CONF_H
  28 #define _DISKMOND_CONF_H
  29 
  30 #pragma ident   "%Z%%M% %I%     %E% SMI"
  31 
  32 /*
  33  * Configuration File data
  34  */
  35 
  36 #ifdef __cplusplus
  37 extern "C" {
  38 #endif
  39 
  40 #include <sys/types.h>
  41 #include <pthread.h>
  42 #include <libnvpair.h>
  43 #include <fm/fmd_api.h>
  44 #include "dm_types.h"
  45 #include "util.h"
  46 
  47 #ifndef MIN
  48 #define MIN(x, y) ((x) < (y) ? (x) : (y))
  49 #endif
  50 
  51 #ifndef MAX
  52 #define MAX(x, y) ((x) > (y) ? (x) : (y))
  53 #endif
  54 
  55 #define DEVICES_PREFIX "/devices"
  56 
  57 #define GLOBAL_PROP_LOG_LEVEL           "log-level"
  58 
  59 /* Property names (and values) for the disk configuration file entity */
  60 #define DISK_PROP_DEVPATH               "dev-path"
  61 #define DISK_PROP_LOGNAME               "logical-path"
  62 #define DISK_PROP_FRUACTION             "fru-update-action"
  63 #define DISK_PROP_OTEMPACTION           "overtemp-action"
  64 #define DISK_PROP_STFAILACTION          "selftest-fail-action"
  65 
  66 /* Properties for the "ap" subentity */
  67 #define DISK_AP_PROP_APID "path"
  68 
  69 #define DEVPATH_MINOR_SEPARATOR ':'
  70 
  71 #define DEFAULT_FAULT_POLLING_INTERVAL 3600     /* seconds */
  72 
  73 #define INDICATOR_FAULT_IDENTIFIER "FAULT"
  74 
  75 typedef enum conf_err_e {
  76         E_NO_ERROR = 0,
  77         E_MULTIPLE_IND_LISTS_DEFINED,
  78         E_MULTIPLE_INDRULE_LISTS_DEFINED,
  79         E_INVALID_STATE_CHANGE,
  80         E_IND_MULTIPLY_DEFINED,
  81         E_IND_ACTION_REDUNDANT,
  82         E_IND_ACTION_CONFLICT,
  83         E_IND_MISSING_FAULT_ON,
  84         E_IND_MISSING_FAULT_OFF,
  85         E_INDRULE_REFERENCES_NONEXISTENT_IND_ACTION,
  86         E_DUPLICATE_STATE_TRANSITION
  87 } conf_err_t;
  88 
  89 typedef enum {
  90         INDICATOR_UNKNOWN,
  91         INDICATOR_ON,
  92         INDICATOR_OFF
  93 } ind_state_t;
  94 
  95 typedef enum {
  96         TS_NOT_RUNNING,
  97         TS_RUNNING,
  98         TS_EXIT_REQUESTED,
  99         TS_EXITED
 100 } thread_state_t;
 101 
 102 typedef struct ind_action {
 103         ind_state_t             ind_state;
 104         char                    *ind_name;
 105         struct ind_action       *next;
 106 } ind_action_t;
 107 
 108 typedef struct state_transition {
 109         hotplug_state_t         begin;
 110         hotplug_state_t         end;
 111 } state_transition_t;
 112 
 113 typedef struct indrule {
 114         state_transition_t      strans;
 115         ind_action_t            *action_list;
 116         struct indrule          *next;
 117 } indrule_t;
 118 
 119 typedef struct indicator {
 120         ind_state_t             ind_state;
 121         char                    *ind_name;
 122         char                    *ind_instr_spec;
 123         struct indicator        *next;
 124 } indicator_t;
 125 
 126 typedef struct diskmon {
 127         /*
 128          * Static configuration data
 129          */
 130         nvlist_t                *props;
 131         char                    *location;      /* descriptive location */
 132         nvlist_t                *app_props;
 133         indicator_t             *ind_list;
 134         indrule_t               *indrule_list;
 135         /*
 136          * Dynamic data
 137          */
 138         hotplug_state_t         state;
 139 
 140         /*
 141          * Only one manager can be manipulating the
 142          * state in the diskmon at one time (either the
 143          * state-change manager or the fault-polling manager)
 144          */
 145         pthread_mutex_t         manager_mutex;
 146 
 147         /*
 148          * Set to true only during initialization, and
 149          * cleared the next time a fru update needs to
 150          * occur, this flag enabled an optimization of
 151          * NOT calling libtopo for a configuration update
 152          * when the DE starts up.  This allows a HUGE
 153          * savings (since only a single snapshot-- the
 154          * initial snapshot) is used as the source of
 155          * the FRU information.
 156          */
 157         boolean_t               initial_configuration;
 158 
 159         /* For the state-change manager: */
 160 
 161         /*
 162          * Current state of the fault indicator.
 163          */
 164         pthread_mutex_t         fault_indicator_mutex;
 165         ind_state_t             fault_indicator_state;
 166 
 167         /*
 168          * Set to TRUE when a disk transitions to the CONFIGURED state
 169          * and remains TRUE until the disk is physically removed.
 170          */
 171         boolean_t               configured_yet;
 172 
 173         /*
 174          * The number of disk hotplug state transitions since the disk
 175          * was inserted.
 176          */
 177         uint_t                  state_change_count;
 178 
 179         /* Disk FRU (model, manufacturer, etc) information */
 180         pthread_mutex_t         fru_mutex;
 181         dm_fru_t                *frup;
 182 
 183         struct diskmon          *next;
 184 } diskmon_t;
 185 
 186 typedef struct cfgdata {
 187         nvlist_t                *props;
 188         diskmon_t               *disk_list;
 189 } cfgdata_t;
 190 
 191 typedef struct namevalpr {
 192         char                    *name;
 193         char                    *value;
 194 } namevalpr_t;
 195 
 196 
 197 extern indicator_t      *new_indicator(ind_state_t lstate, char *namep,
 198     char *actionp);
 199 extern void             link_indicator(indicator_t **first,
 200     indicator_t *to_add);
 201 extern void             ind_free(indicator_t *indp);
 202 
 203 extern ind_action_t     *new_indaction(ind_state_t state, char *namep);
 204 extern void             link_indaction(ind_action_t **first,
 205     ind_action_t *to_add);
 206 extern void             indaction_free(ind_action_t *lap);
 207 
 208 extern indrule_t        *new_indrule(state_transition_t *st,
 209     ind_action_t *actionp);
 210 extern void             link_indrule(indrule_t **first, indrule_t *to_add);
 211 extern void             indrule_free(indrule_t *lrp);
 212 
 213 extern diskmon_t        *new_diskmon(nvlist_t *app_props, indicator_t *indp,
 214     indrule_t *indrp, nvlist_t *nvlp);
 215 extern void             diskmon_free(diskmon_t *dmp);
 216 
 217 extern dm_fru_t         *new_dmfru(char *manu, char *modl, char *firmrev,
 218     char *serno, uint64_t capa);
 219 extern void             dmfru_free(dm_fru_t *frup);
 220 
 221 extern nvlist_t         *namevalpr_to_nvlist(namevalpr_t *nvprp);
 222 
 223 extern conf_err_t       check_state_transition(hotplug_state_t s1,
 224     hotplug_state_t s2);
 225 extern conf_err_t       check_inds(indicator_t *indp);
 226 extern conf_err_t       check_indactions(ind_action_t *indap);
 227 extern conf_err_t       check_indrules(indrule_t *indrp,
 228     state_transition_t **offender);
 229 extern conf_err_t       check_consistent_ind_indrules(indicator_t *indp,
 230     indrule_t *indrp, ind_action_t **offender);
 231 
 232 extern void             cfgdata_add_diskmon(cfgdata_t *cfgp, diskmon_t *dmp);
 233 
 234 extern void             conf_error_msg(conf_err_t err, char *buf, int buflen,
 235     void *arg);
 236 
 237 extern const char       *dm_prop_lookup(nvlist_t *props, const char *prop_name);
 238 extern int              dm_prop_lookup_int(nvlist_t *props,
 239     const char *prop_name, int *value);
 240 
 241 extern int              config_init(void);
 242 extern int              config_get(fmd_hdl_t *hdl, const fmd_prop_t *fmd_props);
 243 extern void             config_fini(void);
 244 
 245 extern const char *hotplug_state_string(hotplug_state_t state);
 246 
 247 extern nvlist_t *dm_global_proplist(void);
 248 
 249 #ifdef __cplusplus
 250 }
 251 #endif
 252 
 253 #endif /* _DISKMOND_CONF_H */