libdladm.c revision 801093905f15f0f1a50095474e8a3f0e5b0cb126
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson/*
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * CDDL HEADER START
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson *
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * The contents of this file are subject to the terms of the
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * Common Development and Distribution License (the "License").
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * You may not use this file except in compliance with the License.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson *
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * or http://www.opensolaris.org/os/licensing.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * See the License for the specific language governing permissions
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * and limitations under the License.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson *
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * When distributing Covered Code, include this CDDL HEADER in each
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * If applicable, add the following below this CDDL HEADER, with the
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * fields enclosed by brackets "[]" replaced with your own identifying
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * information: Portions Copyright [yyyy] [name of copyright owner]
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson *
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * CDDL HEADER END
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson/*
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson#include <unistd.h>
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson#include <errno.h>
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson#include <ctype.h>
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson#include <fcntl.h>
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson#include <strings.h>
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson#include <dirent.h>
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson#include <stdlib.h>
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson#include <netinet/in.h>
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson#include <arpa/inet.h>
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson#include <sys/param.h>
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson#include <sys/stat.h>
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson#include <sys/dld.h>
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson#include <sys/dld_ioc.h>
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson#include <libdladm_impl.h>
191c289b86668766245f78ec1f87557319bc46a1Charles Ting#include <libintl.h>
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson#include <libdlpi.h>
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesonstatic char dladm_rootdir[MAXPATHLEN] = "/";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesontypedef struct media_type_desc {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson uint32_t media_type;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson#define MAX_MEDIA_TYPE_STRING 32
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson const char media_type_str[MAX_MEDIA_TYPE_STRING];
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson} media_type_t;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesonstatic media_type_t media_type_table[] = {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { DL_ETHER, "Ethernet" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { DL_WIFI, "WiFi" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { DL_IB, "Infiniband" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { DL_IPV4, "IPv4Tunnel" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { DL_IPV6, "IPv6Tunnel" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { DL_6TO4, "6to4Tunnel" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { DL_CSMACD, "CSMA/CD" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { DL_TPB, "TokenBus" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { DL_TPR, "TokenRing" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { DL_METRO, "MetroNet" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { DL_HDLC, "HDLC" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { DL_CHAR, "SyncCharacter" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { DL_CTCA, "CTCA" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { DL_FDDI, "FDDI" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { DL_FC, "FiberChannel" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { DL_ATM, "ATM" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { DL_IPATM, "ATM(ClassicIP)" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { DL_X25, "X.25" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { DL_IPX25, "X.25(ClassicIP)" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { DL_ISDN, "ISDN" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { DL_HIPPI, "HIPPI" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { DL_100VG, "100BaseVGEthernet" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { DL_100VGTPR, "100BaseVGTokenRing" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { DL_ETH_CSMA, "IEEE802.3" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { DL_100BT, "100BaseT" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { DL_FRAME, "FrameRelay" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { DL_MPFRAME, "MPFrameRelay" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { DL_ASYNC, "AsyncCharacter" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { DL_IPNET, "IPNET" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { DL_OTHER, "Other" }
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson};
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson#define MEDIATYPECOUNT (sizeof (media_type_table) / sizeof (media_type_t))
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesontypedef struct {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson uint32_t lp_type;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson char *lp_name;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson} link_protect_t;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesonstatic link_protect_t link_protect_types[] = {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { MPT_MACNOSPOOF, "mac-nospoof" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { MPT_RESTRICTED, "restricted" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { MPT_IPNOSPOOF, "ip-nospoof" },
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson { MPT_DHCPNOSPOOF, "dhcp-nospoof" }
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson};
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson#define LPTYPES (sizeof (link_protect_types) / sizeof (link_protect_t))
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_status_t
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_open(dladm_handle_t *handle)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson{
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson int dld_fd;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (handle == NULL)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_BADARG);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if ((dld_fd = open(DLD_CONTROL_DEV, O_RDWR)) < 0)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (dladm_errno2status(errno));
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson /*
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * Don't open DLMGMT_DOOR now. dlmgmtd(1M) is not able to
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * open the door when the dladm handle is opened because the
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * door hasn't been created yet at that time. Thus, we must
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * open it on-demand in dladm_door_fd(). Move the open()
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * to dladm_door_fd() for all cases.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if ((*handle = malloc(sizeof (struct dladm_handle))) == NULL) {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) close(dld_fd);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_NOMEM);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson }
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (*handle)->dld_fd = dld_fd;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (*handle)->door_fd = -1;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_OK);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson}
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesonvoid
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_close(dladm_handle_t handle)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson{
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (handle != NULL) {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) close(handle->dld_fd);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (handle->door_fd != -1)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) close(handle->door_fd);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson free(handle);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson }
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson}
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesonint
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_dld_fd(dladm_handle_t handle)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson{
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (handle->dld_fd);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson}
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson/*
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * If DLMGMT_DOOR hasn't been opened in the handle yet, open it.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_status_t
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_door_fd(dladm_handle_t handle, int *door_fd)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson{
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson int fd;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (handle->door_fd == -1) {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if ((fd = open(DLMGMT_DOOR, O_RDONLY)) < 0)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (dladm_errno2status(errno));
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson handle->door_fd = fd;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson }
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson *door_fd = handle->door_fd;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_OK);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson}
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesonconst char *
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_status2str(dladm_status_t status, char *buf)
168665f7ddaca2a65705c3b127078ffc6b24adc3Sue Gleeson{
168665f7ddaca2a65705c3b127078ffc6b24adc3Sue Gleeson const char *s;
168665f7ddaca2a65705c3b127078ffc6b24adc3Sue Gleeson
168665f7ddaca2a65705c3b127078ffc6b24adc3Sue Gleeson switch (status) {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_OK:
168665f7ddaca2a65705c3b127078ffc6b24adc3Sue Gleeson s = "ok";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_BADARG:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid argument";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_FAILED:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "operation failed";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_TOOSMALL:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "buffer size too small";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_NOTSUP:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "operation not supported";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_NOTFOUND:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "object not found";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_BADVAL:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid value";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_NOMEM:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "insufficient memory";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_EXIST:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "object already exists";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_LINKINVAL:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid link";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_PROPRDONLY:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "read-only property";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_BADVALCNT:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid number of values";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_DBNOTFOUND:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "database not found";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_DENIED:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "permission denied";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_IOERR:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "I/O error";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_TEMPONLY:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "change cannot be persistent";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
aedf2b3bb56b025fcaf87b49ec6c8aeea07f16d7srivijitha dugganapalli case DLADM_STATUS_TIMEDOUT:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "operation timed out";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_ISCONN:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "already connected";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_NOTCONN:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "not connected";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_REPOSITORYINVAL:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid configuration repository";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_MACADDRINVAL:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid MAC address";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_KEYINVAL:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid key";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_INVALIDMACADDRLEN:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid MAC address length";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_INVALIDMACADDRTYPE:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid MAC address type";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_LINKBUSY:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "link busy";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_VIDINVAL:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid VLAN identifier";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_TRYAGAIN:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "try again later";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_NONOTIF:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "link notification is not supported";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_BADTIMEVAL:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid time range";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_INVALIDMACADDR:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid MAC address value";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_INVALIDMACADDRNIC:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "MAC address reserved for use by underlying data-link";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_INVALIDMACADDRINUSE:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "MAC address is already in use";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_MACFACTORYSLOTINVALID:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid factory MAC address slot";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_MACFACTORYSLOTUSED:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "factory MAC address slot already used";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_MACFACTORYSLOTALLUSED:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "all factory MAC address slots are in use";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_MACFACTORYNOTSUP:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "factory MAC address slots not supported";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_INVALIDMACPREFIX:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "Invalid MAC address prefix value";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_INVALIDMACPREFIXLEN:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "Invalid MAC address prefix length";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_CPUMAX:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "non-existent processor ID";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_CPUERR:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "could not determine processor status";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_CPUNOTONLINE:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "processor not online";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_DB_NOTFOUND:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "database not found";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_DB_PARSE_ERR:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "database parse error";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_PROP_PARSE_ERR:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "property parse error";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_ATTR_PARSE_ERR:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "attribute parse error";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_FLOW_DB_ERR:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "flow database error";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_FLOW_DB_OPEN_ERR:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "flow database open error";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_FLOW_DB_PARSE_ERR:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "flow database parse error";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_FLOWPROP_DB_PARSE_ERR:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "flow property database parse error";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_FLOW_ADD_ERR:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "flow add error";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_FLOW_WALK_ERR:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "flow walk error";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_FLOW_IDENTICAL:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "a flow with identical attributes exists";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_FLOW_INCOMPATIBLE:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "flow(s) with incompatible attributes exists";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_FLOW_EXISTS:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "link still has flows";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_PERSIST_FLOW_EXISTS:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "persistent flow with the same name exists";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_INVALID_IP:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid IP address";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_INVALID_PREFIXLEN:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid IP prefix length";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_INVALID_PROTOCOL:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid IP protocol";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_INVALID_PORT:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid port number";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_INVALID_DSF:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid dsfield";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_INVALID_DSFMASK:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid dsfield mask";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_INVALID_MACMARGIN:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "MTU check failed, use lower MTU or -f option";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_BADPROP:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid property";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_MINMAXBW:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "minimum value for maxbw is 1200K";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_NO_HWRINGS:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "request hw rings failed";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_PERMONLY:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "change must be persistent";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_OPTMISSING:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "optional software not installed";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_IPTUNTYPE:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid IP tunnel type";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_IPTUNTYPEREQD:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "IP tunnel type required";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_BADIPTUNLADDR:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid local IP tunnel address";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_BADIPTUNRADDR:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid remote IP tunnel address";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_ADDRINUSE:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "address already in use";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_POOLCPU:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "pool and cpus property are mutually exclusive";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_INVALID_PORT_INSTANCE:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid IB phys link";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_PORT_IS_DOWN:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "port is down";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_PARTITION_EXISTS:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "partition already exists";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_PKEY_NOT_PRESENT:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "PKEY is not present on the port";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_INVALID_PKEY:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid PKEY";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_NO_IB_HW_RESOURCE:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "IB internal resource not available";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_INVALID_PKEY_TBL_SIZE:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid PKEY table size";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DLADM_STATUS_PORT_NOPROTO:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "local or remote port requires transport";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson default:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "<unknown error>";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson }
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) snprintf(buf, DLADM_STRSIZE, "%s", dgettext(TEXT_DOMAIN, s));
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (buf);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson}
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson/*
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * Convert a unix errno to a dladm_status_t.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * We only convert errnos that are likely to be encountered. All others
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * are mapped to DLADM_STATUS_FAILED.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_status_t
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_errno2status(int err)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson{
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson switch (err) {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case 0:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_OK);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case EINVAL:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_BADARG);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case EEXIST:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_EXIST);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case ENOENT:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_NOTFOUND);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case ENOSPC:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_TOOSMALL);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case ENOMEM:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_NOMEM);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case ENOTSUP:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_NOTSUP);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case ENETDOWN:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_NONOTIF);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case EACCES:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case EPERM:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_DENIED);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case EIO:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_IOERR);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case EBUSY:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_LINKBUSY);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case EAGAIN:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_TRYAGAIN);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case ENOTEMPTY:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_FLOW_EXISTS);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case EOPNOTSUPP:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_FLOW_INCOMPATIBLE);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case EALREADY:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_FLOW_IDENTICAL);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case EADDRINUSE:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_ADDRINUSE);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson default:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_FAILED);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson }
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson}
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesonboolean_t
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_str2interval(char *oarg, uint32_t *interval)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson{
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson int val;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson char *endp = NULL;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson errno = 0;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson val = strtol(oarg, &endp, 10);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (errno != 0 || val <= 0 || *endp != '\0')
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (B_FALSE);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson *interval = val;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (B_TRUE);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson}
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_status_t
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_str2bw(char *oarg, uint64_t *bw)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson{
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson char *endp = NULL;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson int64_t n;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson int mult = 1;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson n = strtoull(oarg, &endp, 10);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if ((errno != 0) || (strlen(endp) > 1))
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_BADARG);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (n < 0)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_BADVAL);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson switch (*endp) {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case 'k':
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case 'K':
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson mult = 1000;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case 'm':
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case 'M':
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case '\0':
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson mult = 1000000;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case 'g':
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case 'G':
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson mult = 1000000000;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case '%':
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson /*
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * percentages not supported for now,
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * see RFE 6540675
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_NOTSUP);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson default:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_BADVAL);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson }
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson *bw = n * mult;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson /* check for overflow */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (*bw / mult != n)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_BADARG);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_OK);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson}
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson/*
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * Convert bandwidth in bps to a string in mpbs. For values greater
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * than 1mbps or 1000000, print a whole mbps value. For values that
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson * have fractional Mbps in whole Kbps , print the bandwidth in a manner
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson * simlilar to a floating point format.
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson *
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * bps string
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * 0 0
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * 100 0
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * 2000 0.002
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * 431000 0.431
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * 1000000 1
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * 1030000 1.030
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * 100000000 100
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesonconst char *
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_bw2str(int64_t bw, char *buf)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson{
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson int kbps, mbps;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson kbps = (bw%1000000)/1000;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson mbps = bw/1000000;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (kbps != 0) {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (mbps == 0)
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson (void) snprintf(buf, DLADM_STRSIZE, "0.%03u", kbps);
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson else
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) snprintf(buf, DLADM_STRSIZE, "%5u.%03u", mbps,
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson kbps);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson } else {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) snprintf(buf, DLADM_STRSIZE, "%5u", mbps);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson }
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (buf);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson}
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson#define LOCK_DB_PERMS S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleesonstatic int
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesoni_dladm_lock_db(const char *lock_file, short type)
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson{
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson int lock_fd;
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson struct flock lock;
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if ((lock_fd = open(lock_file, O_RDWR | O_CREAT | O_TRUNC,
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson LOCK_DB_PERMS)) < 0)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (-1);
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson lock.l_type = type;
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson lock.l_whence = SEEK_SET;
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson lock.l_start = 0;
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson lock.l_len = 0;
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson if (fcntl(lock_fd, F_SETLKW, &lock) < 0) {
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson int err = errno;
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson (void) close(lock_fd);
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson (void) unlink(lock_file);
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson errno = err;
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson return (-1);
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson }
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson return (lock_fd);
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson}
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleesonstatic void
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleesoni_dladm_unlock_db(const char *lock_file, int fd)
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson{
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson struct flock lock;
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson if (fd < 0)
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson return;
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson lock.l_type = F_UNLCK;
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson lock.l_whence = SEEK_SET;
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson lock.l_start = 0;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson lock.l_len = 0;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) fcntl(fd, F_SETLKW, &lock);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) close(fd);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) unlink(lock_file);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson}
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson/*
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * Given a link class, returns its class string.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesonconst char *
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_class2str(datalink_class_t class, char *buf)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson{
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson const char *s;
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson switch (class) {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DATALINK_CLASS_PHYS:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "phys";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DATALINK_CLASS_VLAN:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "vlan";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DATALINK_CLASS_AGGR:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "aggr";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DATALINK_CLASS_VNIC:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "vnic";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DATALINK_CLASS_ETHERSTUB:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "etherstub";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DATALINK_CLASS_IPTUN:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "iptun";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DATALINK_CLASS_SIMNET:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "simnet";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DATALINK_CLASS_BRIDGE:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "bridge";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case DATALINK_CLASS_PART:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "part";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson default:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "unknown";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson }
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) snprintf(buf, DLADM_STRSIZE, "%s", s);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (buf);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson}
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson/*
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * Given a physical link media type, returns its media type string.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesonconst char *
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_media2str(uint32_t media, char *buf)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson{
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson const char *s = "--";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson media_type_t *mt;
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson int idx;
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson for (idx = 0; idx < MEDIATYPECOUNT; idx++) {
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson mt = media_type_table + idx;
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson if (mt->media_type == media) {
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson s = mt->media_type_str;
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson break;
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson }
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson }
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) snprintf(buf, DLADM_STRSIZE, "%s", s);
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson return (buf);
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson}
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson/*
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson * Given a physical link media type string, returns its media type constant.
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson */
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleesonuint32_t
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleesondladm_str2media(const char *buf)
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson{
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson media_type_t *mt;
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson int idx;
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson for (idx = 0; idx < MEDIATYPECOUNT; idx++) {
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson mt = media_type_table + idx;
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson if (strcasecmp(buf, mt->media_type_str) == 0)
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson return (mt->media_type);
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson }
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DL_OTHER);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson}
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_status_t
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesoni_dladm_rw_db(dladm_handle_t handle, const char *db_file, mode_t db_perms,
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson dladm_status_t (*process_db)(dladm_handle_t, void *, FILE *, FILE *),
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson void *arg, boolean_t writeop)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson{
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson dladm_status_t status = DLADM_STATUS_OK;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson FILE *fp, *nfp = NULL;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson char lock[MAXPATHLEN];
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson char file[MAXPATHLEN];
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson char newfile[MAXPATHLEN];
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson char *db_basename;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson int nfd, lock_fd;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson /*
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * If we are called from a boot script such as net-physical,
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * it's quite likely that the root fs is still not writable.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * For this case, it's ok for the lock creation to fail since
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * no one else could be accessing our configuration file.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson db_basename = strrchr(db_file, '/');
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (db_basename == NULL || db_basename[1] == '\0')
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (dladm_errno2status(EINVAL));
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson db_basename++;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) snprintf(lock, MAXPATHLEN, "/tmp/%s.lock", db_basename);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if ((lock_fd = i_dladm_lock_db
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (lock, (writeop ? F_WRLCK : F_RDLCK))) < 0 && errno != EROFS)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (dladm_errno2status(errno));
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) snprintf(file, MAXPATHLEN, "%s/%s", dladm_rootdir, db_file);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if ((fp = fopen(file, (writeop ? "r+" : "r"))) == NULL) {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson int err = errno;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson i_dladm_unlock_db(lock, lock_fd);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (err == ENOENT)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_DBNOTFOUND);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (dladm_errno2status(err));
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson }
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (writeop) {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) snprintf(newfile, MAXPATHLEN, "%s/%s.new",
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson dladm_rootdir, db_file);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if ((nfd = open(newfile, O_WRONLY | O_CREAT | O_TRUNC,
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson db_perms)) < 0) {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) fclose(fp);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson i_dladm_unlock_db(lock, lock_fd);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (dladm_errno2status(errno));
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson }
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if ((nfp = fdopen(nfd, "w")) == NULL) {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) close(nfd);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) fclose(fp);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) unlink(newfile);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson i_dladm_unlock_db(lock, lock_fd);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (dladm_errno2status(errno));
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson }
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson }
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson status = (*process_db)(handle, arg, fp, nfp);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (!writeop || status != DLADM_STATUS_OK)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson goto done;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson /* Set permissions on file to db_perms */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (fchmod(nfd, db_perms) < 0) {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson status = dladm_errno2status(errno);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson goto done;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson }
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson /*
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * Configuration files need to be owned by the 'dladm' user and
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * 'netadm' group.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (fchown(nfd, UID_DLADM, GID_NETADM) < 0) {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson status = dladm_errno2status(errno);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson goto done;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson }
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (fflush(nfp) == EOF) {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson status = dladm_errno2status(errno);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson goto done;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson }
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) fclose(fp);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) fclose(nfp);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (rename(newfile, file) < 0) {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) unlink(newfile);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson i_dladm_unlock_db(lock, lock_fd);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (dladm_errno2status(errno));
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson }
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson i_dladm_unlock_db(lock, lock_fd);
191c289b86668766245f78ec1f87557319bc46a1Charles Ting return (DLADM_STATUS_OK);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondone:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (nfp != NULL) {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) fclose(nfp);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (status != DLADM_STATUS_OK)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) unlink(newfile);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson }
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) fclose(fp);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson i_dladm_unlock_db(lock, lock_fd);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (status);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson}
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_status_t
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_set_rootdir(const char *rootdir)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson{
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson DIR *dp;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (rootdir == NULL || *rootdir != '/' ||
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (dp = opendir(rootdir)) == NULL)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_BADARG);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) strncpy(dladm_rootdir, rootdir, MAXPATHLEN);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) closedir(dp);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_OK);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson}
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesonboolean_t
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_valid_linkname(const char *link)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson{
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson size_t len = strlen(link);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson const char *cp;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (len >= MAXLINKNAMELEN)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (B_FALSE);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson /*
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * The link name cannot start with a digit and must end with a digit.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if ((isdigit(link[0]) != 0) || (isdigit(link[len - 1]) == 0))
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (B_FALSE);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson /*
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleeson * The legal characters in a link name are:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * alphanumeric (a-z, A-Z, 0-9), underscore ('_'), and '.'.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson for (cp = link; *cp != '\0'; cp++) {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if ((isalnum(*cp) == 0) && (*cp != '_') && (*cp != '.'))
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (B_FALSE);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson }
aedf2b3bb56b025fcaf87b49ec6c8aeea07f16d7srivijitha dugganapalli
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (B_TRUE);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson}
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleeson
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleeson/*
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleeson * Convert priority string to a value.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_status_t
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_str2pri(char *token, mac_priority_level_t *pri)
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleeson{
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleeson if (strlen(token) == strlen("low") &&
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleeson strncasecmp(token, "low", strlen("low")) == 0) {
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleeson *pri = MPL_LOW;
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleeson } else if (strlen(token) == strlen("medium") &&
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleeson strncasecmp(token, "medium", strlen("medium")) == 0) {
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleeson *pri = MPL_MEDIUM;
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleeson } else if (strlen(token) == strlen("high") &&
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleeson strncasecmp(token, "high", strlen("high")) == 0) {
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleeson *pri = MPL_HIGH;
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleeson } else {
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleeson return (DLADM_STATUS_BADVAL);
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleeson }
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleeson return (DLADM_STATUS_OK);
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleeson}
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleeson
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleeson/*
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleeson * Convert priority value to a string.
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesonconst char *
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleesondladm_pri2str(mac_priority_level_t pri, char *buf)
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleeson{
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson const char *s;
191c289b86668766245f78ec1f87557319bc46a1Charles Ting
191c289b86668766245f78ec1f87557319bc46a1Charles Ting switch (pri) {
191c289b86668766245f78ec1f87557319bc46a1Charles Ting case MPL_LOW:
191c289b86668766245f78ec1f87557319bc46a1Charles Ting s = "low";
191c289b86668766245f78ec1f87557319bc46a1Charles Ting break;
191c289b86668766245f78ec1f87557319bc46a1Charles Ting case MPL_MEDIUM:
191c289b86668766245f78ec1f87557319bc46a1Charles Ting s = "medium";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson case MPL_HIGH:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "high";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson default:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "--";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson }
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) snprintf(buf, DLADM_STRSIZE, "%s", dgettext(TEXT_DOMAIN, s));
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (buf);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson}
191c289b86668766245f78ec1f87557319bc46a1Charles Ting
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson/*
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * Convert protect string to a value.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_status_t
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_str2protect(char *token, uint32_t *ptype)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson{
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson link_protect_t *lp;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson int i;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson for (i = 0; i < LPTYPES; i++) {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson lp = &link_protect_types[i];
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (strcmp(token, lp->lp_name) == 0) {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson *ptype = lp->lp_type;
191c289b86668766245f78ec1f87557319bc46a1Charles Ting return (DLADM_STATUS_OK);
191c289b86668766245f78ec1f87557319bc46a1Charles Ting }
191c289b86668766245f78ec1f87557319bc46a1Charles Ting }
191c289b86668766245f78ec1f87557319bc46a1Charles Ting return (DLADM_STATUS_BADVAL);
191c289b86668766245f78ec1f87557319bc46a1Charles Ting}
191c289b86668766245f78ec1f87557319bc46a1Charles Ting
191c289b86668766245f78ec1f87557319bc46a1Charles Ting/*
191c289b86668766245f78ec1f87557319bc46a1Charles Ting * Convert protect value to a string.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesonconst char *
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleesondladm_protect2str(uint32_t ptype, char *buf)
aedf2b3bb56b025fcaf87b49ec6c8aeea07f16d7srivijitha dugganapalli{
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson const char *s = "--";
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson link_protect_t *lp;
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson int i;
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson for (i = 0; i < LPTYPES; i++) {
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson lp = &link_protect_types[i];
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson if (lp->lp_type == ptype) {
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson s = lp->lp_name;
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson break;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson }
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson }
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) snprintf(buf, DLADM_STRSIZE, "%s", dgettext(TEXT_DOMAIN, s));
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (buf);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson}
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson/*
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * Convert an IPv4 address to/from a string.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesonconst char *
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_ipv4addr2str(void *addr, char *buf)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson{
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (inet_ntop(AF_INET, addr, buf, INET_ADDRSTRLEN) == NULL)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson buf[0] = '\0';
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (buf);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson}
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_status_t
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_str2ipv4addr(char *token, void *addr)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson{
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (inet_pton(AF_INET, token, addr) == 1 ?
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson DLADM_STATUS_OK : DLADM_STATUS_INVALID_IP);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson}
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesonconst char *
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_ipv6addr2str(void *addr, char *buf)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson{
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (inet_ntop(AF_INET6, addr, buf, INET6_ADDRSTRLEN) == NULL)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson buf[0] = '\0';
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (buf);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson}
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_status_t
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_str2ipv6addr(char *token, void *addr)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson{
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (inet_pton(AF_INET6, token, addr) == 1 ?
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson DLADM_STATUS_OK : DLADM_STATUS_INVALID_IP);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson}
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson/*
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * Find the set bits in a mask.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * This is used for expanding a bitmask into individual sub-masks
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * which can be used for further processing.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesonvoid
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_find_setbits32(uint32_t mask, uint32_t *list, uint32_t *cnt)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson{
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson int i, c = 0;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson for (i = 0; i < 32; i++) {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (((1 << i) & mask) != 0)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson list[c++] = 1 << i;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson }
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson *cnt = c;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson}
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesonvoid
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_free_args(dladm_arg_list_t *list)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson{
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (list != NULL) {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson free(list->al_buf);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson free(list);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson }
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson}
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_status_t
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_parse_args(char *str, dladm_arg_list_t **listp, boolean_t novalues)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson{
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson dladm_arg_list_t *list;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson dladm_arg_info_t *aip;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson char *buf, *curr;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson int len, i;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (str == NULL)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_BADVAL);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (str[0] == '\0')
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_OK);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson list = malloc(sizeof (dladm_arg_list_t));
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (list == NULL)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (dladm_errno2status(errno));
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson list->al_count = 0;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson list->al_buf = buf = strdup(str);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (buf == NULL)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (dladm_errno2status(errno));
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson curr = buf;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson len = strlen(buf);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson aip = NULL;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson for (i = 0; i < len; i++) {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson char c = buf[i];
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson boolean_t match = (c == '=' || c == ',');
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (!match && i != len - 1)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson continue;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (match) {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson buf[i] = '\0';
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (*curr == '\0')
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson goto fail;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson }
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (aip != NULL && c != '=') {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (aip->ai_count > DLADM_MAX_ARG_VALS)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson goto fail;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (novalues)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson goto fail;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson aip->ai_val[aip->ai_count] = curr;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson aip->ai_count++;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson } else {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (list->al_count > DLADM_MAX_ARG_VALS)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson goto fail;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson aip = &list->al_info[list->al_count];
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson aip->ai_name = curr;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson aip->ai_count = 0;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson list->al_count++;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (c == ',')
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson aip = NULL;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson }
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson curr = buf + i + 1;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson }
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson *listp = list;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_OK);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesonfail:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson dladm_free_args(list);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (DLADM_STATUS_FAILED);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson}
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson