summaryrefslogtreecommitdiff
path: root/usr/src/cmd/vna/vna.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/cmd/vna/vna.c')
-rw-r--r--usr/src/cmd/vna/vna.c152
1 files changed, 95 insertions, 57 deletions
diff --git a/usr/src/cmd/vna/vna.c b/usr/src/cmd/vna/vna.c
index cf13fd1140..c0bb80fd0a 100644
--- a/usr/src/cmd/vna/vna.c
+++ b/usr/src/cmd/vna/vna.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -37,125 +37,162 @@
#include <strings.h>
#include <sys/types.h>
#include <sys/ethernet.h>
+#include <libdllink.h>
#include <libdlvnic.h>
/*ARGSUSED*/
-static dladm_status_t
-v_print(void *arg, dladm_vnic_attr_sys_t *attr)
+static int
+v_print(datalink_id_t vnic_id, void *arg)
{
- if (attr->va_mac_len != ETHERADDRL)
- return (DLADM_STATUS_OK);
+ dladm_vnic_attr_sys_t attr;
+ char vnic[MAXLINKNAMELEN];
+ char link[MAXLINKNAMELEN];
- (void) printf("%d\t%s\t%s\n", attr->va_vnic_id, attr->va_dev_name,
- ether_ntoa((struct ether_addr *)(attr->va_mac_addr)));
+ if (dladm_vnic_info(vnic_id, &attr, DLADM_OPT_ACTIVE) !=
+ DLADM_STATUS_OK) {
+ return (DLADM_WALK_CONTINUE);
+ }
- return (DLADM_STATUS_OK);
-}
+ if (attr.va_mac_len != ETHERADDRL)
+ return (DLADM_WALK_CONTINUE);
-static int
-v_list(void)
-{
- dladm_status_t status;
+ if (dladm_datalink_id2info(vnic_id, NULL, NULL, NULL, vnic,
+ sizeof (vnic)) != DLADM_STATUS_OK) {
+ return (DLADM_WALK_CONTINUE);
+ }
+
+ if (dladm_datalink_id2info(attr.va_link_id, NULL, NULL, NULL, link,
+ sizeof (link)) != DLADM_STATUS_OK) {
+ return (DLADM_WALK_CONTINUE);
+ }
- status = dladm_vnic_walk_sys(v_print, NULL);
+ (void) printf("%s\t%s\t%s\n", vnic, link,
+ ether_ntoa((struct ether_addr *)(attr.va_mac_addr)));
- if (status != DLADM_STATUS_OK)
- return (-1);
+ return (DLADM_WALK_CONTINUE);
+}
- return (0);
+static void
+v_list(void)
+{
+ (void) dladm_walk_datalink_id(v_print, NULL, DATALINK_CLASS_VNIC,
+ DATALINK_ANY_MEDIATYPE, DLADM_OPT_ACTIVE);
}
-static dladm_status_t
-v_find(void *arg, dladm_vnic_attr_sys_t *attr)
+static int
+v_find(datalink_id_t vnic_id, void *arg)
{
dladm_vnic_attr_sys_t *specp = arg;
+ dladm_vnic_attr_sys_t attr;
- if (strncmp(attr->va_dev_name, specp->va_dev_name,
- strlen(attr->va_dev_name)) != 0)
- return (DLADM_STATUS_OK);
+ if (dladm_vnic_info(vnic_id, &attr, DLADM_OPT_ACTIVE) !=
+ DLADM_STATUS_OK) {
+ return (DLADM_WALK_CONTINUE);
+ }
- if (attr->va_mac_len != specp->va_mac_len)
- return (DLADM_STATUS_OK);
+ if (attr.va_link_id != specp->va_link_id)
+ return (DLADM_WALK_CONTINUE);
- if (memcmp(attr->va_mac_addr, specp->va_mac_addr,
- attr->va_mac_len) != 0)
- return (DLADM_STATUS_OK);
+ if (attr.va_mac_len != specp->va_mac_len)
+ return (DLADM_WALK_CONTINUE);
- specp->va_vnic_id = attr->va_vnic_id;
+ if (memcmp(attr.va_mac_addr, specp->va_mac_addr,
+ attr.va_mac_len) != 0) {
+ return (DLADM_WALK_CONTINUE);
+ }
- return (DLADM_STATUS_EXIST);
+ specp->va_vnic_id = attr.va_vnic_id;
+
+ return (DLADM_WALK_TERMINATE);
}
+/*
+ * Print out the link name of the VNIC.
+ */
static int
-v_add(char *dev, char *addr)
+v_add(char *link, char *addr)
{
struct ether_addr *ea;
dladm_vnic_attr_sys_t spec;
+ datalink_id_t vnic_id, linkid;
+ char vnic[MAXLINKNAMELEN];
dladm_status_t status;
- uint_t vid;
char buf[DLADM_STRSIZE];
ea = ether_aton(addr);
if (ea == NULL) {
- (void) fprintf(stderr, "Invalid ethernet address: %s\n",
- addr);
+ (void) fprintf(stderr, "Invalid ethernet address: %s\n", addr);
+ return (-1);
+ }
+
+ if (dladm_name2info(link, &linkid, NULL, NULL, NULL) !=
+ DLADM_STATUS_OK) {
+ (void) fprintf(stderr, "Invalid link name: %s\n", link);
return (-1);
}
/*
- * If a VNIC already exists over the specified device
+ * If a VNIC already exists over the specified link
* with this MAC address, use it.
*/
- (void) strncpy(spec.va_dev_name, dev, sizeof (spec.va_dev_name) - 1);
+ spec.va_vnic_id = DATALINK_INVALID_LINKID;
+ spec.va_link_id = linkid;
spec.va_mac_len = ETHERADDRL;
(void) memcpy(spec.va_mac_addr, (uchar_t *)ea->ether_addr_octet,
spec.va_mac_len);
- status = dladm_vnic_walk_sys(v_find, &spec);
- switch (status) {
- case DLADM_STATUS_EXIST:
- vid = spec.va_vnic_id;
- break;
-
- case DLADM_STATUS_OK:
+ (void) dladm_walk_datalink_id(v_find, &spec, DATALINK_CLASS_VNIC,
+ DATALINK_ANY_MEDIATYPE, DLADM_OPT_ACTIVE);
+ if (spec.va_vnic_id == DATALINK_INVALID_LINKID) {
/*
* None found, so create.
*/
- status = dladm_vnic_create(0, dev, VNIC_MAC_ADDR_TYPE_FIXED,
- (uchar_t *)ea->ether_addr_octet, ETHERADDRL,
- &vid, DLADM_VNIC_OPT_TEMP | DLADM_VNIC_OPT_AUTOID);
+ status = dladm_vnic_create(NULL, linkid,
+ VNIC_MAC_ADDR_TYPE_FIXED, (uchar_t *)ea->ether_addr_octet,
+ ETHERADDRL, &vnic_id, DLADM_OPT_ACTIVE);
if (status != DLADM_STATUS_OK) {
(void) fprintf(stderr, "dladm_vnic_create: %s\n",
dladm_status2str(status, buf));
return (-1);
}
- break;
+ } else {
+ vnic_id = spec.va_vnic_id;
+ }
- default:
- (void) fprintf(stderr, "dladm_vnic_walk_sys: %s\n",
+ if ((status = dladm_datalink_id2info(vnic_id, NULL, NULL, NULL, vnic,
+ sizeof (vnic))) != DLADM_STATUS_OK) {
+ (void) fprintf(stderr, "dladm_datalink_id2info: %s\n",
dladm_status2str(status, buf));
+ if (spec.va_vnic_id == DATALINK_INVALID_LINKID)
+ (void) dladm_vnic_delete(vnic_id, DLADM_OPT_ACTIVE);
return (-1);
- /* NOTREACHED */
}
- (void) printf("%d\n", vid);
+ (void) printf("%s\n", vnic);
return (0);
}
+/*
+ * v_remove() takes VNIC link name as the argument.
+ */
static int
-v_remove(char *vdev)
+v_remove(char *vnic)
{
- uint_t vid;
+ datalink_id_t vnic_id;
dladm_status_t status;
+ char buf[DLADM_STRSIZE];
- vid = atoi(vdev);
+ if ((status = dladm_name2info(vnic, &vnic_id, NULL, NULL, NULL)) !=
+ DLADM_STATUS_OK) {
+ (void) fprintf(stderr, "dladm_name2info: %s\n",
+ dladm_status2str(status, buf));
+ return (-1);
+ }
- status = dladm_vnic_delete(vid, DLADM_VNIC_OPT_TEMP);
+ status = dladm_vnic_delete(vnic_id, DLADM_OPT_ACTIVE);
if (status != DLADM_STATUS_OK) {
- char buf[DLADM_STRSIZE];
-
(void) fprintf(stderr, "dladm_vnic_delete: %s\n",
dladm_status2str(status, buf));
return (-1);
@@ -170,7 +207,8 @@ main(int argc, char *argv[])
switch (argc) {
case 1:
/* List operation. */
- return (v_list());
+ v_list();
+ return (0);
/* NOTREACHED */
case 2:
/* Remove operation. */