comparison usr/src/cmd/fm/modules/common/sensor-transport/sensor_transport.c @ 12979:ab9ae749152f

PSARC/2009/617 Software Events Notification Parameters CLI PSARC/2009/618 snmp-notify: SNMP Notification Daemon for Software Events PSARC/2009/619 smtp-notify: Email Notification Daemon for Software Events PSARC/2010/225 fmd for non-global Solaris zones PSARC/2010/226 Solaris Instance UUID PSARC/2010/227 nvlist_nvflag(3NVPAIR) PSARC/2010/228 libfmevent additions PSARC/2010/257 sysevent_evc_setpropnvl and sysevent_evc_getpropnvl PSARC/2010/265 FMRI and FMA Event Stabilty, 'ireport' category 1 event class, and the 'sw' FMRI scheme PSARC/2010/278 FMA/SMF integration: instance state transitions PSARC/2010/279 Modelling panics within FMA PSARC/2010/290 logadm.conf upgrade 6392476 fmdump needs to pretty-print 6393375 userland ereport/ireport event generation interfaces 6445732 Add email notification agent for FMA and software events 6804168 RFE: Allow an efficient means to monitor SMF services status changes 6866661 scf_values_destroy(3SCF) will segfault if is passed NULL 6884709 Add snmp notification agent for FMA and software events 6884712 Add private interface to tap into libfmd_msg macro expansion capabilities 6897919 fmd to run in a non-global zone 6897937 fmd use of non-private doors is not safe 6900081 add a UUID to Solaris kernel image for use in crashdump identification 6914884 model panic events as a defect diagnosis in FMA 6944862 fmd_case_open_uuid, fmd_case_uuisresolved, fmd_nvl_create_defect 6944866 log legacy sysevents in fmd 6944867 enumerate svc scheme in topo 6944868 software-diagnosis and software-response fmd modules 6944870 model SMF maintenance state as a defect diagnosis in FMA 6944876 savecore runs in foreground for systems with zfs root and dedicated dump 6965796 Implement notification parameters for SMF state transitions and FMA events 6968287 SUN-FM-MIB.mib needs to be updated to reflect Oracle information 6972331 logadm.conf upgrade PSARC/2010/290
author Gavin Maltby <gavin.maltby@oracle.com>
date Fri, 30 Jul 2010 17:04:17 +1000
parents dac6771300a8
children
comparison
equal deleted inserted replaced
12978:19d842faf8e4 12979:ab9ae749152f
17 * information: Portions Copyright [yyyy] [name of copyright owner] 17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 * 18 *
19 * CDDL HEADER END 19 * CDDL HEADER END
20 */ 20 */
21 /* 21 /*
22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 22 * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
23 * Use is subject to license terms.
24 */ 23 */
25 24
26 #include <fm/fmd_api.h> 25 #include <fm/fmd_api.h>
27 #include <fm/libtopo.h> 26 #include <fm/libtopo.h>
28 #include <fm/topo_hc.h> 27 #include <fm/topo_hc.h>
68 st_stats_t st_stats = { 67 st_stats_t st_stats = {
69 { "bad_fmri", FMD_TYPE_UINT64, "bad or missing resource/FRU FMRI" }, 68 { "bad_fmri", FMD_TYPE_UINT64, "bad or missing resource/FRU FMRI" },
70 { "topo_errors", FMD_TYPE_UINT64, "errors walking topology" }, 69 { "topo_errors", FMD_TYPE_UINT64, "errors walking topology" },
71 { "repairs", FMD_TYPE_UINT64, "auto repairs" } 70 { "repairs", FMD_TYPE_UINT64, "auto repairs" }
72 }; 71 };
72
73 static int st_check_component_complaints;
74 static int have_complained;
73 75
74 static int 76 static int
75 st_check_component(topo_hdl_t *thp, tnode_t *node, void *arg) 77 st_check_component(topo_hdl_t *thp, tnode_t *node, void *arg)
76 { 78 {
77 sensor_transport_t *stp = arg; 79 sensor_transport_t *stp = arg;
115 } 117 }
116 118
117 if (topo_method_invoke(node, TOPO_METH_SENSOR_FAILURE, 119 if (topo_method_invoke(node, TOPO_METH_SENSOR_FAILURE,
118 TOPO_METH_SENSOR_FAILURE_VERSION, NULL, &nvl, &err) != 0) { 120 TOPO_METH_SENSOR_FAILURE_VERSION, NULL, &nvl, &err) != 0) {
119 if (err == ETOPO_METHOD_NOTSUP) { 121 if (err == ETOPO_METHOD_NOTSUP) {
120 fmd_hdl_debug(hdl, "Method %s not supported on %s=%d", 122 st_check_component_complaints++;
121 TOPO_METH_SENSOR_FAILURE, name, 123 if (!have_complained) {
122 topo_node_instance(node)); 124 fmd_hdl_debug(hdl, "Method %s not supported "
125 "on %s=%d", TOPO_METH_SENSOR_FAILURE, name,
126 topo_node_instance(node));
127 }
123 nvlist_free(rsrc); 128 nvlist_free(rsrc);
124 return (0); 129 return (0);
125 } 130 }
126 nvl = NULL; 131 nvl = NULL;
127 } 132 }
269 nvlist_free(rsrc); 274 nvlist_free(rsrc);
270 nvlist_free(nvl); 275 nvlist_free(nvl);
271 return (0); 276 return (0);
272 } 277 }
273 278
279 int st_timeout_verbose = 0;
280
274 /*ARGSUSED*/ 281 /*ARGSUSED*/
275 static void 282 static void
276 st_timeout(fmd_hdl_t *hdl, id_t id, void *data) 283 st_timeout(fmd_hdl_t *hdl, id_t id, void *data)
277 { 284 {
278 sensor_transport_t *stp; 285 sensor_transport_t *stp;
279 sensor_fault_t *sfp, **current; 286 sensor_fault_t *sfp, **current;
280 topo_hdl_t *thp; 287 topo_hdl_t *thp;
281 topo_walk_t *twp; 288 topo_walk_t *twp;
282 int err; 289 int err;
283 290
284 fmd_hdl_debug(hdl, "timeout: checking topology"); 291 if (st_timeout_verbose)
292 fmd_hdl_debug(hdl, "timeout: checking topology");
285 293
286 stp = fmd_hdl_getspecific(hdl); 294 stp = fmd_hdl_getspecific(hdl);
287 thp = fmd_hdl_topo_hold(hdl, TOPO_VERSION); 295 thp = fmd_hdl_topo_hold(hdl, TOPO_VERSION);
288 296
289 if ((twp = topo_walk_init(thp, FM_FMRI_SCHEME_HC, st_check_component, 297 if ((twp = topo_walk_init(thp, FM_FMRI_SCHEME_HC, st_check_component,
292 fmd_hdl_error(hdl, "failed to walk topology: %s\n", 300 fmd_hdl_error(hdl, "failed to walk topology: %s\n",
293 topo_strerror(err)); 301 topo_strerror(err));
294 st_stats.st_topo_errs.fmds_value.ui64++; 302 st_stats.st_topo_errs.fmds_value.ui64++;
295 return; 303 return;
296 } 304 }
305
306 if (st_check_component_complaints)
307 have_complained++;
297 308
298 /* 309 /*
299 * Initialize values in our internal FRU list for this iteration of 310 * Initialize values in our internal FRU list for this iteration of
300 * sensor reads. Keep track of whether the FRU was faulted in the 311 * sensor reads. Keep track of whether the FRU was faulted in the
301 * previous pass so we don't send multiple ereports for the same 312 * previous pass so we don't send multiple ereports for the same