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 Device Agent
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#include <errno.h>
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#include <fcntl.h>
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#include <libdladm.h>
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#include <libdllink.h>
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#include <libds.h>
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#include <stdio.h>
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#include <stdlib.h>
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#include <strings.h>
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#include <unistd.h>
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#include <sys/param.h>
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#include <sys/types.h>
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#include <sys/stat.h>
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#include "ldma.h"
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre#define LDMA_MODULE LDMA_NAME_DEVICE
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_dev_validate_path;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartrestatic ldm_msg_func_t ldma_dev_validate_nic;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartrestatic ds_ver_t ldma_versions[] = { { 1, 0 } };
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartrestatic ldma_msg_handler_t ldma_handlers[] = {
82629e3015252bf18319ba3815c773df23e21436Mike Christensen { LDMA_MSGDEV_VALIDATE_PATH, LDMA_MSGFLG_ACCESS_CONTROL,
82629e3015252bf18319ba3815c773df23e21436Mike Christensen ldma_dev_validate_path },
82629e3015252bf18319ba3815c773df23e21436Mike Christensen { LDMA_MSGDEV_VALIDATE_NIC, LDMA_MSGFLG_ACCESS_CONTROL,
82629e3015252bf18319ba3815c773df23e21436Mike Christensen ldma_dev_validate_nic }
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre};
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartreldma_agent_info_t ldma_device_info = {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre LDMA_NAME_DEVICE,
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_dev_validate_path(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 = NULL;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre ldma_request_status_t status;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre struct stat st;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre char *path = NULL;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre uint32_t *path_type, reply_dlen;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre uint32_t plen;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre int fd;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre plen = request->msg_info;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre if (plen == 0 || plen > MAXPATHLEN || plen > request_dlen) {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre status = LDMA_REQ_INVALID;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre goto done;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre }
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre path = malloc(plen + 1);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre if (path == NULL) {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre status = LDMA_REQ_FAILED;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre goto done;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre }
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre (void) strncpy(path, LDMA_HDR2DATA(request), plen);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre path[plen] = '\0';
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre LDMA_DBG("VALIDATE_PATH(%s)", path);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre reply_dlen = sizeof (uint32_t);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre reply = ldma_alloc_result_msg(request, reply_dlen);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre if (reply == NULL) {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre status = LDMA_REQ_FAILED;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre goto done;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre }
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre /* LINTED E_BAD_PTR_CAST_ALIGN */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre path_type = (uint32_t *)(LDMA_HDR2DATA(reply));
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre reply->msg_info = 0x0;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre /* check if path exists */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre if (stat(path, &st) != 0) {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre LDMA_DBG("VALIDATE_PATH(%s): stat failed with error %d",
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre path, errno);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre switch (errno) {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre case EACCES:
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre case ELOOP:
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre case ENOENT:
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre case ENOLINK:
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre case ENOTDIR:
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre /* path is inaccessible, the request is completed */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre status = LDMA_REQ_COMPLETED;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre break;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre case ENAMETOOLONG:
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre status = LDMA_REQ_INVALID;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre break;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre default:
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre /* request has failed */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre status = LDMA_REQ_FAILED;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre break;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre }
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre goto done;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre }
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre status = LDMA_REQ_COMPLETED;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre reply->msg_info |= LDMA_DEVPATH_EXIST;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
6b8303caf3c5c70ae1c1d362bf6de0c55eb622bbAlexandre Chartre LDMA_DBG("VALIDATE_PATH(%s): file mode = 0x%lx", path, st.st_mode);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre switch (st.st_mode & S_IFMT) {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre case S_IFREG:
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre *path_type = LDMA_DEVPATH_TYPE_FILE;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre break;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre case S_IFCHR:
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre case S_IFBLK:
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre *path_type = LDMA_DEVPATH_TYPE_DEVICE;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre break;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre default:
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre /* we don't advertise other types (fifo, directory...) */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre *path_type = 0;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre }
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre /* check if path can be opened read/write */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre if ((fd = open(path, O_RDWR)) != -1) {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre reply->msg_info |= LDMA_DEVPATH_OPENRW | LDMA_DEVPATH_OPENRO;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre (void) close(fd);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre } else {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre LDMA_DBG("VALIDATE_PATH(%s): open RDWR failed with error %d",
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre path, errno);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre /* check if path can be opened read only */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre if ((fd = open(path, O_RDONLY)) != -1) {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre reply->msg_info |= LDMA_DEVPATH_OPENRO;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre (void) close(fd);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre } else {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre LDMA_DBG("VALIDATE_PATH(%s): open RDONLY failed "
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre "with error %d", path, errno);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre }
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre }
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartredone:
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre if (status != LDMA_REQ_COMPLETED) {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre /*
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * We don't provide a reply message if the request has not
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * been completed. The LDoms agent daemon will send an
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * appropriate reply based on the return code of this function.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre free(reply);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre reply = NULL;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre reply_dlen = 0;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre LDMA_DBG("VALIDATE_PATH(%s): return error %d",
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre (path)? path : "<none>", status);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre } else {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre LDMA_DBG("VALIDATE_PATH(%s): return status=0x%x type=0x%x",
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre path, reply->msg_info, *path_type);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre }
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre free(path);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre *replyp = reply;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre *reply_dlenp = reply_dlen;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre return (status);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre}
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre/*
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * We check that the device is a network interface (NIC) using libdladm.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre/*ARGSUSED*/
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartrestatic ldma_request_status_t
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartreldma_dev_validate_nic(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 dladm_handle_t dlhandle;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre datalink_id_t linkid;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre uint32_t flag, media;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre datalink_class_t class;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre ldma_message_header_t *reply = NULL;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre ldma_request_status_t status;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre char *nic = NULL;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre uint32_t nlen, reply_dlen;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre nlen = request->msg_info;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre if (nlen == 0 || nlen > MAXPATHLEN || nlen > request_dlen) {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre status = LDMA_REQ_INVALID;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre goto done;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre }
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre nic = malloc(nlen + 1);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre if (nic == NULL) {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre status = LDMA_REQ_FAILED;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre goto done;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre }
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre (void) strncpy(nic, LDMA_HDR2DATA(request), nlen);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre nic[nlen] = '\0';
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre LDMA_DBG("VALIDATE_NIC(%s)", nic);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre reply_dlen = 0;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre reply = ldma_alloc_result_msg(request, reply_dlen);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre if (reply == NULL) {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre status = LDMA_REQ_FAILED;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre goto done;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre }
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre reply->msg_info = 0x0;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre if (dladm_open(&dlhandle) != DLADM_STATUS_OK) {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre status = LDMA_REQ_FAILED;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre goto done;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre }
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre if (dladm_name2info(dlhandle, nic, &linkid, &flag, &class,
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre &media) != DLADM_STATUS_OK) {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre LDMA_DBG("VALIDATE_NIC(%s): name2info failed", nic);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre } else {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre LDMA_DBG("VALIDATE_NIC(%s): media=0x%x", nic, media);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre reply->msg_info = LDMA_DEVNIC_EXIST;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre }
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre dladm_close(dlhandle);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre status = LDMA_REQ_COMPLETED;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartredone:
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre if (status != LDMA_REQ_COMPLETED) {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre /*
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * We don't provide a reply message if the request has not
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * been completed. The LDoms agent daemon will send an
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre * appropriate reply based on the return code of this function.
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre */
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre free(reply);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre reply = NULL;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre reply_dlen = 0;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre LDMA_DBG("VALIDATE_NIC(%s): return error %d",
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre (nic)? nic : "<none>", status);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre } else {
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre LDMA_DBG("VALIDATE_NIC(%s): return status=0x%x",
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre nic, reply->msg_info);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre }
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre free(nic);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre *replyp = reply;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre *reply_dlenp = reply_dlen;
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre return (status);
49bfb42b00abac0958a1308f4233e366fd083366Alexandre Chartre}