[Open-FCoE] [RFC PATCH] fcoe-utils: add DRIVER_NAME to specify the FCoE low-level driver

Nithin Sujir nsujir at broadcom.com
Wed Jan 5 02:27:50 UTC 2011


This patch adds support to fcoe-utils to send the low-level driver name into
the libfcoe driver. This complements yi's recent driver patches that change the
sysfs path and add the transport attach support. 

The following changes are added.

1. DRIVER_NAME field in cfg-ethx file. fcoemon will now send "interface:driver
name" string into the libfcoe driver to allow it to invoke the right transport
driver functions.

2. SUPPORTED_DRIVERS field in the config file allows the service to load all
supported drivers if they exist.

3. The check for if driver is loaded is moved to the fcoe service since it
already knows which are the supported drivers.


Signed-off-by: Nithin Nayak Sujir <nsujir at broadcom.com>
---
 doc/fcoemon.txt        |    3 ++
 etc/cfg-ethx           |    5 ++++
 etc/config             |    4 +++
 etc/initd/initd.fedora |   23 +++++++++++++++++-
 etc/initd/initd.suse   |   25 ++++++++++++++++++-
 fcoemon.c              |   59 +++++++++++++++++++++++++++++++++++-------------
 include/fcoe_utils.h   |    4 ++-
 7 files changed, 102 insertions(+), 21 deletions(-)

diff --git a/doc/fcoemon.txt b/doc/fcoemon.txt
index f42c8c0..f69f0f6 100644
--- a/doc/fcoemon.txt
+++ b/doc/fcoemon.txt
@@ -187,6 +187,9 @@ _AUTO_VLAN_::
 	interfaces.  If the network interface specified by the filename is
 	already a VLAN interface, the AUTO_VLAN setting is ignored.
 
+_DRIVER_NAME_::
+	indicates the name of the driver that will claim this interface.
+
 Note that the attached Ethernet peer device (e.g. FCoE capable switch port)
 must have compatible settings For DCB and FCoE to function properly.
 
diff --git a/etc/cfg-ethx b/etc/cfg-ethx
index b7274ac..0616bb4 100644
--- a/etc/cfg-ethx
+++ b/etc/cfg-ethx
@@ -12,3 +12,8 @@ DCB_REQUIRED="yes"
 ## Default:	yes
 # Indicate if VLAN discovery should be handled by fcoemon
 AUTO_VLAN="yes"
+
+## Type:	string
+## Default:	fcoe
+# The name of the driver that will claim this interface
+DRIVER_NAME="fcoe"
diff --git a/etc/config b/etc/config
index 2d08c9e..c993f35 100644
--- a/etc/config
+++ b/etc/config
@@ -8,3 +8,7 @@ DEBUG="no"
 # All the messages go to syslog and stderr (script & C code)
 USE_SYSLOG="yes"
 
+## Type:       string. Driver names separated by space
+## Default:    list of default drivers
+# All supported drivers listed here are loaded when service starts
+SUPPORTED_DRIVERS="fcoe bnx2fc"
diff --git a/etc/initd/initd.fedora b/etc/initd/initd.fedora
index 3888dda..56a883e 100755
--- a/etc/initd/initd.fedora
+++ b/etc/initd/initd.fedora
@@ -63,14 +63,33 @@ test -x $FCOEMON || {
 	fi
 }
 
+check_drivers()
+{
+	driver_loaded=no
+
+	for driver in $SUPPORTED_DRIVERS; do
+		if [ -d /sys/module/$driver/parameters ]; then
+			driver_loaded=yes
+		fi
+	done
+
+	if [ "$driver_loaded" = "yes" ]; then
+		daemon --pidfile ${PID_FILE} ${FCOEMON} ${FCOEMON_OPTS}
+	else
+		echo
+		echo "No supported drivers loaded"
+		failure
+	fi
+}
+
 start()
 {
 	echo -n $"Starting FCoE initiator service: "
 
 	modprobe -q libfc
-	modprobe -q fcoe
+	modprobe -q -a $SUPPORTED_DRIVERS
 
-	daemon --pidfile ${PID_FILE} ${FCOEMON} ${FCOEMON_OPTS}
+	check_drivers
 
 	echo
 	touch /var/lock/subsys/fcoe
diff --git a/etc/initd/initd.suse b/etc/initd/initd.suse
index 139de2d..7deba1e 100755
--- a/etc/initd/initd.suse
+++ b/etc/initd/initd.suse
@@ -82,7 +82,28 @@ test -x $FCOEMON || {
 
 startup_fcoe_modules()
 {
-	modprobe fcoe > /dev/null 2>&1
+	modprobe -a $SUPPORTED_DRIVERS > /dev/null 2>&1
+}
+
+check_drivers()
+{
+	driver_loaded=no
+
+	for driver in $SUPPORTED_DRIVERS; do
+		if [ -d /sys/module/$driver/parameters ]; then
+			driver_loaded=yes
+		fi
+	done
+
+	if [ "$driver_loaded" = "yes" ]; then
+		startproc -l ${LOG_FILE} -p ${PID_FILE} ${FCOEMON} ${FCOEMON_OPTS}
+	else
+		echo
+		echo "No supported drivers loaded"
+		rc_failed
+		rc_status -v
+		rc_exit
+	fi
 }
 
 start()
@@ -90,8 +111,8 @@ start()
 	echo -n $"Starting FCoE initiator service: "
 
 	startup_fcoe_modules
+	check_drivers
 
-	startproc -l ${LOG_FILE} -p ${PID_FILE} ${FCOEMON} ${FCOEMON_OPTS}
 
 	rc_status -v
 }
diff --git a/fcoemon.c b/fcoemon.c
index bf0de93..fe73bbc 100644
--- a/fcoemon.c
+++ b/fcoemon.c
@@ -124,6 +124,8 @@ struct fcoe_port {
 	struct sa_timer vlan_disc_timer;
 	int vlan_disc_count;
 	int fip_socket;
+
+	char driver_name[MAX_DRV_NAME_LEN];
 };
 
 enum fcoeport_ifname {
@@ -143,7 +145,7 @@ static void fcm_dcbd_event(char *, size_t);
 static void fcm_dcbd_cmd_resp(char *, cmd_status);
 static void fcm_netif_advance(struct fcm_netif *);
 static void fcm_fcoe_action(struct fcm_netif *, struct fcoe_port *);
-static int fcm_fcoe_if_action(char *, char *);
+static int fcm_fcoe_if_action(char *, char *, char *);
 
 struct fcm_clif {
 	int cl_fd;
@@ -372,6 +374,27 @@ static int fcm_read_config_files(void)
 		if (!strncasecmp(val, "yes", 3) && rc == 1)
 			next->dcb_required = 1;
 
+
+		/* DRIVER_NAME */
+		rc = fcm_read_config_variable(file, val, sizeof(val),
+					      fp, "DRIVER_NAME");
+		if (rc < 0) {
+			FCM_LOG("%s invalid format for DRIVER_NAME setting");
+			fclose(fp);
+			free(next);
+			continue;
+		}
+		/* if DRIVER_NAME not found, error out */
+		if (rc == 1) {
+			FCM_LOG("DRIVER_NAME found %s", val);
+			strncpy(next->driver_name, val, MAX_DRV_NAME_LEN - 1);
+		} else {
+			FCM_LOG("DRIVER_NAME not found");
+			fclose(fp);
+			free(next);
+			continue;
+		}
+
 		/* AUTO_VLAN */
 		rc = fcm_read_config_variable(file, val, sizeof(val),
 					      fp, "AUTO_VLAN");
@@ -552,6 +575,8 @@ int fcm_vlan_disc_handler(struct fiphdr *fh, struct sockaddr_ll *sa, void *arg)
 			vid = ntohs(((struct fip_tlv_vlan *)tlv)->vlan);
 			vp = fcm_new_vlan(sa->sll_ifindex, vid);
 			vp->dcb_required = p->dcb_required;
+			strncpy(vp->driver_name, p->driver_name,
+					MAX_DRV_NAME_LEN - 1);
 			break;
 		default:
 			/* unexpected or unrecognized descriptor */
@@ -1279,7 +1304,8 @@ static void fcm_cleanup(void)
 
 	for (curr = fcoe_config.port; curr; curr = next) {
 		FCM_LOG_DBG("OP: DESTROY %s\n", curr->ifname);
-		fcm_fcoe_if_action(FCOE_DESTROY,  curr->ifname);
+		fcm_fcoe_if_action(FCOE_DESTROY,  curr->ifname,
+							curr->driver_name);
 		next = curr->next;
 		free(curr);
 	}
@@ -1959,10 +1985,17 @@ static void fcm_cli_reply(struct sock_info *r, int status)
 			r->fromlen);
 }
 
-static int fcm_fcoe_if_action(char *path, char *ifname)
+static int fcm_fcoe_if_action(char *path, char *ifname, char *driver_name)
 {
 	FILE *fp = NULL;
 	int ret = fcm_fail;
+	char buf[MAX_STR_LEN];
+	strncpy(buf, ifname, MAX_STR_LEN - 1);
+
+	if (driver_name)
+		snprintf(buf, MAX_STR_LEN - 1, "%s:%s", ifname, driver_name);
+	else
+		strncpy(buf, ifname, MAX_STR_LEN - 1);
 
 	fp = fopen(path, "w");
 	if (!fp) {
@@ -1971,7 +2004,7 @@ static int fcm_fcoe_if_action(char *path, char *ifname)
 		goto err_out;
 	}
 
-	if (EOF == fputs(ifname, fp)) {
+	if (EOF == fputs(buf, fp)) {
 		FCM_LOG_ERR(errno, "%s: Failed to write %s to path %s.\n",
 				progname, ifname, path);
 		goto out;
@@ -2035,7 +2068,7 @@ static void fcm_fcoe_action(struct fcm_netif *ff, struct fcoe_port *p)
 	switch (p->action) {
 	case FCP_CREATE_IF:
 		FCM_LOG_DBG("OP: CREATE %s\n", p->ifname);
-		rc = fcm_fcoe_if_action(FCOE_CREATE, ifname);
+		rc = fcm_fcoe_if_action(FCOE_CREATE, ifname, p->driver_name);
 		break;
 	case FCP_DESTROY_IF:
 		FCM_LOG_DBG("OP: DESTROY %s\n", p->ifname);
@@ -2050,11 +2083,11 @@ static void fcm_fcoe_action(struct fcm_netif *ff, struct fcoe_port *p)
 			rc = fcm_success;
 			break;
 		}
-		rc = fcm_fcoe_if_action(FCOE_DESTROY, ifname);
+		rc = fcm_fcoe_if_action(FCOE_DESTROY, ifname, p->driver_name);
 		break;
 	case FCP_ENABLE_IF:
 		FCM_LOG_DBG("OP: ENABLE %s\n", p->ifname);
-		rc = fcm_fcoe_if_action(FCOE_ENABLE, ifname);
+		rc = fcm_fcoe_if_action(FCOE_ENABLE, ifname, p->driver_name);
 		break;
 	case FCP_DISABLE_IF:
 		FCM_LOG_DBG("OP: DISABLE %s\n", p->ifname);
@@ -2068,7 +2101,7 @@ static void fcm_fcoe_action(struct fcm_netif *ff, struct fcoe_port *p)
 			}
 			break;
 		}
-		rc = fcm_fcoe_if_action(FCOE_DISABLE, ifname);
+		rc = fcm_fcoe_if_action(FCOE_DISABLE, ifname, p->driver_name);
 		break;
 	case FCP_RESET_IF:
 		FCM_LOG_DBG("OP: RESET %s\n", p->ifname);
@@ -2083,7 +2116,7 @@ static void fcm_fcoe_action(struct fcm_netif *ff, struct fcoe_port *p)
 		}
 
 		sprintf(path, "%s/%s/issue_lip", SYSFS_FCHOST, fchost);
-		rc = fcm_fcoe_if_action(path, "1");
+		rc = fcm_fcoe_if_action(path, "1", NULL);
 		break;
 	case FCP_SCAN_IF:
 		FCM_LOG_DBG("OP: SCAN %s\n", p->ifname);
@@ -2099,7 +2132,7 @@ static void fcm_fcoe_action(struct fcm_netif *ff, struct fcoe_port *p)
 
 		sprintf(path, "%s/%s/device/scsi_host/%s/scan",
 			SYSFS_FCHOST, fchost, fchost);
-		rc = fcm_fcoe_if_action(path, "- - -");
+		rc = fcm_fcoe_if_action(path, "- - -", NULL);
 		break;
 	case FCP_VLAN_DISC:
 		FCM_LOG_DBG("OP: VLAN DISC %s\n", p->ifname);
@@ -2667,12 +2700,6 @@ int main(int argc, char **argv)
 	}
 	fcm_pidfile_create();
 
-	/* check fcoe module */
-	if (fcoe_checkdir(SYSFS_FCOE)) {
-		FCM_LOG_ERR(errno, "make sure FCoE driver module is loaded!");
-		exit(1);
-	}
-
 	fcm_fcoe_init();
 	fcm_link_init();	/* NETLINK_ROUTE protocol */
 	fcm_dcbd_init();
diff --git a/include/fcoe_utils.h b/include/fcoe_utils.h
index 3c43304..4c9715d 100644
--- a/include/fcoe_utils.h
+++ b/include/fcoe_utils.h
@@ -42,11 +42,13 @@
 
 #define MAX_STR_LEN 512
 #define MAX_PATH_LEN MAX_STR_LEN
+#define MAX_DRV_NAME_LEN 32
+
 
 #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 SYSFS_FCOE	SYSFS_MOUNT "/module/libfcoe/parameters"
 
 #define FCHOSTBUFLEN 64
 
-- 
1.7.1







More information about the devel mailing list