dladm.c revision c7e4935f5b755b4bbeaec416f1ad24337aeac7a4
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * CDDL HEADER START
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * The contents of this file are subject to the terms of the
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * Common Development and Distribution License (the "License").
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * You may not use this file except in compliance with the License.
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * See the License for the specific language governing permissions
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * and limitations under the License.
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * When distributing Covered Code, include this CDDL HEADER in each
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * If applicable, add the following below this CDDL HEADER, with the
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * fields enclosed by brackets "[]" replaced with your own identifying
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * information: Portions Copyright [yyyy] [name of copyright owner]
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * CDDL HEADER END
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers * Use is subject to license terms.
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers#pragma ident "%Z%%M% %I% %E% SMI"
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers "%-5s %-4s %-4s %-9s %-7s\n"
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowerstypedef struct pktsum_s {
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowerstypedef struct show_link_state {
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowerstypedef struct show_grp_state {
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowerstypedef struct show_mac_state {
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowerstypedef struct port_state {
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers#define NPORTSTATES (sizeof (port_states) / sizeof (port_state_t))
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowerstypedef void cmdfunc_t(int, char **);
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowersstatic cmdfunc_t do_show_link, do_show_dev, do_show_wifi;
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowersstatic cmdfunc_t do_create_aggr, do_delete_aggr, do_add_aggr, do_remove_aggr;
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowersstatic cmdfunc_t do_modify_aggr, do_show_aggr, do_up_aggr, do_down_aggr;
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowersstatic cmdfunc_t do_scan_wifi, do_connect_wifi, do_disconnect_wifi;
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowersstatic cmdfunc_t do_show_linkprop, do_set_linkprop, do_reset_linkprop;
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowersstatic cmdfunc_t do_create_secobj, do_delete_secobj, do_show_secobj;
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowersstatic void show_linkprop_onelink(void *, const char *);
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowersstatic void get_mac_stats(const char *, pktsum_t *);
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowersstatic void get_link_stats(const char *, pktsum_t *);
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowersstatic char *mac_link_state(const char *);
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowersstatic char *mac_link_duplex(const char *);
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowersstatic void stats_total(pktsum_t *, pktsum_t *, pktsum_t *);
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowersstatic void stats_diff(pktsum_t *, pktsum_t *, pktsum_t *);
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowersstatic void die(const char *, ...);
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowersstatic void die_optdup(int);
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowersstatic void die_opterr(int, int);
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowersstatic void die_laerr(laadm_diag_t, const char *, ...);
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowersstatic void die_wlerr(wladm_status_t, const char *, ...);
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowersstatic void die_dlerr(dladm_status_t, const char *, ...);
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowersstatic void warn(const char *, ...);
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowersstatic void warn_wlerr(wladm_status_t, const char *, ...);
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowersstatic void warn_dlerr(dladm_status_t, const char *, ...);
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowerstypedef struct cmd {
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers { 0, 0, 0, 0 }
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers { 0, 0, 0, 0 }
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers { 0, 0, 0, 0 }
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowersstatic char *progname;
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers (void) fprintf(stderr, gettext("usage: dladm <subcommand> <args> ...\n"
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers "\tshow-link [-p] [-s [-i <interval>]] [<name>]\n"
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers "\tshow-dev [-p] [-s [-i <interval>]] [<dev>]\n"
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers "\tcreate-aggr [-t] [-R <root-dir>] [-P <policy>] [-l <mode>]\n"
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers "\t [-T <time>] [-u <address>] -d <dev> ... <key>\n"
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers "\tmodify-aggr [-t] [-R <root-dir>] [-P <policy>] [-l <mode>]\n"
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers "\t [-T <time>] [-u <address>] <key>\n"
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers "\tdelete-aggr [-t] [-R <root-dir>] <key>\n"
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers "\tadd-aggr [-t] [-R <root-dir>] -d <dev> ... <key>\n"
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers "\tremove-aggr [-t] [-R <root-dir>] -d <dev> ... <key>\n"
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers "\tshow-aggr [-pL][-s [-i <interval>]] [<key>]\n"
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers "\tscan-wifi [-p] [-o <field>,...] [<name>]\n"
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers "\tconnect-wifi [-e <essid>] [-i <bssid>] [-k <key>,...]"
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers " [-s wep]\n"
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers "\t [-a open|shared] [-b bss|ibss] [-c] [-m a|b|g]\n"
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers "\t [-T <time>] [<name>]\n"
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers "\tdisconnect-wifi [-a] [<name>]\n"
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers "\tshow-wifi [-p] [-o <field>,...] [<name>]\n"
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers "\tset-linkprop [-t] [-R <root-dir>] -p <prop>=<value>[,...]"
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers " <name>\n"
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers "\treset-linkprop [-t] [-R <root-dir>] [-p <prop>,...] <name>\n"
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers "\tshow-linkprop [-cP][-p <prop>,...] <name>\n"
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers "\tcreate-secobj [-t] [-R <root-dir>] [-f <file>] -c <class>"
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers " <secobj>\n"
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers "\tdelete-secobj [-t] [-R <root-dir>] <secobj>[,...]\n"
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers "\tshow-secobj [-pP][<secobj>,...]\n"));
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers for (i = 0; i < sizeof (cmds) / sizeof (cmds[0]); i++) {
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers (void) fprintf(stderr, gettext("%s: unknown subcommand '%s'\n"),
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers return (0);
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers aggr_lacp_timer_t lacp_timer = AGGR_LACP_TIMER_SHORT;
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers while ((option = getopt_long(argc, argv, ":d:l:P:R:tu:T:",
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers if (!laadm_str_to_mac_addr(optarg, &mac_addr_fixed,
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers /* get key value (required last argument) */
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers if (laadm_create(key, nport, port, policy, mac_addr_fixed,
f9fbec18f5b458b560ecf45d3db8e8bd56bf6942mcpowers mac_addr, lacp_mode, lacp_timer, t_arg, altroot, &diag) < 0)
opterr = 0;
switch (option) {
usage();
char option;
int key;
opterr = 0;
switch (option) {
nport++;
if (nport == 0)
usage();
usage();
char option;
int key;
opterr = 0;
switch (option) {
nport++;
if (nport == 0)
usage();
usage();
char option;
int key;
opterr = 0;
switch (option) {
mac_addr))
if (modify_mask == 0)
usage();
int key = 0;
usage();
if (key != 0) {
key);
int key = 0;
usage();
if (key != 0) {
if (!legacy) {
if (!legacy) {
int err;
if (!parseable) {
const char *lacp_timer_str =
if (!parseable) {
dump_ports_lacp_head(void)
dump_ports_head(void)
for (i = 0; i < NPORTSTATES; i++) {
if (!parseable) {
switch (type) {
case KSTAT_DATA_UINT64:
case KSTAT_DATA_UINT32:
int option;
int interval = 0;
opterr = 0;
switch (option) {
if (s_arg)
if (i_arg)
usage();
if (s_arg) {
int option;
int key = 0;
int interval = 0;
opterr = 0;
switch (option) {
if (L_arg)
if (s_arg)
if (L_arg)
if (i_arg)
if (L_arg)
usage();
if (s_arg) {
int option;
int interval = 0;
opterr = 0;
switch (option) {
if (s_arg)
if (i_arg)
usage();
if (s_arg) {
if (interval == 0)
if (interval == 0)
if (interval == 0)
goto bail;
goto bail;
goto bail;
goto bail;
goto bail;
goto bail;
goto bail;
bail:
void *val)
goto bail;
goto bail;
goto bail;
bail:
static uint64_t
return (ifspeed);
&link_state) != 0) {
return (state_str);
switch (link_state) {
case LINK_STATE_UP:
case LINK_STATE_DOWN:
return (state_str);
&link_duplex) != 0) {
return (duplex_str);
switch (link_duplex) {
case LINK_DUPLEX_FULL:
case LINK_DUPLEX_HALF:
return (duplex_str);
typedef struct wifi_field {
const char *wf_name;
const char *wf_header;
} wifi_field_t;
static char *all_scan_wifi_fields =
static char *all_show_wifi_fields =
static char *def_scan_wifi_fields =
static char *def_show_wifi_fields =
char *s_buf;
} split_t;
static split_t *
return (NULL);
return (NULL);
goto fail;
goto fail;
return (sp);
fail:
return (NULL);
uint_t i, j;
goto fail;
for (j = 0; j < WIFI_MAX_FIELDS; j++) {
if (!good_match)
goto fail;
*countp = i;
fail:
typedef struct print_wifi_state {
const char *ws_link;
const char *value)
case WLADM_WLAN_ATTR_ESSID:
case WLADM_WLAN_ATTR_BSSID:
case WLADM_WLAN_ATTR_SECMODE:
case WLADM_WLAN_ATTR_STRENGTH:
case WLADM_WLAN_ATTR_MODE:
case WLADM_WLAN_ATTR_SPEED:
case WLADM_WLAN_ATTR_AUTH:
case WLADM_WLAN_ATTR_BSSTYPE:
static boolean_t
return (B_TRUE);
static boolean_t
return (B_TRUE);
static boolean_t
return (B_TRUE);
int option;
opterr = 0;
switch (option) {
usage();
typedef struct wlan_count_attr {
const char *wc_link;
static boolean_t
return (B_TRUE);
uint_t i;
goto fail;
goto fail;
goto fail;
*key_countp = i;
fail:
int option;
opterr = 0;
switch (option) {
usage();
goto again;
static boolean_t
return (B_TRUE);
int option;
opterr = 0;
switch (option) {
usage();
if (!all_links) {
typedef struct prop_info {
char *pi_name;
} prop_info_t;
typedef struct prop_list {
char *pl_buf;
} prop_list_t;
typedef struct show_linkprop_state {
const char *ls_link;
char *ls_line;
char **ls_propvals;
int len, i;
goto fail;
for (i = 0; i < len; i++) {
char c = buf[i];
if (match) {
goto fail;
goto fail;
if (novalues)
goto fail;
goto fail;
fail:
print_linkprop_head(void)
char **pptr)
propname);
for (i = 0; i < valcnt; i++) {
if (valcnt > 0)
static boolean_t
return (B_TRUE);
return (B_TRUE);
int option;
opterr = 0;
switch (option) {
usage();
int i, fd;
char *buf;
const char *savep;
for (i = 0; i < MAX_PROP_VALS; i++) {
i * DLADM_PROP_VAL_MAX;
static dladm_status_t
char *errprop;
if (reset) {
return (status);
int i, option;
opterr = 0;
switch (option) {
usage();
char *errprop;
if (!reset)
&errprop);
if (!temp) {
if (s != DLADM_STATUS_OK)
status = s;
goto done;
char **val;
if (reset) {
count = 0;
if (count == 0) {
if (s == DLADM_STATUS_OK) {
if (!temp) {
if (s != DLADM_STATUS_OK)
status = s;
status = s;
case DLADM_STATUS_NOTFOUND:
case DLADM_STATUS_BADVAL: {
for (j = 0; j < MAX_PROP_VALS; j++) {
j * DLADM_PROP_VAL_MAX;
propvals[j]);
if (reset) {
done:
int error = 0;
return (ENOENT);
switch (len) {
return (EINVAL);
return (EINVAL);
return (error);
void (*sigfunc)(int);
while (signalled == 0) {
c = getchar();
if (len != 0)
goto again;
if (signalled != 0)
return (len);
int rval;
if (rval == 0) {
return (rval);
len--;
static boolean_t
return (B_FALSE);
char *errstr;
if (create) {
if (create) {
if (success) {
ADT_FAIL_VALUE_AUTH) != 0) {
opterr = 0;
switch (option) {
usage();
if (!success)
if (rval != 0) {
switch (rval) {
case ENOENT:
case EINVAL:
case ENOTSUP:
obj_name);
if (temp)
int i, option;
opterr = 0;
switch (option) {
usage();
if (!success)
if (!temp) {
typedef struct show_secobj_state {
static boolean_t
return (B_TRUE);
int option;
uint_t i;
opterr = 0;
switch (option) {
if (getuid() != 0)
usage();
static boolean_t
int val;
errno = 0;
return (B_FALSE);
return (B_TRUE);
if (diag == 0)
switch (opterr) {