> 
> 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 <[email protected]>
> ---
>  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
> [email protected]
> https://lists.open-fcoe.org/mailman/listinfo/devel
_______________________________________________
devel mailing list
[email protected]
https://lists.open-fcoe.org/mailman/listinfo/devel

Reply via email to