1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22 /*
23 * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
24 */
25
26 #include <stdio.h>
27 #include <door.h>
28 #include <errno.h>
29 #include <strings.h>
30 #include <sys/mman.h>
31 #include <libdladm.h>
32 #include <libdlib.h>
33 #include <libdllink.h>
34
35 extern dladm_status_t dladm_door_fd(dladm_handle_t, int *);
36
37 static dladm_status_t
ibd_dladm_door_call(dladm_handle_t handle,void * arg,size_t asize,void * rbuf,size_t rsize)38 ibd_dladm_door_call(dladm_handle_t handle, void *arg, size_t asize, void *rbuf,
39 size_t rsize)
40 {
41 door_arg_t darg;
42 int door_fd;
43 dladm_status_t status = DLADM_STATUS_OK;
44
45 darg.data_ptr = arg;
46 darg.data_size = asize;
47 darg.desc_ptr = NULL;
48 darg.desc_num = 0;
49 darg.rbuf = rbuf;
50 darg.rsize = rsize;
51
52 /* The door descriptor is opened if it isn't already */
53 if ((status = dladm_door_fd(handle, &door_fd)) != DLADM_STATUS_OK)
54 return (status);
55
56 if (door_call(door_fd, &darg) == -1)
57 return (DLADM_STATUS_FAILED);
58
59 if (darg.rbuf != rbuf) {
60 /*
61 * The size of the input rbuf is not big enough so that
62 * the door allocate the rbuf itself. In this case, simply
63 * think something wrong with the door call.
64 */
65 (void) munmap(darg.rbuf, darg.rsize);
66 return (DLADM_STATUS_TOOSMALL);
67 }
68
69 if (darg.rsize != rsize)
70 return (DLADM_STATUS_FAILED);
71
72 if ((((dlmgmt_retval_t *)rbuf)->lr_err) == 0)
73 return (DLADM_STATUS_OK);
74 else
75 return (DLADM_STATUS_FAILED);
76 }
77
78 static int
ibd_delete_link(dladm_handle_t dlh,char * link)79 ibd_delete_link(dladm_handle_t dlh, char *link)
80 {
81 dlmgmt_door_getlinkid_t getlinkid;
82 dlmgmt_getlinkid_retval_t retval;
83 datalink_id_t linkid;
84 dladm_status_t status;
85 char errmsg[DLADM_STRSIZE];
86
87 getlinkid.ld_cmd = DLMGMT_CMD_GETLINKID;
88 (void) strlcpy(getlinkid.ld_link, link, MAXLINKNAMELEN);
89
90 if ((status = ibd_dladm_door_call(dlh, &getlinkid, sizeof (getlinkid),
91 &retval, sizeof (retval))) != DLADM_STATUS_OK) {
92 (void) fprintf(stderr,
93 "dladm_door_call failed: %s; linkname = %s\n",
94 dladm_status2str(status, errmsg), link);
95 return (status);
96 }
97
98 if (retval.lr_class != DATALINK_CLASS_PHYS) {
99 (void) fprintf(stderr,
100 "Not a physical link: linkname = %s, class = 0x%x\n",
101 link, (uint_t)retval.lr_class);
102 return (status);
103 }
104
105 linkid = retval.lr_linkid;
106
107 if ((status = dladm_remove_conf(dlh, linkid)) != DLADM_STATUS_OK) {
108 (void) fprintf(stderr, "dladm_remove_conf failed: %s\n",
109 dladm_status2str(status, errmsg));
110 return (status);
111 }
112
113 if ((status = dladm_destroy_datalink_id(dlh, linkid,
114 DLADM_OPT_ACTIVE | DLADM_OPT_PERSIST)) != DLADM_STATUS_OK) {
115 (void) fprintf(stderr, "dladm_destroy_datalink_id failed: %s\n",
116 dladm_status2str(status, errmsg));
117 }
118
119 return (status);
120 }
121
122 int
main(int argc,char * argv[])123 main(int argc, char *argv[])
124 {
125 dladm_handle_t dlh;
126 int i;
127 dladm_status_t status;
128 char errmsg[DLADM_STRSIZE];
129
130 if (argc < 2) {
131 (void) fprintf(stderr,
132 "Usage: ibd_delete_link linkname ...\n");
133 return (2);
134 }
135
136 if ((status = dladm_open(&dlh)) != DLADM_STATUS_OK) {
137 (void) fprintf(stderr, "Failed to open dladm handle: %s\n",
138 dladm_status2str(status, errmsg));
139 return (1);
140 }
141
142 for (i = 1; i < argc; i++) {
143 if (ibd_delete_link(dlh, argv[i]) != DLADM_STATUS_OK) {
144 dladm_close(dlh);
145 return (1);
146 }
147 }
148
149 dladm_close(dlh);
150 return (0);
151 }
152