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