xref: /onnv-gate/usr/src/cmd/fcinfo/fcoeadm.c (revision 10264:1196af6129ec)
19087SZhong.Wang@Sun.COM /*
29087SZhong.Wang@Sun.COM  * CDDL HEADER START
39087SZhong.Wang@Sun.COM  *
49087SZhong.Wang@Sun.COM  * The contents of this file are subject to the terms of the
59087SZhong.Wang@Sun.COM  * Common Development and Distribution License (the "License").
69087SZhong.Wang@Sun.COM  * You may not use this file except in compliance with the License.
79087SZhong.Wang@Sun.COM  *
89087SZhong.Wang@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
99087SZhong.Wang@Sun.COM  * or http://www.opensolaris.org/os/licensing.
109087SZhong.Wang@Sun.COM  * See the License for the specific language governing permissions
119087SZhong.Wang@Sun.COM  * and limitations under the License.
129087SZhong.Wang@Sun.COM  *
139087SZhong.Wang@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
149087SZhong.Wang@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
159087SZhong.Wang@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
169087SZhong.Wang@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
179087SZhong.Wang@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
189087SZhong.Wang@Sun.COM  *
199087SZhong.Wang@Sun.COM  * CDDL HEADER END
209087SZhong.Wang@Sun.COM  */
219087SZhong.Wang@Sun.COM /*
229087SZhong.Wang@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
239087SZhong.Wang@Sun.COM  * Use is subject to license terms.
249087SZhong.Wang@Sun.COM  */
259087SZhong.Wang@Sun.COM 
269087SZhong.Wang@Sun.COM #include "fcinfo.h"
279087SZhong.Wang@Sun.COM #include <libintl.h>
289087SZhong.Wang@Sun.COM #include <fcntl.h>
299087SZhong.Wang@Sun.COM #include <errno.h>
309087SZhong.Wang@Sun.COM #include <assert.h>
319087SZhong.Wang@Sun.COM #include <ctype.h>
329087SZhong.Wang@Sun.COM #include <sys/list.h>
339087SZhong.Wang@Sun.COM #include <stddef.h>
349087SZhong.Wang@Sun.COM #include <strings.h>
359087SZhong.Wang@Sun.COM #include <libfcoe.h>
369087SZhong.Wang@Sun.COM #include <syslog.h>
379087SZhong.Wang@Sun.COM 
389087SZhong.Wang@Sun.COM static const char *FCOE_DRIVER_PATH	= "/devices/fcoe:admin";
399087SZhong.Wang@Sun.COM 
409087SZhong.Wang@Sun.COM static int
isValidWWN(char * wwn)419087SZhong.Wang@Sun.COM isValidWWN(char *wwn)
429087SZhong.Wang@Sun.COM {
439087SZhong.Wang@Sun.COM 	int index;
449087SZhong.Wang@Sun.COM 
459087SZhong.Wang@Sun.COM 	if (wwn == NULL) {
469087SZhong.Wang@Sun.COM 		return (0);
479087SZhong.Wang@Sun.COM 	}
489087SZhong.Wang@Sun.COM 
499087SZhong.Wang@Sun.COM 	if (strlen(wwn) != 16) {
509087SZhong.Wang@Sun.COM 		return (0);
519087SZhong.Wang@Sun.COM 	}
529087SZhong.Wang@Sun.COM 
539087SZhong.Wang@Sun.COM 	for (index = 0; index < 16; index++) {
549087SZhong.Wang@Sun.COM 		if (isxdigit(wwn[index])) {
559087SZhong.Wang@Sun.COM 			continue;
569087SZhong.Wang@Sun.COM 		}
579087SZhong.Wang@Sun.COM 		return (0);
589087SZhong.Wang@Sun.COM 	}
599087SZhong.Wang@Sun.COM 	return (1);
609087SZhong.Wang@Sun.COM }
619087SZhong.Wang@Sun.COM 
wwnconvert(uchar_t * wwn)629087SZhong.Wang@Sun.COM static uint64_t wwnconvert(uchar_t *wwn)
639087SZhong.Wang@Sun.COM {
649087SZhong.Wang@Sun.COM 	uint64_t tmp;
659087SZhong.Wang@Sun.COM 	memcpy(&tmp, wwn, sizeof (uint64_t));
669087SZhong.Wang@Sun.COM 	return (ntohll(tmp));
679087SZhong.Wang@Sun.COM }
689087SZhong.Wang@Sun.COM 
699087SZhong.Wang@Sun.COM /*
709087SZhong.Wang@Sun.COM  * prints out all the HBA port information
719087SZhong.Wang@Sun.COM  */
729087SZhong.Wang@Sun.COM void
printFCOEPortInfo(FCOE_PORT_ATTRIBUTE * attr)739087SZhong.Wang@Sun.COM printFCOEPortInfo(FCOE_PORT_ATTRIBUTE *attr)
749087SZhong.Wang@Sun.COM {
759087SZhong.Wang@Sun.COM 	int i;
769087SZhong.Wang@Sun.COM 	if (attr == NULL) {
779087SZhong.Wang@Sun.COM 		return;
789087SZhong.Wang@Sun.COM 	}
799087SZhong.Wang@Sun.COM 	fprintf(stdout, gettext("HBA Port WWN: %016llx\n"),
809087SZhong.Wang@Sun.COM 	    wwnconvert((unsigned char *)&attr->port_wwn));
819087SZhong.Wang@Sun.COM 
829087SZhong.Wang@Sun.COM 	fprintf(stdout, gettext("\tPort Type: %s\n"),
839087SZhong.Wang@Sun.COM 	    (attr->port_type == 0) ? "Initiator" : "Target");
849087SZhong.Wang@Sun.COM 
859087SZhong.Wang@Sun.COM 	fprintf(stdout, gettext("\tMAC Name: %s\n"), attr->mac_link_name);
869087SZhong.Wang@Sun.COM 
879087SZhong.Wang@Sun.COM 	fprintf(stdout, gettext("\tMTU Size: %d\n"), attr->mtu_size);
889087SZhong.Wang@Sun.COM 
89*10264SZhong.Wang@Sun.COM 	fprintf(stdout, gettext("\tPrimary MAC Address: "));
909087SZhong.Wang@Sun.COM 	for (i = 0; i < 6; i++) {
919087SZhong.Wang@Sun.COM 		fprintf(stdout, gettext("%02x"), attr->mac_factory_addr[i]);
929087SZhong.Wang@Sun.COM 	}
93*10264SZhong.Wang@Sun.COM 	fprintf(stdout, gettext("\n\tCurrent MAC Address: "));
949087SZhong.Wang@Sun.COM 	for (i = 0; i < 6; i++) {
959087SZhong.Wang@Sun.COM 		fprintf(stdout, gettext("%02x"), attr->mac_current_addr[i]);
969087SZhong.Wang@Sun.COM 	}
979087SZhong.Wang@Sun.COM 	fprintf(stdout, gettext("\n\tPromiscuous Mode: %s\n"),
989087SZhong.Wang@Sun.COM 	    attr->mac_promisc == 1 ? "On" : "Off");
999087SZhong.Wang@Sun.COM }
1009087SZhong.Wang@Sun.COM 
1019087SZhong.Wang@Sun.COM 
1029087SZhong.Wang@Sun.COM int
fcoe_adm_create_port(int objects,char * argv[],cmdOptions_t * options)1039087SZhong.Wang@Sun.COM fcoe_adm_create_port(int objects, char *argv[],
1049087SZhong.Wang@Sun.COM     cmdOptions_t *options)
1059087SZhong.Wang@Sun.COM {
1069087SZhong.Wang@Sun.COM 	FCOE_STATUS status = FCOE_STATUS_OK;
1079087SZhong.Wang@Sun.COM 	uint64_t	nodeWWN, portWWN;
1089087SZhong.Wang@Sun.COM 	FCOE_PORT_WWN	pwwn, nwwn;
1099087SZhong.Wang@Sun.COM 	FCOE_UINT8	macLinkName[FCOE_MAX_MAC_NAME_LEN];
1109087SZhong.Wang@Sun.COM 	FCOE_UINT8	promiscuous = 0;
1119087SZhong.Wang@Sun.COM 	int		createini = 0, createtgt = 0;
1129087SZhong.Wang@Sun.COM 
1139087SZhong.Wang@Sun.COM 	/* check the mac name operand */
1149087SZhong.Wang@Sun.COM 	assert(objects == 1);
1159087SZhong.Wang@Sun.COM 
1169087SZhong.Wang@Sun.COM 	strcpy((char *)macLinkName, argv[0]);
1179087SZhong.Wang@Sun.COM 	bzero(&pwwn, 8);
1189087SZhong.Wang@Sun.COM 	bzero(&nwwn, 8);
1199087SZhong.Wang@Sun.COM 
1209087SZhong.Wang@Sun.COM 	for (; options->optval; options++) {
1219087SZhong.Wang@Sun.COM 		switch (options->optval) {
1229087SZhong.Wang@Sun.COM 		case 'i':
1239087SZhong.Wang@Sun.COM 			createini = 1;
1249087SZhong.Wang@Sun.COM 			break;
1259087SZhong.Wang@Sun.COM 
1269087SZhong.Wang@Sun.COM 		case 't':
1279087SZhong.Wang@Sun.COM 			createtgt = 1;
1289087SZhong.Wang@Sun.COM 			break;
1299087SZhong.Wang@Sun.COM 		case 'p':
1309087SZhong.Wang@Sun.COM 			if (!isValidWWN(options->optarg)) {
1319087SZhong.Wang@Sun.COM 				fprintf(stderr,
1329087SZhong.Wang@Sun.COM 				    gettext("Error: Invalid Port WWN\n"));
1339087SZhong.Wang@Sun.COM 				return (1);
1349087SZhong.Wang@Sun.COM 			}
1359087SZhong.Wang@Sun.COM 			sscanf(options->optarg, "%016llx", &portWWN);
1369087SZhong.Wang@Sun.COM 			portWWN = htonll(portWWN);
1379087SZhong.Wang@Sun.COM 			memcpy(&pwwn, &portWWN, sizeof (portWWN));
1389087SZhong.Wang@Sun.COM 			break;
1399087SZhong.Wang@Sun.COM 
1409087SZhong.Wang@Sun.COM 		case 'n':
1419087SZhong.Wang@Sun.COM 			if (!isValidWWN(options->optarg)) {
1429087SZhong.Wang@Sun.COM 				fprintf(stderr,
1439087SZhong.Wang@Sun.COM 				    gettext("Error: Invalid Node WWN\n"));
1449087SZhong.Wang@Sun.COM 				return (1);
1459087SZhong.Wang@Sun.COM 			}
1469087SZhong.Wang@Sun.COM 			sscanf(options->optarg, "%016llx", &nodeWWN);
1479087SZhong.Wang@Sun.COM 			nodeWWN = htonll(nodeWWN);
1489087SZhong.Wang@Sun.COM 			memcpy(&nwwn, &nodeWWN, sizeof (nodeWWN));
1499087SZhong.Wang@Sun.COM 			break;
1509087SZhong.Wang@Sun.COM 		case 'f':
1519087SZhong.Wang@Sun.COM 			promiscuous = 1;
1529087SZhong.Wang@Sun.COM 			break;
1539087SZhong.Wang@Sun.COM 
1549087SZhong.Wang@Sun.COM 		default:
1559087SZhong.Wang@Sun.COM 			fprintf(stderr, gettext("Error: Illegal option: %c\n"),
1569087SZhong.Wang@Sun.COM 			    options->optval);
1579087SZhong.Wang@Sun.COM 			return (1);
1589087SZhong.Wang@Sun.COM 		}
1599087SZhong.Wang@Sun.COM 	}
1609087SZhong.Wang@Sun.COM 
1619087SZhong.Wang@Sun.COM 	if (createini == 1 && createtgt == 1) {
1629087SZhong.Wang@Sun.COM 		fprintf(stderr, "Error: Option -i and -t should "
1639087SZhong.Wang@Sun.COM 		    "not be both specified\n");
1649087SZhong.Wang@Sun.COM 		return (1);
1659087SZhong.Wang@Sun.COM 	}
1669087SZhong.Wang@Sun.COM 	status = FCOE_CreatePort(macLinkName,
1679087SZhong.Wang@Sun.COM 	    createtgt == 1 ? FCOE_PORTTYPE_TARGET :
1689087SZhong.Wang@Sun.COM 	    FCOE_PORTTYPE_INITIATOR, pwwn, nwwn, promiscuous);
1699087SZhong.Wang@Sun.COM 
1709087SZhong.Wang@Sun.COM 	if (status != FCOE_STATUS_OK) {
1719087SZhong.Wang@Sun.COM 		switch (status) {
1729087SZhong.Wang@Sun.COM 		case  FCOE_STATUS_ERROR_BUSY:
1739087SZhong.Wang@Sun.COM 			fprintf(stderr,
1749087SZhong.Wang@Sun.COM 			    gettext("Error: fcoe driver is busy\n"));
1759087SZhong.Wang@Sun.COM 			break;
1769087SZhong.Wang@Sun.COM 
1779087SZhong.Wang@Sun.COM 		case  FCOE_STATUS_ERROR_ALREADY:
1789087SZhong.Wang@Sun.COM 			fprintf(stderr,
1799087SZhong.Wang@Sun.COM 			    gettext("Error: Existing FCoE port "
1809087SZhong.Wang@Sun.COM 			    "found on the specified MAC link\n"));
1819087SZhong.Wang@Sun.COM 			break;
1829087SZhong.Wang@Sun.COM 
1839087SZhong.Wang@Sun.COM 		case  FCOE_STATUS_ERROR_PERM:
1849087SZhong.Wang@Sun.COM 			fprintf(stderr,
1859087SZhong.Wang@Sun.COM 			    gettext("Error: Not enough permission to "
1869087SZhong.Wang@Sun.COM 			    "open fcoe device\n"));
1879087SZhong.Wang@Sun.COM 			break;
1889087SZhong.Wang@Sun.COM 
1899087SZhong.Wang@Sun.COM 		case  FCOE_STATUS_ERROR_OPEN_DEV:
1909087SZhong.Wang@Sun.COM 			fprintf(stderr,
1919087SZhong.Wang@Sun.COM 			    gettext("Error: Failed to open fcoe device\n"));
1929087SZhong.Wang@Sun.COM 			break;
1939087SZhong.Wang@Sun.COM 
1949087SZhong.Wang@Sun.COM 		case  FCOE_STATUS_ERROR_WWN_SAME:
1959087SZhong.Wang@Sun.COM 			fprintf(stderr,
1969087SZhong.Wang@Sun.COM 			    gettext("Error: Port WWN is same as Node "
1979087SZhong.Wang@Sun.COM 			    "WWN\n"));
1989087SZhong.Wang@Sun.COM 			break;
1999087SZhong.Wang@Sun.COM 
2009087SZhong.Wang@Sun.COM 		case  FCOE_STATUS_ERROR_MAC_LEN:
2019087SZhong.Wang@Sun.COM 			fprintf(stderr,
2029087SZhong.Wang@Sun.COM 			    gettext("Error: MAC name exceeds maximum "
2039087SZhong.Wang@Sun.COM 			    "length\n"));
2049087SZhong.Wang@Sun.COM 			break;
2059087SZhong.Wang@Sun.COM 
2069087SZhong.Wang@Sun.COM 		case  FCOE_STATUS_ERROR_PWWN_CONFLICTED:
2079087SZhong.Wang@Sun.COM 			fprintf(stderr,
2089087SZhong.Wang@Sun.COM 			    gettext("Error: The specified Port WWN "
2099087SZhong.Wang@Sun.COM 			    "is already in use\n"));
2109087SZhong.Wang@Sun.COM 			break;
2119087SZhong.Wang@Sun.COM 
2129087SZhong.Wang@Sun.COM 		case  FCOE_STATUS_ERROR_NWWN_CONFLICTED:
2139087SZhong.Wang@Sun.COM 			fprintf(stderr,
2149087SZhong.Wang@Sun.COM 			    gettext("Error: The specified Node WWN "
2159087SZhong.Wang@Sun.COM 			    "is already in use\n"));
2169087SZhong.Wang@Sun.COM 			break;
2179087SZhong.Wang@Sun.COM 
2189087SZhong.Wang@Sun.COM 		case  FCOE_STATUS_ERROR_NEED_JUMBO_FRAME:
2199087SZhong.Wang@Sun.COM 			fprintf(stderr,
2209087SZhong.Wang@Sun.COM 			    gettext("Error: MTU size of the specified "
2219087SZhong.Wang@Sun.COM 			    "MAC link needs to be increased to 2500 "
2229087SZhong.Wang@Sun.COM 			    "or above\n"));
2239087SZhong.Wang@Sun.COM 			break;
2249087SZhong.Wang@Sun.COM 
2259087SZhong.Wang@Sun.COM 		case  FCOE_STATUS_ERROR_CREATE_MAC:
2269087SZhong.Wang@Sun.COM 			fprintf(stderr,
2279087SZhong.Wang@Sun.COM 			    gettext("Error: Out of memory\n"));
2289087SZhong.Wang@Sun.COM 			break;
2299087SZhong.Wang@Sun.COM 
2309087SZhong.Wang@Sun.COM 
2319087SZhong.Wang@Sun.COM 		case  FCOE_STATUS_ERROR_OPEN_MAC:
2329087SZhong.Wang@Sun.COM 			fprintf(stderr,
2339087SZhong.Wang@Sun.COM 			    gettext("Error: Failed to open the "
2349087SZhong.Wang@Sun.COM 			    "specified MAC link\n"));
2359087SZhong.Wang@Sun.COM 			break;
2369087SZhong.Wang@Sun.COM 
2379087SZhong.Wang@Sun.COM 		case  FCOE_STATUS_ERROR_CREATE_PORT:
2389087SZhong.Wang@Sun.COM 			fprintf(stderr,
2399087SZhong.Wang@Sun.COM 			    gettext("Error: Failed to create FCoE "
2409087SZhong.Wang@Sun.COM 			    "port on the specified MAC link\n"));
2419087SZhong.Wang@Sun.COM 			break;
2429087SZhong.Wang@Sun.COM 
2439307Skelly.hu@Sun.COM 		case  FCOE_STATUS_ERROR_CLASS_UNSUPPORT:
2449087SZhong.Wang@Sun.COM 			fprintf(stderr,
2459307Skelly.hu@Sun.COM 			    gettext("Error: Link class other than physical "
2469307Skelly.hu@Sun.COM 			    "link is not supported\n"));
2479307Skelly.hu@Sun.COM 			break;
2489307Skelly.hu@Sun.COM 
2499307Skelly.hu@Sun.COM 		case FCOE_STATUS_ERROR_GET_LINKINFO:
2509307Skelly.hu@Sun.COM 			fprintf(stderr,
2519895SKevin.Yu@Sun.COM 			    gettext("Error: Failed to get link information "
2529307Skelly.hu@Sun.COM 			    "for %s\n"), macLinkName);
2539087SZhong.Wang@Sun.COM 			break;
2549087SZhong.Wang@Sun.COM 
2559087SZhong.Wang@Sun.COM 		case FCOE_STATUS_ERROR:
2569087SZhong.Wang@Sun.COM 		default:
2579087SZhong.Wang@Sun.COM 			fprintf(stderr,
2589087SZhong.Wang@Sun.COM 			    gettext("Error: Due to reason code %d\n"), status);
2599087SZhong.Wang@Sun.COM 		}
2609087SZhong.Wang@Sun.COM 		return (1);
2619087SZhong.Wang@Sun.COM 	} else {
2629087SZhong.Wang@Sun.COM 		return (0);
2639087SZhong.Wang@Sun.COM 	}
2649087SZhong.Wang@Sun.COM }
2659087SZhong.Wang@Sun.COM 
2669087SZhong.Wang@Sun.COM int
fcoe_adm_delete_port(int objects,char * argv[])2679087SZhong.Wang@Sun.COM fcoe_adm_delete_port(int objects, char *argv[])
2689087SZhong.Wang@Sun.COM {
2699087SZhong.Wang@Sun.COM 	FCOE_STATUS status;
2709087SZhong.Wang@Sun.COM 	FCOE_UINT8	*macLinkName;
271*10264SZhong.Wang@Sun.COM 	FCOE_UINT32		port_num;
272*10264SZhong.Wang@Sun.COM 	FCOE_PORT_ATTRIBUTE	*portlist = NULL;
273*10264SZhong.Wang@Sun.COM 	int			i;
2749087SZhong.Wang@Sun.COM 
2759087SZhong.Wang@Sun.COM 	/* check the mac name operand */
2769087SZhong.Wang@Sun.COM 	assert(objects == 1);
2779087SZhong.Wang@Sun.COM 
2789087SZhong.Wang@Sun.COM 	macLinkName = (FCOE_UINT8 *) argv[0];
2799087SZhong.Wang@Sun.COM 
2809087SZhong.Wang@Sun.COM 	status = FCOE_DeletePort(macLinkName);
2819087SZhong.Wang@Sun.COM 	if (status != FCOE_STATUS_OK) {
2829087SZhong.Wang@Sun.COM 		switch (status) {
2839087SZhong.Wang@Sun.COM 		case  FCOE_STATUS_ERROR_BUSY:
2849087SZhong.Wang@Sun.COM 			fprintf(stderr,
2859087SZhong.Wang@Sun.COM 			    gettext("Error: fcoe driver is busy\n"));
2869087SZhong.Wang@Sun.COM 			break;
2879087SZhong.Wang@Sun.COM 
2889087SZhong.Wang@Sun.COM 		case  FCOE_STATUS_ERROR_ALREADY:
2899087SZhong.Wang@Sun.COM 			fprintf(stderr,
2909087SZhong.Wang@Sun.COM 			    gettext("Error: FCoE port not found on the "
2919087SZhong.Wang@Sun.COM 			    "specified MAC link\n"));
2929087SZhong.Wang@Sun.COM 			break;
2939087SZhong.Wang@Sun.COM 
2949087SZhong.Wang@Sun.COM 		case  FCOE_STATUS_ERROR_PERM:
2959087SZhong.Wang@Sun.COM 			fprintf(stderr,
2969087SZhong.Wang@Sun.COM 			    gettext("Error: Not enough permission to "
2979087SZhong.Wang@Sun.COM 			    "open fcoe device\n"));
2989087SZhong.Wang@Sun.COM 			break;
2999087SZhong.Wang@Sun.COM 
3009087SZhong.Wang@Sun.COM 		case  FCOE_STATUS_ERROR_MAC_LEN:
3019087SZhong.Wang@Sun.COM 			fprintf(stderr,
3029087SZhong.Wang@Sun.COM 			    gettext("Failed: MAC name exceeds maximum "
3039087SZhong.Wang@Sun.COM 			    "length 32\n"));
3049087SZhong.Wang@Sun.COM 			break;
3059087SZhong.Wang@Sun.COM 
3069087SZhong.Wang@Sun.COM 		case  FCOE_STATUS_ERROR_OPEN_DEV:
3079087SZhong.Wang@Sun.COM 			fprintf(stderr,
3089087SZhong.Wang@Sun.COM 			    gettext("Error: Failed to open fcoe device\n"));
3099087SZhong.Wang@Sun.COM 			break;
3109087SZhong.Wang@Sun.COM 
3119087SZhong.Wang@Sun.COM 		case  FCOE_STATUS_ERROR_MAC_NOT_FOUND:
3129087SZhong.Wang@Sun.COM 			fprintf(stderr,
3139087SZhong.Wang@Sun.COM 			    gettext("Error: FCoE port not found on the "
3149087SZhong.Wang@Sun.COM 			    "specified MAC link\n"));
3159087SZhong.Wang@Sun.COM 			break;
3169087SZhong.Wang@Sun.COM 
3179087SZhong.Wang@Sun.COM 		case  FCOE_STATUS_ERROR_OFFLINE_DEV:
318*10264SZhong.Wang@Sun.COM 			status = FCOE_GetPortList(&port_num, &portlist);
319*10264SZhong.Wang@Sun.COM 			if (status != FCOE_STATUS_OK || port_num == 0) {
320*10264SZhong.Wang@Sun.COM 				fprintf(stderr,
321*10264SZhong.Wang@Sun.COM 				    gettext("Error: FCoE port not found on the "
322*10264SZhong.Wang@Sun.COM 				    "specified MAC link\n"));
323*10264SZhong.Wang@Sun.COM 				break;
324*10264SZhong.Wang@Sun.COM 			}
325*10264SZhong.Wang@Sun.COM 			for (i = 0; i < port_num; i++) {
326*10264SZhong.Wang@Sun.COM 				if (strcmp(
327*10264SZhong.Wang@Sun.COM 				    (char *)portlist[i].mac_link_name,
328*10264SZhong.Wang@Sun.COM 				    (char *)macLinkName) == 0) {
329*10264SZhong.Wang@Sun.COM 					if (portlist[i].port_type ==
330*10264SZhong.Wang@Sun.COM 					    FCOE_PORTTYPE_TARGET) {
331*10264SZhong.Wang@Sun.COM 						fprintf(stderr,
332*10264SZhong.Wang@Sun.COM 						    gettext("Error: Please use "
333*10264SZhong.Wang@Sun.COM 						    "stmfadm to offline the "
334*10264SZhong.Wang@Sun.COM 						    "FCoE target first\n"));
335*10264SZhong.Wang@Sun.COM 					} else {
336*10264SZhong.Wang@Sun.COM 						fprintf(stderr,
337*10264SZhong.Wang@Sun.COM 						    gettext("Error: Failed to "
338*10264SZhong.Wang@Sun.COM 						    "delete FCoE port because "
339*10264SZhong.Wang@Sun.COM 						    "unable to offline the "
340*10264SZhong.Wang@Sun.COM 						    "device\n"));
341*10264SZhong.Wang@Sun.COM 					}
342*10264SZhong.Wang@Sun.COM 					break;
343*10264SZhong.Wang@Sun.COM 				}
344*10264SZhong.Wang@Sun.COM 			}
345*10264SZhong.Wang@Sun.COM 			free(portlist);
346*10264SZhong.Wang@Sun.COM 			if (i == port_num) {
347*10264SZhong.Wang@Sun.COM 				fprintf(stderr,
348*10264SZhong.Wang@Sun.COM 				    gettext("Error: FCoE port not found on the "
349*10264SZhong.Wang@Sun.COM 				    "specified MAC link\n"));
350*10264SZhong.Wang@Sun.COM 			}
3519087SZhong.Wang@Sun.COM 			break;
3529087SZhong.Wang@Sun.COM 
3539307Skelly.hu@Sun.COM 		case FCOE_STATUS_ERROR_GET_LINKINFO:
3549307Skelly.hu@Sun.COM 			fprintf(stderr,
3559307Skelly.hu@Sun.COM 			    gettext("Error: Failed to get link information "
3569307Skelly.hu@Sun.COM 			    "for %s\n"), macLinkName);
3579307Skelly.hu@Sun.COM 			break;
3589307Skelly.hu@Sun.COM 
3599087SZhong.Wang@Sun.COM 		case FCOE_STATUS_ERROR:
3609087SZhong.Wang@Sun.COM 		default:
3619087SZhong.Wang@Sun.COM 			fprintf(stderr,
3629087SZhong.Wang@Sun.COM 			    gettext("Error: Due to reason code %d\n"), status);
3639087SZhong.Wang@Sun.COM 		}
3649087SZhong.Wang@Sun.COM 		return (1);
3659087SZhong.Wang@Sun.COM 	} else {
3669087SZhong.Wang@Sun.COM 		return (0);
3679087SZhong.Wang@Sun.COM 	}
3689087SZhong.Wang@Sun.COM }
3699087SZhong.Wang@Sun.COM 
3709087SZhong.Wang@Sun.COM int
fcoe_adm_list_ports(cmdOptions_t * options)3719087SZhong.Wang@Sun.COM fcoe_adm_list_ports(cmdOptions_t *options)
3729087SZhong.Wang@Sun.COM {
3739087SZhong.Wang@Sun.COM 	FCOE_STATUS	status;
3749087SZhong.Wang@Sun.COM 	int	showini = 0, showtgt = 0;
3759087SZhong.Wang@Sun.COM 	FCOE_UINT32	port_num;
3769087SZhong.Wang@Sun.COM 	FCOE_PORT_ATTRIBUTE	*portlist = NULL;
3779087SZhong.Wang@Sun.COM 	int i;
3789087SZhong.Wang@Sun.COM 	int ret;
3799087SZhong.Wang@Sun.COM 
3809087SZhong.Wang@Sun.COM 	for (; options->optval; options++) {
3819087SZhong.Wang@Sun.COM 		switch (options->optval) {
3829087SZhong.Wang@Sun.COM 		case 'i':
3839087SZhong.Wang@Sun.COM 			showini = 1;
3849087SZhong.Wang@Sun.COM 			break;
3859087SZhong.Wang@Sun.COM 
3869087SZhong.Wang@Sun.COM 		case 't':
3879087SZhong.Wang@Sun.COM 			showtgt = 1;
3889087SZhong.Wang@Sun.COM 			break;
3899087SZhong.Wang@Sun.COM 
3909087SZhong.Wang@Sun.COM 		default:
3919087SZhong.Wang@Sun.COM 			fprintf(stderr, gettext("Error: Illegal option: %c\n"),
3929087SZhong.Wang@Sun.COM 			    options->optval);
3939087SZhong.Wang@Sun.COM 			return (1);
3949087SZhong.Wang@Sun.COM 		}
3959087SZhong.Wang@Sun.COM 	}
3969087SZhong.Wang@Sun.COM 	if (showini == 0 && showtgt == 0) {
3979087SZhong.Wang@Sun.COM 		showini = 1;
3989087SZhong.Wang@Sun.COM 		showtgt = 1;
3999087SZhong.Wang@Sun.COM 	}
4009087SZhong.Wang@Sun.COM 
4019087SZhong.Wang@Sun.COM 	status = FCOE_GetPortList(&port_num, &portlist);
4029087SZhong.Wang@Sun.COM 
4039087SZhong.Wang@Sun.COM 	if (status != FCOE_STATUS_OK) {
4049087SZhong.Wang@Sun.COM 		switch (status) {
4059087SZhong.Wang@Sun.COM 		case  FCOE_STATUS_ERROR_BUSY:
4069087SZhong.Wang@Sun.COM 			fprintf(stderr,
4079087SZhong.Wang@Sun.COM 			    gettext("Error: fcoe driver is busy\n"));
4089087SZhong.Wang@Sun.COM 			break;
4099087SZhong.Wang@Sun.COM 
4109087SZhong.Wang@Sun.COM 		case  FCOE_STATUS_ERROR_PERM:
4119087SZhong.Wang@Sun.COM 			fprintf(stderr,
4129087SZhong.Wang@Sun.COM 			    gettext("Error: Not enough permission to "
4139087SZhong.Wang@Sun.COM 			    "open fcoe device\n"));
4149087SZhong.Wang@Sun.COM 			break;
4159087SZhong.Wang@Sun.COM 
4169087SZhong.Wang@Sun.COM 		case  FCOE_STATUS_ERROR_OPEN_DEV:
4179087SZhong.Wang@Sun.COM 			fprintf(stderr,
4189087SZhong.Wang@Sun.COM 			    gettext("Error: Failed to open fcoe device\n"));
4199087SZhong.Wang@Sun.COM 			break;
4209087SZhong.Wang@Sun.COM 
4219087SZhong.Wang@Sun.COM 		case  FCOE_STATUS_ERROR_INVAL_ARG:
4229087SZhong.Wang@Sun.COM 			fprintf(stderr,
4239087SZhong.Wang@Sun.COM 			    gettext("Error: Invalid argument\n"));
4249087SZhong.Wang@Sun.COM 			break;
4259087SZhong.Wang@Sun.COM 
4269087SZhong.Wang@Sun.COM 		case  FCOE_STATUS_ERROR_MORE_DATA:
4279087SZhong.Wang@Sun.COM 			fprintf(stderr,
4289087SZhong.Wang@Sun.COM 			    gettext("Error: More data\n"));
4299087SZhong.Wang@Sun.COM 			break;
4309087SZhong.Wang@Sun.COM 
4319087SZhong.Wang@Sun.COM 		case FCOE_STATUS_ERROR:
4329087SZhong.Wang@Sun.COM 		default:
4339087SZhong.Wang@Sun.COM 			fprintf(stderr,
4349087SZhong.Wang@Sun.COM 			    gettext("Error: Due to reason code %d\n"), status);
4359087SZhong.Wang@Sun.COM 		}
4369087SZhong.Wang@Sun.COM 		ret = 1;
4379087SZhong.Wang@Sun.COM 	} else {
4389087SZhong.Wang@Sun.COM 		if (port_num == 0) {
4399087SZhong.Wang@Sun.COM 			fprintf(stdout, gettext("No FCoE Ports Found!\n"));
4409087SZhong.Wang@Sun.COM 		} else {
4419087SZhong.Wang@Sun.COM 			for (i = 0; i < port_num; i++) {
4429087SZhong.Wang@Sun.COM 				if ((portlist[i].port_type ==
4439087SZhong.Wang@Sun.COM 				    FCOE_PORTTYPE_INITIATOR &&
4449087SZhong.Wang@Sun.COM 				    showini == 1) || (showtgt == 1 &&
4459087SZhong.Wang@Sun.COM 				    portlist[i].port_type ==
4469087SZhong.Wang@Sun.COM 				    FCOE_PORTTYPE_TARGET)) {
4479087SZhong.Wang@Sun.COM 					printFCOEPortInfo(&portlist[i]);
4489087SZhong.Wang@Sun.COM 				}
4499087SZhong.Wang@Sun.COM 			}
4509087SZhong.Wang@Sun.COM 		}
4519087SZhong.Wang@Sun.COM 		ret = 0;
4529087SZhong.Wang@Sun.COM 	}
4539087SZhong.Wang@Sun.COM 
4549087SZhong.Wang@Sun.COM 	if (portlist != NULL) {
4559087SZhong.Wang@Sun.COM 		free(portlist);
4569087SZhong.Wang@Sun.COM 	}
4579087SZhong.Wang@Sun.COM 	return (ret);
4589087SZhong.Wang@Sun.COM 
4599087SZhong.Wang@Sun.COM }
460