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 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 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 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