/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
*/
#include <strings.h>
#include "asr.h"
#include "asr_buf.h"
#include "asr_err.h"
#include "asr_nvl.h"
/*
* Returns a supported ASR severity value from the FMA severity value.
* NA, None, Major, Minor, Critical
*/
static char *
{
return (ASR_FLT_SEVERITY_NA);
return (ASR_FLT_SEVERITY_NONE);
return (ASR_FLT_SEVERITY_MINOR);
return (ASR_FLT_SEVERITY_MAJOR);
return (ASR_FLT_SEVERITY_CRITICAL);
return (ASR_FLT_SEVERITY_NA);
}
/*
* Adds the diagnosis engine FMRI as additional information.
*/
static int
{
int err;
goto finally;
err = ASR_FAILURE;
goto finally;
}
return (err);
}
/*
* Pulls out the ASR component name from an FMRI string.
*/
static char *
{
char *cp;
char *rname;
if (*cp == '/')
if (*name == '/')
name++;
if (*cp == '=')
*cp = ' ';
return (rname);
}
/*
* Truncates the fmri name string so it just contains the fru type.
*/
static void
{
int i;
for (i = 0; name[i] != '\0'; i++) {
if (name[i] == ' ') {
name[i] = '\0';
break;
}
}
}
/*
* Create hardware component for a manual fault.
*/
static int
{
int err = 0;
/* FRU name is required by ASR message schema */
"revision", fru_revision);
return (err);
}
/*
* Adds and ASR <hardware-component> element for each FRU suspect
*/
static int
{
int err = 0;
if (nfaults == 0)
return (ASR_FAILURE);
}
char *class;
if (nvlist_lookup_uint8(
certaintystr[0] = '\0';
else
"%d", certainty);
if (nvlist_lookup_nvlist(
/* This must be a service fault. */
char *name;
char *desc;
"no fru, asru, or resource");
goto finally;
}
if ((fmristr = asr_topo_fmri2str(
err = ASR_FAILURE;
goto finally;
}
desc = "-";
if (err != 0)
goto finally;
continue;
}
if (nvlist_lookup_string(
"expected fmri to have scheme");
goto finally;
}
goto finally;
}
err = ASR_FAILURE;
goto finally;
}
FM_FMRI_HC_V0_PART, &hc_part) != 0)
hc_part = "N/A";
FM_FMRI_HC_V0_REVISION, &hc_revision) != 0)
hc_revision = "N/A";
FM_FMRI_HC_V0_SERIAL, &hc_serial_id) != 0)
hc_serial_id = "N/A";
if (nvlist_lookup_nvlist(
}
}
if (use_schema_2_1) {
"fru-revision", hc_revision);
} else {
"revision", hc_revision);
}
if (use_schema_2_1) {
char *hc_data;
/* fault class: fault.cpu.intel.IOcache */
if (nvlist_lookup_string(
/* manufacturer */
if (nvlist_lookup_string(
/* model */
if (nvlist_lookup_string(
/* capacity */
if (nvlist_lookup_string(
/* certainty */
}
/* Add required FRU authority information */
&authority) == 0)
/* Add optional additional-information elements */
if (certaintystr[0] != '\0')
}
}
}
}
}
}
/*
* Gets the description and severity from and FMA event by looking up
* the dictionary information for the fault code.
*/
static nvlist_t *
{
items = asr_nvl_alloc();
(void) ASR_ERROR(EASR_NOMEM);
return (items);
}
} else {
if ((desc = fmd_msg_getitem_nv(
(void) nvlist_add_string(
(void) nvlist_add_string(
} else {
(void) ASR_ERROR(EASR_NOMEM);
}
}
return (items);
}
static int
{
} else {
}
return (ASR_OK);
}
/*
* Creates an ASR event message or updates an FMA fault event.
*/
static int
{
int err;
int rollback;
/* Pick out particular fields for inclusion directly in the XML. */
}
/*
* Look up Severity and Descripiton values.
*/
(void) nvlist_lookup_string(
(void) nvlist_lookup_string(
(void) nvlist_lookup_string(
}
if (description == NULL)
description = "-";
goto finally;
}
pad++;
pad++;
nfaults = 0;
if (use_schema_2_1) {
if (nvlist_lookup_uint32(
switch (case_state) {
case FMD_SUSPECT_CASE_SOLVED:
eventType = "SOLVED";
break;
eventType = "CLOSE_WAIT";
break;
eventType = "ISOLATED";
break;
eventType = "REPAIRED";
break;
eventType = "RESOLVED";
break;
}
}
}
/* Add info about faulted components. */
err = ASR_FAILURE;
goto finally;
}
pad++;
pad--;
}
if (use_schema_2_1) {
if (nvlist_lookup_nvlist(
}
} else {
}
"telemetry_source", ASR_TELEMETRY_SOURCE);
&injected) == 0)
pad--;
pad--;
if (err == 0) {
err = EASR_NOMEM;
} else {
}
return (err);
}
/*
* Creates an ASR event message from an FMA fault event.
*/
int
{
return (do_asr_fault_msg(
}
/*
* Creates an ASR event message that updates an FMA fault event.
* This type of message is used to identify that there are updates to an
* already existing event.
* Event UUIDs are used to identify the parent events.
*/
int
asr_message_t **msg)
{
return (do_asr_fault_msg(
}