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

Zou, Yi yi.zou at intel.com
Thu Jan 6 02:00:08 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.
> 
We need a way to be backward compatible, or at least somehow let the user
know if the fcoe-utils is not matching up w/ the running kernel on this.

> 
> 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"
It will be nice if fcoeadm is able to enable/disable vendor and update
the config...but I guess it's ok for now.

Thanks,
yi

> 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"
> 
Rob,
This change will impact existing fcoe-utils and may need some coordination
to make sure the kernel side goes in first, I guess it’s an overkill to add
kernel version tracking then build SYSFS_FCOE accordingly, might be simpler
just prompt the user to upgrade the fcoe-util.

thanks,
yi

>  #define FCHOSTBUFLEN 64
> 
> --
> 1.7.1
> 
> 
> 
> 
> _______________________________________________
> devel mailing list
> devel at open-fcoe.org
> https://lists.open-fcoe.org/mailman/listinfo/devel



More information about the devel mailing list