Patchwork [Open-FCoE,8/8] fipvlan: Add support for fcoe_sysfs kernel interface

login
register
mail settings
Submitter Robert Love
Date March 5, 2013, 6:30 p.m.
Message ID <20130305183025.21625.80385.stgit@fritz>
Download mbox | patch
Permalink /patch/9/
State Accepted
Headers show

Comments

Robert Love - March 5, 2013, 6:30 p.m.
Add support for creating FCoE sessions with /sys/bus/fcoe
interfaces.

Signed-off-by: Robert Love <robert.w.love@intel.com>
Tested-by: Marcus Dennis <marcusx.e.dennis@intel.com>
---
 fipvlan.c |   50 ++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 48 insertions(+), 2 deletions(-)

Patch

diff --git a/fipvlan.c b/fipvlan.c
index 80e4190..882ebbc 100644
--- a/fipvlan.c
+++ b/fipvlan.c
@@ -78,6 +78,8 @@  struct {
 	.suffix = "",
 };
 
+int (*fcoe_instance_start)(const char *ifname);
+
 char *exe;
 
 static struct pollfd *pfd = NULL;
@@ -549,13 +551,13 @@  void create_missing_vlans()
 	printf("\n");
 }
 
-int fcoe_instance_start(char *ifname)
+int fcoe_mod_instance_start(const char *ifname)
 {
 	enum fcoe_status ret = EFAIL;
 
 	ret = fcm_write_str_to_sysfs_file(FCOE_CREATE, ifname);
 	if (ret) {
-		FIP_LOG_ERRNO("Failed to open file:%s", FCOE_CREATE);
+		FIP_LOG_ERRNO("Failed to open file: %s", FCOE_CREATE);
 		FIP_LOG_ERRNO("May be fcoe stack not loaded, starting"
 			      " fcoe service will fix that");
 
@@ -565,6 +567,48 @@  int fcoe_instance_start(char *ifname)
 	return 0;
 }
 
+int fcoe_bus_instance_start(const char *ifname)
+{
+	enum fcoe_status ret = EFAIL;
+	char fchost[FCHOSTBUFLEN];
+	char ctlr[FCHOSTBUFLEN];
+
+	ret = fcm_write_str_to_sysfs_file(FCOE_BUS_CREATE, ifname);
+	if (ret) {
+		FIP_LOG_ERRNO("Failed to open file: %s", FCOE_BUS_CREATE);
+		FIP_LOG_ERRNO("May be fcoe stack not loaded, starting"
+			      " fcoe service will fix that");
+		return ret;
+	}
+
+	if (fcoe_find_fchost(ifname, fchost, FCHOSTBUFLEN)) {
+		FIP_LOG_DBG("Failed to find fc_host for %s\n", ifname);
+		return ENOSYSFS;
+	}
+
+	if (fcoe_find_ctlr(fchost, ctlr, FCHOSTBUFLEN)) {
+		FIP_LOG_DBG("Failed to get ctlr for %s\n", ifname);
+		return ENOSYSFS;
+	}
+
+	ret = fcm_write_str_to_ctlr_attr(ctlr, FCOE_CTLR_ATTR_ENABLED, "1");
+	if (ret)
+		FIP_LOG_DBG("Failed to enable interface %s\n", ifname);
+
+	return 0;
+}
+
+void determine_libfcoe_interface()
+{
+	if (!access(FCOE_BUS_CREATE, F_OK)) {
+		FIP_LOG_DBG("Using /sys/bus/fcoe interfaces\n");
+		fcoe_instance_start = &fcoe_bus_instance_start;
+	} else {
+		FIP_LOG_DBG("Using libfcoe module parameter interfaces\n");
+		fcoe_instance_start = &fcoe_mod_instance_start;
+	}
+}
+
 void start_fcoe()
 {
 	struct fcf *fcf;
@@ -836,6 +880,8 @@  int main(int argc, char **argv)
 	}
 	pfd_add(ns);
 
+	determine_libfcoe_interface();
+
 	find_interfaces(ns);
 	while ((TAILQ_EMPTY(&interfaces)) && ++find_cnt < 5) {
 		FIP_LOG_DBG("no interfaces found, trying again");