libdladm.c revision 801093905f15f0f1a50095474e8a3f0e5b0cb126
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * CDDL HEADER START
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 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * See the License for the specific language governing permissions
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * and limitations under the License.
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 * CDDL HEADER END
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesontypedef struct media_type_desc {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson const char media_type_str[MAX_MEDIA_TYPE_STRING];
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson#define MEDIATYPECOUNT (sizeof (media_type_table) / sizeof (media_type_t))
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesontypedef struct {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson#define LPTYPES (sizeof (link_protect_types) / sizeof (link_protect_t))
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if ((dld_fd = open(DLD_CONTROL_DEV, O_RDWR)) < 0)
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 if ((*handle = malloc(sizeof (struct dladm_handle))) == NULL) {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * If DLMGMT_DOOR hasn't been opened in the handle yet, open it.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_door_fd(dladm_handle_t handle, int *door_fd)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_status2str(dladm_status_t status, char *buf)
168665f7ddaca2a65705c3b127078ffc6b24adc3Sue Gleeson const char *s;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid argument";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "operation failed";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "buffer size too small";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "operation not supported";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "object not found";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid value";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "insufficient memory";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "object already exists";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid link";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "read-only property";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid number of values";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "database not found";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "permission denied";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "I/O error";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "change cannot be persistent";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "operation timed out";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "already connected";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "not connected";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid configuration repository";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid MAC address";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid key";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid MAC address length";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid MAC address type";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "link busy";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid VLAN identifier";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "try again later";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "link notification is not supported";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid time range";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid MAC address value";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "MAC address reserved for use by underlying data-link";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "MAC address is already in use";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid factory MAC address slot";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "factory MAC address slot already used";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "all factory MAC address slots are in use";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "factory MAC address slots not supported";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "Invalid MAC address prefix value";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "Invalid MAC address prefix length";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "non-existent processor ID";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "could not determine processor status";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "processor not online";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "database not found";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "database parse error";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "property parse error";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "attribute parse error";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "flow database error";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "flow database open error";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "flow database parse error";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "flow property database parse error";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "flow add error";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "flow walk error";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "a flow with identical attributes exists";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "flow(s) with incompatible attributes exists";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "link still has flows";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "persistent flow with the same name exists";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid IP address";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid IP prefix length";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid IP protocol";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid port number";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid dsfield";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid dsfield mask";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "MTU check failed, use lower MTU or -f option";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid property";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "minimum value for maxbw is 1200K";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "request hw rings failed";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "change must be persistent";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "optional software not installed";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid IP tunnel type";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "IP tunnel type required";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid local IP tunnel address";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid remote IP tunnel address";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "address already in use";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "pool and cpus property are mutually exclusive";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid IB phys link";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "port is down";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "partition already exists";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "PKEY is not present on the port";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid PKEY";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "IB internal resource not available";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "invalid PKEY table size";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "local or remote port requires transport";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "<unknown error>";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) snprintf(buf, DLADM_STRSIZE, "%s", dgettext(TEXT_DOMAIN, s));
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 Gleesondladm_str2interval(char *oarg, uint32_t *interval)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * percentages not supported for now,
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * see RFE 6540675
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson /* check for overflow */
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.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * bps string
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * 2000 0.002
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * 431000 0.431
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * 1030000 1.030
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * 100000000 100
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson (void) snprintf(buf, DLADM_STRSIZE, "0.%03u", kbps);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) snprintf(buf, DLADM_STRSIZE, "%5u.%03u", mbps,
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) snprintf(buf, DLADM_STRSIZE, "%5u", mbps);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson#define LOCK_DB_PERMS S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesoni_dladm_lock_db(const char *lock_file, short type)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if ((lock_fd = open(lock_file, O_RDWR | O_CREAT | O_TRUNC,
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson return (-1);
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson return (-1);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * Given a link class, returns its class string.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_class2str(datalink_class_t class, char *buf)
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson const char *s;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "etherstub";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "iptun";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "simnet";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "bridge";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson s = "unknown";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * Given a physical link media type, returns its media type string.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson const char *s = "--";
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson * Given a physical link media type string, returns its media type constant.
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 * 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 if (db_basename == NULL || db_basename[1] == '\0')
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) snprintf(lock, MAXPATHLEN, "/tmp/%s.lock", db_basename);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (lock, (writeop ? F_WRLCK : F_RDLCK))) < 0 && errno != EROFS)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) snprintf(file, MAXPATHLEN, "%s/%s", dladm_rootdir, db_file);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if ((fp = fopen(file, (writeop ? "r+" : "r"))) == NULL) {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) snprintf(newfile, MAXPATHLEN, "%s/%s.new",
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if ((nfd = open(newfile, O_WRONLY | O_CREAT | O_TRUNC,
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson /* Set permissions on file to db_perms */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * Configuration files need to be owned by the 'dladm' user and
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * 'netadm' group.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) strncpy(dladm_rootdir, rootdir, MAXPATHLEN);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson const char *cp;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * The link name cannot start with a digit and must end with a digit.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if ((isdigit(link[0]) != 0) || (isdigit(link[len - 1]) == 0))
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleeson * The legal characters in a link name are:
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * alphanumeric (a-z, A-Z, 0-9), underscore ('_'), and '.'.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if ((isalnum(*cp) == 0) && (*cp != '_') && (*cp != '.'))
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleeson * Convert priority string to a value.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_str2pri(char *token, mac_priority_level_t *pri)
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleeson strncasecmp(token, "low", strlen("low")) == 0) {
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleeson strncasecmp(token, "medium", strlen("medium")) == 0) {
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleeson strncasecmp(token, "high", strlen("high")) == 0) {
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleeson * Convert priority value to a string.
285c05bcaff47f0043483452c70351ad34aeb880Sue Gleesondladm_pri2str(mac_priority_level_t pri, char *buf)
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson const char *s;
191c289b86668766245f78ec1f87557319bc46a1Charles Ting s = "medium";
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) snprintf(buf, DLADM_STRSIZE, "%s", dgettext(TEXT_DOMAIN, s));
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * Convert protect string to a value.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson for (i = 0; i < LPTYPES; i++) {
191c289b86668766245f78ec1f87557319bc46a1Charles Ting * Convert protect value to a string.
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson const char *s = "--";
3baa0db47b1b400bbbd8b7ae9ccb32bfdd1ad865Sue Gleeson for (i = 0; i < LPTYPES; i++) {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson (void) snprintf(buf, DLADM_STRSIZE, "%s", dgettext(TEXT_DOMAIN, s));
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * Convert an IPv4 address to/from a string.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (inet_ntop(AF_INET, addr, buf, INET_ADDRSTRLEN) == NULL)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (inet_ntop(AF_INET6, addr, buf, INET6_ADDRSTRLEN) == NULL)
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 Gleesondladm_find_setbits32(uint32_t mask, uint32_t *list, uint32_t *cnt)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson int i, c = 0;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson for (i = 0; i < 32; i++) {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesondladm_parse_args(char *str, dladm_arg_list_t **listp, boolean_t novalues)
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson for (i = 0; i < len; i++) {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson char c = buf[i];
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson if (c == ',')