49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre/*
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * CDDL HEADER START
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre *
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * The contents of this file are subject to the terms of the
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * Common Development and Distribution License (the "License").
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * You may not use this file except in compliance with the License.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre *
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * or http://www.opensolaris.org/os/licensing.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * See the License for the specific language governing permissions
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * and limitations under the License.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre *
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * When distributing Covered Code, include this CDDL HEADER in each
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * If applicable, add the following below this CDDL HEADER, with the
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * fields enclosed by brackets "[]" replaced with your own identifying
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * information: Portions Copyright [yyyy] [name of copyright owner]
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre *
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * CDDL HEADER END
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre/*
82629e3015252bf18319ba3815c773df23e21436Mike Christensen * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * Use is subject to license terms.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre/*
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * Logical Domains System Agent
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#include <errno.h>
82629e3015252bf18319ba3815c773df23e21436Mike Christensen#include <fcntl.h>
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#include <libds.h>
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#include <stdio.h>
82629e3015252bf18319ba3815c773df23e21436Mike Christensen#include <stdlib.h>
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#include <strings.h>
82629e3015252bf18319ba3815c773df23e21436Mike Christensen#include <synch.h>
82629e3015252bf18319ba3815c773df23e21436Mike Christensen#include <thread.h>
82629e3015252bf18319ba3815c773df23e21436Mike Christensen#include <unistd.h>
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#include <sys/utsname.h>
82629e3015252bf18319ba3815c773df23e21436Mike Christensen#include <sys/mdesc.h>
82629e3015252bf18319ba3815c773df23e21436Mike Christensen#include <sys/mdesc_impl.h>
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#include "ldma.h"
82629e3015252bf18319ba3815c773df23e21436Mike Christensen#include "pri.h"
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_MODULE LDMA_NAME_SYSTEM
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_NVERSIONS (sizeof (ldma_versions) / sizeof (ds_ver_t))
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_NHANDLERS (sizeof (ldma_handlers) / sizeof (ldma_msg_handler_t))
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartrestatic ldm_msg_func_t ldma_sys_get_sysinfo;
82629e3015252bf18319ba3815c773df23e21436Mike Christensenstatic ldm_msg_func_t ldma_sys_get_chassisno;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
82629e3015252bf18319ba3815c773df23e21436Mike Christensen/* ptr to cached value of chassisno */
82629e3015252bf18319ba3815c773df23e21436Mike Christensenstatic char *ldma_sys_chassisno = NULL;
82629e3015252bf18319ba3815c773df23e21436Mike Christensenmutex_t ldma_chassisno_lock = DEFAULTMUTEX;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartrestatic ds_ver_t ldma_versions[] = { { 1, 0 } };
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartrestatic ldma_msg_handler_t ldma_handlers[] = {
82629e3015252bf18319ba3815c773df23e21436Mike Christensen { LDMA_MSGSYS_GET_SYSINFO, LDMA_MSGFLG_ACCESS_ANY,
82629e3015252bf18319ba3815c773df23e21436Mike Christensen ldma_sys_get_sysinfo },
82629e3015252bf18319ba3815c773df23e21436Mike Christensen { LDMA_MSGSYS_GET_CHASSISNO, LDMA_MSGFLG_ACCESS_ANY,
82629e3015252bf18319ba3815c773df23e21436Mike Christensen ldma_sys_get_chassisno }
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre};
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartreldma_agent_info_t ldma_system_info = {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre LDMA_NAME_SYSTEM,
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre ldma_versions, LDMA_NVERSIONS,
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre ldma_handlers, LDMA_NHANDLERS
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre};
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre/*ARGSUSED*/
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartrestatic ldma_request_status_t
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartreldma_sys_get_sysinfo(ds_ver_t *ver, ldma_message_header_t *request,
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre size_t request_dlen, ldma_message_header_t **replyp, size_t *reply_dlenp)
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre{
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre ldma_message_header_t *reply;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre struct utsname name;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre size_t syslen, nodlen, rellen, maclen, verlen;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre size_t rlen;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre char *data;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre int status;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre LDMA_DBG("GET_SYSINFO");
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre if (request->msg_info != 0 || request_dlen != 0) {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre status = LDMA_REQ_INVALID;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre goto done;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre }
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre if (uname(&name) == -1) {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre LDMA_DBG("GET_SYSINFO: uname failed with error %d", errno);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre status = LDMA_REQ_FAILED;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre goto done;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre }
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre syslen = strlen(name.sysname) + 1;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre nodlen = strlen(name.nodename) + 1;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre rellen = strlen(name.release) + 1;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre verlen = strlen(name.version) + 1;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre maclen = strlen(name.machine) + 1;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre rlen = syslen + nodlen + rellen + verlen + maclen;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre reply = ldma_alloc_result_msg(request, rlen);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre if (reply == NULL) {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre status = LDMA_REQ_FAILED;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre goto done;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre }
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre reply->msg_info = rlen;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre data = LDMA_HDR2DATA(reply);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre (void) strcpy(data, name.sysname);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre data += syslen;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre (void) strcpy(data, name.nodename);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre data += nodlen;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre (void) strcpy(data, name.release);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre data += rellen;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre (void) strcpy(data, name.version);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre data += verlen;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre (void) strcpy(data, name.machine);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre LDMA_DBG("GET_SYSINFO: return info=%u, {%s, %s, %s, %s, %s}", rlen,
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre name.sysname, name.nodename, name.release, name.version,
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre name.machine);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre *replyp = reply;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre *reply_dlenp = rlen;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre return (LDMA_REQ_COMPLETED);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartredone:
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre LDMA_DBG("GET_SYSINFO: return error %d", status);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre return (status);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre}
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
82629e3015252bf18319ba3815c773df23e21436Mike Christensen/*
82629e3015252bf18319ba3815c773df23e21436Mike Christensen * Wrapper for MD free: need unused size argument.
82629e3015252bf18319ba3815c773df23e21436Mike Christensen */
82629e3015252bf18319ba3815c773df23e21436Mike Christensen/* ARGSUSED */
82629e3015252bf18319ba3815c773df23e21436Mike Christensenstatic void
82629e3015252bf18319ba3815c773df23e21436Mike Christensenldma_md_free(void *buf, size_t n)
82629e3015252bf18319ba3815c773df23e21436Mike Christensen{
82629e3015252bf18319ba3815c773df23e21436Mike Christensen free(buf);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen}
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
82629e3015252bf18319ba3815c773df23e21436Mike Christensen/*
82629e3015252bf18319ba3815c773df23e21436Mike Christensen * Wrapper for MD init: read PRI MD and invoke md_init_intern.
82629e3015252bf18319ba3815c773df23e21436Mike Christensen */
82629e3015252bf18319ba3815c773df23e21436Mike Christensenstatic md_t *
82629e3015252bf18319ba3815c773df23e21436Mike Christensenldma_md_init()
82629e3015252bf18319ba3815c773df23e21436Mike Christensen{
82629e3015252bf18319ba3815c773df23e21436Mike Christensen md_t *mdp;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen uint64_t *buf = NULL;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen uint64_t token;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen ssize_t status;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
82629e3015252bf18319ba3815c773df23e21436Mike Christensen if (pri_init() == -1)
82629e3015252bf18319ba3815c773df23e21436Mike Christensen return (NULL);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
82629e3015252bf18319ba3815c773df23e21436Mike Christensen status = pri_get(PRI_GET, &token, &buf, malloc, ldma_md_free);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen pri_fini();
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
82629e3015252bf18319ba3815c773df23e21436Mike Christensen if (status == (ssize_t)(-1))
82629e3015252bf18319ba3815c773df23e21436Mike Christensen return (NULL);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
82629e3015252bf18319ba3815c773df23e21436Mike Christensen mdp = md_init_intern(buf, malloc, ldma_md_free);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
82629e3015252bf18319ba3815c773df23e21436Mike Christensen return (mdp);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen}
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
82629e3015252bf18319ba3815c773df23e21436Mike Christensen/*
82629e3015252bf18319ba3815c773df23e21436Mike Christensen * Wrapper for md_fini. Allow NULL md ptr and free MD buffer.
82629e3015252bf18319ba3815c773df23e21436Mike Christensen */
82629e3015252bf18319ba3815c773df23e21436Mike Christensenstatic void
82629e3015252bf18319ba3815c773df23e21436Mike Christensenldma_md_fini(void *md)
82629e3015252bf18319ba3815c773df23e21436Mike Christensen{
82629e3015252bf18319ba3815c773df23e21436Mike Christensen md_impl_t *mdp = (md_impl_t *)md;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
82629e3015252bf18319ba3815c773df23e21436Mike Christensen if (mdp) {
82629e3015252bf18319ba3815c773df23e21436Mike Christensen free(mdp->caddr);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen (void) md_fini(md);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen }
82629e3015252bf18319ba3815c773df23e21436Mike Christensen}
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
82629e3015252bf18319ba3815c773df23e21436Mike Christensenstatic int
82629e3015252bf18319ba3815c773df23e21436Mike Christensenldma_get_chassis_serialno(char **strp)
82629e3015252bf18319ba3815c773df23e21436Mike Christensen{
82629e3015252bf18319ba3815c773df23e21436Mike Christensen md_t *mdp;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen mde_cookie_t *component_nodes, rootnode;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen int list_size, ncomponents, num_nodes, i;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen char *component_type, *serialno;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen int rv = 0;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
82629e3015252bf18319ba3815c773df23e21436Mike Christensen (void) mutex_lock(&ldma_chassisno_lock);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen if (ldma_sys_chassisno != NULL) {
82629e3015252bf18319ba3815c773df23e21436Mike Christensen *strp = ldma_sys_chassisno;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen (void) mutex_unlock(&ldma_chassisno_lock);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen return (1);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen }
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
82629e3015252bf18319ba3815c773df23e21436Mike Christensen mdp = ldma_md_init();
82629e3015252bf18319ba3815c773df23e21436Mike Christensen if (mdp == NULL) {
82629e3015252bf18319ba3815c773df23e21436Mike Christensen (void) mutex_unlock(&ldma_chassisno_lock);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen return (0);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen }
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
82629e3015252bf18319ba3815c773df23e21436Mike Christensen num_nodes = md_node_count(mdp);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen list_size = num_nodes * sizeof (mde_cookie_t);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen component_nodes = malloc(list_size);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen if (component_nodes == NULL) {
82629e3015252bf18319ba3815c773df23e21436Mike Christensen (void) mutex_unlock(&ldma_chassisno_lock);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen ldma_md_fini(mdp);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen return (0);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen }
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
82629e3015252bf18319ba3815c773df23e21436Mike Christensen rootnode = md_root_node(mdp);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
82629e3015252bf18319ba3815c773df23e21436Mike Christensen ncomponents = md_scan_dag(mdp, rootnode, md_find_name(mdp, "component"),
82629e3015252bf18319ba3815c773df23e21436Mike Christensen md_find_name(mdp, "fwd"), component_nodes);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
82629e3015252bf18319ba3815c773df23e21436Mike Christensen for (i = 0; i < ncomponents; i++) {
82629e3015252bf18319ba3815c773df23e21436Mike Christensen if (md_get_prop_str(mdp, component_nodes[i], "type",
82629e3015252bf18319ba3815c773df23e21436Mike Christensen &component_type))
82629e3015252bf18319ba3815c773df23e21436Mike Christensen continue;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen if (strcmp(component_type, "chassis") != 0)
82629e3015252bf18319ba3815c773df23e21436Mike Christensen continue;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen if (md_get_prop_str(mdp, component_nodes[i],
82629e3015252bf18319ba3815c773df23e21436Mike Christensen "serial_number", &serialno) == 0) {
82629e3015252bf18319ba3815c773df23e21436Mike Christensen ldma_sys_chassisno = strdup(serialno);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen *strp = ldma_sys_chassisno;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen rv = 1;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen break;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen }
82629e3015252bf18319ba3815c773df23e21436Mike Christensen }
82629e3015252bf18319ba3815c773df23e21436Mike Christensen (void) mutex_unlock(&ldma_chassisno_lock);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen free(component_nodes);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen ldma_md_fini(mdp);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen return (rv);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen}
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
82629e3015252bf18319ba3815c773df23e21436Mike Christensen/*ARGSUSED*/
82629e3015252bf18319ba3815c773df23e21436Mike Christensenstatic ldma_request_status_t
82629e3015252bf18319ba3815c773df23e21436Mike Christensenldma_sys_get_chassisno(ds_ver_t *ver, ldma_message_header_t *request,
82629e3015252bf18319ba3815c773df23e21436Mike Christensen size_t request_dlen, ldma_message_header_t **replyp, size_t *reply_dlenp)
82629e3015252bf18319ba3815c773df23e21436Mike Christensen{
82629e3015252bf18319ba3815c773df23e21436Mike Christensen ldma_message_header_t *reply;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen char *str;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen size_t rlen;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen char *data;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen int status;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
82629e3015252bf18319ba3815c773df23e21436Mike Christensen LDMA_DBG("GET_CHASSISNO");
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
82629e3015252bf18319ba3815c773df23e21436Mike Christensen if (request->msg_info != 0 || request_dlen != 0) {
82629e3015252bf18319ba3815c773df23e21436Mike Christensen status = LDMA_REQ_INVALID;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen goto done;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen }
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
82629e3015252bf18319ba3815c773df23e21436Mike Christensen if (ldma_get_chassis_serialno(&str) == 0) {
82629e3015252bf18319ba3815c773df23e21436Mike Christensen LDMA_DBG("GET_CHASSISNO: ldma_get_chassisno failed "
82629e3015252bf18319ba3815c773df23e21436Mike Christensen "with error %d", errno);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen status = LDMA_REQ_FAILED;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen goto done;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen }
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
82629e3015252bf18319ba3815c773df23e21436Mike Christensen rlen = strlen(str) + 1;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
82629e3015252bf18319ba3815c773df23e21436Mike Christensen reply = ldma_alloc_result_msg(request, rlen);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
82629e3015252bf18319ba3815c773df23e21436Mike Christensen if (reply == NULL) {
82629e3015252bf18319ba3815c773df23e21436Mike Christensen status = LDMA_REQ_FAILED;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen goto done;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen }
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
82629e3015252bf18319ba3815c773df23e21436Mike Christensen reply->msg_info = rlen;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
82629e3015252bf18319ba3815c773df23e21436Mike Christensen data = LDMA_HDR2DATA(reply);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
82629e3015252bf18319ba3815c773df23e21436Mike Christensen (void) strcpy(data, str);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
82629e3015252bf18319ba3815c773df23e21436Mike Christensen LDMA_DBG("GET_CHASSISNO: return info=%u, {%s}", rlen, str);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
82629e3015252bf18319ba3815c773df23e21436Mike Christensen *replyp = reply;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen *reply_dlenp = rlen;
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
82629e3015252bf18319ba3815c773df23e21436Mike Christensen return (LDMA_REQ_COMPLETED);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen
82629e3015252bf18319ba3815c773df23e21436Mike Christensendone:
82629e3015252bf18319ba3815c773df23e21436Mike Christensen LDMA_DBG("GET_CHASSISNO: return error %d", status);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen return (status);
82629e3015252bf18319ba3815c773df23e21436Mike Christensen}