dladm.c revision da14cebe459d3275048785f25bd869cb09b5307f
2N/A * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2N/A * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2N/A#include <auth_attr.h>
2N/A#include <auth_list.h>
2N/A#include <libdevinfo.h>
2N/A#include <libdladm.h>
2N/A#include <libdllink.h>
2N/A#include <libdlstat.h>
2N/A#include <libdlaggr.h>
2N/A#include <libdlwlan.h>
2N/A#include <libdlvlan.h>
2N/A#include <libdlvnic.h>
2N/A#include <libinetutil.h>
2N/A#include <libdlvnic.h>
typedef struct print_field_s {
}_pf_un;
typedef struct print_state_s {
print_callback_t, void *);
typedef struct show_state {
} show_state_t;
typedef struct show_grp_state {
typedef struct show_vnic_state {
typedef struct show_usage_state_s {
typedef void cmdfunc_t(int, char **, const char *);
static void altroot_cmd(char *, int, char **);
void *, boolean_t);
char *, boolean_t);
static char *pause_str(int, int);
static void die(const char *, ...);
static void die_optdup(int);
static void die_opterr(int, int, const char *);
static void warn(const char *, ...);
typedef struct cmd {
char *c_name;
const char *c_usage;
} cmd_t;
typedef struct ether_fields_buf_s
typedef struct print_ether_state {
const char *es_link;
typedef struct link_fields_buf_s {
typedef struct laggr_fields_buf_s {
typedef struct laggr_args_s {
const char *laggr_link;
} laggr_args_t;
#define AGGR_X_MAX_FIELDS \
#define AGGR_S_MAX_FIELDS \
#define AGGR_L_MAX_FIELDS \
static char *all_scan_wifi_fields =
static char *all_show_wifi_fields =
static char *def_scan_wifi_fields =
static char *def_show_wifi_fields =
#define LINKPROP_MAX_FIELDS \
typedef struct show_linkprop_state {
char *ls_line;
char **ls_propvals;
typedef struct set_linkprop_state {
const char *ls_name;
typedef struct linkprop_args_s {
char *ls_propname;
typedef struct secobj_fields_buf_s {
typedef struct vnic_fields_buf_s
typedef struct usage_fields_buf_s {
typedef struct usage_l_fields_buf_s {
#define USAGE_L_MAX_FIELDS \
static char *progname;
usage(void)
#if !defined(TEXT_DOMAIN)
usage();
exit(0);
usage();
return (DLADM_STATUS_OK);
double bw;
return (DLADM_STATUS_OK);
buf);
buf);
return (DLADM_STATUS_OK);
return (DLADM_STATUS_OK);
static boolean_t
return (B_TRUE);
return (B_FALSE);
int opt;
char *all_fields =
char *all_l_fields =
switch (opt) {
if (d_arg) {
!p_arg) {
char option;
int key = 0;
switch (option) {
if (P_arg)
if (u_arg)
mac_addr))
if (l_arg)
if (T_arg)
!= DLADM_STATUS_OK)
usage();
usage();
for (n = 0; n < ndev; n++) {
for (n = 0; n < nlink; n++) {
goto done;
goto done;
done:
static dladm_status_t
int key = 0;
return (DLADM_STATUS_LINKINVAL);
return (DLADM_STATUS_OK);
return (status);
char option;
opterr = 0;
switch (option) {
usage();
goto done;
done:
char option;
switch (option) {
usage();
usage();
goto done;
for (n = 0; n < ndev; n++) {
for (n = 0; n < nlink; n++) {
done:
char option;
switch (option) {
usage();
usage();
goto done;
for (n = 0; n < ndev; n++) {
for (n = 0; n < nlink; n++) {
done:
char option;
opterr = 0;
switch (option) {
mac_addr))
if (modify_mask == 0)
usage();
goto done;
done:
goto done;
usage();
done:
int vid = 0;
char option;
opterr = 0;
switch (option) {
if (vid != 0)
!= DLADM_STATUS_OK) {
usage();
DLPI_SUCCESS)) {
char option;
opterr = 0;
switch (option) {
usage();
goto done;
done:
char option;
opterr = 0;
switch (option) {
usage();
usage();
return (DLADM_WALK_CONTINUE);
return (DLADM_WALK_CONTINUE);
return (DLADM_WALK_CONTINUE);
usage();
static dladm_status_t
goto done;
goto done;
goto done;
goto done;
goto done;
goto done;
done:
return (status);
static dladm_status_t
goto done;
goto done;
goto done;
goto link_mtu;
DLPI_SUCCESS) {
goto done;
goto done;
goto done;
goto done;
done:
return (status);
goto done;
done:
return (DLADM_WALK_CONTINUE);
return (DLADM_WALK_CONTINUE);
return (DLADM_WALK_CONTINUE);
return (DLADM_WALK_CONTINUE);
return (DLADM_WALK_CONTINUE);
static dladm_status_t
return (DLADM_STATUS_OK);
int portnum;
if (is_port) {
goto err;
goto err;
case AGGR_X_LINK:
case AGGR_X_PORT:
if (is_port)
case AGGR_X_SPEED:
if (is_port) {
case AGGR_X_DUPLEX:
if (is_port)
case AGGR_X_STATE:
if (is_port)
case AGGR_X_ADDRESS:
(void) dladm_aggr_macaddr2str(
buf);
case AGGR_X_PORTSTATE:
if (is_port)
(void) dladm_aggr_portstate2str(
return (buf);
err:
return (buf);
static dladm_status_t
goto done;
goto done;
done:
return (status);
int portnum;
if (!is_port) {
goto err;
case AGGR_L_LINK:
case AGGR_L_PORT:
case AGGR_L_AGGREGATABLE:
case AGGR_L_SYNC:
case AGGR_L_COLL:
case AGGR_L_DIST:
case AGGR_L_DEFAULTED:
case AGGR_L_EXPIRED:
return (buf);
err:
return (buf);
static dladm_status_t
goto done;
done:
return (status);
int portnum;
if (is_port) {
goto err;
goto err;
case AGGR_S_LINK:
case AGGR_S_PORT:
if (is_port)
case AGGR_S_IPKTS:
if (is_port) {
case AGGR_S_RBYTES:
if (is_port) {
case AGGR_S_OPKTS:
if (is_port) {
case AGGR_S_OBYTES:
if (is_port) {
case AGGR_S_IPKTDIST:
if (is_port) {
case AGGR_S_OPKTDIST:
if (is_port) {
return (buf);
err:
return (buf);
static dladm_status_t
goto done;
goto done;
goto done;
done:
return (status);
static dladm_status_t
return (status);
return (DLADM_STATUS_NOTFOUND);
return (status);
done:
return (status);
goto done;
done:
return (DLADM_WALK_CONTINUE);
int option;
int interval = 0;
char *allstat_fields =
opterr = 0;
switch (option) {
if (p_arg)
if (s_arg)
if (S_arg)
if (i_arg)
uint32_t f;
>= MAXLINKNAMELEN) {
progname);
if (!(f & flags)) {
usage();
if (S_arg) {
if (s_arg)
if (s_arg) {
int option;
int interval = 0;
int key;
char *all_fields =
char *all_lacp_fields =
char *all_stats_fields =
char *all_extended_fields =
int pfmax;
opterr = 0;
switch (option) {
if (L_arg)
if (p_arg)
if (x_arg)
if (s_arg)
if (i_arg)
usage();
&nfields);
if (s_arg) {
static dladm_status_t
goto done;
done:
return (status);
char *ms_link;
case PHYS_M_LINK:
case PHYS_M_SLOT:
if (is_primary)
case PHYS_M_ADDRESS:
case PHYS_M_INUSE:
case PHYS_M_CLIENT:
return (buf);
char *hs_link;
case PHYS_H_LINK:
case PHYS_H_GROUP:
case PHYS_H_GRPTYPE:
case PHYS_H_RINGS:
case PHYS_H_CLIENTS:
return (buf);
static boolean_t
return (B_TRUE);
static dladm_status_t
static boolean_t
return (B_TRUE);
static dladm_status_t
static dladm_status_t
goto done;
goto done;
goto done;
done:
return (status);
return (DLADM_WALK_CONTINUE);
static dladm_status_t
goto done;
goto done;
goto done;
done:
return (status);
goto done;
done:
return (DLADM_WALK_CONTINUE);
int option;
char *all_active_fields =
char *all_hwgrp_fields =
int pfmax;
opterr = 0;
switch (option) {
if (p_arg)
usage();
int option;
opterr = 0;
switch (option) {
if (p_arg)
usage();
char option;
opterr = 0;
switch (option) {
errno = 0;
!= DLADM_STATUS_OK)
usage();
if (!l_arg)
usage();
usage();
usage();
char option;
opterr = 0;
switch (option) {
usage();
char *type;
goto done;
usage();
if (vlan)
done:
if (tot_stats) {
static dladm_status_t
return (status);
return (DLADM_STATUS_OK);
return (DLADM_STATUS_OK);
return (DLADM_STATUS_BADARG);
if (!is_etherstub &&
return (DLADM_STATUS_BADARG);
return (DLADM_STATUS_OK);
if (!is_etherstub) {
case VNIC_MAC_ADDR_TYPE_FIXED:
mstr));
return (DLADM_STATUS_OK);
return (DLADM_WALK_CONTINUE);
int option;
int pfmax;
char *all_fields =
char *all_e_fields =
opterr = 0;
switch (option) {
if (etherstub)
if (s_arg) {
if (i_arg) {
usage();
if (l_arg) {
if (etherstub)
&nfields);
if (s_arg) {
char option;
opterr = 0;
switch (option) {
usage();
if (interval == 0)
if (interval == 0)
if (!specific_link) {
if (!specific_link) {
if (interval == 0)
goto bail;
goto bail;
goto bail;
bail:
if (islink) {
static uint64_t
return (ifspeed);
return (buf);
return (buf);
char *s_buf;
} split_t;
static split_t *
return (NULL);
return (NULL);
goto fail;
goto fail;
return (sp);
fail:
return (NULL);
static print_field_t **
uint_t i, j;
return (NULL);
goto fail;
for (j = 0; j < max_fields; j++) {
if (!good_match)
goto fail;
*countp = i;
return (pf);
fail:
return (NULL);
typedef struct print_wifi_state {
char *ws_link;
typedef struct wlan_scan_args_s {
void *ws_attr;
if (parseable) {
(void) putchar(c);
case DLADM_WLAN_ATTR_ESSID:
case DLADM_WLAN_ATTR_BSSID:
case DLADM_WLAN_ATTR_SECMODE:
case DLADM_WLAN_ATTR_STRENGTH:
case DLADM_WLAN_ATTR_MODE:
case DLADM_WLAN_ATTR_SPEED:
case DLADM_WLAN_ATTR_AUTH:
case DLADM_WLAN_ATTR_BSSTYPE:
return (buf);
static boolean_t
return (B_TRUE);
return (DLADM_WALK_CONTINUE);
return (DLADM_WALK_CONTINUE);
char *ptr;
(void) dladm_wlan_linkstatus2str(
return (buf);
return (ptr);
return (DLADM_WALK_CONTINUE);
return (DLADM_WALK_CONTINUE);
int option;
opterr = 0;
switch (option) {
usage();
typedef struct wlan_count_attr {
return (DLADM_WALK_CONTINUE);
uint_t i;
goto fail;
goto fail;
goto fail;
*key_countp = i;
fail:
int option;
opterr = 0;
switch (option) {
usage();
goto again;
return (DLADM_WALK_CONTINUE);
int option;
opterr = 0;
switch (option) {
usage();
if (!all_links) {
for (i = 0; i < valcnt; i++) {
if (valcnt > 0)
case LINKPROP_LINK:
case LINKPROP_PROPERTY:
case LINKPROP_VALUE:
goto skip;
case LINKPROP_PERM:
goto skip;
case LINKPROP_DEFAULT:
goto skip;
case LINKPROP_POSSIBLE:
goto skip;
return (ptr);
skip:
return (NULL);
static boolean_t
return (B_TRUE);
return (DLADM_WALK_CONTINUE);
return (DLADM_WALK_CONTINUE);
int option;
char *all_fields =
opterr = 0;
switch (option) {
!= DLADM_STATUS_OK)
usage();
char *buf;
return (DLADM_WALK_CONTINUE);
return (DLADM_WALK_CONTINUE);
for (i = 0; i < DLADM_MAX_PROP_VALCNT; i++) {
sizeof (char *) * DLADM_MAX_PROP_VALCNT +
i * DLADM_PROP_VAL_MAX;
return (DLADM_WALK_CONTINUE);
static dladm_status_t
return (status);
if (s != DLADM_STATUS_OK)
status = s;
return (DLADM_WALK_CONTINUE);
int i, option;
opterr = 0;
switch (option) {
usage();
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 < DLADM_MAX_PROP_VALCNT; j++) {
j * DLADM_PROP_VAL_MAX;
&valcnt);
if (s != DLADM_STATUS_OK) {
for (j = 0; j < valcnt; j++) {
propvals[j]);
if (reset) {
done:
int error = 0;
return (EINVAL);
return (error);
switch (len) {
return (EINVAL);
return (EINVAL);
return (error);
return (ENOENT);
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
obj_name);
if (getuid() == 0) {
return (B_TRUE);
int option;
uint_t i;
opterr = 0;
switch (option) {
usage();
return (DLADM_WALK_CONTINUE);
int option;
opterr = 0;
switch (option) {
usage();
usage();
int option;
char *fields_str;
char *all_fields =
char *default_fields =
switch (option) {
char *value;
return (value);
int speed;
uint64_t s;
return (DLADM_WALK_CONTINUE);
KSTAT_DATA_UINT64, &s);
return (DLADM_WALK_CONTINUE);
* - If the /etc/dladm/datalink.conf file exists on the alternative root,
* append dladm commands to the <altroot>/var/svc/profile/upgrade_datalink
* - If the /etc/dladm/datalink.conf file does not exist on the alternative
* the /var/svc/profile/upgrade_datalink script will not exist any more.
* Check for the existence of the /etc/dladm/datalink.conf
altroot);
for (i = 0; i < argc; i++) {
exit(0);
static boolean_t
int val;
errno = 0;
return (B_FALSE);
return (B_TRUE);
switch (opterr) {
if (r1)
if (r1)
if (r1)
if (r1)
if (r1)
if (r1)
static boolean_t
&speed);
if (speed) {
if (speed) {
if (ret) {
if (add_comma)
return (ret);
char *value;
static boolean_t
return (B_TRUE);
return (B_FALSE);