xref: /illumos-gate/usr/src/cmd/fcinfo/fcoeadm.c (revision 7ff83669)
12a8164dfSZhong Wang /*
22a8164dfSZhong Wang  * CDDL HEADER START
32a8164dfSZhong Wang  *
42a8164dfSZhong Wang  * The contents of this file are subject to the terms of the
52a8164dfSZhong Wang  * Common Development and Distribution License (the "License").
62a8164dfSZhong Wang  * You may not use this file except in compliance with the License.
72a8164dfSZhong Wang  *
82a8164dfSZhong Wang  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
92a8164dfSZhong Wang  * or http://www.opensolaris.org/os/licensing.
102a8164dfSZhong Wang  * See the License for the specific language governing permissions
112a8164dfSZhong Wang  * and limitations under the License.
122a8164dfSZhong Wang  *
132a8164dfSZhong Wang  * When distributing Covered Code, include this CDDL HEADER in each
142a8164dfSZhong Wang  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
152a8164dfSZhong Wang  * If applicable, add the following below this CDDL HEADER, with the
162a8164dfSZhong Wang  * fields enclosed by brackets "[]" replaced with your own identifying
172a8164dfSZhong Wang  * information: Portions Copyright [yyyy] [name of copyright owner]
182a8164dfSZhong Wang  *
192a8164dfSZhong Wang  * CDDL HEADER END
202a8164dfSZhong Wang  */
212a8164dfSZhong Wang /*
222a8164dfSZhong Wang  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
232a8164dfSZhong Wang  * Use is subject to license terms.
242a8164dfSZhong Wang  */
252a8164dfSZhong Wang 
262a8164dfSZhong Wang #include "fcinfo.h"
272a8164dfSZhong Wang #include <libintl.h>
282a8164dfSZhong Wang #include <fcntl.h>
292a8164dfSZhong Wang #include <errno.h>
302a8164dfSZhong Wang #include <assert.h>
312a8164dfSZhong Wang #include <ctype.h>
322a8164dfSZhong Wang #include <sys/list.h>
332a8164dfSZhong Wang #include <stddef.h>
342a8164dfSZhong Wang #include <strings.h>
352a8164dfSZhong Wang #include <libfcoe.h>
362a8164dfSZhong Wang #include <syslog.h>
372a8164dfSZhong Wang 
382a8164dfSZhong Wang static const char *FCOE_DRIVER_PATH	= "/devices/fcoe:admin";
392a8164dfSZhong Wang 
402a8164dfSZhong Wang static int
isValidWWN(char * wwn)412a8164dfSZhong Wang isValidWWN(char *wwn)
422a8164dfSZhong Wang {
432a8164dfSZhong Wang 	int index;
442a8164dfSZhong Wang 
452a8164dfSZhong Wang 	if (wwn == NULL) {
462a8164dfSZhong Wang 		return (0);
472a8164dfSZhong Wang 	}
482a8164dfSZhong Wang 
492a8164dfSZhong Wang 	if (strlen(wwn) != 16) {
502a8164dfSZhong Wang 		return (0);
512a8164dfSZhong Wang 	}
522a8164dfSZhong Wang 
532a8164dfSZhong Wang 	for (index = 0; index < 16; index++) {
542a8164dfSZhong Wang 		if (isxdigit(wwn[index])) {
552a8164dfSZhong Wang 			continue;
562a8164dfSZhong Wang 		}
572a8164dfSZhong Wang 		return (0);
582a8164dfSZhong Wang 	}
592a8164dfSZhong Wang 	return (1);
602a8164dfSZhong Wang }
612a8164dfSZhong Wang 
wwnconvert(uchar_t * wwn)622a8164dfSZhong Wang static uint64_t wwnconvert(uchar_t *wwn)
632a8164dfSZhong Wang {
642a8164dfSZhong Wang 	uint64_t tmp;
652a8164dfSZhong Wang 	memcpy(&tmp, wwn, sizeof (uint64_t));
662a8164dfSZhong Wang 	return (ntohll(tmp));
672a8164dfSZhong Wang }
682a8164dfSZhong Wang 
692a8164dfSZhong Wang /*
702a8164dfSZhong Wang  * prints out all the HBA port information
712a8164dfSZhong Wang  */
722a8164dfSZhong Wang void
printFCOEPortInfo(FCOE_PORT_ATTRIBUTE * attr)732a8164dfSZhong Wang printFCOEPortInfo(FCOE_PORT_ATTRIBUTE *attr)
742a8164dfSZhong Wang {
752a8164dfSZhong Wang 	int i;
762a8164dfSZhong Wang 	if (attr == NULL) {
772a8164dfSZhong Wang 		return;
782a8164dfSZhong Wang 	}
792a8164dfSZhong Wang 	fprintf(stdout, gettext("HBA Port WWN: %016llx\n"),
802a8164dfSZhong Wang 	    wwnconvert((unsigned char *)&attr->port_wwn));
812a8164dfSZhong Wang 
822a8164dfSZhong Wang 	fprintf(stdout, gettext("\tPort Type: %s\n"),
832a8164dfSZhong Wang 	    (attr->port_type == 0) ? "Initiator" : "Target");
842a8164dfSZhong Wang 
852a8164dfSZhong Wang 	fprintf(stdout, gettext("\tMAC Name: %s\n"), attr->mac_link_name);
862a8164dfSZhong Wang 
872a8164dfSZhong Wang 	fprintf(stdout, gettext("\tMTU Size: %d\n"), attr->mtu_size);
882a8164dfSZhong Wang 
89*7ff83669SZhong Wang 	fprintf(stdout, gettext("\tPrimary MAC Address: "));
902a8164dfSZhong Wang 	for (i = 0; i < 6; i++) {
912a8164dfSZhong Wang 		fprintf(stdout, gettext("%02x"), attr->mac_factory_addr[i]);
922a8164dfSZhong Wang 	}
93*7ff83669SZhong Wang 	fprintf(stdout, gettext("\n\tCurrent MAC Address: "));
942a8164dfSZhong Wang 	for (i = 0; i < 6; i++) {
952a8164dfSZhong Wang 		fprintf(stdout, gettext("%02x"), attr->mac_current_addr[i]);
962a8164dfSZhong Wang 	}
972a8164dfSZhong Wang 	fprintf(stdout, gettext("\n\tPromiscuous Mode: %s\n"),
982a8164dfSZhong Wang 	    attr->mac_promisc == 1 ? "On" : "Off");
992a8164dfSZhong Wang }
1002a8164dfSZhong Wang 
1012a8164dfSZhong Wang 
1022a8164dfSZhong Wang int
fcoe_adm_create_port(int objects,char * argv[],cmdOptions_t * options)1032a8164dfSZhong Wang fcoe_adm_create_port(int objects, char *argv[],
1042a8164dfSZhong Wang     cmdOptions_t *options)
1052a8164dfSZhong Wang {
1062a8164dfSZhong Wang 	FCOE_STATUS status = FCOE_STATUS_OK;
1072a8164dfSZhong Wang 	uint64_t	nodeWWN, portWWN;
1082a8164dfSZhong Wang 	FCOE_PORT_WWN	pwwn, nwwn;
1092a8164dfSZhong Wang 	FCOE_UINT8	macLinkName[FCOE_MAX_MAC_NAME_LEN];
1102a8164dfSZhong Wang 	FCOE_UINT8	promiscuous = 0;
1112a8164dfSZhong Wang 	int		createini = 0, createtgt = 0;
1122a8164dfSZhong Wang 
1132a8164dfSZhong Wang 	/* check the mac name operand */
1142a8164dfSZhong Wang 	assert(objects == 1);
1152a8164dfSZhong Wang 
1162a8164dfSZhong Wang 	strcpy((char *)macLinkName, argv[0]);
1172a8164dfSZhong Wang 	bzero(&pwwn, 8);
1182a8164dfSZhong Wang 	bzero(&nwwn, 8);
1192a8164dfSZhong Wang 
1202a8164dfSZhong Wang 	for (; options->optval; options++) {
1212a8164dfSZhong Wang 		switch (options->optval) {
1222a8164dfSZhong Wang 		case 'i':
1232a8164dfSZhong Wang 			createini = 1;
1242a8164dfSZhong Wang 			break;
1252a8164dfSZhong Wang 
1262a8164dfSZhong Wang 		case 't':
1272a8164dfSZhong Wang 			createtgt = 1;
1282a8164dfSZhong Wang 			break;
1292a8164dfSZhong Wang 		case 'p':
1302a8164dfSZhong Wang 			if (!isValidWWN(options->optarg)) {
1312a8164dfSZhong Wang 				fprintf(stderr,
1322a8164dfSZhong Wang 				    gettext("Error: Invalid Port WWN\n"));
1332a8164dfSZhong Wang 				return (1);
1342a8164dfSZhong Wang 			}
1352a8164dfSZhong Wang 			sscanf(options->optarg, "%016llx", &portWWN);
1362a8164dfSZhong Wang 			portWWN = htonll(portWWN);
1372a8164dfSZhong Wang 			memcpy(&pwwn, &portWWN, sizeof (portWWN));
1382a8164dfSZhong Wang 			break;
1392a8164dfSZhong Wang 
1402a8164dfSZhong Wang 		case 'n':
1412a8164dfSZhong Wang 			if (!isValidWWN(options->optarg)) {
1422a8164dfSZhong Wang 				fprintf(stderr,
1432a8164dfSZhong Wang 				    gettext("Error: Invalid Node WWN\n"));
1442a8164dfSZhong Wang 				return (1);
1452a8164dfSZhong Wang 			}
1462a8164dfSZhong Wang 			sscanf(options->optarg, "%016llx", &nodeWWN);
1472a8164dfSZhong Wang 			nodeWWN = htonll(nodeWWN);
1482a8164dfSZhong Wang 			memcpy(&nwwn, &nodeWWN, sizeof (nodeWWN));
1492a8164dfSZhong Wang 			break;
1502a8164dfSZhong Wang 		case 'f':
1512a8164dfSZhong Wang 			promiscuous = 1;
1522a8164dfSZhong Wang 			break;
1532a8164dfSZhong Wang 
1542a8164dfSZhong Wang 		default:
1552a8164dfSZhong Wang 			fprintf(stderr, gettext("Error: Illegal option: %c\n"),
1562a8164dfSZhong Wang 			    options->optval);
1572a8164dfSZhong Wang 			return (1);
1582a8164dfSZhong Wang 		}
1592a8164dfSZhong Wang 	}
1602a8164dfSZhong Wang 
1612a8164dfSZhong Wang 	if (createini == 1 && createtgt == 1) {
1622a8164dfSZhong Wang 		fprintf(stderr, "Error: Option -i and -t should "
1632a8164dfSZhong Wang 		    "not be both specified\n");
1642a8164dfSZhong Wang 		return (1);
1652a8164dfSZhong Wang 	}
1662a8164dfSZhong Wang 	status = FCOE_CreatePort(macLinkName,
1672a8164dfSZhong Wang 	    createtgt == 1 ? FCOE_PORTTYPE_TARGET :
1682a8164dfSZhong Wang 	    FCOE_PORTTYPE_INITIATOR, pwwn, nwwn, promiscuous);
1692a8164dfSZhong Wang 
1702a8164dfSZhong Wang 	if (status != FCOE_STATUS_OK) {
1712a8164dfSZhong Wang 		switch (status) {
1722a8164dfSZhong Wang 		case  FCOE_STATUS_ERROR_BUSY:
1732a8164dfSZhong Wang 			fprintf(stderr,
1742a8164dfSZhong Wang 			    gettext("Error: fcoe driver is busy\n"));
1752a8164dfSZhong Wang 			break;
1762a8164dfSZhong Wang 
1772a8164dfSZhong Wang 		case  FCOE_STATUS_ERROR_ALREADY:
1782a8164dfSZhong Wang 			fprintf(stderr,
1792a8164dfSZhong Wang 			    gettext("Error: Existing FCoE port "
1802a8164dfSZhong Wang 			    "found on the specified MAC link\n"));
1812a8164dfSZhong Wang 			break;
1822a8164dfSZhong Wang 
1832a8164dfSZhong Wang 		case  FCOE_STATUS_ERROR_PERM:
1842a8164dfSZhong Wang 			fprintf(stderr,
1852a8164dfSZhong Wang 			    gettext("Error: Not enough permission to "
1862a8164dfSZhong Wang 			    "open fcoe device\n"));
1872a8164dfSZhong Wang 			break;
1882a8164dfSZhong Wang 
1892a8164dfSZhong Wang 		case  FCOE_STATUS_ERROR_OPEN_DEV:
1902a8164dfSZhong Wang 			fprintf(stderr,
1912a8164dfSZhong Wang 			    gettext("Error: Failed to open fcoe device\n"));
1922a8164dfSZhong Wang 			break;
1932a8164dfSZhong Wang 
1942a8164dfSZhong Wang 		case  FCOE_STATUS_ERROR_WWN_SAME:
1952a8164dfSZhong Wang 			fprintf(stderr,
1962a8164dfSZhong Wang 			    gettext("Error: Port WWN is same as Node "
1972a8164dfSZhong Wang 			    "WWN\n"));
1982a8164dfSZhong Wang 			break;
1992a8164dfSZhong Wang 
2002a8164dfSZhong Wang 		case  FCOE_STATUS_ERROR_MAC_LEN:
2012a8164dfSZhong Wang 			fprintf(stderr,
2022a8164dfSZhong Wang 			    gettext("Error: MAC name exceeds maximum "
2032a8164dfSZhong Wang 			    "length\n"));
2042a8164dfSZhong Wang 			break;
2052a8164dfSZhong Wang 
2062a8164dfSZhong Wang 		case  FCOE_STATUS_ERROR_PWWN_CONFLICTED:
2072a8164dfSZhong Wang 			fprintf(stderr,
2082a8164dfSZhong Wang 			    gettext("Error: The specified Port WWN "
2092a8164dfSZhong Wang 			    "is already in use\n"));
2102a8164dfSZhong Wang 			break;
2112a8164dfSZhong Wang 
2122a8164dfSZhong Wang 		case  FCOE_STATUS_ERROR_NWWN_CONFLICTED:
2132a8164dfSZhong Wang 			fprintf(stderr,
2142a8164dfSZhong Wang 			    gettext("Error: The specified Node WWN "
2152a8164dfSZhong Wang 			    "is already in use\n"));
2162a8164dfSZhong Wang 			break;
2172a8164dfSZhong Wang 
2182a8164dfSZhong Wang 		case  FCOE_STATUS_ERROR_NEED_JUMBO_FRAME:
2192a8164dfSZhong Wang 			fprintf(stderr,
2202a8164dfSZhong Wang 			    gettext("Error: MTU size of the specified "
2212a8164dfSZhong Wang 			    "MAC link needs to be increased to 2500 "
2222a8164dfSZhong Wang 			    "or above\n"));
2232a8164dfSZhong Wang 			break;
2242a8164dfSZhong Wang 
2252a8164dfSZhong Wang 		case  FCOE_STATUS_ERROR_CREATE_MAC:
2262a8164dfSZhong Wang 			fprintf(stderr,
2272a8164dfSZhong Wang 			    gettext("Error: Out of memory\n"));
2282a8164dfSZhong Wang 			break;
2292a8164dfSZhong Wang 
2302a8164dfSZhong Wang 
2312a8164dfSZhong Wang 		case  FCOE_STATUS_ERROR_OPEN_MAC:
2322a8164dfSZhong Wang 			fprintf(stderr,
2332a8164dfSZhong Wang 			    gettext("Error: Failed to open the "
2342a8164dfSZhong Wang 			    "specified MAC link\n"));
2352a8164dfSZhong Wang 			break;
2362a8164dfSZhong Wang 
2372a8164dfSZhong Wang 		case  FCOE_STATUS_ERROR_CREATE_PORT:
2382a8164dfSZhong Wang 			fprintf(stderr,
2392a8164dfSZhong Wang 			    gettext("Error: Failed to create FCoE "
2402a8164dfSZhong Wang 			    "port on the specified MAC link\n"));
2412a8164dfSZhong Wang 			break;
2422a8164dfSZhong Wang 
243d4401b99SKelly Hu 		case  FCOE_STATUS_ERROR_CLASS_UNSUPPORT:
2442a8164dfSZhong Wang 			fprintf(stderr,
245d4401b99SKelly Hu 			    gettext("Error: Link class other than physical "
246d4401b99SKelly Hu 			    "link is not supported\n"));
247d4401b99SKelly Hu 			break;
248d4401b99SKelly Hu 
249d4401b99SKelly Hu 		case FCOE_STATUS_ERROR_GET_LINKINFO:
250d4401b99SKelly Hu 			fprintf(stderr,
251e6eb57e7SKevin Yu 			    gettext("Error: Failed to get link information "
252d4401b99SKelly Hu 			    "for %s\n"), macLinkName);
2532a8164dfSZhong Wang 			break;
2542a8164dfSZhong Wang 
2552a8164dfSZhong Wang 		case FCOE_STATUS_ERROR:
2562a8164dfSZhong Wang 		default:
2572a8164dfSZhong Wang 			fprintf(stderr,
2582a8164dfSZhong Wang 			    gettext("Error: Due to reason code %d\n"), status);
2592a8164dfSZhong Wang 		}
2602a8164dfSZhong Wang 		return (1);
2612a8164dfSZhong Wang 	} else {
2622a8164dfSZhong Wang 		return (0);
2632a8164dfSZhong Wang 	}
2642a8164dfSZhong Wang }
2652a8164dfSZhong Wang 
2662a8164dfSZhong Wang int
fcoe_adm_delete_port(int objects,char * argv[])2672a8164dfSZhong Wang fcoe_adm_delete_port(int objects, char *argv[])
2682a8164dfSZhong Wang {
2692a8164dfSZhong Wang 	FCOE_STATUS status;
2702a8164dfSZhong Wang 	FCOE_UINT8	*macLinkName;
271*7ff83669SZhong Wang 	FCOE_UINT32		port_num;
272*7ff83669SZhong Wang 	FCOE_PORT_ATTRIBUTE	*portlist = NULL;
273*7ff83669SZhong Wang 	int			i;
2742a8164dfSZhong Wang 
2752a8164dfSZhong Wang 	/* check the mac name operand */
2762a8164dfSZhong Wang 	assert(objects == 1);
2772a8164dfSZhong Wang 
2782a8164dfSZhong Wang 	macLinkName = (FCOE_UINT8 *) argv[0];
2792a8164dfSZhong Wang 
2802a8164dfSZhong Wang 	status = FCOE_DeletePort(macLinkName);
2812a8164dfSZhong Wang 	if (status != FCOE_STATUS_OK) {
2822a8164dfSZhong Wang 		switch (status) {
2832a8164dfSZhong Wang 		case  FCOE_STATUS_ERROR_BUSY:
2842a8164dfSZhong Wang 			fprintf(stderr,
2852a8164dfSZhong Wang 			    gettext("Error: fcoe driver is busy\n"));
2862a8164dfSZhong Wang 			break;
2872a8164dfSZhong Wang 
2882a8164dfSZhong Wang 		case  FCOE_STATUS_ERROR_ALREADY:
2892a8164dfSZhong Wang 			fprintf(stderr,
2902a8164dfSZhong Wang 			    gettext("Error: FCoE port not found on the "
2912a8164dfSZhong Wang 			    "specified MAC link\n"));
2922a8164dfSZhong Wang 			break;
2932a8164dfSZhong Wang 
2942a8164dfSZhong Wang 		case  FCOE_STATUS_ERROR_PERM:
2952a8164dfSZhong Wang 			fprintf(stderr,
2962a8164dfSZhong Wang 			    gettext("Error: Not enough permission to "
2972a8164dfSZhong Wang 			    "open fcoe device\n"));
2982a8164dfSZhong Wang 			break;
2992a8164dfSZhong Wang 
3002a8164dfSZhong Wang 		case  FCOE_STATUS_ERROR_MAC_LEN:
3012a8164dfSZhong Wang 			fprintf(stderr,
3022a8164dfSZhong Wang 			    gettext("Failed: MAC name exceeds maximum "
3032a8164dfSZhong Wang 			    "length 32\n"));
3042a8164dfSZhong Wang 			break;
3052a8164dfSZhong Wang 
3062a8164dfSZhong Wang 		case  FCOE_STATUS_ERROR_OPEN_DEV:
3072a8164dfSZhong Wang 			fprintf(stderr,
3082a8164dfSZhong Wang 			    gettext("Error: Failed to open fcoe device\n"));
3092a8164dfSZhong Wang 			break;
3102a8164dfSZhong Wang 
3112a8164dfSZhong Wang 		case  FCOE_STATUS_ERROR_MAC_NOT_FOUND:
3122a8164dfSZhong Wang 			fprintf(stderr,
3132a8164dfSZhong Wang 			    gettext("Error: FCoE port not found on the "
3142a8164dfSZhong Wang 			    "specified MAC link\n"));
3152a8164dfSZhong Wang 			break;
3162a8164dfSZhong Wang 
3172a8164dfSZhong Wang 		case  FCOE_STATUS_ERROR_OFFLINE_DEV:
318*7ff83669SZhong Wang 			status = FCOE_GetPortList(&port_num, &portlist);
319*7ff83669SZhong Wang 			if (status != FCOE_STATUS_OK || port_num == 0) {
320*7ff83669SZhong Wang 				fprintf(stderr,
321*7ff83669SZhong Wang 				    gettext("Error: FCoE port not found on the "
322*7ff83669SZhong Wang 				    "specified MAC link\n"));
323*7ff83669SZhong Wang 				break;
324*7ff83669SZhong Wang 			}
325*7ff83669SZhong Wang 			for (i = 0; i < port_num; i++) {
326*7ff83669SZhong Wang 				if (strcmp(
327*7ff83669SZhong Wang 				    (char *)portlist[i].mac_link_name,
328*7ff83669SZhong Wang 				    (char *)macLinkName) == 0) {
329*7ff83669SZhong Wang 					if (portlist[i].port_type ==
330*7ff83669SZhong Wang 					    FCOE_PORTTYPE_TARGET) {
331*7ff83669SZhong Wang 						fprintf(stderr,
332*7ff83669SZhong Wang 						    gettext("Error: Please use "
333*7ff83669SZhong Wang 						    "stmfadm to offline the "
334*7ff83669SZhong Wang 						    "FCoE target first\n"));
335*7ff83669SZhong Wang 					} else {
336*7ff83669SZhong Wang 						fprintf(stderr,
337*7ff83669SZhong Wang 						    gettext("Error: Failed to "
338*7ff83669SZhong Wang 						    "delete FCoE port because "
339*7ff83669SZhong Wang 						    "unable to offline the "
340*7ff83669SZhong Wang 						    "device\n"));
341*7ff83669SZhong Wang 					}
342*7ff83669SZhong Wang 					break;
343*7ff83669SZhong Wang 				}
344*7ff83669SZhong Wang 			}
345*7ff83669SZhong Wang 			free(portlist);
346*7ff83669SZhong Wang 			if (i == port_num) {
347*7ff83669SZhong Wang 				fprintf(stderr,
348*7ff83669SZhong Wang 				    gettext("Error: FCoE port not found on the "
349*7ff83669SZhong Wang 				    "specified MAC link\n"));
350*7ff83669SZhong Wang 			}
3512a8164dfSZhong Wang 			break;
3522a8164dfSZhong Wang 
353d4401b99SKelly Hu 		case FCOE_STATUS_ERROR_GET_LINKINFO:
354d4401b99SKelly Hu 			fprintf(stderr,
355d4401b99SKelly Hu 			    gettext("Error: Failed to get link information "
356d4401b99SKelly Hu 			    "for %s\n"), macLinkName);
357d4401b99SKelly Hu 			break;
358d4401b99SKelly Hu 
3592a8164dfSZhong Wang 		case FCOE_STATUS_ERROR:
3602a8164dfSZhong Wang 		default:
3612a8164dfSZhong Wang 			fprintf(stderr,
3622a8164dfSZhong Wang 			    gettext("Error: Due to reason code %d\n"), status);
3632a8164dfSZhong Wang 		}
3642a8164dfSZhong Wang 		return (1);
3652a8164dfSZhong Wang 	} else {
3662a8164dfSZhong Wang 		return (0);
3672a8164dfSZhong Wang 	}
3682a8164dfSZhong Wang }
3692a8164dfSZhong Wang 
3702a8164dfSZhong Wang int
fcoe_adm_list_ports(cmdOptions_t * options)3712a8164dfSZhong Wang fcoe_adm_list_ports(cmdOptions_t *options)
3722a8164dfSZhong Wang {
3732a8164dfSZhong Wang 	FCOE_STATUS	status;
3742a8164dfSZhong Wang 	int	showini = 0, showtgt = 0;
3752a8164dfSZhong Wang 	FCOE_UINT32	port_num;
3762a8164dfSZhong Wang 	FCOE_PORT_ATTRIBUTE	*portlist = NULL;
3772a8164dfSZhong Wang 	int i;
3782a8164dfSZhong Wang 	int ret;
3792a8164dfSZhong Wang 
3802a8164dfSZhong Wang 	for (; options->optval; options++) {
3812a8164dfSZhong Wang 		switch (options->optval) {
3822a8164dfSZhong Wang 		case 'i':
3832a8164dfSZhong Wang 			showini = 1;
3842a8164dfSZhong Wang 			break;
3852a8164dfSZhong Wang 
3862a8164dfSZhong Wang 		case 't':
3872a8164dfSZhong Wang 			showtgt = 1;
3882a8164dfSZhong Wang 			break;
3892a8164dfSZhong Wang 
3902a8164dfSZhong Wang 		default:
3912a8164dfSZhong Wang 			fprintf(stderr, gettext("Error: Illegal option: %c\n"),
3922a8164dfSZhong Wang 			    options->optval);
3932a8164dfSZhong Wang 			return (1);
3942a8164dfSZhong Wang 		}
3952a8164dfSZhong Wang 	}
3962a8164dfSZhong Wang 	if (showini == 0 && showtgt == 0) {
3972a8164dfSZhong Wang 		showini = 1;
3982a8164dfSZhong Wang 		showtgt = 1;
3992a8164dfSZhong Wang 	}
4002a8164dfSZhong Wang 
4012a8164dfSZhong Wang 	status = FCOE_GetPortList(&port_num, &portlist);
4022a8164dfSZhong Wang 
4032a8164dfSZhong Wang 	if (status != FCOE_STATUS_OK) {
4042a8164dfSZhong Wang 		switch (status) {
4052a8164dfSZhong Wang 		case  FCOE_STATUS_ERROR_BUSY:
4062a8164dfSZhong Wang 			fprintf(stderr,
4072a8164dfSZhong Wang 			    gettext("Error: fcoe driver is busy\n"));
4082a8164dfSZhong Wang 			break;
4092a8164dfSZhong Wang 
4102a8164dfSZhong Wang 		case  FCOE_STATUS_ERROR_PERM:
4112a8164dfSZhong Wang 			fprintf(stderr,
4122a8164dfSZhong Wang 			    gettext("Error: Not enough permission to "
4132a8164dfSZhong Wang 			    "open fcoe device\n"));
4142a8164dfSZhong Wang 			break;
4152a8164dfSZhong Wang 
4162a8164dfSZhong Wang 		case  FCOE_STATUS_ERROR_OPEN_DEV:
4172a8164dfSZhong Wang 			fprintf(stderr,
4182a8164dfSZhong Wang 			    gettext("Error: Failed to open fcoe device\n"));
4192a8164dfSZhong Wang 			break;
4202a8164dfSZhong Wang 
4212a8164dfSZhong Wang 		case  FCOE_STATUS_ERROR_INVAL_ARG:
4222a8164dfSZhong Wang 			fprintf(stderr,
4232a8164dfSZhong Wang 			    gettext("Error: Invalid argument\n"));
4242a8164dfSZhong Wang 			break;
4252a8164dfSZhong Wang 
4262a8164dfSZhong Wang 		case  FCOE_STATUS_ERROR_MORE_DATA:
4272a8164dfSZhong Wang 			fprintf(stderr,
4282a8164dfSZhong Wang 			    gettext("Error: More data\n"));
4292a8164dfSZhong Wang 			break;
4302a8164dfSZhong Wang 
4312a8164dfSZhong Wang 		case FCOE_STATUS_ERROR:
4322a8164dfSZhong Wang 		default:
4332a8164dfSZhong Wang 			fprintf(stderr,
4342a8164dfSZhong Wang 			    gettext("Error: Due to reason code %d\n"), status);
4352a8164dfSZhong Wang 		}
4362a8164dfSZhong Wang 		ret = 1;
4372a8164dfSZhong Wang 	} else {
4382a8164dfSZhong Wang 		if (port_num == 0) {
4392a8164dfSZhong Wang 			fprintf(stdout, gettext("No FCoE Ports Found!\n"));
4402a8164dfSZhong Wang 		} else {
4412a8164dfSZhong Wang 			for (i = 0; i < port_num; i++) {
4422a8164dfSZhong Wang 				if ((portlist[i].port_type ==
4432a8164dfSZhong Wang 				    FCOE_PORTTYPE_INITIATOR &&
4442a8164dfSZhong Wang 				    showini == 1) || (showtgt == 1 &&
4452a8164dfSZhong Wang 				    portlist[i].port_type ==
4462a8164dfSZhong Wang 				    FCOE_PORTTYPE_TARGET)) {
4472a8164dfSZhong Wang 					printFCOEPortInfo(&portlist[i]);
4482a8164dfSZhong Wang 				}
4492a8164dfSZhong Wang 			}
4502a8164dfSZhong Wang 		}
4512a8164dfSZhong Wang 		ret = 0;
4522a8164dfSZhong Wang 	}
4532a8164dfSZhong Wang 
4542a8164dfSZhong Wang 	if (portlist != NULL) {
4552a8164dfSZhong Wang 		free(portlist);
4562a8164dfSZhong Wang 	}
4572a8164dfSZhong Wang 	return (ret);
4582a8164dfSZhong Wang 
4592a8164dfSZhong Wang }
460