File fcoe-utils-rc1-update of Package open-fcoe
fixes for RC1
From: Vasu Dev <vasu.dev@intel.com>
This brings up SP1 to this open-fcoe commit:-
commit 9403c2aaac0b79d0d236ef9413cc88b7d6f7f04e
Author: Robert Love <robert.w.love@intel.com>
Date: Fri Mar 12 16:41:32 2010 -0800
fcoe-utils: Increment fcoe-utils version from 1.0.11 to 1.0.12
Signed-off-by: Vasu Dev <vasu.dev@intel.com>
---
INSTALL | 2
QUICKSTART | 26 ++
configure.ac | 2
fcoe_utils.c | 3
fcoe_utils.h | 3
fcoeadm.c | 160 +++++----------
fcoeadm.h | 71 -------
fcoeadm_display.c | 555 +++++++++++++++++++++++++++--------------------------
fcoeadm_display.h | 36 +++
fcoemon.c | 24 +-
fcoemon_utils.c | 62 ------
fcoemon_utils.h | 15 -
13 files changed, 504 insertions(+), 690 deletions(-)
delete mode 100644 fcoeadm.h
create mode 100644 fcoeadm_display.h
diff --git a/INSTALL b/INSTALL
index c974282..9cd35f6 100644
--- a/INSTALL
+++ b/INSTALL
@@ -9,7 +9,7 @@ their corresponding manual pages.
DEPENDENCIES
* libhbalinux
-* dcbd (optional configure flag to build without)
+* dcbd v0.9.24 or greater (optional configure flag to build without)
* autoconf
* autotools
diff --git a/QUICKSTART b/QUICKSTART
index a1789af..766c068 100644
--- a/QUICKSTART
+++ b/QUICKSTART
@@ -88,8 +88,8 @@ DEPENDENCIES
PROCESS
-1) Obtain the source tarball from sourceforge
- http://sourceforge.net/projects/e1000/files/DCB%20Tools/0.9.19/dcbd-0.9.19.tar.gz/download
+1) Obtain the latest source tarball from sourceforge
+ http://sourceforge.net/projects/e1000/files/DCB%20Tools/
2) Untar the tarball and change into it's directory
# tar -xvzf dcbd-x.y.z.tar.gz
@@ -169,7 +169,7 @@ PROCESS
DEPENDENCIES
* libhbalinux
-* dcbd (optional configure flag to build without)
+* dcbd v0.9.24 or greater (optional configure flag to build without)
* autoconf
* autotools
@@ -207,20 +207,28 @@ PROCESS
This example sets up a VLAN (101) for interface eth3 and configures the
system to automatically connect to storage over this interface.
-1) Create a VLAN
+1) Discover VLANs
+ # fipvlan -a
+ Fibre Channel Forwarders Discovered
+ interface | VLAN | FCF MAC
+ ------------------------------------
+ eth3 | 101 | 00:0d:ec:a3:3a:80
+
+2) Create a VLAN
# cd /etc/sysconfig/network-scripts/
# cp ifcfg-eth3 ifcfg-eth3.101
+
Edit ifcfg-eth3.101 so the file has the following settings,
DEVICE=eth3.101
VLAN=yes
ONBOOT=yes
-2) Congigure fcoe for the VLAN
+3) Configure fcoe for the VLAN
# cd /etc/fcoe/
# cp cfg-ethx cfg-eth3.101
-3) Start dcbd and configure the VLAN interface
+4) Start dcbd and configure the VLAN interface
# /etc/init.d/dcbd start
# dcbtool sc eth3 dcb on
# dcbtool sc eth3 pfc e:1
@@ -235,12 +243,12 @@ system to automatically connect to storage over this interface.
Follow the suggestions and repeatedly run the script until it states that
DCB is configured correctly.
-4) Start fcoe
+5) Start fcoe
# /etc/init.d/fcoe start
- After a few moments your storage should apear (assuming everything is
+ After a few moments your storage should appear (assuming everything is
configured correctly on the fabric)
-5) Setup dcbd and fcoe to start when booting
+6) Setup dcbd and fcoe to start when booting
# chkconfig dcbd on
# chkconfig fcoe on
diff --git a/configure.ac b/configure.ac
index 60817e6..517b9c2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,4 +1,4 @@
-AC_INIT([fcoe-utils], [1.0.11], [devel@open-fcoe.org])
+AC_INIT([fcoe-utils], [1.0.12], [devel@open-fcoe.org])
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
AC_PROG_CC
diff --git a/fcoe_utils.c b/fcoe_utils.c
index 016dc0f..506356d 100644
--- a/fcoe_utils.c
+++ b/fcoe_utils.c
@@ -171,6 +171,9 @@ int check_symbolic_name_for_interface(const char *symbolic_name,
int rc = -EINVAL;
char *symb;
+ if (!ifname)
+ return rc;
+
symb = get_ifname_from_symbolic_name(symbolic_name);
/*
diff --git a/fcoe_utils.h b/fcoe_utils.h
index 3215804..3c43304 100644
--- a/fcoe_utils.h
+++ b/fcoe_utils.h
@@ -61,6 +61,7 @@
enum fcoe_err {
NOERR = 0, /* No error */
+ EFCOECONN, /* FCoE connection already exists */
ENOFCOECONN, /* No FCoE connection on interface */
EINTERR, /* Internal error */
EINVALARG, /* Invalid argument */
@@ -74,11 +75,11 @@ enum fcoe_err {
};
enum fcoe_err fcoe_validate_interface(char *ifname);
+enum fcoe_err fcoe_validate_fcoe_conn(char *ifname);
enum fcoe_err fcoe_find_fchost(char *ifname, char *fchost, int len);
int fcoe_checkdir(char *dir);
int check_symbolic_name_for_interface(const char *symbolic_name,
const char *ifname);
char *get_ifname_from_symbolic_name(const char *symbolic_name);
-int valid_ifname(const char *ifname);
#endif /* _FCOE_UTILS_H_ */
diff --git a/fcoeadm.c b/fcoeadm.c
index 97cd1bd..0498e27 100644
--- a/fcoeadm.c
+++ b/fcoeadm.c
@@ -21,10 +21,17 @@
#include <paths.h>
#include <net/if.h>
#include <sys/un.h>
-
+#include <getopt.h>
+#include <dirent.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "fcoe_utils.h"
#include "fcoe_utils_version.h"
-#include "fcoeadm.h"
#include "fcoe_clif.h"
+#include "fcoeadm_display.h"
static const char *optstring = "c:d:r:S:itlshv";
static struct option fcoeadm_opts[] = {
@@ -40,7 +47,6 @@ static struct option fcoeadm_opts[] = {
{0, 0, 0, 0}
};
-struct opt_info _opt_info, *opt_info = &_opt_info;
char progname[20];
static void fcoeadm_help(void)
@@ -141,7 +147,6 @@ static void fcoeadm_close_cli(struct clif_sock_info *clif_info)
*/
static enum fcoe_err fcoeadm_open_cli(struct clif_sock_info *clif_info)
{
- int counter;
enum fcoe_err rc = NOERR;
clif_info->socket_fd = socket(PF_UNIX, SOCK_DGRAM, 0);
@@ -152,7 +157,7 @@ static enum fcoe_err fcoeadm_open_cli(struct clif_sock_info *clif_info)
clif_info->local.sun_family = AF_UNIX;
snprintf(clif_info->local.sun_path, sizeof(clif_info->local.sun_path),
- "/tmp/fcadm_clif_%d-%d", getpid(), counter++);
+ "/tmp/fcadm_clif_%d", getpid());
if (bind(clif_info->socket_fd, (struct sockaddr *)&clif_info->local,
sizeof(clif_info->local)) < 0) {
@@ -200,62 +205,6 @@ static enum fcoe_err fcoeadm_action(enum clif_action cmd, char *ifname)
return rc;
}
-static enum fcoe_err fcoeadm_loadhba()
-{
- if (HBA_STATUS_OK != HBA_LoadLibrary())
- return EHBAAPIERR;
-
- return NOERR;
-}
-
-/*
- * Display adapter information
- */
-static enum fcoe_err fcoeadm_display_adapter_info(struct opt_info *opt_info)
-{
- if (fcoeadm_loadhba())
- return EHBAAPIERR;
-
- display_adapter_info(opt_info);
-
- HBA_FreeLibrary();
- return NOERR;
-}
-
-/*
- * Display target information
- */
-static enum fcoe_err fcoeadm_display_target_info(struct opt_info *opt_info)
-{
- if (fcoeadm_loadhba())
- return EHBAAPIERR;
-
- display_target_info(opt_info);
-
- HBA_FreeLibrary();
- return NOERR;
-}
-
-/*
- * Display port statistics
- */
-static int fcoeadm_display_port_stats(struct opt_info *opt_info)
-{
- if (!opt_info->s_flag)
- return -EINVAL;
-
- if (!opt_info->n_flag)
- opt_info->n_interval = DEFAULT_STATS_INTERVAL;
-
- if (fcoeadm_loadhba())
- return -EINVAL;
-
- display_port_stats(opt_info);
-
- HBA_FreeLibrary();
- return 0;
-}
-
#define MAX_ARG_LEN 32
/*
@@ -271,9 +220,10 @@ static int fcoeadm_display_port_stats(struct opt_info *opt_info)
*/
int main(int argc, char *argv[])
{
- int opt;
enum clif_action cmd = CLIF_NONE;
enum fcoe_err rc = NOERR;
+ int opt, stat_interval;
+ char *ifname = NULL;
/*
* This has to be first because the error print macro
@@ -292,8 +242,6 @@ int main(int argc, char *argv[])
if (rc)
goto err;
- memset(opt_info, 0, sizeof(*opt_info));
-
opt = getopt_long(argc, argv, optstring, fcoeadm_opts, NULL);
if (opt != -1) {
switch (opt) {
@@ -314,16 +262,18 @@ int main(int argc, char *argv[])
break;
}
- strncpy(opt_info->ifname, optarg,
- sizeof(opt_info->ifname));
+ ifname = optarg;
- if (opt == 'c')
- rc = fcoe_validate_interface(opt_info->ifname);
- else
- rc = fcoe_validate_fcoe_conn(opt_info->ifname);
+ if (opt == 'c') {
+ rc = fcoe_validate_interface(ifname);
+ if (!rc &&
+ !fcoe_validate_fcoe_conn(ifname))
+ rc = EFCOECONN;
+ } else
+ rc = fcoe_validate_fcoe_conn(ifname);
if (!rc)
- rc = fcoeadm_action(cmd, opt_info->ifname);
+ rc = fcoeadm_action(cmd, ifname);
break;
case 'i':
@@ -337,14 +287,12 @@ int main(int argc, char *argv[])
* treat it as the interface name.
*/
if (optind != argc) {
- strncpy(opt_info->ifname, argv[optind],
- sizeof(opt_info->ifname));
-
- rc = fcoe_validate_fcoe_conn(opt_info->ifname);
+ ifname = argv[optind];
+ rc = fcoe_validate_fcoe_conn(ifname);
}
if (!rc)
- rc = fcoeadm_display_adapter_info(opt_info);
+ rc = display_adapter_info(ifname);
break;
@@ -359,16 +307,12 @@ int main(int argc, char *argv[])
* treat it as the interface name.
*/
if (optind != argc) {
- strncpy(opt_info->ifname, argv[optind],
- sizeof(opt_info->ifname));
-
- rc = fcoe_validate_fcoe_conn(opt_info->ifname);
+ ifname = argv[optind];
+ rc = fcoe_validate_fcoe_conn(ifname);
}
- if (!rc) {
- opt_info->t_flag = 1;
- rc = fcoeadm_display_target_info(opt_info);
- }
+ if (!rc)
+ rc = display_target_info(ifname, DISP_TARG);
break;
@@ -383,16 +327,12 @@ int main(int argc, char *argv[])
* treat it as the interface name.
*/
if (optind != argc) {
- strncpy(opt_info->ifname, argv[optind],
- sizeof(opt_info->ifname));
-
- rc = fcoe_validate_fcoe_conn(opt_info->ifname);
+ ifname = argv[optind];
+ rc = fcoe_validate_fcoe_conn(ifname);
}
- if (!rc) {
- opt_info->l_flag = 1;
- rc = fcoeadm_display_target_info(opt_info);
- }
+ if (!rc)
+ rc = display_target_info(ifname, DISP_LUN);
break;
@@ -403,25 +343,19 @@ int main(int argc, char *argv[])
}
if (optind != argc) {
- strncpy(opt_info->ifname, argv[optind],
- sizeof(opt_info->ifname));
-
- rc = fcoe_validate_fcoe_conn(opt_info->ifname);
+ ifname = argv[optind];
+ rc = fcoe_validate_fcoe_conn(ifname);
}
if (!rc && ++optind != argc) {
- opt_info->n_interval = atoi(argv[optind]);
- if (opt_info->n_interval <= 0)
+ stat_interval = atoi(argv[optind]);
+ if (stat_interval <= 0)
rc = EINVALARG;
- else
- opt_info->n_flag = 1;
- }
-
- if (!rc) {
- opt_info->s_flag = 1;
- rc = fcoeadm_display_port_stats(opt_info);
- }
+ } else if (!rc && optind == argc)
+ stat_interval = DEFAULT_STATS_INTERVAL;
+ if (!rc)
+ rc = display_port_stats(ifname, stat_interval);
break;
case 'v':
@@ -451,9 +385,14 @@ int main(int argc, char *argv[])
err:
if (rc) {
switch (rc) {
+ case EFCOECONN:
+ FCOE_LOG_ERR("Connection already created on "
+ "interface %s\n", ifname);
+ break;
+
case ENOFCOECONN:
FCOE_LOG_ERR("No connection created on "
- "interface %s\n", opt_info->ifname);
+ "interface %s\n", ifname);
break;
case EINVALARG:
@@ -476,8 +415,7 @@ err:
break;
case ENOETHDEV:
- FCOE_LOG_ERR("Invalid interface name %s\n",
- opt_info->ifname);
+ FCOE_LOG_ERR("Invalid interface name %s\n", ifname);
break;
case ENOSYSFS:
@@ -492,6 +430,10 @@ err:
FCOE_LOG_ERR("Connection to fcoemon timed out\n");
break;
+ case EHBAAPIERR:
+ FCOE_LOG_ERR("libHBAAPI or libhbalinux error\n");
+ break;
+
case EINTERR:
FCOE_LOG_ERR("Internal error\n");
break;
diff --git a/fcoeadm.h b/fcoeadm.h
deleted file mode 100644
index 8536fb7..0000000
--- a/fcoeadm.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright(c) 2009 Intel Corporation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Maintained at www.Open-FCoE.org
- */
-
-#ifndef _FCOEADM_H_
-#define _FCOEADM_H_
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/param.h>
-#include <sys/ioctl.h>
-#include <linux/types.h>
-#include <ctype.h>
-
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <unistd.h>
-#include <dirent.h>
-#include <time.h>
-#include <fcntl.h>
-#include <malloc.h>
-#include <pthread.h>
-#include <limits.h>
-#include <scsi/sg.h>
-#include <getopt.h>
-#include <byteswap.h>
-#include <net/if.h>
-#include "hbaapi.h"
-#include "net_types.h"
-#include "fc_types.h"
-#include "fc_scsi.h"
-
-#include "fcoe_utils.h"
-
-struct opt_info {
- char ifname[IFNAMSIZ];
- char a_flag;
- char t_flag;
- char l_flag;
- char l_fcid_present;
- HBA_UINT32 l_fcid;
- char l_lun_id_present;
- u_int32_t l_lun_id;
- char s_flag;
- char n_flag;
- #define DEFAULT_STATS_INTERVAL 1
- int n_interval; /* seconds */
-};
-
-void display_adapter_info(struct opt_info *opt_info);
-void display_target_info(struct opt_info *opt_info);
-void display_port_stats(struct opt_info *opt_info);
-
-#endif /* _FCOEADM_H_ */
diff --git a/fcoeadm_display.c b/fcoeadm_display.c
index 8687bb3..9d5690d 100644
--- a/fcoeadm_display.c
+++ b/fcoeadm_display.c
@@ -17,7 +17,29 @@
* Maintained at www.Open-FCoE.org
*/
-#include "fcoeadm.h"
+#include <sys/param.h>
+#include <sys/ioctl.h>
+#include <linux/types.h>
+#include <ctype.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <time.h>
+#include <malloc.h>
+#include <pthread.h>
+#include <limits.h>
+#include <scsi/sg.h>
+#include <byteswap.h>
+#include <net/if.h>
+#include <unistd.h>
+
+#include "net_types.h"
+#include "fc_types.h"
+#include "fc_scsi.h"
+#include "hbaapi.h"
+#include "fcoeadm_display.h"
+#include "fcoe_utils.h"
/* #define TEST_HBAAPI_V1 */
#ifdef TEST_HBAAPI_V1
@@ -50,6 +72,18 @@ struct sa_nameval {
u_int32_t nv_val;
};
+/*
+ * HBA and port objects are one-to-one since there
+ * is one host created per Ethernet port (vlan).
+ */
+struct hba_name_table {
+ HBA_HANDLE hba_handle;
+ HBA_ADAPTERATTRIBUTES hba_attrs;
+ HBA_PORTATTRIBUTES port_attrs;
+ int failed;
+ int displayed;
+};
+
struct sa_nameval port_states[] = {
{ "Not Present", HBA_PORTSTATE_UNKNOWN },
{ "Online", HBA_PORTSTATE_ONLINE },
@@ -215,10 +249,8 @@ static void show_wwn(unsigned char *pWwn)
sa_dump_wwn(pWwn, 8, 0);
}
-static void
-show_hba_info(int hba_index, HBA_ADAPTERATTRIBUTES *hba_info, int flags)
+static void show_hba_info(HBA_ADAPTERATTRIBUTES *hba_info)
{
- printf("Adapter #%d\n", hba_index);
printf(" Description: %s\n", hba_info->ModelDescription);
printf(" Revision: %s\n", hba_info->HardwareVersion);
printf(" Manufacturer: %s\n", hba_info->Manufacturer);
@@ -229,16 +261,12 @@ show_hba_info(int hba_index, HBA_ADAPTERATTRIBUTES *hba_info, int flags)
printf("\n");
}
-static void
-show_port_info(int hba_index, int lp_index,
- HBA_ADAPTERATTRIBUTES *hba_info,
- HBA_PORTATTRIBUTES *lp_info)
+static void show_port_info(HBA_ADAPTERATTRIBUTES *hba_info,
+ HBA_PORTATTRIBUTES *lp_info)
{
char buf[256];
int len = sizeof(buf);
- printf(" Port #%d\n", lp_index);
-
printf(" Symbolic Name: %s\n",
lp_info->PortSymbolicName);
@@ -275,8 +303,7 @@ show_port_info(int hba_index, int lp_index,
/* TODO: Display PortSupportedFc4Types and PortActiveFc4Types */
}
-static void show_target_info(const char *symbolic_name, int hba_index,
- int lp_index, int rp_index,
+static void show_target_info(const char *symbolic_name,
HBA_ADAPTERATTRIBUTES *hba_info,
HBA_PORTATTRIBUTES *rp_info)
{
@@ -287,9 +314,8 @@ static void show_target_info(const char *symbolic_name, int hba_index,
ifname = get_ifname_from_symbolic_name(symbolic_name);
- printf("Target #%d @ %s\n", rp_index, ifname);
-
rc = sa_sys_read_line(rp_info->OSDeviceName, "roles", buf, sizeof(buf));
+ printf(" Interface: %s\n", ifname);
printf(" Roles: %s\n", buf);
printf(" Node Name: 0x");
@@ -893,7 +919,8 @@ scan_device_map(HBA_HANDLE hba_handle,
HBA_ADAPTERATTRIBUTES *hba_info,
HBA_PORTATTRIBUTES *lp_info,
HBA_PORTATTRIBUTES *rp_info,
- struct opt_info *opt_info)
+ const char *ifname,
+ enum disp_style style)
{
HBA_STATUS status;
HBA_FCP_TARGET_MAPPING *map = NULL;
@@ -917,11 +944,6 @@ scan_device_map(HBA_HANDLE hba_handle,
if (ep->FcpId.FcId != rp_info->PortFcId)
continue;
- if (opt_info->l_flag &&
- opt_info->l_fcid_present &&
- opt_info->l_lun_id_present &&
- ep->ScsiId.ScsiOSLun != opt_info->l_lun_id)
- continue;
dev = ep->ScsiId.OSDeviceName;
if (strstr(dev, "/dev/") == dev)
dev += 5;
@@ -949,15 +971,19 @@ scan_device_map(HBA_HANDLE hba_handle,
#endif
if (status != HBA_STATUS_OK)
continue;
- if (opt_info->t_flag) {
+ switch (style) {
+ case DISP_TARG:
if (!print_header) {
show_short_lun_info_header();
print_header = 1;
}
show_short_lun_info(ep, inqbuf, &rcap_resp);
- } else if (opt_info->l_flag)
+ break;
+ case DISP_LUN:
show_full_lun_info(hba_handle, hba_info, lp_info,
- rp_info, ep, inqbuf, &rcap_resp);
+ rp_info, ep, inqbuf, &rcap_resp);
+ break;
+ }
#ifdef TEST_REPORT_LUNS
if (i == 0) { /* only issue report luns to the first LUN */
@@ -971,25 +997,24 @@ scan_device_map(HBA_HANDLE hba_handle,
}
/* Newline at the end of the short lun report */
- if (opt_info->t_flag)
+ if (style == DISP_TARG)
printf("\n");
free(map);
}
-static void
-show_port_stats_header(struct opt_info *opt_info)
+static void show_port_stats_header(const char *ifname, int interval)
{
printf("\n");
printf("%-7s interval: %-2d Err Inv "
- "IvTx Link Cntl Input Input Output Output\n",
- opt_info->ifname, opt_info->n_interval);
+ "IvTx Link Cntl Input Input Output Output\n",
+ ifname, interval);
printf("Seconds TxFrames TxBytes RxFrames RxBytes "
- "Frms CRC Byte Fail Reqs Requests MBytes "
- "Requests MBytes\n");
+ "Frms CRC Byte Fail Reqs Requests MBytes "
+ "Requests MBytes\n");
printf("------- --------- ------------ --------- -------------- "
- "---- ---- ---- ---- ---- --------- --------- "
- "--------- ---------\n");
+ "---- ---- ---- ---- ---- --------- --------- "
+ "--------- ---------\n");
}
static void
@@ -1014,44 +1039,74 @@ show_port_stats_in_row(HBA_INT64 start_time,
printf("\n");
}
+static void hba_table_destroy(struct hba_name_table *hba_table)
+{
+ int i;
+
+ /*
+ * This is inefficiant as is closes adapter handles
+ * (presumedly 0) that weren't open. However, it allows
+ * us to avoid maintaining a count.
+ */
+ for (i = 0 ; i < MAX_HBA_COUNT ; i++)
+ HBA_CloseAdapter(hba_table[i].hba_handle);
+}
-void
-display_port_stats(struct opt_info *opt_info)
+static enum fcoe_err fcoeadm_loadhba()
+{
+ if (HBA_STATUS_OK != HBA_LoadLibrary())
+ return EHBAAPIERR;
+
+ return NOERR;
+}
+
+/*
+ * This routine leaves all adapters fd's open.
+ */
+static int hba_table_init(struct hba_name_table *hba_table)
{
HBA_STATUS retval;
- HBA_UINT32 hba_cnt;
- HBA_HANDLE hba_handle;
- HBA_ADAPTERATTRIBUTES hba_attrs;
- HBA_PORTATTRIBUTES port_attrs;
- HBA_PORTSTATISTICS port_stats;
- HBA_FC4STATISTICS port_fc4stats;
- HBA_INT64 start_time = 0;
- char namebuf[1028];
- int i = 0, found = 0;
+ char namebuf[1024];
+ int i, j, num_hbas = 0;
+
+ /*
+ * Initialize the table.
+ */
+ for (i = 0 ; i < MAX_HBA_COUNT ; i++) {
+ memset(&hba_table[i], 0,
+ sizeof(struct hba_name_table));
+ }
- hba_cnt = HBA_GetNumberOfAdapters();
- if (!hba_cnt) {
+ num_hbas = HBA_GetNumberOfAdapters();
+ if (!num_hbas) {
fprintf(stderr, "No FCoE interfaces created.\n");
- return;
+ return num_hbas;
}
- for (i = 0; i < hba_cnt; i++) {
+ /*
+ * Fill out the HBA table.
+ */
+ for (i = 0; i < num_hbas ; i++) {
retval = HBA_GetAdapterName(i, namebuf);
if (retval != HBA_STATUS_OK) {
- fprintf(stderr, "Failure of HBA_GetAdapterName: %d\n",
- retval);
+ fprintf(stderr,
+ "Failure of HBA_GetAdapterName: %d\n", retval);
continue;
}
- hba_handle = HBA_OpenAdapter(namebuf);
- if (!hba_handle) {
+ hba_table[i].hba_handle = HBA_OpenAdapter(namebuf);
+ if (!hba_table[i].hba_handle) {
+ hba_table[i].failed = 1;
fprintf(stderr, "HBA_OpenAdapter failed\n");
perror("HBA_OpenAdapter");
continue;
}
- retval = HBA_GetAdapterAttributes(hba_handle, &hba_attrs);
+ retval = HBA_GetAdapterAttributes(hba_table[i].hba_handle,
+ &hba_table[i].hba_attrs);
if (retval != HBA_STATUS_OK) {
+ HBA_CloseAdapter(hba_table[i].hba_handle);
+ hba_table[i].failed = 1;
fprintf(stderr,
"HBA_GetAdapterAttributes failed, retval=%d\n",
retval);
@@ -1059,34 +1114,77 @@ display_port_stats(struct opt_info *opt_info)
continue;
}
- retval = HBA_GetAdapterPortAttributes(
- hba_handle, 0, &port_attrs);
+ retval = HBA_GetAdapterPortAttributes(hba_table[i].hba_handle,
+ 0,
+ &hba_table[i].port_attrs);
if (retval != HBA_STATUS_OK) {
+ HBA_CloseAdapter(hba_table[i].hba_handle);
+ hba_table[i].failed = 1;
fprintf(stderr,
"HBA_GetAdapterPortAttributes failed, "
- "status=%d\n", retval);
+ "j=%d, status=%d\n", j, retval);
continue;
}
+ }
+
+ return num_hbas;
+}
+
+/*
+ * This routine expects a valid interface name.
+ */
+static int get_index_for_ifname(struct hba_name_table *hba_table,
+ int num_hbas, const char *ifname)
+{
+ int i;
+ for (i = 0 ; i < num_hbas ; i++) {
if (!check_symbolic_name_for_interface(
- port_attrs.PortSymbolicName,
- opt_info->ifname)) {
- found = 1;
- break;
- }
+ hba_table[i].port_attrs.PortSymbolicName,
+ ifname))
+ return i;
}
- if (!found) {
- fprintf(stderr, "Cannot find attributes for %s\n",
- opt_info->ifname);
- return;
+ return -EINVAL;
+}
+
+enum fcoe_err display_port_stats(const char *ifname, int interval)
+{
+ HBA_STATUS retval;
+ HBA_HANDLE hba_handle;
+ HBA_PORTATTRIBUTES *port_attrs;
+ HBA_PORTSTATISTICS port_stats;
+ HBA_FC4STATISTICS port_fc4stats;
+ HBA_INT64 start_time = 0;
+ struct hba_name_table hba_table[MAX_HBA_COUNT];
+ enum fcoe_err rc = NOERR;
+ int i, num_hbas;
+
+ if (fcoeadm_loadhba())
+ return EHBAAPIERR;
+
+ num_hbas = hba_table_init(hba_table);
+
+ i = get_index_for_ifname(hba_table, num_hbas, ifname);
+
+ /*
+ * Return error code if a valid index wasn't returned.
+ */
+ if (i < 0) {
+ hba_table_destroy(hba_table);
+ HBA_FreeLibrary();
+ return EHBAAPIERR;
}
+ hba_handle = hba_table[i].hba_handle;
+ port_attrs = &hba_table[i].port_attrs;
+
i = 0;
while (1) {
unsigned int secs_left;
- retval = HBA_GetPortStatistics(hba_handle, 0, &port_stats);
+ retval = HBA_GetPortStatistics(hba_handle,
+ 0, &port_stats);
if (retval != HBA_STATUS_OK &&
retval != HBA_STATUS_ERROR_NOT_SUPPORTED) {
fprintf(stderr,
@@ -1097,7 +1195,7 @@ display_port_stats(struct opt_info *opt_info)
if (retval == HBA_STATUS_ERROR_NOT_SUPPORTED) {
fprintf(stderr,
"Port Statistics not supported by %s\n",
- opt_info->ifname);
+ ifname);
break;
}
@@ -1105,7 +1203,7 @@ display_port_stats(struct opt_info *opt_info)
start_time = port_stats.SecondsSinceLastReset;
retval = HBA_GetFC4Statistics(hba_handle,
- port_attrs.PortWWN,
+ port_attrs->PortWWN,
FC_TYPE_FCP,
&port_fc4stats);
if (retval != HBA_STATUS_OK &&
@@ -1117,263 +1215,172 @@ display_port_stats(struct opt_info *opt_info)
if (retval == HBA_STATUS_ERROR_NOT_SUPPORTED) {
fprintf(stderr,
"Port FC4 Statistics not supported by %s\n",
- opt_info->ifname);
+ ifname);
break;
}
if (!(i % 52))
- show_port_stats_header(opt_info);
+ show_port_stats_header(ifname, interval);
show_port_stats_in_row(start_time, &port_stats, &port_fc4stats);
i++;
/* wait for the requested time interval in seconds */
- secs_left = opt_info->n_interval;
+ secs_left = interval;
do {
secs_left = sleep(secs_left);
} while (secs_left);
}
- HBA_CloseAdapter(hba_handle);
- return;
-}
-
-static struct hba_name_table {
- char SerialNumber[64];
- int index;
-} hba_name_table[MAX_HBA_COUNT];
-
-static int
-find_hba_index(char *serial_number, int *hba_index)
-{
- int i, j;
-
- j = sizeof(hba_name_table[0].SerialNumber) - 1;
- for (i = 0; i < MAX_HBA_COUNT; i++) {
- if (hba_name_table[i].index == -1) {
- /* not found */
- hba_name_table[i].index = i;
- /* TODO: change to sa_strncpy_safe */
- strncpy(hba_name_table[i].SerialNumber,
- serial_number, j);
- *hba_index = i;
- return 1; /* print hba info */
- }
- if (!strncmp(serial_number,
- hba_name_table[i].SerialNumber, j)) {
- *hba_index = hba_name_table[i].index;
- return 0; /* do not print hba info */
- }
- }
- /* table full */
- return -1;
+ hba_table_destroy(hba_table);
+ HBA_FreeLibrary();
+ return rc;
}
-void
-display_adapter_info(struct opt_info *opt_info)
+enum fcoe_err display_adapter_info(const char *ifname)
{
- HBA_STATUS retval;
- HBA_UINT32 hba_cnt;
- HBA_UINT32 lport_cnt_per_hba = 1; /* always one port per hba */
- HBA_HANDLE hba_handle;
- HBA_ADAPTERATTRIBUTES hba_attrs;
- HBA_PORTATTRIBUTES port_attrs;
- char namebuf[1028];
- int i, j, rc;
- int hba_index = -1;
- int lp_index = -1;
-
- for (i = 0; i < MAX_HBA_COUNT; i++) {
- hba_name_table[i].index = -1;
- memset(hba_name_table[i].SerialNumber, 0,
- sizeof(hba_name_table[i].SerialNumber));
- }
+ struct hba_name_table hba_table[MAX_HBA_COUNT];
+ enum fcoe_err rc = NOERR;
+ int i, j, num_hbas = 0;
- hba_cnt = HBA_GetNumberOfAdapters();
- if (!hba_cnt) {
- fprintf(stderr, "No FCoE interfaces created.\n");
- return;
- }
+ if (fcoeadm_loadhba())
+ return EHBAAPIERR;
- for (i = 0; i < hba_cnt; i++) {
- retval = HBA_GetAdapterName(i, namebuf);
- if (retval != HBA_STATUS_OK) {
- fprintf(stderr,
- "Failure of HBA_GetAdapterName: %d\n", retval);
- continue;
- }
+ num_hbas = hba_table_init(hba_table);
- hba_handle = HBA_OpenAdapter(namebuf);
- if (!hba_handle) {
- fprintf(stderr, "HBA_OpenAdapter failed\n");
- perror("HBA_OpenAdapter");
+ /*
+ * Loop through each HBA entry and for each serial number
+ * not already printed print the header and each sub-port
+ * on that adapter.
+ */
+ for (i = 0 ; i < num_hbas ; i++) {
+ if (hba_table[i].failed ||
+ hba_table[i].displayed)
continue;
- }
- retval = HBA_GetAdapterAttributes(hba_handle, &hba_attrs);
- if (retval != HBA_STATUS_OK) {
- fprintf(stderr,
- "HBA_GetAdapterAttributes failed, retval=%d\n",
- retval);
- perror("HBA_GetAdapterAttributes");
+ if (ifname && check_symbolic_name_for_interface(
+ hba_table[i].port_attrs.PortSymbolicName,
+ ifname)) {
+ /*
+ * Overloading 'displayed' to indicate
+ * that the HBA/Port should be skipped.
+ */
+ hba_table[i].displayed = 1;
continue;
}
- rc = find_hba_index(hba_attrs.SerialNumber, &hba_index);
- if (rc == -1) {
- fprintf(stderr,
- "Too many adapters. Maximum %d\n",
- MAX_HBA_COUNT);
- return;
- } else if (rc == 1)
- show_hba_info(hba_index, &hba_attrs, 0);
-
- for (j = 0; j < lport_cnt_per_hba; j++) {
- retval = HBA_GetAdapterPortAttributes(
- hba_handle, j, &port_attrs);
- if (retval != HBA_STATUS_OK) {
- fprintf(stderr,
- "HBA_GetAdapterPortAttributes failed, "
- "j=%d, status=%d\n", j, retval);
+ /*
+ * Display the adapter header.
+ */
+ show_hba_info(&hba_table[i].hba_attrs);
+
+ /*
+ * Loop through HBAs again to print sub-ports.
+ */
+ for (j = 0; j < num_hbas ; j++) {
+ if (ifname && check_symbolic_name_for_interface(
+ hba_table[j].port_attrs.PortSymbolicName,
+ ifname)) {
+ /*
+ * Overloading 'displayed' to indicate
+ * that the HBA/Port should be skipped.
+ */
+ hba_table[i].displayed = 1;
continue;
}
- lp_index++;
-
- if (strlen(opt_info->ifname)) {
- if (check_symbolic_name_for_interface(
- port_attrs.PortSymbolicName,
- opt_info->ifname))
- continue;
+ if (!strncmp(hba_table[i].hba_attrs.SerialNumber,
+ hba_table[j].hba_attrs.SerialNumber,
+ strlen(hba_table[i].hba_attrs.SerialNumber))) {
+ show_port_info(&hba_table[j].hba_attrs,
+ &hba_table[j].port_attrs);
+ hba_table[j].displayed = 1;
}
-
- show_port_info(hba_index, lp_index,
- &hba_attrs, &port_attrs);
}
- HBA_CloseAdapter(hba_handle);
}
+
+ hba_table_destroy(hba_table);
+ HBA_FreeLibrary();
+
+ return rc;
}
-void
-display_target_info(struct opt_info *opt_info)
+enum fcoe_err display_target_info(const char *ifname,
+ enum disp_style style)
{
HBA_STATUS retval;
- HBA_UINT32 hba_cnt;
- HBA_UINT32 lport_cnt_per_hba = 1; /* always one port per hba */
- HBA_HANDLE hba_handle;
- HBA_ADAPTERATTRIBUTES hba_attrs;
- HBA_PORTATTRIBUTES port_attrs;
HBA_PORTATTRIBUTES rport_attrs;
- char namebuf[1028];
- int i, j, rc;
- int hba_index = -1;
- int lp_index = -1;
- int rp_index = -1;
-
- for (i = 0; i < MAX_HBA_COUNT; i++) {
- hba_name_table[i].index = -1;
- memset(hba_name_table[i].SerialNumber, 0,
- sizeof(hba_name_table[i].SerialNumber));
- }
+ struct hba_name_table hba_table[MAX_HBA_COUNT];
+ int i, target_index, num_hbas = 0;
+ enum fcoe_err rc = NOERR;
- hba_cnt = HBA_GetNumberOfAdapters();
- if (!hba_cnt) {
- fprintf(stderr, "No FCoE interfaces created.\n");
- return;
- }
+ if (fcoeadm_loadhba())
+ return EHBAAPIERR;
- for (i = 0; i < hba_cnt; i++) {
- retval = HBA_GetAdapterName(i, namebuf);
- if (retval != HBA_STATUS_OK) {
- fprintf(stderr,
- "Failure of HBA_GetAdapterName: %d\n", retval);
- continue;
- }
+ num_hbas = hba_table_init(hba_table);
- hba_handle = HBA_OpenAdapter(namebuf);
- if (!hba_handle) {
- fprintf(stderr, "HBA_OpenAdapter failed\n");
- perror("HBA_OpenAdapter");
+ /*
+ * Loop through each HBA entry and for each serial number
+ * not already printed print the header and each sub-port
+ * on that adapter.
+ */
+ for (i = 0 ; i < num_hbas ; i++) {
+ if (hba_table[i].failed ||
+ hba_table[i].displayed)
continue;
- }
- retval = HBA_GetAdapterAttributes(hba_handle, &hba_attrs);
- if (retval != HBA_STATUS_OK) {
- fprintf(stderr,
- "HBA_GetAdapterAttributes failed, retval=%d\n",
- retval);
- perror("HBA_GetAdapterAttributes");
+ if (ifname && check_symbolic_name_for_interface(
+ hba_table[i].port_attrs.PortSymbolicName,
+ ifname)) {
+ /*
+ * Overloading 'displayed' to indicate
+ * that the HBA/Port should be skipped.
+ */
+ hba_table[i].displayed = 1;
continue;
}
- rc = find_hba_index(hba_attrs.SerialNumber, &hba_index);
- if (rc == -1) {
- fprintf(stderr,
- "Too many adapters. Maximum %d\n",
- MAX_HBA_COUNT);
- return;
- }
+ for (target_index = 0;
+ target_index < hba_table[i].port_attrs.NumberofDiscoveredPorts;
+ target_index++) {
+
+ /* TODO: Second arg might be incorrect */
+ retval = HBA_GetDiscoveredPortAttributes(
+ hba_table[i].hba_handle,
+ 0, target_index,
+ &rport_attrs);
- for (j = 0; j < lport_cnt_per_hba; j++) {
- retval = HBA_GetAdapterPortAttributes(
- hba_handle, j, &port_attrs);
if (retval != HBA_STATUS_OK) {
fprintf(stderr,
- "HBA_GetAdapterPortAttributes failed, "
- "j=%d, status=%d\n", j, retval);
+ "HBA_GetDiscoveredPortAttributes "
+ "failed for target_index=%d, "
+ "status=%d\n", target_index, retval);
+ hba_table[i].failed = 1;
continue;
}
- lp_index++;
-
- if (strlen(opt_info->ifname)) {
- if (check_symbolic_name_for_interface(
- port_attrs.PortSymbolicName,
- opt_info->ifname))
- continue;
- }
-
- for (rp_index = 0;
- rp_index < port_attrs.NumberofDiscoveredPorts;
- rp_index++) {
- retval = HBA_GetDiscoveredPortAttributes(
- hba_handle, j, rp_index,
- &rport_attrs);
- if (retval != HBA_STATUS_OK) {
- fprintf(stderr,
- "HBA_GetDiscoveredPortAttributes "
- "failed, j=%d, for rp_index=%d, "
- "status=%d\n", j, rp_index, retval);
- continue;
- }
-
- /*
- * If -l option and fcid are specified in the
- * command, filter out the targets do not have
- * port ID equals to fcid.
- */
- if (opt_info->l_flag &&
- opt_info->l_fcid_present &&
- rport_attrs.PortFcId != opt_info->l_fcid)
- continue;
-
- /*
- * Skip any targets that are not FCP targets
- */
- if (is_fcp_target(&rport_attrs))
- continue;
+ /*
+ * Skip any targets that are not FCP targets
+ */
+ if (is_fcp_target(&rport_attrs))
+ continue;
- show_target_info(port_attrs.PortSymbolicName,
- hba_index, lp_index, rp_index,
- &hba_attrs, &rport_attrs);
+ show_target_info(
+ hba_table[i].port_attrs.PortSymbolicName,
+ &hba_table[i].hba_attrs,
+ &rport_attrs);
- /*
- * This will print the LUN table
- * under the target.
- */
- scan_device_map(hba_handle, &hba_attrs,
- &port_attrs, &rport_attrs,
- opt_info);
- }
+ /*
+ * This will print the LUN table
+ * under the target.
+ */
+ scan_device_map(hba_table[i].hba_handle,
+ &hba_table[i].hba_attrs,
+ &hba_table[i].port_attrs,
+ &rport_attrs, ifname, style);
}
- HBA_CloseAdapter(hba_handle);
}
+
+ hba_table_destroy(hba_table);
+ HBA_FreeLibrary();
+
+ return rc;
}
diff --git a/fcoeadm_display.h b/fcoeadm_display.h
new file mode 100644
index 0000000..662cfa7
--- /dev/null
+++ b/fcoeadm_display.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright(c) 2010 Intel Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Maintained at www.Open-FCoE.org
+ */
+
+#ifndef _FCOEADM_DISPLAY_H_
+#define _FCOEADM_DISPLAY_H_
+
+#define DEFAULT_STATS_INTERVAL 1
+
+enum disp_style {
+ DISP_LUN = 0,
+ DISP_TARG,
+};
+
+enum fcoe_err display_adapter_info(const char *ifname);
+enum fcoe_err display_target_info(const char *ifname,
+ enum disp_style style);
+enum fcoe_err display_port_stats(const char *ifname,
+ int stat_interval);
+
+#endif /* _FCOEADM_DISPLAY_H_ */
diff --git a/fcoemon.c b/fcoemon.c
index ea246c2..8cb31ea 100644
--- a/fcoemon.c
+++ b/fcoemon.c
@@ -65,10 +65,11 @@
#define DCB_APP_0_DEFAULT_ENABLE 1
#define DCB_APP_0_DEFAULT_WILLING 1
#define FILE_NAME_LEN (NAME_MAX + 1)
+#define CFG_FILE_PREFIX "cfg-"
+#define DEF_CFG_FILE CFG_FILE_PREFIX "ethx"
#define VLAN_DIR "/proc/net/vlan"
-#define CLIF_NAME_PATH _PATH_VARRUN "dcbd/clif"
#define CLIF_LOCAL_SUN_PATH _PATH_TMP "fcoemon.dcbd.%d"
#define DCBD_CONNECT_TIMEOUT (10 * 1000 * 1000) /* 10 seconds */
#define DCBD_CONNECT_RETRY_TIMEOUT (1 * 1000 * 1000) /* 1 seconds */
@@ -301,9 +302,15 @@ static int fcm_read_config_files(void)
(dp->d_name[1] == '\0' ||
(dp->d_name[1] == '.' && dp->d_name[2] == '\0')))
continue;
- rc = strncmp(dp->d_name, "cfg-", strlen("cfg-"));
+ rc = strncmp(dp->d_name, CFG_FILE_PREFIX,
+ strlen(CFG_FILE_PREFIX));
if (rc)
continue;
+
+ if (!strncmp(dp->d_name, DEF_CFG_FILE,
+ strlen(DEF_CFG_FILE)))
+ continue;
+
next = alloc_fcoe_port(dp->d_name + 4);
if (!next) {
@@ -320,8 +327,6 @@ static int fcm_read_config_files(void)
continue;
}
- next->action = FCP_WAIT;
-
/* FCOE_ENABLE */
rc = fcm_read_config_variable(file, val, sizeof(val),
fp, "FCOE_ENABLE");
@@ -724,7 +729,6 @@ void fcm_process_link_msg(struct ifinfomsg *ip, int len, unsigned type)
u_int8_t operstate;
u_int64_t mac;
int is_vlan;
- int dcb_required_cnt;
mac = is_vlan = 0;
operstate = IF_OPER_UNKNOWN;
@@ -908,7 +912,6 @@ static int fcm_link_buf_check(size_t read_len)
return 0;
}
-
static void fcm_fcoe_init(void)
{
if (fcm_read_config_files())
@@ -1014,7 +1017,7 @@ static int fcm_dcbd_connect(void)
memset(&dest, 0, sizeof(dest));
dest.sun_family = PF_UNIX;
snprintf(dest.sun_path, sizeof(dest.sun_path),
- CLIF_NAME_PATH);
+ LLDP_CLIF_SOCK);
rc = connect(fd, (struct sockaddr *)&dest, sizeof(dest));
if (rc < 0) {
FCM_LOG_ERR(errno, "clif connect failed");
@@ -1875,7 +1878,6 @@ static void fcm_fcoe_action(struct fcm_netif *ff, struct fcoe_port *p)
static void fcm_netif_advance(struct fcm_netif *ff)
{
char buf[80], params[30];
- int old_qos_mask;
ASSERT(ff);
ASSERT(fcm_clif);
@@ -2018,7 +2020,7 @@ static void fcm_handle_changes()
fcm_fcoe_action(ff, p);
- p->action = FCP_WAIT;
+ fcp_set_next_action(p, FCP_WAIT);
next_port:
p = p->next;
}
@@ -2037,7 +2039,6 @@ static void fcm_usage(void)
static void fcm_sig(int sig)
{
- fcm_dcbd_shutdown();
sa_select_exit();
}
@@ -2341,11 +2342,12 @@ int main(int argc, char **argv)
sa_log_flags = 0;
openlog(sa_log_prefix, LOG_CONS, LOG_DAEMON);
- while ((c = getopt_long(argc, argv, "fd:hv",
+ while ((c = getopt_long(argc, argv, "fdhv",
fcm_options, NULL)) != -1) {
switch (c) {
case 'f':
fcm_fg = 1;
+ break;
case 'd':
fcoe_config.debug = 1;
break;
diff --git a/fcoemon_utils.c b/fcoemon_utils.c
index 74353e0..5f1cd10 100644
--- a/fcoemon_utils.c
+++ b/fcoemon_utils.c
@@ -469,23 +469,6 @@ static struct sa_sel_state {
TAILQ_HEAD(, sa_defer_ent) ts_defer_list;
} sa_sel_state;
-static void
-sa_select_call_deferred_funcs(void)
-{
- struct sa_sel_state *ss = &sa_sel_state;
- struct sa_defer_ent *de, *de_next;
-
- de = ss->ts_defer_list.tqh_first;
- TAILQ_INIT(&ss->ts_defer_list);
-
- for (; de != NULL; de = de_next) {
- de_next = de->de_next.tqe_next;
- if (de->de_func != NULL)
- (*de->de_func)(de->de_arg);
- free(de);
- }
-}
-
int sa_select_loop(void)
{
struct sa_sel_state *ss = &sa_sel_state;
@@ -502,14 +485,7 @@ int sa_select_loop(void)
sa_timer_check(&tval);
if (ss->ts_exit)
break;
- if (ss->ts_defer_list.tqh_first != NULL) {
- /*
- * If a timer or deferred function added a new deferred
- * function, just poll through select (zero-timeout).
- */
- tval.tv_sec = tval.tv_usec = 0;
- tvp = &tval;
- } else if (tval.tv_sec == 0 && tval.tv_usec == 0)
+ if (tval.tv_sec == 0 && tval.tv_usec == 0)
tvp = NULL;
else
tvp = &tval;
@@ -552,8 +528,6 @@ int sa_select_loop(void)
}
if (ss->ts_callback != NULL)
(*ss->ts_callback)();
- if (ss->ts_defer_list.tqh_first != NULL)
- sa_select_call_deferred_funcs();
}
return 0;
}
@@ -654,40 +628,6 @@ sa_select_set_callback(void (*cb)(void))
}
/*
- * Add a deferred function call.
- */
-void *
-sa_select_add_deferred_callback(void (*func)(void *), void *arg)
-{
- struct sa_sel_state *ss = &sa_sel_state;
- struct sa_defer_ent *de;
-
- ASSERT(func != NULL);
-
- de = malloc(sizeof(*de));
- if (de != NULL) {
- de->de_func = func;
- de->de_arg = arg;
- if (ss->ts_defer_list.tqh_first == NULL)
- TAILQ_INIT(&ss->ts_defer_list);
- TAILQ_INSERT_TAIL(&ss->ts_defer_list, de, de_next);
- }
-
- return de;
-}
-
-/*
- * Delete (cancel) a deferred function call.
- */
-void
-sa_select_del_deferred_callback(void *handle)
-{
- struct sa_defer_ent *de = handle;
-
- de->de_func = NULL;
-}
-
-/*
* Cause select loop to exit.
* This is invoked from a handler which wants the select loop to return
* after the handler is finished. For example, during receipt of a network
diff --git a/fcoemon_utils.h b/fcoemon_utils.h
index 4a4546f..35ab19e 100644
--- a/fcoemon_utils.h
+++ b/fcoemon_utils.h
@@ -230,21 +230,6 @@ int sa_select_loop(void);
void sa_select_set_callback(void (*)(void));
/*
- * Add a deferred function call. The function is called at the start
- * of the next select loop cycle.
- * Returns a handle to the deferred call object on success, or NULL on memory
- * allocation failure.
- */
-void *sa_select_add_deferred_callback(void (*func)(void *), void *arg);
-
-/*
- * Delete a deferred function call.
- * Takes the handle returned by sa_select_add_deferred_callback as an argument.
- */
-void sa_select_del_deferred_callback(void *handle);
-
-
-/*
* Add a callback to handle files which are ready for receive, transmit,
* or to handle exceptions.
*/