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