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 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 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 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 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 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) { 3202a8164dfSZhong 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 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