[Open-FCoE] [PATCH 1/4]fcoe-utils: Create library files for fcoesocket interfaces

Lucy Liu lucy.liu at intel.com
Thu Dec 10 17:47:09 UTC 2009


Create library files for fcoe util socket interfaces.
Create new files fcoe_clif.h/c as a library used by fcoemon and fcoeadm.
Clif stands for client interface. Change Makefile.am for new files
fcoe_clif.h/c.

Signed-off-by: Lucy Liu <lucy.liu at intel.com>

---

 Makefile.am |    4 +-
 fcoe_clif.c |  128 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 fcoe_clif.h |   53 ++++++++++++++++++++++++
 3 files changed, 183 insertions(+), 2 deletions(-)
 create mode 100644 fcoe_clif.c
 create mode 100644 fcoe_clif.h

diff --git a/Makefile.am b/Makefile.am
index 3f8ac7f..0703449 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -13,7 +13,7 @@ AM_CFLAGS = -DSYSCONFDIR="\"${sysconfdir}\""
 ## rules for building fcoeadm
 ## only listed sources get packaged, so must list all headers too
 fcoeadm_SOURCES = fcoeadm_display.c fcoeadm.c fcoeadm.h \
-include/fc_scsi.h include/fc_types.h include/net_types.h
+include/fc_scsi.h include/fc_types.h include/net_types.h fcoe_clif.c fcoe_clif.h
 
 ## fcoeadm uses HBAAPI, so get the right flags for compiling and linking
 fcoeadm_CFLAGS = $(HBAAPI_CFLAGS)
@@ -30,7 +30,7 @@ fcping_LDFLAGS = $(HBAAPI_LIBS) -lrt
 ## rules for building fcoemon
 ## only listed sources get packaged, so must list all headers too
 fcoemon_SOURCES = fcoemon_utils.c fcoemon.c fcoemon.h fcoemon_utils.h \
-include/fc_scsi.h include/fc_types.h include/net_types.h
+include/fc_scsi.h include/fc_types.h include/net_types.h fcoe_clif.c fcoe_clif.h
 
 ## fcoemon needs headers from dcbd, get the right include path for them
 fcoemon_CFLAGS = $(DCBD_CFLAGS)
diff --git a/fcoe_clif.c b/fcoe_clif.c
new file mode 100644
index 0000000..3ab0f46
--- /dev/null
+++ b/fcoe_clif.c
@@ -0,0 +1,128 @@
+/*
+ * 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 _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <libgen.h>
+#include <dirent.h>
+#include <net/if.h>
+#include <errno.h>
+#include "fcoe_clif.h"
+
+static char *fcoeclif_read(const char *path)
+{
+	FILE *fp;
+	char *buf;
+	int size = 512;
+
+	buf = malloc(size);
+	if (!buf)
+		return NULL;
+	memset(buf, 0, size);
+
+	fp = fopen(path, "r");
+	if (fp) {
+		if (fgets(buf, size, fp)) {
+			fclose(fp);
+			return buf;
+		}
+	}
+	fclose(fp);
+	free(buf);
+	return NULL;
+}
+
+static int fcoeclif_check_fchost(const char *ifname, const char *dname)
+{
+	char *buf;
+	char path[512];
+
+	if (dname[0] == '.')
+		return -EINVAL;
+
+	sprintf(path, "%s/%s/symbolic_name", SYSFS_FCHOST, dname);
+	buf = fcoeclif_read(path);
+	if (!buf)
+		return -EINVAL;
+
+	if (!strstr(buf, ifname)) {
+		free(buf);
+		return -EINVAL;
+	}
+	free(buf);
+	return 0;
+}
+
+static int fcoeclif_find_fchost(char *ifname, char *fchost, int len)
+{
+	int n, dname_len;
+	int found = 0;
+	struct dirent **namelist;
+
+	memset(fchost, 0, len);
+	n = scandir(SYSFS_FCHOST, &namelist, 0, alphasort);
+	if (n > 0) {
+		while (n--) {
+			/* check symbolic name */
+			if (!fcoeclif_check_fchost(ifname,
+						  namelist[n]->d_name)) {
+				dname_len = strnlen(namelist[n]->d_name, len);
+				if (dname_len != len) {
+					/*
+					 * This assumes that d_name is always
+					 * NULL terminated.
+					 */
+					strncpy(fchost, namelist[n]->d_name,
+						dname_len + 1);
+					found = 1;
+				} else {
+					fprintf(stderr, "scsi_host (%s) is "
+						"too large for a buffer that "
+						"is only %d bytes large\n",
+						namelist[n]->d_name, dname_len);
+					free(namelist[n]);
+				}
+			}
+			free(namelist[n]);
+		}
+		free(namelist);
+	}
+
+	return found;
+}
+
+/*
+ * Validate an existing instance for an FC interface
+ */
+int fcoeclif_validate_interface(char *ifname, char *fchost, int len)
+{
+	if ((!ifname) || (!fchost) || (len <= 0))
+		return -EINVAL;
+
+	if (!fcoeclif_find_fchost(ifname, fchost, len)) {
+		fprintf(stderr, "No fc_host found for %s\n", ifname);
+		return -EINVAL;
+	}
+
+	return 0;
+}
diff --git a/fcoe_clif.h b/fcoe_clif.h
new file mode 100644
index 0000000..de03e92
--- /dev/null
+++ b/fcoe_clif.h
@@ -0,0 +1,53 @@
+/*
+ * 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 _FCOE_CLIF_H_
+#define _FCOE_CLIF_H_
+
+#define SYSFS_MOUNT	"/sys"
+#define SYSFS_NET	SYSFS_MOUNT "/class/net"
+#define SYSFS_FCHOST	SYSFS_MOUNT "/class/fc_host"
+#define SYSFS_FCOE	SYSFS_MOUNT "/module/fcoe/parameters"
+#define FCM_SRV_DIR "/var/run/fcm"
+#define CLIF_IFNAME "fcm_clif"
+#define FCHOSTBUFLEN		64
+#define MAX_MSGBUF 512
+
+enum clif_status {
+	CLI_SUCCESS = 0,
+	CLI_FAIL,
+	CLI_NO_ACTION
+};
+
+enum {
+	FCOE_CREATE_CMD = 1,
+	FCOE_DESTROY_CMD,
+	FCOE_RESET_CMD,
+};
+
+/*
+ * Description of fcoemon and fcoeadm socket data structure interface
+ */
+struct clif_data {
+	int cmd;
+	char ifname[IFNAMSIZ];
+};
+
+int fcoeclif_validate_interface(char *ifname, char *fchost, int len);
+#endif /* _FCOE_CLIF_H_ */

-- 
Signature: Lucy Liu <lucy.liu at intel.com>



More information about the devel mailing list