|
Packit Service |
bca4e3 |
/*
|
|
Packit Service |
bca4e3 |
* Copyright(c) 2010 Intel Corporation. All rights reserved.
|
|
Packit Service |
bca4e3 |
*
|
|
Packit Service |
bca4e3 |
* This program is free software; you can redistribute it and/or modify it
|
|
Packit Service |
bca4e3 |
* under the terms and conditions of the GNU General Public License,
|
|
Packit Service |
bca4e3 |
* version 2, as published by the Free Software Foundation.
|
|
Packit Service |
bca4e3 |
*
|
|
Packit Service |
bca4e3 |
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
Packit Service |
bca4e3 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
Packit Service |
bca4e3 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
Packit Service |
bca4e3 |
* more details.
|
|
Packit Service |
bca4e3 |
*
|
|
Packit Service |
bca4e3 |
* You should have received a copy of the GNU General Public License along with
|
|
Packit Service |
bca4e3 |
* this program; if not, write to the Free Software Foundation, Inc.,
|
|
Packit Service |
bca4e3 |
* 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
|
Packit Service |
bca4e3 |
*
|
|
Packit Service |
bca4e3 |
* Maintained at www.Open-FCoE.org
|
|
Packit Service |
bca4e3 |
*/
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
#include <libgen.h>
|
|
Packit Service |
bca4e3 |
#include <paths.h>
|
|
Packit Service |
bca4e3 |
#include <net/if.h>
|
|
Packit Service |
bca4e3 |
#include <sys/un.h>
|
|
Packit Service |
bca4e3 |
#include <getopt.h>
|
|
Packit Service |
bca4e3 |
#include <dirent.h>
|
|
Packit Service |
bca4e3 |
#include <sys/types.h>
|
|
Packit Service |
bca4e3 |
#include <sys/stat.h>
|
|
Packit Service |
bca4e3 |
#include <fcntl.h>
|
|
Packit Service |
bca4e3 |
#include <unistd.h>
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
#include "fcoe_utils.h"
|
|
Packit Service |
bca4e3 |
#include "fcoe_utils_version.h"
|
|
Packit Service |
bca4e3 |
#include "fcoe_clif.h"
|
|
Packit Service |
bca4e3 |
#include "fcoeadm_display.h"
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
static const char optstring[] = "cdrSiftlm:sbhpv";
|
|
Packit Service |
bca4e3 |
static const struct option fcoeadm_opts[] = {
|
|
Packit Service |
bca4e3 |
{"create", no_argument, 0, 'c'},
|
|
Packit Service |
bca4e3 |
{"destroy", no_argument, 0, 'd'},
|
|
Packit Service |
bca4e3 |
{"reset", no_argument, 0, 'r'},
|
|
Packit Service |
bca4e3 |
{"interface", no_argument, 0, 'i'},
|
|
Packit Service |
bca4e3 |
{"Scan", no_argument, 0, 'S'},
|
|
Packit Service |
bca4e3 |
{"fcf", no_argument, 0, 'f'},
|
|
Packit Service |
bca4e3 |
{"target", no_argument, 0, 't'},
|
|
Packit Service |
bca4e3 |
{"lun", no_argument, 0, 'l'},
|
|
Packit Service |
bca4e3 |
{"mode", required_argument, 0, 'm'},
|
|
Packit Service |
bca4e3 |
{"pid", no_argument, 0, 'p'},
|
|
Packit Service |
bca4e3 |
{"stats", no_argument, 0, 's'},
|
|
Packit Service |
bca4e3 |
{"lesb", no_argument, 0, 'b'},
|
|
Packit Service |
bca4e3 |
{"help", no_argument, 0, 'h'},
|
|
Packit Service |
bca4e3 |
{"version", no_argument, 0, 'v'},
|
|
Packit Service |
bca4e3 |
{0, 0, 0, 0}
|
|
Packit Service |
bca4e3 |
};
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
char progname[20];
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
static void fcoeadm_help(void)
|
|
Packit Service |
bca4e3 |
{
|
|
Packit Service |
bca4e3 |
printf("Version %s\n", FCOE_UTILS_VERSION);
|
|
Packit Service |
bca4e3 |
printf("Usage: %s\n"
|
|
Packit Service |
bca4e3 |
"\t [-m|--mode fabric|vn2vn] [-c|--create] <ethX>\n"
|
|
Packit Service |
bca4e3 |
"\t [-d|--destroy] <ethX>\n"
|
|
Packit Service |
bca4e3 |
"\t [-r|--reset] <ethX>\n"
|
|
Packit Service |
bca4e3 |
"\t [-S|--Scan] <ethX>\n"
|
|
Packit Service |
bca4e3 |
"\t [-i|--interface] [<ethX>]\n"
|
|
Packit Service |
bca4e3 |
"\t [-f]--fcf] [<ethX>]\n"
|
|
Packit Service |
bca4e3 |
"\t [-t|--target] [<ethX>]\n"
|
|
Packit Service |
bca4e3 |
"\t [-l|--lun] [<ethX>]\n"
|
|
Packit Service |
bca4e3 |
"\t [-s|--stats] <ethX> [<interval>]\n"
|
|
Packit Service |
bca4e3 |
"\t [-b|--lesb] <ethX> [<interval>]\n"
|
|
Packit Service |
bca4e3 |
"\t [-p|--pid]\n"
|
|
Packit Service |
bca4e3 |
"\t [-v|--version]\n"
|
|
Packit Service |
bca4e3 |
"\t [-h|--help]\n\n", progname);
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
static enum fcoe_status fcoeadm_clif_request(struct clif_sock_info *clif_info,
|
|
Packit Service |
bca4e3 |
const struct clif_data *cmd,
|
|
Packit Service |
bca4e3 |
size_t cmd_len, char *reply,
|
|
Packit Service |
bca4e3 |
size_t *reply_len)
|
|
Packit Service |
bca4e3 |
{
|
|
Packit Service |
bca4e3 |
struct timeval tv;
|
|
Packit Service |
bca4e3 |
int ret;
|
|
Packit Service |
bca4e3 |
fd_set rfds;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
if (send(clif_info->socket_fd, cmd, cmd_len, 0) < 0)
|
|
Packit Service |
bca4e3 |
return ENOMONCONN;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
tv.tv_sec = CLIF_CMD_RESPONSE_TIMEOUT;
|
|
Packit Service |
bca4e3 |
tv.tv_usec = 0;
|
|
Packit Service |
bca4e3 |
FD_ZERO(&rfds);
|
|
Packit Service |
bca4e3 |
FD_SET(clif_info->socket_fd, &rfds);
|
|
Packit Service |
bca4e3 |
ret = select(clif_info->socket_fd + 1, &rfds, NULL, NULL, &tv;;
|
|
Packit Service |
bca4e3 |
if (FD_ISSET(clif_info->socket_fd, &rfds)) {
|
|
Packit Service |
bca4e3 |
ret = recv(clif_info->socket_fd, reply, *reply_len, 0);
|
|
Packit Service |
bca4e3 |
if (ret < 0)
|
|
Packit Service |
bca4e3 |
return EINTERR;
|
|
Packit Service |
bca4e3 |
*reply_len = ret;
|
|
Packit Service |
bca4e3 |
return SUCCESS;
|
|
Packit Service |
bca4e3 |
} else {
|
|
Packit Service |
bca4e3 |
return EINTERR;
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
static int fcoeadm_request(struct clif_sock_info *clif_info,
|
|
Packit Service |
bca4e3 |
struct clif_data *data)
|
|
Packit Service |
bca4e3 |
{
|
|
Packit Service |
bca4e3 |
char rbuf[MAX_MSGBUF];
|
|
Packit Service |
bca4e3 |
size_t len;
|
|
Packit Service |
bca4e3 |
int rc = SUCCESS;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
/*
|
|
Packit Service |
bca4e3 |
* TODO: This is odd that we read the response code back as a
|
|
Packit Service |
bca4e3 |
* string. We should just write the error code into a member
|
|
Packit Service |
bca4e3 |
* of clif_data and then just read it directly.
|
|
Packit Service |
bca4e3 |
*/
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
len = MAX_MSGBUF - 1;
|
|
Packit Service |
bca4e3 |
rc = fcoeadm_clif_request(clif_info, data, sizeof(struct clif_data),
|
|
Packit Service |
bca4e3 |
rbuf, &len;;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
if (!rc) {
|
|
Packit Service |
bca4e3 |
rbuf[len] = '\0';
|
|
Packit Service |
bca4e3 |
rc = atoi(rbuf);
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
return rc;
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
static inline void fcoeadm_close_cli(struct clif_sock_info *clif_info)
|
|
Packit Service |
bca4e3 |
{
|
|
Packit Service |
bca4e3 |
close(clif_info->socket_fd);
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
/*
|
|
Packit Service |
bca4e3 |
* Create fcoeadm client interface
|
|
Packit Service |
bca4e3 |
*/
|
|
Packit Service |
bca4e3 |
static enum fcoe_status fcoeadm_open_cli(struct clif_sock_info *clif_info)
|
|
Packit Service |
bca4e3 |
{
|
|
Packit Service |
bca4e3 |
enum fcoe_status rc = SUCCESS;
|
|
Packit Service |
bca4e3 |
struct sockaddr_un *lp;
|
|
Packit Service |
bca4e3 |
socklen_t addrlen;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
clif_info->socket_fd = socket(AF_LOCAL, SOCK_DGRAM, 0);
|
|
Packit Service |
bca4e3 |
if (clif_info->socket_fd < 0)
|
|
Packit Service |
bca4e3 |
return ENOMONCONN;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
lp = &clif_info->local;
|
|
Packit Service |
bca4e3 |
memset(lp, 0, sizeof(*lp));
|
|
Packit Service |
bca4e3 |
lp->sun_family = AF_LOCAL;
|
|
Packit Service |
bca4e3 |
lp->sun_path[0] = '\0';
|
|
Packit Service |
bca4e3 |
snprintf(&lp->sun_path[1], sizeof(lp->sun_path) - 1,
|
|
Packit Service |
bca4e3 |
"%s/%lu", CLIF_IFNAME, (unsigned long int)getpid);
|
|
Packit Service |
bca4e3 |
addrlen = sizeof(sa_family_t) + strlen(lp->sun_path + 1) + 1;
|
|
Packit Service |
bca4e3 |
if (bind(clif_info->socket_fd, (struct sockaddr *)lp, addrlen) < 0) {
|
|
Packit Service |
bca4e3 |
rc = ENOMONCONN;
|
|
Packit Service |
bca4e3 |
goto err_close;
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
clif_info->dest.sun_family = AF_LOCAL;
|
|
Packit Service |
bca4e3 |
clif_info->dest.sun_path[0] = '\0';
|
|
Packit Service |
bca4e3 |
snprintf(&clif_info->dest.sun_path[1],
|
|
Packit Service |
bca4e3 |
sizeof(clif_info->dest.sun_path) - 1,
|
|
Packit Service |
bca4e3 |
"%s", CLIF_IFNAME);
|
|
Packit Service |
bca4e3 |
addrlen = sizeof(sa_family_t) + strlen(clif_info->dest.sun_path + 1) + 1;
|
|
Packit Service |
bca4e3 |
if (connect(clif_info->socket_fd, (struct sockaddr *)&clif_info->dest,
|
|
Packit Service |
bca4e3 |
addrlen) < 0) {
|
|
Packit Service |
bca4e3 |
rc = ENOMONCONN;
|
|
Packit Service |
bca4e3 |
goto err_close;
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
return rc;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
err_close:
|
|
Packit Service |
bca4e3 |
close(clif_info->socket_fd);
|
|
Packit Service |
bca4e3 |
return rc;
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
/*
|
|
Packit Service |
bca4e3 |
* Send request to fcoemon
|
|
Packit Service |
bca4e3 |
*/
|
|
Packit Service |
bca4e3 |
static enum fcoe_status
|
|
Packit Service |
bca4e3 |
fcoeadm_action(enum clif_action cmd, char *ifname, enum clif_flags flags)
|
|
Packit Service |
bca4e3 |
{
|
|
Packit Service |
bca4e3 |
struct clif_data data;
|
|
Packit Service |
bca4e3 |
struct clif_sock_info clif_info;
|
|
Packit Service |
bca4e3 |
int rc;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
if (ifname) {
|
|
Packit Service |
bca4e3 |
strncpy(data.ifname, ifname, IFNAMSIZ);
|
|
Packit Service |
bca4e3 |
data.ifname[IFNAMSIZ - 1] = '\0';
|
|
Packit Service |
bca4e3 |
} else
|
|
Packit Service |
bca4e3 |
data.ifname[0] = '\0';
|
|
Packit Service |
bca4e3 |
data.cmd = cmd;
|
|
Packit Service |
bca4e3 |
data.flags = flags;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
rc = fcoeadm_open_cli(&clif_info);
|
|
Packit Service |
bca4e3 |
if (!rc) {
|
|
Packit Service |
bca4e3 |
rc = fcoeadm_request(&clif_info, &data);
|
|
Packit Service |
bca4e3 |
if (rc > 0 && cmd == CLIF_PID_CMD) {
|
|
Packit Service |
bca4e3 |
printf("%d\n", rc);
|
|
Packit Service |
bca4e3 |
rc = 0;
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
fcoeadm_close_cli(&clif_info);
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
return rc;
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
#define MAX_ARG_LEN 32
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
/*
|
|
Packit Service |
bca4e3 |
* getopts_long(3) does not handle optional arguments
|
|
Packit Service |
bca4e3 |
* correctly. It will not allow a ' ' between the option
|
|
Packit Service |
bca4e3 |
* and its argument. For required arguments the user can
|
|
Packit Service |
bca4e3 |
* specify, '-i X' or '-iX' but with optional arguments
|
|
Packit Service |
bca4e3 |
* only the first style is valid.
|
|
Packit Service |
bca4e3 |
*
|
|
Packit Service |
bca4e3 |
* This is being worked around by making '-i/-t/-l' have
|
|
Packit Service |
bca4e3 |
* no arguments, but then process any following argv
|
|
Packit Service |
bca4e3 |
* elements.
|
|
Packit Service |
bca4e3 |
*/
|
|
Packit Service |
bca4e3 |
int main(int argc, char *argv[])
|
|
Packit Service |
bca4e3 |
{
|
|
Packit Service |
bca4e3 |
enum clif_action cmd = CLIF_NONE;
|
|
Packit Service |
bca4e3 |
enum fcoe_status rc = SUCCESS;
|
|
Packit Service |
bca4e3 |
enum clif_flags flags = CLIF_FLAGS_NONE;
|
|
Packit Service |
bca4e3 |
int opt, stat_interval;
|
|
Packit Service |
bca4e3 |
int op = -1;
|
|
Packit Service |
bca4e3 |
char *ifname = NULL;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
/*
|
|
Packit Service |
bca4e3 |
* This has to be first because the error print macro
|
|
Packit Service |
bca4e3 |
* expects progname to be valid.
|
|
Packit Service |
bca4e3 |
*/
|
|
Packit Service |
bca4e3 |
strncpy(progname, basename(argv[0]), sizeof(progname));
|
|
Packit Service |
bca4e3 |
progname[sizeof(progname) - 1] = '\0';
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
/* check if we have sysfs */
|
|
Packit Service |
bca4e3 |
if (fcoe_checkdir(SYSFS_MOUNT)) {
|
|
Packit Service |
bca4e3 |
rc = ENOSYSFS;
|
|
Packit Service |
bca4e3 |
goto err;
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
for (;;) {
|
|
Packit Service |
bca4e3 |
opt = getopt_long(argc, argv, optstring, fcoeadm_opts, NULL);
|
|
Packit Service |
bca4e3 |
if (opt < 0)
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
switch (opt) {
|
|
Packit Service |
bca4e3 |
case 'm':
|
|
Packit Service |
bca4e3 |
if (strcasecmp(optarg, "vn2vn") == 0) {
|
|
Packit Service |
bca4e3 |
flags &= ~CLIF_FLAGS_MODE_MASK;
|
|
Packit Service |
bca4e3 |
flags |= CLIF_FLAGS_VN2VN;
|
|
Packit Service |
bca4e3 |
} else if (strcasecmp(optarg, "fabric") == 0) {
|
|
Packit Service |
bca4e3 |
flags &= ~CLIF_FLAGS_MODE_MASK;
|
|
Packit Service |
bca4e3 |
} else {
|
|
Packit Service |
bca4e3 |
rc = EINVALARG;
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
default:
|
|
Packit Service |
bca4e3 |
if (op == -1)
|
|
Packit Service |
bca4e3 |
op = opt;
|
|
Packit Service |
bca4e3 |
else
|
|
Packit Service |
bca4e3 |
rc = EINVALARG;
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
case '?':
|
|
Packit Service |
bca4e3 |
rc = EIGNORE;
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
if (op == -1)
|
|
Packit Service |
bca4e3 |
fcoeadm_help();
|
|
Packit Service |
bca4e3 |
else if (rc == SUCCESS) {
|
|
Packit Service |
bca4e3 |
switch (op) {
|
|
Packit Service |
bca4e3 |
case 'd':
|
|
Packit Service |
bca4e3 |
cmd = CLIF_DESTROY_CMD;
|
|
Packit Service |
bca4e3 |
flags = 0; /* No flags allowed on destroy yet */
|
|
Packit Service |
bca4e3 |
/* fall through */
|
|
Packit Service |
bca4e3 |
case 'c':
|
|
Packit Service |
bca4e3 |
if (cmd == CLIF_NONE)
|
|
Packit Service |
bca4e3 |
cmd = CLIF_CREATE_CMD;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
if (argc - optind != 1) {
|
|
Packit Service |
bca4e3 |
rc = EBADNUMARGS;
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
ifname = argv[optind];
|
|
Packit Service |
bca4e3 |
rc = fcoeadm_action(cmd, ifname, flags);
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
case 'r':
|
|
Packit Service |
bca4e3 |
cmd = CLIF_RESET_CMD;
|
|
Packit Service |
bca4e3 |
/* fall through */
|
|
Packit Service |
bca4e3 |
case 'S':
|
|
Packit Service |
bca4e3 |
if (cmd == CLIF_NONE)
|
|
Packit Service |
bca4e3 |
cmd = CLIF_SCAN_CMD;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
if (argc - optind != 1) {
|
|
Packit Service |
bca4e3 |
rc = EBADNUMARGS;
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
ifname = argv[optind];
|
|
Packit Service |
bca4e3 |
rc = fcoe_validate_fcoe_conn(ifname);
|
|
Packit Service |
bca4e3 |
if (!rc)
|
|
Packit Service |
bca4e3 |
rc = fcoeadm_action(cmd, ifname, flags);
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
case 'i':
|
|
Packit Service |
bca4e3 |
if (argc - optind > 1) {
|
|
Packit Service |
bca4e3 |
rc = EBADNUMARGS;
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
/*
|
|
Packit Service |
bca4e3 |
* If there's an additional argument
|
|
Packit Service |
bca4e3 |
* treat it as the interface name.
|
|
Packit Service |
bca4e3 |
*/
|
|
Packit Service |
bca4e3 |
if (optind != argc) {
|
|
Packit Service |
bca4e3 |
ifname = argv[optind];
|
|
Packit Service |
bca4e3 |
rc = fcoe_validate_fcoe_conn(ifname);
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
if (!rc)
|
|
Packit Service |
bca4e3 |
rc = display_adapter_info(ifname);
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
case 'f':
|
|
Packit Service |
bca4e3 |
if (argc - optind > 1) {
|
|
Packit Service |
bca4e3 |
rc = EBADNUMARGS;
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
/*
|
|
Packit Service |
bca4e3 |
* If there's an aditional argument
|
|
Packit Service |
bca4e3 |
* treat it as the interface name.
|
|
Packit Service |
bca4e3 |
*/
|
|
Packit Service |
bca4e3 |
if (optind != argc) {
|
|
Packit Service |
bca4e3 |
ifname = argv[optind];
|
|
Packit Service |
bca4e3 |
rc = fcoe_validate_fcoe_conn(ifname);
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
if (!rc)
|
|
Packit Service |
bca4e3 |
rc = display_fcf_info(ifname);
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
case 't':
|
|
Packit Service |
bca4e3 |
if (argc - optind > 1) {
|
|
Packit Service |
bca4e3 |
rc = EBADNUMARGS;
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
/*
|
|
Packit Service |
bca4e3 |
* If there's an aditional argument
|
|
Packit Service |
bca4e3 |
* treat it as the interface name.
|
|
Packit Service |
bca4e3 |
*/
|
|
Packit Service |
bca4e3 |
if (optind != argc) {
|
|
Packit Service |
bca4e3 |
ifname = argv[optind];
|
|
Packit Service |
bca4e3 |
rc = fcoe_validate_fcoe_conn(ifname);
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
if (!rc)
|
|
Packit Service |
bca4e3 |
rc = display_target_info(ifname, DISP_TARG);
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
case 'l':
|
|
Packit Service |
bca4e3 |
if (argc - optind > 1) {
|
|
Packit Service |
bca4e3 |
rc = EBADNUMARGS;
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
/*
|
|
Packit Service |
bca4e3 |
* If there's an aditional argument
|
|
Packit Service |
bca4e3 |
* treat it as the interface name.
|
|
Packit Service |
bca4e3 |
*/
|
|
Packit Service |
bca4e3 |
if (optind != argc) {
|
|
Packit Service |
bca4e3 |
ifname = argv[optind];
|
|
Packit Service |
bca4e3 |
rc = fcoe_validate_fcoe_conn(ifname);
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
if (!rc)
|
|
Packit Service |
bca4e3 |
rc = display_target_info(ifname, DISP_LUN);
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
case 's':
|
|
Packit Service |
bca4e3 |
if (argc - optind > 2) {
|
|
Packit Service |
bca4e3 |
rc = EBADNUMARGS;
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
if (optind != argc) {
|
|
Packit Service |
bca4e3 |
ifname = argv[optind];
|
|
Packit Service |
bca4e3 |
rc = fcoe_validate_fcoe_conn(ifname);
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
if (!rc && ++optind != argc) {
|
|
Packit Service |
bca4e3 |
stat_interval = atoi(argv[optind]);
|
|
Packit Service |
bca4e3 |
if (stat_interval <= 0)
|
|
Packit Service |
bca4e3 |
rc = EINVALARG;
|
|
Packit Service |
bca4e3 |
} else if (!rc && optind == argc)
|
|
Packit Service |
bca4e3 |
stat_interval = DEFAULT_STATS_INTERVAL;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
if (!rc)
|
|
Packit Service |
bca4e3 |
rc = display_port_stats(ifname, stat_interval);
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
case 'p':
|
|
Packit Service |
bca4e3 |
rc = fcoeadm_action(CLIF_PID_CMD, NULL, flags);
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
case 'b':
|
|
Packit Service |
bca4e3 |
if (argc - optind > 2) {
|
|
Packit Service |
bca4e3 |
rc = EBADNUMARGS;
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
if (optind != argc) {
|
|
Packit Service |
bca4e3 |
ifname = argv[optind];
|
|
Packit Service |
bca4e3 |
rc = fcoe_validate_fcoe_conn(ifname);
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
if (!rc && ++optind != argc) {
|
|
Packit Service |
bca4e3 |
stat_interval = atoi(argv[optind]);
|
|
Packit Service |
bca4e3 |
if (stat_interval <= 0)
|
|
Packit Service |
bca4e3 |
rc = EINVALARG;
|
|
Packit Service |
bca4e3 |
} else if (!rc && optind == argc)
|
|
Packit Service |
bca4e3 |
stat_interval = DEFAULT_STATS_INTERVAL;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
if (!rc)
|
|
Packit Service |
bca4e3 |
rc = display_port_lesb_stats(ifname,
|
|
Packit Service |
bca4e3 |
stat_interval);
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
case 'v':
|
|
Packit Service |
bca4e3 |
if (argc - optind != 0) {
|
|
Packit Service |
bca4e3 |
rc = EBADNUMARGS;
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
printf("%s\n", FCOE_UTILS_VERSION);
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
case 'h':
|
|
Packit Service |
bca4e3 |
if (argc - optind != 0) {
|
|
Packit Service |
bca4e3 |
rc = EBADNUMARGS;
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
fcoeadm_help();
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
case '?':
|
|
Packit Service |
bca4e3 |
rc = EIGNORE;
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
err:
|
|
Packit Service |
bca4e3 |
if (rc) {
|
|
Packit Service |
bca4e3 |
switch (rc) {
|
|
Packit Service |
bca4e3 |
case EFAIL:
|
|
Packit Service |
bca4e3 |
FCOE_LOG_ERR("Command failed\n");
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
case ENOACTION:
|
|
Packit Service |
bca4e3 |
FCOE_LOG_ERR("No action was taken\n");
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
case EFCOECONN:
|
|
Packit Service |
bca4e3 |
FCOE_LOG_ERR("Connection already created on "
|
|
Packit Service |
bca4e3 |
"interface %s\n", ifname);
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
case ENOFCOECONN:
|
|
Packit Service |
bca4e3 |
case ENOFCHOST:
|
|
Packit Service |
bca4e3 |
FCOE_LOG_ERR("No connection created on "
|
|
Packit Service |
bca4e3 |
"interface %s\n", ifname);
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
case EINVALARG:
|
|
Packit Service |
bca4e3 |
FCOE_LOG_ERR("Invalid argument\n");
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
case EBADNUMARGS:
|
|
Packit Service |
bca4e3 |
/*
|
|
Packit Service |
bca4e3 |
* Overloading E2BIG for too many argumets
|
|
Packit Service |
bca4e3 |
* and too few arguments.
|
|
Packit Service |
bca4e3 |
*/
|
|
Packit Service |
bca4e3 |
FCOE_LOG_ERR("Incorrect number of arguments\n");
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
case EIGNORE:
|
|
Packit Service |
bca4e3 |
/*
|
|
Packit Service |
bca4e3 |
* getopt_long will print the initial error, just break
|
|
Packit Service |
bca4e3 |
* through to get the --help suggestion.
|
|
Packit Service |
bca4e3 |
*/
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
case ENOETHDEV:
|
|
Packit Service |
bca4e3 |
FCOE_LOG_ERR("Invalid interface name %s\n", ifname);
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
case ENOSYSFS:
|
|
Packit Service |
bca4e3 |
FCOE_LOG_ERR("sysfs not mounted\n");
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
case ENOMONCONN:
|
|
Packit Service |
bca4e3 |
FCOE_LOG_ERR("Could not connect to fcoemon\n");
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
case ECONNTMOUT:
|
|
Packit Service |
bca4e3 |
FCOE_LOG_ERR("Connection to fcoemon timed out\n");
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
case EHBAAPIERR:
|
|
Packit Service |
bca4e3 |
FCOE_LOG_ERR("libHBAAPI or libhbalinux error\n");
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
case EINTERR:
|
|
Packit Service |
bca4e3 |
FCOE_LOG_ERR("Internal error\n");
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
case EBADCLIFMSG:
|
|
Packit Service |
bca4e3 |
FCOE_LOG_ERR("Messaging error\n");
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
default:
|
|
Packit Service |
bca4e3 |
/*
|
|
Packit Service |
bca4e3 |
* This will catch EOPNOTSUPP which should never happen
|
|
Packit Service |
bca4e3 |
*/
|
|
Packit Service |
bca4e3 |
FCOE_LOG_ERR("Unknown error code %d\n", rc);
|
|
Packit Service |
bca4e3 |
break;
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
fprintf(stderr, "Try \'%s --help\' for more information.\n",
|
|
Packit Service |
bca4e3 |
progname);
|
|
Packit Service |
bca4e3 |
}
|
|
Packit Service |
bca4e3 |
|
|
Packit Service |
bca4e3 |
return rc;
|
|
Packit Service |
bca4e3 |
}
|