File fcoe-utils-beta5-update of Package open-fcoe

Index: fcoe-utils-1.0.8/Makefile.am
===================================================================
--- fcoe-utils-1.0.8.orig/Makefile.am
+++ fcoe-utils-1.0.8/Makefile.am
@@ -12,8 +12,9 @@ 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 fcoe_utils.h \
-include/fc_scsi.h include/fc_types.h include/net_types.h fcoe_clif.c fcoe_clif.h
+fcoeadm_SOURCES = fcoeadm_display.c fcoeadm.c fcoeadm.h fcoe_utils.c \
+fcoe_utils.h fcoe_utils_version.h include/fc_scsi.h include/fc_types.h \
+include/net_types.h fcoe_clif.h
 
 ## fcoeadm uses HBAAPI, so get the right flags for compiling and linking
 fcoeadm_CFLAGS = $(HBAAPI_CFLAGS)
@@ -21,7 +22,7 @@ fcoeadm_LDFLAGS = $(HBAAPI_LIBS)
 
 ## rules for building fcping
 ## only listed sources get packaged, so must list all headers too
-fcping_SOURCES = fcping.c
+fcping_SOURCES = fcping.c fcoe_utils.c fcoe_utils.h
 
 ## fcping uses HBAAPI, so get the right flags for compiling and linking
 fcping_CFLAGS = $(HBAAPI_CFLAGS)
@@ -30,8 +31,8 @@ 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 \
-fcoe_utils.h include/fc_scsi.h include/fc_types.h include/net_types.h \
-fcoe_clif.c fcoe_clif.h
+fcoe_utils.c fcoe_utils.h fcoe_utils_version.h include/fc_scsi.h \
+include/fc_types.h include/net_types.h fcoe_clif.h
 
 ## fcoemon needs headers from dcbd, get the right include path for them
 fcoemon_CFLAGS = $(DCBD_CFLAGS)
@@ -39,12 +40,12 @@ fcoemon_LDFLAGS = -lrt
 
 ## rules for building fipvlan
 ## only listed sources get packaged, so must list all headers too
-fipvlan_SOURCES = fipvlan.c fcoe_utils.h include/fip.h \
+fipvlan_SOURCES = fipvlan.c fcoe_utils_version.h include/fip.h \
 log.c include/log.h include/list.h
 
 ## install configuration file in $(prefix)/etc/fcoe
 fcoe_configdir = ${sysconfdir}/fcoe
-dist_fcoe_config_DATA = etc/config etc/cfg-ethx
+dist_fcoe_config_DATA = etc/cfg-ethx
 
 ## man pages for fcoeadm and fcoemon
 dist_man_MANS = doc/fcoeadm.8
@@ -69,3 +70,7 @@ init_d_SCRIPTS = etc/initd/fcoe
 
 dist_noinst_DATA = README COPYING INSTALL fcoe-utils.spec
 
+install-data-hook:
+	if [ ! -f ${fcoe_configdir}/config ] ; then \
+		cp etc/config ${fcoe_configdir}/config; \
+	fi
Index: fcoe-utils-1.0.8/QUICKSTART
===================================================================
--- fcoe-utils-1.0.8.orig/QUICKSTART
+++ fcoe-utils-1.0.8/QUICKSTART
@@ -1,7 +1,11 @@
-This document is a quickstart guide for a user connected
-to a Fibre Channel Forwarder (FCF) and not a SW target.
-It covers the installation of Data Center Bridging (DCB),
-the HBA API wrapper library, libhbalinux and fcoe-utils.
+This document is a quickstart guide for a user connected to a Fibre Channel
+Forwarder (FCF) and not a SW target. It covers the configuration of the kernel
+and installation and configuration of Data Center Bridging (DCB), the HBA API
+wrapper library, libhbalinux and fcoe-utils.
+
+This document was written using Fedora 11 as the installed operating system.
+The instructions may need adjustments for them to work on other
+distributions.
 
 ##
 # Dependencies
@@ -11,6 +15,63 @@ git://open-fcoe.org/openfc/hbaapi_build.
 git://open-fcoe.org/openfc/libhbalinux.git
 git://open-fcoe.org/openfc/fcoe-utils.git
 
+##
+# Kernel Configuration and Compilation
+######################################
+
+1) Download kernel source
+   There are a number of good choices regarding the most appropriate
+   kernel source for your needs. fcoe-next.git is a repository that may be
+   unstable, but will have the latest code. Downloading a released kernel
+   from kernel.org will give you the most stable kernel, but you'll need to
+   get user space code that matches the kernel version you've chosen. You can
+   get user space code that matches stable kernels on the Open-FCoE.org
+   "Downloads" page or you can pull directly from the git repositories using
+   tags.
+
+2) Configure the kernel
+   # make menuconfig
+
+   Select the following:
+
+   Networking Support -> Networking Options
+	      Data Center Bridging
+	      802.1Q VLAN Support
+	      GVRP (GARP VLAN Registration Protocol) support
+
+   Networking Support -> Networking Options -> QoS and/or fair queuing
+	      Multi Band Priority Queueing (PRIO)
+	      Hardware Multiqueue-aware Multi Band Queuing (MULTIQ)
+	      Elementary classification (BASIC)
+	      Universal 32bit comparisons w/ hashing (U32)
+	      Extended Matches
+			U32 key
+	      Actions
+			SKB Editing
+
+   Device Drivers -> SCSI Device Support -> SCSI Low-level drivers
+	      LibFC
+	      LibFCoE
+	      FCoE
+
+   Device Drivers -> Network Device Support -> Ethernet (10000 Mbit)
+	      Intel(R) 10GbE PCI Express adapters support
+	      Data Center Bridging (DCB) Support
+
+   [ Replace with desired driver if not using Intel adapter. ]
+
+   Exit Saving Changes
+
+3) Compile the kernel
+   # make && make modules_install && make install
+
+   If you're going to build fcoe-utils, you can run 'make headers_install'
+   at this stage to skip a later step.
+
+4) Configure Grub
+   Change the default kernel so that this new kernel is used when booting
+   # reboot
+
 
 ##
 # DCB
@@ -119,13 +180,12 @@ DEPENDENCIES
 PROCESS
 
 1) Ensure correct header files
-   - fcping requires certain kernel header files to be exported
-     or it cannot be compiled. These header files were included
-     in the 2.6.31 Linux kernel. If you are using a distribution
-     kernel that is >= 2.6.31 then you shouldn't have to take
-     this step. If you are building your own kernel or are using
-     a pre-2.6.31 kernel you will need to take this step to
-     export the appropriate header files.
+   - fcping requires certain kernel header files to be exported or it
+   cannot be compiled. These header files were included in the 2.6.31 Linux
+   kernel. If you are using a distribution kernel that is >= 2.6.31 then you
+   shouldn't have to take this step. If you are building your own kernel or
+   are using a pre-2.6.31 kernel you will need to take this step to export
+   the appropriate header files.
 
    # pushd <kernel-src>
    # make headers_install
@@ -139,3 +199,59 @@ PROCESS
    # rpm --eval "%configure" | sh
    # make
    # make install
+
+##
+# Example Configuration
+#######################
+
+This example sets up a VLAN (101) for interface eth3 and configures the
+system to automatically connect to storage over this interface.
+
+1) Create a VLAN
+   # cd /etc/sysconfig/network-scripts/
+   # cp ifcfg-eth3 ifcfg-eth3.101
+   Edit ifcfg-eth3.101 so the file has the following settings,
+
+   DEVICE=eth3.101
+   VLAN=yes
+   ONBOOT=yes
+
+2) Congigure fcoe for the VLAN
+   # cd /etc/fcoe/
+   # cp cfg-ethx cfg-eth3.101
+
+3) Start dcbd and configure the VLAN interface
+   # /etc/init.d/dcbd start
+   # dcbtool sc eth3 dcb on
+   # dcbtool sc eth3 pfc e:1
+   # dcbtool sc eth3 app:fcoe e:1
+
+   As a convenience there is a script that will confirm if DCB has been
+   configured correctly for FCoE. The script is run as follows,
+
+   <fcoe-utils source>/debug/dcbcheck.sh eth3
+   (note: this is on the root device, not the VLAN)
+
+   Follow the suggestions and repeatedly run the script until it states that
+   DCB is configured correctly.
+
+4) Start fcoe
+   # /etc/init.d/fcoe start
+     After a few moments your storage should apear (assuming everything is
+     configured correctly on the fabric)
+
+5) Setup dcbd and fcoe to start when booting
+    # chkconfig dcbd on
+    # chkconfig fcoe on
+
+
+##
+# Reporting Errors
+##################
+
+Most steps cannot be skipped. Resolve issues before moving forward.
+
+Please run '<fcoe-utils-src>/debug/fcoedump.sh eth3.101 2>&1 > dump.out'
+and provide the dump.out file with the bug report. Defects can be filed
+against the distribution used, reported to the Ethernet vendor of the
+card in use, or mailed to devel@open-fcoe.org.
Index: fcoe-utils-1.0.8/configure.ac
===================================================================
--- fcoe-utils-1.0.8.orig/configure.ac
+++ fcoe-utils-1.0.8/configure.ac
@@ -1,4 +1,4 @@
-AC_INIT([fcoe-utils], [1.0.10], [devel@open-fcoe.org])
+AC_INIT([fcoe-utils], [1.0.11], [devel@open-fcoe.org])
 AM_INIT_AUTOMAKE([-Wall -Werror foreign])
 
 AC_PROG_CC
@@ -19,6 +19,6 @@ AS_IF([test "X$with_dcb" != Xno],
 	[PKG_CHECK_MODULES([DCBD], [dcbd])
 	AC_SUBST([DCBD_CFLAGS])])
 
-AC_CONFIG_FILES([Makefile fcoe-utils.spec fcoe_utils.h])
+AC_CONFIG_FILES([Makefile fcoe-utils.spec fcoe_utils_version.h])
 AC_OUTPUT
 
Index: fcoe-utils-1.0.8/contrib/fcc.sh
===================================================================
--- fcoe-utils-1.0.8.orig/contrib/fcc.sh
+++ fcoe-utils-1.0.8/contrib/fcc.sh
@@ -19,7 +19,7 @@
 #
 # Please send comments and changes to jeykholt at cisco dot com
 
-VERSION="fcc v1.0.2 10/07/2009"
+VERSION="fcc v1.0.3 02/19/2010"
 
 fcoe_dir=/sys/module/fcoe
 fdir=/sys/class/fc_host
@@ -41,6 +41,7 @@ cmd:
 	luns		Show LUN list and status
 	stats		Show HBA statistics
 	reset		Reset the HBA
+	scan		Scan the HBA
 	version		Show version
 USAGE
 }
@@ -366,22 +367,33 @@ fcoe_ctl() {
 
 fc_host_ctl() {
 	local hba=$1
+	local host=$1
 	local cmd=$2
-	local value=$3
+	local value
 	local file
 	local dir
 
-	dir=$fdir/$hba
+	dir=$fdir/$host
 	if [ ! -d "$dir" ]
 	then
-		dir=$fdir/`hba_name $hba`
+		host=`hba_name $hba`
+		dir=$fdir/$host
 		if [ $? != 0 ]
 		then
 			echo "$cmdname: hba $hba not found" >&2
 			exit 1
 		fi
 	fi
-	file=$dir/$cmd
+
+	case "$cmd" in
+		reset)
+			file=$dir/issue_lip
+			value=1
+		;;
+		scan)
+			file=$dir/device/scsi_host/$host/scan
+			value="- - -"
+	esac
 
 	if [ -w "$file" ]
 	then
@@ -478,16 +490,15 @@ case "$cmd" in
 	realname)
 		hba_name $hba
 		;;
-	reset)
+	reset | scan)
 		if [ "$hba_spec" != y ]
 		then
-			echo "$cmdname: reset requires hba name" >&2
+			echo "$cmdname: $cmd requires hba name" >&2
 			exit 2
 		fi
 		for hba in $hbas
 		do
-			(fc_host_ctl $hba issue_lip 1 &&
-				 echo "reset $hba") || break
+			fc_host_ctl $hba $cmd || break
 		done
 		;;
 	version)
Index: fcoe-utils-1.0.8/contrib/sysfs_edd.sh
===================================================================
--- /dev/null
+++ fcoe-utils-1.0.8/contrib/sysfs_edd.sh
@@ -0,0 +1,52 @@
+#!/bin/bash
+
+# Script to read EDD information from sysfs and
+# echo the FCoE interface name and target info.
+# This is a work in progress and will be enhanced
+# with more options as we progress further.
+#
+# Author: Supreeth Venkataraman
+#         Intel Corporation
+#
+# Usage: edd.sh -i for getting the interface name.
+#        edd.sh -t for getting target information.
+#        edd.sh -h for displaying help information.
+
+DisplayHelp(){
+  echo "Usage: sysfs_edd.sh -i for getting the interface name."
+  echo "       sysfs_edd.sh -t for getting target information."
+  echo "       sysfs_edd.sh -h for displaying help options."
+  exit;
+}
+
+GetTargetInfo(){
+   if [ -e /sys/firmware/edd/int13_dev80/interface ]; then
+      cd -P /sys/firmware/edd/int13_dev80
+   else
+      echo "Target information not found in EDD!"; exit;
+   fi
+
+   line=`cat interface`;
+   echo $line;
+}
+
+
+GetFcoeIfName(){
+   if [ -e /sys/firmware/edd/int13_dev80/pci_dev ]; then
+        cd -P /sys/firmware/edd/int13_dev80/pci_dev
+   else
+      echo "Disk 80 not found in EDD!"; exit;
+   fi
+
+   for if in net/eth* ;
+   do [ -d $if ] && echo ${if##*/}; done
+}
+
+while getopts ith OptionName; do
+    case "$OptionName" in
+        t) GetTargetInfo;;
+        i) GetFcoeIfName;;
+        h) DisplayHelp;;
+        *) echo "Invalid Option. Use -h option for help.";;
+    esac
+done
Index: fcoe-utils-1.0.8/doc/fcoeadm.8
===================================================================
--- fcoe-utils-1.0.8.orig/doc/fcoeadm.8
+++ fcoe-utils-1.0.8/doc/fcoeadm.8
@@ -12,9 +12,9 @@
 .P
 \fBfcoeadm\fR [\fB\-t\fR|\fB\-\-target\fR] [\fI<ethX>\fR]
 .P
-\fBfcoeadm\fR [\fB\-l\fR|\fB\-\-lun\fR] [\fI<target_port_id>\fR [\fI<lun_id>\fR]]
+\fBfcoeadm\fR [\fB\-l\fR|\fB\-\-lun\fR] [\fI<ethX>\fR]
 .P
-\fBfcoeadm\fR [\fB\-s\fR|\fB\-\-stats\fR] [\fI<ethX>\fR [\fB\-n\fR \fI<interval>\fR]]
+\fBfcoeadm\fR [\fB\-s\fR|\fB\-\-stats\fR \fI<ethX>\fR [\fI<interval>\fR]]
 .P
 \fBfcoeadm\fR [\fB\-v\fR|\fB\-\-version\fR]
 .P
@@ -44,21 +44,21 @@ Destroys an FCoE instance based on the g
 Resets the fc_host associated with the FCoE interface given by \fI<ethX>\fR.
 .TP
 \fB\-i\fR, \fB\-\-interface\fR \fI<ethX>\fR
-Show the information of the FCoE instances created at \fI<ethX>\fR.
+Show the information of the FCoE instance created at \fI<ethX>\fR.
 If \fI<ethX>\fR is not specified the command will show the information of all the
 FCoE instances created on the system.
 .TP
 \fB\-t\fR, \fB\-\-target\fR \fI<ethX>\fR
-Show the information of all the discovered targets from the FCoE instances created
+Show the information of all the discovered targets from the FCoE instance created
 at \fI<ethX>\fR.  If \fI<ethX>\fR is not specified the command will
 show the information of all the discovered targets from all the FCoE instances created.
 .TP
-\fB\-l\fR, \fB\-\-lun\fR \fI<target_port_id>\fR \fI<lun_id>\fR
-Show the detailed information of a specific LUN with \fI<lun_id>\fR at the target
-with port id \fI<target_port_id>\fR. port id is also known as FC\-ID. If \fI<lun_id>\fR
-is not specified, all the LUNs associated with the target will be shown.
+\fB\-l\fR, \fB\-\-lun\fR \fI<ethX>\fR
+Show the information of all the discovered LUNs from the FCoE instance created
+at \fI<ethX>\fR.  If \fI<ethX>\fR is not specified the command will
+show the information of all the discovered LUNs from all the FCoE instances created.
 .TP
-\fB\-s\fR, \fB\-\-stats\fR \fI<ethX>\fR \fB\-n\fR \fI<interval>\fR
+\fB\-s\fR, \fB\-\-stats\fR \fI<ethX>\fR \fI<interval>\fR
 Show the statistics (including FC4 statistics) of the FCoE instances created at \fI<ethX>\fR.
 The information will be display in one line on the screen per given time interval. \fI<interval>\fR should
 be specified in whole intergers greater than 0. It specifies the time interval in the unit of second.
@@ -104,37 +104,22 @@ created. A brief listing of discovered L
 .IP
 $ \fBfcoeadm\fR \-t eth3
 .P
-Show the detailed information of all the LUNs associated with a specific target.
-The target is identified by its port id (aka FC\-ID) 0xD700EF.
-.IP
-$ \fBfcoeadm\fR \-l 0xD700EF
-.P
-.IP
-$ \fBfcoeadm\fR \-l D700EF
-.P
+Show the detailed information of all the LUNs discovered on all FCoE connections.
 .IP
-$ \fBfcoeadm\fR \-l 0xd700ef
+$ \fBfcoeadm\fR \-l
 .P
+Show the detailed information of all the LUNs associated with a specific interface.
 .IP
-$ \fBfcoeadm\fR \-l d700ef
-.P
-Show the detailed information of a LUN associated with a specific target.
-The target is identified by its port id (aka FC\-ID) 0xD700EF and the LUN
-is identified by its LUN id.
-.IP
-$ \fBfcoeadm\fR \-l 0xD700EF 1
+$ \fBfcoeadm\fR \-l eth3.101
 .P
 Show the statistics information of a specific port eth3 having FCoE instances created.
 The statistics are displayed one line per time interval. The default interval is one
-second if \-n option is not specified.
+second if an interval is not specified.
 .IP
 $ \fBfcoeadm\fR \-s eth3
 .P
 .IP
-$ \fBfcoeadm\fR \-s eth3 \-n 3
-.P
-.IP
-$ \fBfcoeadm\fR \-s eth3 \-n3
+$ \fBfcoeadm\fR \-s eth3 3
 .SH "REPORTING BUGS"
 If you have identified a
 defect please either file a bug or engage the development mailing list at
Index: fcoe-utils-1.0.8/etc/initd/initd.fedora
===================================================================
--- fcoe-utils-1.0.8.orig/etc/initd/initd.fedora
+++ fcoe-utils-1.0.8/etc/initd/initd.fedora
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# Copyright(c) 2009 Intel Corporation. All rights reserved.
+# Copyright(c) 2010 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,
@@ -23,7 +23,7 @@
 # Required-Stop:
 # Default-Start: 3 5
 # Default-Stop: 3 5
-# Description: Open-FCoE SAN Setup
+# Description: Open-FCoE Initiator
 ### END INIT INFO
 
 CONFIG_DIR=/etc/fcoe
@@ -31,70 +31,21 @@ PID_FILE="/var/run/fcoemon.pid"
 LOG_FILE="/var/log/fcoemon.log"
 FCOEMON=/usr/sbin/fcoemon
 FCOEADM=/usr/sbin/fcoeadm
-DCBD=dcbd
-LOGGER="echo"
 FCOEMON_OPTS=
 
 . /etc/init.d/functions
-
-varify_yesno_values()
-{
-	value=$1
-
-	case $value in
-		"yes" | "YES" ) return 1 ;;
-		"no" | "NO" ) return 2 ;;
-		*) return 0 ;;
-	esac
-}
-
-verify_configuration()
-{
-	. $CONFIG_DIR/config
-	varify_yesno_values $USE_SYSLOG
-	if [ $? -eq 0 ]; then
-		echo "Invalid USE_SYSLOG in $CONFIG_DIR/config"
-		return 1
-	fi
-	varify_yesno_values $DEBUG
-	if [ $? -eq 0 ]; then
-		echo "Invalid DEBUG in $CONFIG_DIR/config"
-		return 1
-	fi
-
-	for ifcfg_file in `ls $CONFIG_DIR/cfg-eth*`
-	do
-		. $ifcfg_file
-		varify_yesno_values $FCOE_ENABLE
-		if [ $? -eq 0 ]; then
-			echo "Invalid FCOE_ENABLE in $ifcfg_file"
-			return 1
-		fi
-		varify_yesno_values $DCB_REQUIRED
-		if [ $? -eq 0 ]; then
-			echo "Invalid DCB_REQUIRED in $ifcfg_file"
-			return 1
-		fi
-	done
-	return 0
-}
-
-verify_configuration
-if [ $? -ne 0 ]; then
-    failure
-fi
+. $CONFIG_DIR/config
 
 if [ "$USE_SYSLOG" = "yes" ] || [ "$USE_SYSLOG" = "YES" ]; then
-    LOGGER="logger -t fcoe"
     FCOEMON_OPTS+=" --syslog"
 fi
 
 if [ "$DEBUG" = "yes" ] || [ "$DEBUG" = "YES" ]; then
-	FCOEMON_OPTS+=" --debug"
+    FCOEMON_OPTS+=" --debug"
 fi
 
 test -x $FCOEADM || {
-	$LOGGER "$FCOEADM not installed";
+	echo "$FCOEADM not installed";
 	if [ "$1" = "stop" ]; then exit 0;
 	else
 	    failure
@@ -102,41 +53,38 @@ test -x $FCOEADM || {
 }
 
 test -x $FCOEMON || {
-	$LOGGER "$FCOEMON not installed";
+	echo "$FCOEMON not installed";
 	if [ "$1" = "stop" ]; then exit 0;
 	else
 	    failure
 	fi
 }
 
-service_start()
+start()
 {
-	pidof $FCOEMON
-	if [ $? -eq 0 ]; then
-		$LOGGER "Warning: daemon already running."
-		return
-	fi
-
-	rm -f /var/run/fcoemon.*
+	echo -n $"Starting FCoE initiator service: "
 
 	modprobe -q libfc
 	modprobe -q fcoe
 
 	daemon --pidfile ${PID_FILE} ${FCOEMON} ${FCOEMON_OPTS}
 
-	return
+	echo
 }
 
-service_stop()
+stop()
 {
-	pidof $FCOEMON
-	[ $? -eq 0 ] && kill -TERM `pidof $FCOEMON`
+	echo -n $"Stopping FCoE initiator service: "
+
+	killproc $FCOEMON
 
 	rm -f /var/run/fcoemon.*
 	rm -f /tmp/fcoemon.dcbd.*
+
+	echo
 }
 
-service_status()
+status()
 {
 	pidof $FCOEMON
 	if [ $? -eq 0 ]; then
@@ -144,56 +92,48 @@ service_status()
 	else
 		echo "$FCOEMON -- UNUSED"
 	fi
-	IF_LIST=`$FCOEADM -i 2>&1 | \
-		awk '/Symbolic Name:/{print $6}' | \
-		sort | awk '{printf("%s ", $1)}'`
-	if [ -z "$IF_LIST" ]; then
+
+	interfaces=`$FCOEADM -i 2>&1 | \
+		    awk '/Symbolic Name:/{print $6}' | \
+		    sort | awk '{printf("%s ", $1)}'`
+
+	if [ -z "$interfaces" ]; then
 		echo "No interfaces created."
 	else
-		echo "Created interfaces: $IF_LIST"
+		echo "Created interfaces: $interfaces"
 	fi
 }
 
 case "$1" in
 	start)
-		$LOGGER "Service starting up"
-		service_start
+		start
 		;;
+
 	stop)
-		$LOGGER "Service shutting down"
-		service_stop
+		stop
 		;;
-	try-restart|condrestart)
-		if test "$1" = "condrestart"; then
-			$LOGGER "${attn} Use try-restart ${done}(LSB)${attn} " \
-				"rather than condrestart ${warn}(RH)${norm}"
-		fi
-		$0 status
-		if test $? = 0; then
-			$0 restart
-		else
-			failure
-		fi
 
-		;;
 	restart)
-		$0 stop
-		$0 start
-
+		stop
+		start
 		;;
-	force-reload)
-		$0 try-restart
 
+	force-reload)
+		echo "force-reload not yet implemented"
+		failure
 		;;
+
 	reload)
-		$LOGGER "Service reloading"
+		echo "reload not yet implemented"
 		failure
 		;;
+
 	status)
-		service_status
+		status
 		;;
+
 	*)
-		echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload}"
+		echo "Usage: $0 {start|stop|status|restart}"
 		exit 1
 		;;
 esac
Index: fcoe-utils-1.0.8/etc/initd/initd.suse
===================================================================
--- fcoe-utils-1.0.8.orig/etc/initd/initd.suse
+++ fcoe-utils-1.0.8/etc/initd/initd.suse
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# Copyright(c) 2009 Intel Corporation. All rights reserved.
+# Copyright(c) 2010 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,
@@ -36,7 +36,7 @@
 # Required-Stop: $network $remote_fs
 # Default-Start: 3 5
 # Default-Stop: 3 5
-# Description: Open-FCoE SAN Setup
+# Description: Open-FCoE Initiator
 ### END INIT INFO
 
 CONFIG_DIR=/etc/fcoe
@@ -45,73 +45,14 @@ LOG_FILE="/var/log/fcoemon.log"
 FCOEMON=/usr/sbin/fcoemon
 FCOEADM=/usr/sbin/fcoeadm
 DCBD=dcbd
-LOGGER="echo"
 FCOEMON_OPTS=
 
 . /etc/rc.status
 rc_reset
 
-test -r $CONFIG_DIR/config || {
-	$LOGGER "$CONFIG_DIR/config not installed";
-	if [ "$1" = "stop" ]; then exit 0;
-	else
-		rc_failed
-		rc_status -v
-		rc_exit
-	fi
-}
-
-varify_yesno_values()
-{
-	value=$1
-
-	case $value in
-		"yes" | "YES" ) return 1 ;;
-		"no" | "NO" ) return 2 ;;
-		*) return 0 ;;
-	esac
-}
-
-verify_configuration()
-{
-	. $CONFIG_DIR/config
-	varify_yesno_values $USE_SYSLOG
-	if [ $? -eq 0 ]; then
-		echo "Invalid USE_SYSLOG in $CONFIG_DIR/config"
-		return 1
-	fi
-	varify_yesno_values $DEBUG
-	if [ $? -eq 0 ]; then
-		echo "Invalid DEBUG in $CONFIG_DIR/config"
-		return 1
-	fi
-
-	for ifcfg_file in `ls $CONFIG_DIR/cfg-eth*`
-	do
-		. $ifcfg_file
-		varify_yesno_values $FCOE_ENABLE
-		if [ $? -eq 0 ]; then
-			echo "Invalid FCOE_ENABLE in $ifcfg_file"
-			return 1
-		fi
-		varify_yesno_values $DCB_REQUIRED
-		if [ $? -eq 0 ]; then
-			echo "Invalid DCB_REQUIRED in $ifcfg_file"
-			return 1
-		fi
-	done
-	return 0
-}
-
-verify_configuration
-if [ $? -ne 0 ]; then
-	rc_failed
-	rc_status -v
-	rc_exit
-fi
+. $CONFIG_DIR/config
 
 if [ "$USE_SYSLOG" = "yes" ] || [ "$USE_SYSLOG" = "YES" ]; then
-    LOGGER="logger -t fcoe"
     FCOEMON_OPTS+=" --syslog"
 fi
 
@@ -120,7 +61,7 @@ if [ "$DEBUG" = "yes" ] || [ "$DEBUG" =
 fi
 
 test -x $FCOEADM || {
-	$LOGGER "$FCOEADM not installed";
+	echo "$FCOEADM not installed";
 	if [ "$1" = "stop" ]; then exit 0;
 	else
 		rc_failed
@@ -130,7 +71,7 @@ test -x $FCOEADM || {
 }
 
 test -x $FCOEMON || {
-	$LOGGER "$FCOEMON not installed";
+	echo "$FCOEMON not installed";
 	if [ "$1" = "stop" ]; then exit 0;
 	else
 		rc_failed
@@ -144,113 +85,78 @@ startup_fcoe_modules()
 	modprobe fcoe > /dev/null 2>&1
 }
 
-validate_link_flow_control()
+start()
 {
-	ifname=$1
-
-	retry_count=1
-	while true
-	do
-		TX_STATUS=`ethtool -a $ifname 2>&1 | awk '/TX:/{print $2}'`
-		RX_STATUS=`ethtool -a $ifname 2>&1 | awk '/RX:/{print $2}'`
-
-		if [ "$TX_STATUS" = "on" ] && [ "$RX_STATUS" = "on" ]; then
-			return 0
-		fi
-
-		ethtool -A $ifname rx on tx on
-		[ $retry_count -eq 0 ] && return 0
-		retry_count=$(($retry_count-1))
-		usleep 500000
-	done
-	$LOGGER "Warning: Failed to bring up link flow control of $ifname."
-	return 1
-}
-
-service_start()
-{
-	checkproc ${FCOEMON}
-	if [ $? -eq 0 ]; then
-		$LOGGER "Warning: daemon already running."
-		return
-	fi
-	rm -f /var/run/fcoemon.*
+	echo -n $"Starting FCoE initiator service: "
 
 	startup_fcoe_modules
 
 	startproc -l ${LOG_FILE} -p ${PID_FILE} ${FCOEMON} ${FCOEMON_OPTS}
 
 	rc_status -v
-	return
+
+	echo
 }
 
-service_stop()
+stop()
 {
-	checkproc $FCOEMON
-	[ $? -eq 0 ] && killproc -TERM $FCOEMON
+	echo -n $"Stopping FCoE initiator service: "
+
+	killproc -TERM $FCOEMON
 
 	rm -f /var/run/fcoemon.*
 	rm -f /tmp/fcoemon.dcbd.*
 
 	rc_status -v
+
+	echo
 }
 
-service_status()
+status()
 {
 	echo -n "Checking status for fcoe service "
 	checkproc -p ${PID_FILE} ${FCOEMON}
 	rc_status -v
-	IF_LIST=`$FCOEADM -i 2>&1 | \
-		awk '/Symbolic Name:/{print $6}' | \
-		sort | awk '{printf("%s ", $1)}'`
-	if [ -z "$IF_LIST" ]; then
+	interfaces=`$FCOEADM -i 2>&1 | \
+		    awk '/Symbolic Name:/{print $6}' | \
+		    sort | awk '{printf("%s ", $1)}'`
+	if [ -z "$interfaces" ]; then
 		echo "No interfaces created."
 	else
-		echo "Created interfaces: $IF_LIST"
+		echo "Created interfaces: $interfaces"
 	fi
 }
 
 case "$1" in
 	start)
-		$LOGGER "Service starting up"
-		service_start
+		start
 		;;
+
 	stop)
-		$LOGGER "Service shutting down"
-		service_stop
-		;;
-	try-restart|condrestart)
-		if test "$1" = "condrestart"; then
-			$LOGGER "${attn} Use try-restart ${done}(LSB)${attn} " \
-				"rather than condrestart ${warn}(RH)${norm}"
-		fi
-		$0 status
-		if test $? = 0; then
-			$0 restart
-		else
-			rc_reset	# Not running is not a failure.
-		fi
-		rc_status
+		stop
 		;;
+
 	restart)
-		$0 stop
-		$0 start
+		stop
+		start
 		rc_status
 		;;
+
 	force-reload)
-		$0 try-restart
-		rc_status
+		echo "force-reload not yet implemented"
 		;;
+
 	reload)
-		$LOGGER "Service reloading"
+		echo "reload not yet implemented"
 		rc_failed 3
-		rc_status -v
 		;;
+
 	status)
-		service_status
+		status
 		;;
+
 	*)
-		echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload}"
+		echo "Usage: $0 {start|stop|status|restart}"
 		exit 1
 		;;
 esac
Index: fcoe-utils-1.0.8/fcoe_clif.c
===================================================================
--- fcoe-utils-1.0.8.orig/fcoe_clif.c
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * 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;
-}
-
-
-/*
- * Open and close to check if directory exists
- */
-int fcoeclif_checkdir(char *dir)
-{
-	DIR *d = NULL;
-
-	if (!dir)
-		return -EINVAL;
-	/* check if we have sysfs */
-	d = opendir(dir);
-	if (!d)
-		return -EINVAL;
-	closedir(d);
-	return 0;
-}
Index: fcoe-utils-1.0.8/fcoe_clif.h
===================================================================
--- fcoe-utils-1.0.8.orig/fcoe_clif.h
+++ fcoe-utils-1.0.8/fcoe_clif.h
@@ -1,5 +1,5 @@
 /*
- * Copyright(c) 2009 Intel Corporation. All rights reserved.
+ * Copyright(c) 2010 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,
@@ -20,15 +20,21 @@
 #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"
+/*
+ * A DCB file is incorrectly including linux/if.h which is redefining
+ * IFF_UP. This makes it so we cannot include net/if.h. We have to
+ * redefine IFNAMSIZ to work around this until DCB is corrected.
+
+*/
+
 #define FCM_SRV_DIR "/var/run/fcm"
 #define CLIF_IFNAME "fcm_clif"
-#define FCHOSTBUFLEN		64
+#define CLIF_SOCK_FILE FCM_SRV_DIR "/" CLIF_IFNAME
+
+#define CLIF_PID_FILE _PATH_VARRUN "fcoemon.pid"
+
+#define CLIF_CMD_RESPONSE_TIMEOUT 5
 #define MAX_MSGBUF 512
-#define CLIF_PID_FILE           _PATH_VARRUN "fcoemon.pid"
 
 enum clif_status {
 	CLI_SUCCESS = 0,
@@ -36,20 +42,31 @@ enum clif_status {
 	CLI_NO_ACTION
 };
 
-enum {
-	FCOE_CREATE_CMD = 1,
-	FCOE_DESTROY_CMD,
-	FCOE_RESET_CMD,
+enum clif_action {
+	CLIF_NONE = 0,
+	CLIF_CREATE_CMD,
+	CLIF_DESTROY_CMD,
+	CLIF_RESET_CMD,
+	CLIF_SCAN_CMD
+};
+
+/**
+ * struct clif - Internal structure for client interface library
+ *
+ * This structure is used by fcoeadm client interface to store internal data.
+ */
+struct clif_sock_info {
+	int socket_fd;
+	struct sockaddr_un local;
+	struct sockaddr_un dest;
 };
 
 /*
  * Description of fcoemon and fcoeadm socket data structure interface
  */
 struct clif_data {
-	int cmd;
+	enum clif_action cmd;
 	char ifname[IFNAMSIZ];
 };
 
-int fcoeclif_validate_interface(char *ifname, char *fchost, int len);
-int fcoeclif_checkdir(char *dir);
 #endif /* _FCOE_CLIF_H_ */
Index: fcoe-utils-1.0.8/fcoe_utils.c
===================================================================
--- /dev/null
+++ fcoe-utils-1.0.8/fcoe_utils.c
@@ -0,0 +1,188 @@
+/*
+ * Copyright(c) 2010 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
+ */
+
+#include "fcoe_utils.h"
+
+static int fcoe_sysfs_read(char *buf, int size, const char *path)
+{
+	FILE *fp;
+	int i, rc = -EINVAL;
+
+	fp = fopen(path, "r");
+	if (fp) {
+		if (fgets(buf, size, fp)) {
+			/*
+			 * Strip trailing newline by replacing
+			 * any '\r' or '\n' instances with '\0'.
+			 * It's not as elegant as it could be, but
+			 * we know that the symbolic name won't
+			 * have either of those characters until
+			 * the end of the line.
+			 */
+			for (i = 0; i < strlen(buf); i++) {
+				if (buf[i] == '\n' ||
+				    buf[i] == '\r') {
+					buf[i] = '\0';
+					break;
+				}
+			}
+			rc = 0;
+		}
+
+		fclose(fp);
+	}
+
+	return rc;
+}
+
+static int fcoe_check_fchost(const char *ifname, const char *dname)
+{
+	char buf[MAX_STR_LEN];
+	char path[MAX_PATH_LEN];
+	int rc = -EINVAL;
+
+	sprintf(path, "%s/%s/symbolic_name", SYSFS_FCHOST, dname);
+
+	if (!fcoe_sysfs_read(buf, MAX_STR_LEN, path))
+		rc = check_symbolic_name_for_interface(buf, ifname);
+
+	return rc;
+}
+
+enum fcoe_err fcoe_find_fchost(char *ifname, char *fchost, int len)
+{
+	int n, dname_len;
+	struct dirent **namelist;
+	int rc = ENOFCOECONN;
+
+	n = scandir(SYSFS_FCHOST, &namelist, 0, alphasort);
+
+	for (n-- ; n >= 0 ; n--) {
+		if (rc) {
+			/* check symbolic name */
+			if (!fcoe_check_fchost(ifname, namelist[n]->d_name)) {
+				dname_len = strnlen(namelist[n]->d_name, len);
+
+				if (len > dname_len) {
+					strncpy(fchost, namelist[n]->d_name,
+						dname_len + 1);
+					/* rc = 0 indicates found */
+					rc = NOERR;
+				} else {
+					/*
+					 * The fc_host is too large
+					 * for the buffer.
+					 */
+					rc = EINTERR;
+				}
+			}
+		}
+		free(namelist[n]);
+
+	}
+	free(namelist);
+
+	return rc;
+}
+
+enum fcoe_err fcoe_validate_interface(char *ifname)
+{
+	enum fcoe_err rc = NOERR;
+	char path[MAX_PATH_LEN];
+
+
+	if (!strlen(ifname))
+		rc = ENOETHDEV;
+
+	/*
+	 * TODO: Is there a better way to check if the
+	 * interface name is correct?
+	 */
+	sprintf(path, "%s/%s", SYSFS_NET, ifname);
+	if (!rc && fcoe_checkdir(path))
+		rc = ENOETHDEV;
+
+	return rc;
+}
+
+/*
+ * Validate an existing instance for an FC interface
+ */
+enum fcoe_err fcoe_validate_fcoe_conn(char *ifname)
+{
+	char fchost[FCHOSTBUFLEN];
+	enum fcoe_err rc = NOERR;
+
+	rc = fcoe_validate_interface(ifname);
+
+	if (!rc)
+		rc = fcoe_find_fchost(ifname, fchost, FCHOSTBUFLEN);
+
+	return rc;
+}
+
+/*
+ * Open and close to check if directory exists
+ */
+int fcoe_checkdir(char *dir)
+{
+	DIR *d = NULL;
+
+	if (!dir)
+		return -EINVAL;
+	/* check if we have sysfs */
+	d = opendir(dir);
+	if (!d)
+		return -EINVAL;
+	closedir(d);
+	return 0;
+}
+
+char *get_ifname_from_symbolic_name(const char *symbolic_name)
+{
+	int symbolic_name_len = strlen(symbolic_name);
+	int lead_len = strlen(SYMB_NAME_LEAD);
+
+	if (lead_len < symbolic_name_len)
+		return (char *)(symbolic_name + lead_len);
+
+       return NULL;
+}
+
+int check_symbolic_name_for_interface(const char *symbolic_name,
+				      const char *ifname)
+{
+	int rc = -EINVAL;
+	char *symb;
+
+	symb = get_ifname_from_symbolic_name(symbolic_name);
+
+	/*
+	 * It's important to use the length of the ifname
+	 * from the symbolic_name here. If the ifname length
+	 * were used then if the user passed in a substring
+	 * of the the interface name it would match because
+	 * we'd only be looking for the first few characters,
+	 * not the whole string.
+	 */
+	if (symb && !strncmp(ifname, symb, strlen(symb)))
+		rc = 0;
+
+	return rc;
+}
Index: fcoe-utils-1.0.8/fcoe_utils.h
===================================================================
--- /dev/null
+++ fcoe-utils-1.0.8/fcoe_utils.h
@@ -0,0 +1,84 @@
+/*
+ * Copyright(c) 2010 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_UTILS_H_
+#define _FCOE_UTILS_H_
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <libgen.h>
+#include <dirent.h>
+#include <errno.h>
+
+/*
+ * Used when trying to get the interface name from the symbolic_name.
+ * Not very elegant as this code will need to change if fcoe.ko changes
+ * its version.
+ */
+#define FCOE_MODULE_VERSION "v0.1"
+#define SYMB_NAME_LEAD "fcoe " FCOE_MODULE_VERSION " over "
+
+#define MAX_STR_LEN 512
+#define MAX_PATH_LEN MAX_STR_LEN
+
+#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 FCHOSTBUFLEN 64
+
+/*
+ * This macro assumes that progname has been set
+ */
+#define FCOE_LOG_ERR(fmt, args...)					\
+	do {								\
+		fprintf(stderr, "%s: " fmt, progname, ##args);		\
+	} while (0)
+
+
+enum fcoe_err {
+	NOERR = 0,    /* No error */
+	ENOFCOECONN,  /* No FCoE connection on interface */
+	EINTERR,      /* Internal error */
+	EINVALARG,    /* Invalid argument */
+	EBADNUMARGS,  /* Invalid number of arguments */
+	EIGNORE,      /* Ignore this error value */
+	ENOSYSFS,     /* sysfs is not present */
+	ENOETHDEV,    /* Not a valid Ethernet interface */
+	ENOMONCONN,   /* Not connected to fcoemon */
+	ECONNTMOUT,   /* Connection to fcoemon timed out */
+	EHBAAPIERR,   /* Error using HBAAPI/libhbalinux */
+};
+
+enum fcoe_err fcoe_validate_interface(char *ifname);
+enum fcoe_err fcoe_find_fchost(char *ifname, char *fchost, int len);
+int fcoe_checkdir(char *dir);
+int check_symbolic_name_for_interface(const char *symbolic_name,
+				      const char *ifname);
+char *get_ifname_from_symbolic_name(const char *symbolic_name);
+int valid_ifname(const char *ifname);
+
+#endif /* _FCOE_UTILS_H_ */
Index: fcoe-utils-1.0.8/fcoe_utils.h.in
===================================================================
--- fcoe-utils-1.0.8.orig/fcoe_utils.h.in
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef _FCOE_UTILS_H_
-#define _FCOE_UTILS_H_
-
-#define FCOE_UTILS_VERSION "@VERSION@"
-
-#endif /* _FCOE_UTILS_H_ */
Index: fcoe-utils-1.0.8/fcoe_utils_version.h.in
===================================================================
--- /dev/null
+++ fcoe-utils-1.0.8/fcoe_utils_version.h.in
@@ -0,0 +1,6 @@
+#ifndef _FCOE_UTILS_VERSION_H_
+#define _FCOE_UTILS_VERSION_H_
+
+#define FCOE_UTILS_VERSION "@VERSION@"
+
+#endif /* _FCOE_UTILS_VERSION_H_ */
Index: fcoe-utils-1.0.8/fcoeadm.c
===================================================================
--- fcoe-utils-1.0.8.orig/fcoeadm.c
+++ fcoe-utils-1.0.8/fcoeadm.c
@@ -1,5 +1,5 @@
 /*
- * Copyright(c) 2009 Intel Corporation. All rights reserved.
+ * Copyright(c) 2010 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,
@@ -17,391 +17,223 @@
  * Maintained at www.Open-FCoE.org
  */
 
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE
-#endif
 #include <libgen.h>
 #include <paths.h>
-#include "fcoe_utils.h"
+#include <net/if.h>
+#include <sys/un.h>
+
+#include "fcoe_utils_version.h"
 #include "fcoeadm.h"
 #include "fcoe_clif.h"
 
-static char *fcoeadm_version =
-"fcoeadm v" FCOE_UTILS_VERSION "\n Copyright (c) 2009, Intel Corporation.\n";
-
-#define CMD_RESPONSE_TIMEOUT 5
-
+static const char *optstring = "c:d:r:S:itlshv";
 static struct option fcoeadm_opts[] = {
-	{"create", 1, 0, 'c'},
-	{"destroy", 1, 0, 'd'},
-	{"reset", 1, 0, 'r'},
-	{"interface", 1, 0, 'i'},
-	{"target", 1, 0, 't'},
-	{"lun", 2, 0, 'l'},
-	{"stats", 1, 0, 's'},
-	{"help", 0, 0, 'h'},
-	{"version", 0, 0, 'v'},
+	{"create", required_argument, 0, 'c'},
+	{"destroy", required_argument, 0, 'd'},
+	{"reset", required_argument, 0, 'r'},
+	{"interface", no_argument, 0, 'i'},
+	{"target", no_argument, 0, 't'},
+	{"lun", no_argument, 0, 'l'},
+	{"stats", no_argument, 0, 's'},
+	{"help", no_argument, 0, 'h'},
+	{"version", no_argument, 0, 'v'},
 	{0, 0, 0, 0}
 };
 
 struct opt_info _opt_info, *opt_info = &_opt_info;
 char progname[20];
 
-struct clif *clif_conn;
-
 static void fcoeadm_help(void)
 {
-	printf("%s\n", fcoeadm_version);
+	printf("Version %s\n", FCOE_UTILS_VERSION);
 	printf("Usage: %s\n"
 	       "\t [-c|--create] <ethX>\n"
 	       "\t [-d|--destroy] <ethX>\n"
 	       "\t [-r|--reset] <ethX>\n"
+	       "\t [-S|--Scan] <ethX>\n"
 	       "\t [-i|--interface] [<ethX>]\n"
 	       "\t [-t|--target] [<ethX>]\n"
-	       "\t [-l|--lun] [<target port_id> [<lun_id>]]\n"
-	       "\t [-s|--stats] <ethX> [-n <interval>]\n"
+	       "\t [-l|--lun] [<ethX>]\n"
+	       "\t [-s|--stats] <ethX> [<interval>]\n"
 	       "\t [-v|--version]\n"
 	       "\t [-h|--help]\n\n", progname);
 }
 
-/*
- * TODO - check this ifname before performing any action
- */
-static int fcoeadm_check(char *ifname)
+static enum fcoe_err fcoeadm_check_fcoemon()
 {
-	char path[256];
 	int fd;
-	int status = 0;
-
-	/* check if we have sysfs */
-	if (fcoeclif_checkdir(SYSFS_MOUNT)) {
-		fprintf(stderr,
-			"%s: Sysfs mount point %s not found\n",
-			progname, SYSFS_MOUNT);
-		status = -EINVAL;
-	}
-
-	/* check target interface */
-	if (!ifname) {
-		fprintf(stderr, "%s: Invalid interface name\n", progname);
-		status = -EINVAL;
-	}
-	sprintf(path, "%s/%s", SYSFS_NET, ifname);
-	if (fcoeclif_checkdir(path)) {
-		fprintf(stderr,
-			"%s: Interface %s not found\n", progname, ifname);
-		status = -EINVAL;
-	}
 
 	fd = open(CLIF_PID_FILE, O_RDWR, S_IRUSR | S_IWUSR);
-	if (fd < 0) {
-		fprintf(stderr,
-			"%s: fcoemon was not running\n", progname);
-		status = -EINVAL;
-	}
+	if (fd < 0)
+		return ENOMONCONN;
+
+	close(fd);
 
-	return status;
+	return NOERR;
 }
 
-static int fcoeadm_clif_request(const struct clif_data *cmd, size_t cmd_len,
-				char *reply, size_t *reply_len)
+static enum fcoe_err fcoeadm_clif_request(struct clif_sock_info *clif_info,
+					  const struct clif_data *cmd,
+					  size_t cmd_len, char *reply,
+					  size_t *reply_len)
 {
 	struct timeval tv;
 	int ret;
 	fd_set rfds;
 
-	if (send(clif_conn->s, cmd, cmd_len, 0) < 0)
-		return -1;
+	if (send(clif_info->socket_fd, cmd, cmd_len, 0) < 0)
+		return ENOMONCONN;
 
 	for (;;) {
-		tv.tv_sec = CMD_RESPONSE_TIMEOUT;
+		tv.tv_sec = CLIF_CMD_RESPONSE_TIMEOUT;
 		tv.tv_usec = 0;
 		FD_ZERO(&rfds);
-		FD_SET(clif_conn->s, &rfds);
-		ret = select(clif_conn->s + 1, &rfds, NULL, NULL, &tv);
-		if (FD_ISSET(clif_conn->s, &rfds)) {
-			ret = recv(clif_conn->s, reply, *reply_len, 0);
+		FD_SET(clif_info->socket_fd, &rfds);
+		ret = select(clif_info->socket_fd + 1, &rfds, NULL, NULL, &tv);
+		if (FD_ISSET(clif_info->socket_fd, &rfds)) {
+			ret = recv(clif_info->socket_fd, reply, *reply_len, 0);
 			if (ret < 0)
-				return ret;
+				return EINTERR;
+
 			*reply_len = ret;
 			break;
 		} else {
-			return -2;
+			return EINTERR;
 		}
 	}
 
-	return 0;
+	return NOERR;
 }
 
-static int fcoeadm_request(int cmd, char *s)
+static enum fcoe_err fcoeadm_request(struct clif_sock_info *clif_info,
+				     struct clif_data *data)
 {
-	struct clif_data *data = NULL;
 	char rbuf[MAX_MSGBUF];
 	size_t len;
-	int ret;
-
-	if (clif_conn == NULL) {
-		fprintf(stderr, "Not connected to fcoemon\n");
-		return -EINVAL;
-	}
-
-	data = (struct clif_data *)malloc(sizeof(struct clif_data));
-	if (data == NULL)
-		return -EINVAL;
+	int rc = NOERR;
 
-	memset(data, 0, sizeof(data));
-	data->cmd = cmd;
-	strcpy(data->ifname, s);
-
-	len = sizeof(rbuf)-1;
-
-	ret = fcoeadm_clif_request(data, sizeof(struct clif_data), rbuf, &len);
-	if (ret == -2) {
-		fprintf(stderr, "Command timed out\n");
-		goto fail;
-	} else if (ret < 0) {
-		fprintf(stderr, "Command failed\n");
-		goto fail;
+	/*
+	 * TODO: This is odd that we read the response code back as a
+	 * string. We should just write the error code into a member
+	 * of clif_data and then just read it directly.
+	 */
+
+	len = MAX_MSGBUF - 1;
+	rc = fcoeadm_clif_request(clif_info, data, sizeof(struct clif_data),
+				  rbuf, &len);
+
+	if (!rc) {
+		rbuf[len] = '\0';
+		rc = atoi(rbuf);
 	}
 
-	rbuf[len] = '\0';
-	ret = atoi(rbuf);
-	free(data);
-	return ret;
-
-fail:
-	free(data);
-	return -EINVAL;
+	return rc;
 }
 
-static void fcoeadm_close_cli(void)
+static void fcoeadm_close_cli(struct clif_sock_info *clif_info)
 {
-	if (clif_conn == NULL)
-		return;
-
-	unlink(clif_conn->local.sun_path);
-	close(clif_conn->s);
-	free(clif_conn);
-	clif_conn = NULL;
+	unlink(clif_info->local.sun_path);
+	close(clif_info->socket_fd);
 }
 
 /*
  * Create fcoeadm client interface
  */
-static struct clif *fcoeadm_open_cli(const char *ifname)
+static enum fcoe_err fcoeadm_open_cli(struct clif_sock_info *clif_info)
 {
-	char *fcmon_file = NULL;
-	int flen;
-	static int counter;
-
-	flen = strlen(FCM_SRV_DIR) + strlen(ifname) + 2;
-	fcmon_file = malloc(flen);
-	if (fcmon_file == NULL)
-		goto fail;
-	snprintf(fcmon_file, flen, "%s/%s", FCM_SRV_DIR, ifname);
-
-	clif_conn = malloc(sizeof(*clif_conn));
-	if (clif_conn == NULL)
-		goto fail;
-	memset(clif_conn, 0, sizeof(*clif_conn));
-
-	clif_conn->s = socket(PF_UNIX, SOCK_DGRAM, 0);
-	if (clif_conn->s < 0)
-		goto fail;
-
-	clif_conn->local.sun_family = AF_UNIX;
-	snprintf(clif_conn->local.sun_path, sizeof(clif_conn->local.sun_path),
-		    "/tmp/fcadm_clif_%d-%d", getpid(), counter++);
-	if (bind(clif_conn->s, (struct sockaddr *) &clif_conn->local,
-		    sizeof(clif_conn->local)) < 0) {
-		close(clif_conn->s);
-		goto fail;
-	}
+	int counter;
+	enum fcoe_err rc = NOERR;
 
-	clif_conn->dest.sun_family = AF_UNIX;
-	snprintf(clif_conn->dest.sun_path, sizeof(clif_conn->dest.sun_path),
-			"%s", fcmon_file);
-	if (connect(clif_conn->s, (struct sockaddr *) &clif_conn->dest,
-		    sizeof(clif_conn->dest)) < 0) {
-		close(clif_conn->s);
-		unlink(clif_conn->local.sun_path);
-		goto fail;
+	clif_info->socket_fd = socket(PF_UNIX, SOCK_DGRAM, 0);
+	if (clif_info->socket_fd < 0) {
+		rc = ENOMONCONN;
+		goto err;
 	}
 
-	free(fcmon_file);
-	return clif_conn;
-
-fail:
-	free(fcmon_file);
-	free(clif_conn);
-	return NULL;
-}
-
-/*
- * Send request to fcoemon
- */
-static int fcoeadm_action(int cmd, char *device_name)
-{
-	char *clif_ifname = NULL;
-	int ret = 0;
-
-	if (!device_name)
-		return -EINVAL;
-
-	for (;;) {
-		if (clif_ifname == NULL) {
-			struct dirent *dent;
-			DIR *dir = opendir(FCM_SRV_DIR);
-			if (dir) {
-				while ((dent = readdir(dir))) {
-					if (strcmp(dent->d_name, ".") == 0 ||
-						strcmp(dent->d_name, "..") == 0)
-						continue;
-					clif_ifname = strdup(dent->d_name);
-					break;
-				}
-			closedir(dir);
-			}
-		}
+	clif_info->local.sun_family = AF_UNIX;
+	snprintf(clif_info->local.sun_path, sizeof(clif_info->local.sun_path),
+		 "/tmp/fcadm_clif_%d-%d", getpid(), counter++);
 
-		clif_conn = fcoeadm_open_cli(clif_ifname);
-		if (clif_conn) {
-			break;
-		} else {
-			fprintf(stderr, "Failed to connect to fcoemon\n");
-			free(clif_ifname);
-			return -1;
-		}
+	if (bind(clif_info->socket_fd, (struct sockaddr *)&clif_info->local,
+		 sizeof(clif_info->local)) < 0) {
+		rc = ENOMONCONN;
+		goto err_close;
 	}
 
-	ret = fcoeadm_request(cmd, device_name);
+	clif_info->dest.sun_family = AF_UNIX;
+	strncpy(clif_info->dest.sun_path, CLIF_SOCK_FILE,
+		sizeof(clif_info->dest.sun_path));
 
-	free(clif_ifname);
-	fcoeadm_close_cli();
-
-	return ret;
-}
-
-/*
- * Create FCoE instance for this ifname
- */
-static int fcoeadm_create(char *ifname)
-{
-	if (fcoeadm_check(ifname)) {
-		fprintf(stderr,
-			"%s: Failed to create FCoE instance on %s\n",
-			progname, ifname);
-		return -EINVAL;
+	if (!connect(clif_info->socket_fd, (struct sockaddr *)&clif_info->dest,
+		     sizeof(clif_info->dest)) < 0) {
+		rc = ENOMONCONN;
+		unlink(clif_info->local.sun_path);
+		goto err_close;
 	}
-	return fcoeadm_action(FCOE_CREATE_CMD, ifname);
-}
 
-/*
- * Remove FCoE instance for this ifname
- */
-static int fcoeadm_destroy(char *ifname)
-{
-	if (fcoeadm_check(ifname)) {
-		fprintf(stderr,
-			"%s: Failed to destroy FCoE instance on %s\n",
-			progname, ifname);
-		return -EINVAL;
-	}
-	return fcoeadm_action(FCOE_DESTROY_CMD, ifname);
-}
+	return rc;
 
-/*
- * Reset the fc_host that is associated w/ this ifname
- */
-static int fcoeadm_reset(char *ifname)
-{
-	return fcoeadm_action(FCOE_RESET_CMD, ifname);
+err_close:
+	close(clif_info->socket_fd);
+err:
+	return rc;
 }
 
 /*
- * Parse a user-entered hex field.
- * Format may be xx-xx-xx OR xxxxxx OR xx:xx:xx for len bytes (up to 8).
- * Leading zeros may be omitted.
+ * Send request to fcoemon
  */
-static int parse_hex_ll(unsigned long long *hexp, const char *input, u_int len)
+static enum fcoe_err fcoeadm_action(enum clif_action cmd, char *ifname)
 {
-	int i;
-	unsigned long long hex = 0;
-	unsigned long long byte;
-	char *endptr = "";
-	int error = EINVAL;
-	char sep = 0;
-
-	for (i = 0; i < len; i++) {
-		byte = strtoull(input, &endptr, 16);
-		if (i == 0 && *endptr == '\0') {
-			hex = byte;
-			if (len == 8 || hex < (1ULL << (8 * len)))
-				error = 0;
-			break;
-		}
-		if (sep == 0 && (*endptr == ':' || *endptr == '-'))
-			sep = *endptr;
-		if ((*endptr == '\0' || *endptr == sep) && byte < 256)
-			hex = (hex << 8) | byte;
-		else
-			break;
-		input = endptr + 1;
+	struct clif_data data;
+	struct clif_sock_info clif_info;
+	enum fcoe_err rc;
+
+	strncpy(data.ifname, ifname, sizeof(data.ifname));
+	data.cmd = cmd;
+
+	rc = fcoeadm_open_cli(&clif_info);
+	if (!rc) {
+		rc = fcoeadm_request(&clif_info, &data);
+		fcoeadm_close_cli(&clif_info);
 	}
-	if (i == len && *endptr == '\0')
-		error = 0;
-	if (error == 0)
-		*hexp = hex;
-	return error;
+
+	return rc;
 }
 
-static int parse_fcid(HBA_UINT32 *fcid, const char *input)
+static enum fcoe_err fcoeadm_loadhba()
 {
-	int rc;
-	unsigned long long hex;
+	if (HBA_STATUS_OK != HBA_LoadLibrary())
+		return EHBAAPIERR;
 
-	rc = parse_hex_ll(&hex, input, 3);
-	if (rc == 0)
-		*fcid = (HBA_UINT32) hex;
-	return rc;
+	return NOERR;
 }
 
 /*
  * Display adapter information
  */
-static int fcoeadm_display_adapter_info(struct opt_info *opt_info)
+static enum fcoe_err fcoeadm_display_adapter_info(struct opt_info *opt_info)
 {
-	HBA_STATUS retval;
-
-	retval = HBA_LoadLibrary();
-	if (retval != HBA_STATUS_OK) {
-		perror("HBA_LoadLibrary");
-		return -EINVAL;
-	}
+	if (fcoeadm_loadhba())
+		return EHBAAPIERR;
 
 	display_adapter_info(opt_info);
 
 	HBA_FreeLibrary();
-	return 0;
+	return NOERR;
 }
 
 /*
  * Display target information
  */
-static int fcoeadm_display_target_info(struct opt_info *opt_info)
+static enum fcoe_err fcoeadm_display_target_info(struct opt_info *opt_info)
 {
-	HBA_STATUS retval;
-
-	retval = HBA_LoadLibrary();
-	if (retval != HBA_STATUS_OK) {
-		perror("HBA_LoadLibrary");
-		return -EINVAL;
-	}
+	if (fcoeadm_loadhba())
+		return EHBAAPIERR;
 
 	display_target_info(opt_info);
 
 	HBA_FreeLibrary();
-	return 0;
+	return NOERR;
 }
 
 /*
@@ -409,19 +241,14 @@ static int fcoeadm_display_target_info(s
  */
 static int fcoeadm_display_port_stats(struct opt_info *opt_info)
 {
-	HBA_STATUS retval;
-
 	if (!opt_info->s_flag)
 		return -EINVAL;
 
 	if (!opt_info->n_flag)
 		opt_info->n_interval = DEFAULT_STATS_INTERVAL;
 
-	retval = HBA_LoadLibrary();
-	if (retval != HBA_STATUS_OK) {
-		perror("HBA_LoadLibrary");
+	if (fcoeadm_loadhba())
 		return -EINVAL;
-	}
 
 	display_port_stats(opt_info);
 
@@ -431,168 +258,255 @@ static int fcoeadm_display_port_stats(st
 
 #define MAX_ARG_LEN 32
 
+/*
+ * getopts_long(3) does not handle optional arguments
+ * correctly. It will not allow a ' ' between the option
+ * and its argument. For required arguments the user can
+ * specify, '-i X' or '-iX' but with optional arguments
+ * only the first style is valid.
+ *
+ * This is being worked around by making '-i/-t/-l' have
+ * no arguments, but then process any following argv
+ * elements.
+ */
 int main(int argc, char *argv[])
 {
-	char fchost[FCHOSTBUFLEN], *s;
-	int opt, rc = -1;
-
+	int opt;
+	enum clif_action cmd = CLIF_NONE;
+	enum fcoe_err rc = NOERR;
+
+	/*
+	 * This has to be first because the error print macro
+	 * expects progname to be valid.
+	 */
 	strncpy(progname, basename(argv[0]), sizeof(progname));
+
+	/* check if we have sysfs */
+	if (fcoe_checkdir(SYSFS_MOUNT)) {
+		rc = ENOSYSFS;
+		goto err;
+	}
+
+	/* Check if fcoemon is running */
+	rc = fcoeadm_check_fcoemon();
+	if (rc)
+		goto err;
+
 	memset(opt_info, 0, sizeof(*opt_info));
 
-	while ((opt = getopt_long(argc, argv, "c:d:r:itls:n:hv",
-				  fcoeadm_opts, NULL)) != -1) {
+	opt = getopt_long(argc, argv, optstring, fcoeadm_opts, NULL);
+	if (opt != -1) {
 		switch (opt) {
 		case 'c':
-			if ((argc < 2 || argc > 3) ||
-			    strnlen(optarg, MAX_ARG_LEN) > (IFNAMSIZ - 1) ||
-			    ((argc == 3) && strnlen(argv[1], MAX_ARG_LEN) > 2 &&
-			     argv[1][1] != '-'))
-				goto error;
-			rc = fcoeadm_create(optarg);
-			goto done;
+			cmd = CLIF_CREATE_CMD;
 		case 'd':
-			if ((argc < 2 || argc > 3) ||
-			    strnlen(optarg, MAX_ARG_LEN) > (IFNAMSIZ - 1) ||
-			    ((argc == 3) && strnlen(argv[1], MAX_ARG_LEN) > 2 &&
-			     argv[1][1] != '-'))
-				goto error;
-			rc = fcoeadm_destroy(optarg);
-			goto done;
+			if (cmd == CLIF_NONE)
+				cmd = CLIF_DESTROY_CMD;
 		case 'r':
-			if ((argc < 2 || argc > 3) ||
-			    strnlen(optarg, MAX_ARG_LEN) > (IFNAMSIZ - 1) ||
-			    ((argc == 3) && strnlen(argv[1], MAX_ARG_LEN) > 2 &&
-			     argv[1][1] != '-'))
-				goto error;
-			rc = fcoeadm_reset(optarg);
-			goto done;
+			if (cmd == CLIF_NONE)
+				cmd = CLIF_RESET_CMD;
+		case 'S':
+			if (cmd == CLIF_NONE)
+				cmd = CLIF_SCAN_CMD;
+
+			if (argc > 3) {
+				rc = EBADNUMARGS;
+				break;
+			}
+
+			strncpy(opt_info->ifname, optarg,
+				sizeof(opt_info->ifname));
+
+			if (opt == 'c')
+				rc = fcoe_validate_interface(opt_info->ifname);
+			else
+				rc = fcoe_validate_fcoe_conn(opt_info->ifname);
+
+			if (!rc)
+				rc = fcoeadm_action(cmd, opt_info->ifname);
+			break;
+
 		case 'i':
-			if (argc < 2 || argc > 3 ||
-			    (argc == 3 && strnlen(argv[1], MAX_ARG_LEN) > 2 &&
-			     (argv[1][1] != '-' || strchr(argv[1], '=')
-			      != NULL)))
-				goto error;
-			s = NULL;
-			if (argc == 2) {
-				if (argv[1][1] == '-')
-					s = strchr(argv[1], '=')+1;
-				else
-					s = argv[1]+2;
-			} else
-				s = argv[2];
-
-			if (s) {
-				if (strnlen(s, MAX_ARG_LEN) > (IFNAMSIZ - 1))
-					goto error;
-				strncpy(opt_info->ifname, s,
+			if (argc > 3) {
+				rc = EBADNUMARGS;
+				break;
+			}
+
+			/*
+			 * If there's an aditional argument
+			 * treat it as the interface name.
+			 */
+			if (optind != argc) {
+				strncpy(opt_info->ifname, argv[optind],
 					sizeof(opt_info->ifname));
+
+				rc = fcoe_validate_fcoe_conn(opt_info->ifname);
 			}
-			if (strnlen(opt_info->ifname, IFNAMSIZ - 1)) {
-				if (fcoeclif_validate_interface(
-					    opt_info->ifname,
-					    fchost, FCHOSTBUFLEN))
-					goto done;
-			}
-			opt_info->a_flag = 1;
-			rc = fcoeadm_display_adapter_info(opt_info);
-			goto done;
+
+			if (!rc)
+				rc = fcoeadm_display_adapter_info(opt_info);
+
+			break;
+
 		case 't':
-			if (argc < 2 || argc > 3 ||
-			    (argc == 3 && strnlen(argv[1], MAX_ARG_LEN) > 2 &&
-			     (argv[1][1] != '-' || strchr(argv[1], '=')
-			      != NULL)))
-				goto error;
-			s = NULL;
-			if (argc == 2) {
-				if (argv[1][1] == '-')
-					s = strchr(argv[1], '=')+1;
-				else
-					s = argv[1]+2;
-			} else {
-				s = argv[2];
-			}
-			if (s) {
-				if (strnlen(s, MAX_ARG_LEN) > (IFNAMSIZ - 1))
-					goto error;
-				strncpy(opt_info->ifname, s,
+			if (argc > 3) {
+				rc = EBADNUMARGS;
+				break;
+			}
+
+			/*
+			 * If there's an aditional argument
+			 * treat it as the interface name.
+			 */
+			if (optind != argc) {
+				strncpy(opt_info->ifname, argv[optind],
 					sizeof(opt_info->ifname));
+
+				rc = fcoe_validate_fcoe_conn(opt_info->ifname);
 			}
-			if (strnlen(opt_info->ifname, IFNAMSIZ - 1)) {
-				if (fcoeclif_validate_interface(
-					    opt_info->ifname,
-					    fchost, FCHOSTBUFLEN))
-					goto done;
-			}
-			opt_info->t_flag = 1;
-			rc = fcoeadm_display_target_info(opt_info);
-			goto done;
+
+			if (!rc) {
+				opt_info->t_flag = 1;
+				rc = fcoeadm_display_target_info(opt_info);
+			}
+
+			break;
+
 		case 'l':
-			if (argc < 2 || argc > 4)
-				goto error;
-			if (optarg) {
-				if (parse_fcid(&opt_info->l_fcid, optarg))
-					goto error;
-				opt_info->l_fcid_present = 1;
-				if (argv[optind]) {
-					opt_info->l_lun_id = atoi(argv[optind]);
-					opt_info->l_lun_id_present = 1;
-				}
-			}
-			opt_info->l_flag = 1;
-			rc = fcoeadm_display_target_info(opt_info);
-			goto done;
-		case 's':
-			if ((argc < 2 || argc > 5) ||
-			    strnlen(optarg, MAX_ARG_LEN) > (IFNAMSIZ - 1))
-				goto error;
-			if (optarg)
-				strncpy(opt_info->ifname, optarg,
+			if (argc > 3) {
+				rc = EBADNUMARGS;
+				break;
+			}
+
+			/*
+			 * If there's an aditional argument
+			 * treat it as the interface name.
+			 */
+			if (optind != argc) {
+				strncpy(opt_info->ifname, argv[optind],
 					sizeof(opt_info->ifname));
-			if (strnlen(opt_info->ifname, IFNAMSIZ - 1)) {
-				if (fcoeclif_validate_interface(
-					    opt_info->ifname,
-					    fchost, FCHOSTBUFLEN))
-					goto done;
+
+				rc = fcoe_validate_fcoe_conn(opt_info->ifname);
 			}
-			opt_info->s_flag = 1;
-			if (argv[optind] && !strncmp(argv[optind], "-n", 2))
+
+			if (!rc) {
+				opt_info->l_flag = 1;
+				rc = fcoeadm_display_target_info(opt_info);
+			}
+
+			break;
+
+		case 's':
+			if (argc > 4) {
+				rc = EBADNUMARGS;
 				break;
-			goto stats;
-		case 'n':
-			if (!opt_info->s_flag)
-				goto error;
-			opt_info->n_interval = atoi(optarg);
-			if (opt_info->n_interval <= 0)
-				goto error;
-			if (argv[optind] &&
-			    strnlen(argv[optind], MAX_ARG_LEN<<1) > MAX_ARG_LEN)
-				goto error;
-			opt_info->n_flag = 1;
-			goto stats;
+			}
+
+			if (optind != argc) {
+				strncpy(opt_info->ifname, argv[optind],
+					sizeof(opt_info->ifname));
+
+				rc = fcoe_validate_fcoe_conn(opt_info->ifname);
+			}
+
+			if (!rc && ++optind != argc) {
+				opt_info->n_interval = atoi(argv[optind]);
+				if (opt_info->n_interval <= 0)
+					rc = EINVALARG;
+				else
+					opt_info->n_flag = 1;
+			}
+
+			if (!rc) {
+				opt_info->s_flag = 1;
+				rc = fcoeadm_display_port_stats(opt_info);
+			}
+
+			break;
+
 		case 'v':
-			if (argc != 2)
-				goto error;
-			printf("%s\n", fcoeadm_version);
-			goto done;
+			if (argc > 2) {
+				rc = EBADNUMARGS;
+				break;
+			}
+
+			printf("%s\n", FCOE_UTILS_VERSION);
+			break;
+
 		case 'h':
-		default:
-			if (argc != 2)
-				goto error;
+			if (argc > 2) {
+				rc = EBADNUMARGS;
+				break;
+			}
+
 			fcoeadm_help();
-			exit(-EINVAL);
+			break;
+
+		case '?':
+			rc = EIGNORE;
+			break;
 		}
 	}
-	goto error;
 
-stats:
-	if (!fcoeadm_display_port_stats(opt_info))
-		goto done;
-
-error:
-	fprintf(stderr, "%s: Invalid command options\n", progname);
-	fcoeadm_help();
-	exit(-EINVAL);
+err:
+	if (rc) {
+		switch (rc) {
+		case ENOFCOECONN:
+			FCOE_LOG_ERR("No connection created on "
+				     "interface %s\n", opt_info->ifname);
+			break;
+
+		case EINVALARG:
+			FCOE_LOG_ERR("Invalid argument\n");
+			break;
+
+		case EBADNUMARGS:
+			/*
+			 * Overloading E2BIG for too many argumets
+			 * and too few arguments.
+			 */
+			FCOE_LOG_ERR("Incorrect number of arguments\n");
+			break;
+
+		case EIGNORE:
+			/*
+			 * getopt_long will print the initial error, just break
+			 * through to get the --help suggestion.
+			 */
+			break;
+
+		case ENOETHDEV:
+			FCOE_LOG_ERR("Invalid interface name %s\n",
+				     opt_info->ifname);
+			break;
+
+		case ENOSYSFS:
+			FCOE_LOG_ERR("sysfs not mounted\n");
+			break;
+
+		case ENOMONCONN:
+			FCOE_LOG_ERR("Could not connect to fcoemon\n");
+			break;
+
+		case ECONNTMOUT:
+			FCOE_LOG_ERR("Connection to fcoemon timed out\n");
+			break;
+
+		case EINTERR:
+			FCOE_LOG_ERR("Internal error\n");
+			break;
+
+		default:
+			/*
+			 * This will catch EOPNOTSUPP which should never happen
+			 */
+			FCOE_LOG_ERR("Unknown error\n");
+			break;
+		}
+
+		fprintf(stderr, "Try \'%s --help\' for more information.\n",
+			progname);
+	}
 
-done:
 	return rc;
 }
Index: fcoe-utils-1.0.8/fcoeadm.h
===================================================================
--- fcoe-utils-1.0.8.orig/fcoeadm.h
+++ fcoe-utils-1.0.8/fcoeadm.h
@@ -26,11 +26,11 @@
 #include <sys/ioctl.h>
 #include <linux/types.h>
 #include <ctype.h>
-#include <stdlib.h>
+
 #include <stddef.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <stdarg.h>
-#include <errno.h>
 #include <unistd.h>
 #include <dirent.h>
 #include <time.h>
@@ -42,14 +42,12 @@
 #include <getopt.h>
 #include <byteswap.h>
 #include <net/if.h>
-#include <sys/un.h>
-
 #include "hbaapi.h"
 #include "net_types.h"
 #include "fc_types.h"
 #include "fc_scsi.h"
 
-#define FCOE_MAX_LUN	255
+#include "fcoe_utils.h"
 
 struct opt_info {
 	char ifname[IFNAMSIZ];
@@ -66,22 +64,8 @@ struct opt_info {
 	int n_interval;		/* seconds */
 };
 
-/**
- * struct clif - Internal structure for client interface library
- *
- * This structure is used by fcoeadm client interface to store internal data.
- */
-struct clif {
-	int s;
-	struct sockaddr_un local;
-	struct sockaddr_un dest;
-};
-
-extern struct opt_info *opt_info;
-extern char build_date[];
-
-extern void display_adapter_info(struct opt_info *opt_info);
-extern void display_target_info(struct opt_info *opt_info);
-extern void display_port_stats(struct opt_info *opt_info);
+void display_adapter_info(struct opt_info *opt_info);
+void display_target_info(struct opt_info *opt_info);
+void display_port_stats(struct opt_info *opt_info);
 
 #endif /* _FCOEADM_H_ */
Index: fcoe-utils-1.0.8/fcoeadm_display.c
===================================================================
--- fcoe-utils-1.0.8.orig/fcoeadm_display.c
+++ fcoe-utils-1.0.8/fcoeadm_display.c
@@ -1,5 +1,5 @@
 /*
- * Copyright(c) 2009 Intel Corporation. All rights reserved.
+ * Copyright(c) 2010 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,
@@ -43,6 +43,8 @@
 /* Minimum byte size of the received inquiry data */
 #define MIN_INQ_DATA_SIZE       36
 
+#define FCP_TARG_STR "FCP Target"
+
 struct sa_nameval {
 	char        *nv_name;
 	u_int32_t   nv_val;
@@ -195,6 +197,19 @@ sa_sys_read_u32(const char *dir, const c
 	return rc;
 }
 
+static int is_fcp_target(HBA_PORTATTRIBUTES *rp_info)
+{
+	char buf[MAX_STR_LEN];
+
+	if (sa_sys_read_line(rp_info->OSDeviceName, "roles", buf, sizeof(buf)))
+		return -EINVAL;
+
+	if (!strncmp(buf, FCP_TARG_STR, strlen(buf)))
+		return 0;
+
+	return -EINVAL;
+}
+
 static void show_wwn(unsigned char *pWwn)
 {
 	sa_dump_wwn(pWwn, 8, 0);
@@ -203,8 +218,7 @@ static void show_wwn(unsigned char *pWwn
 static void
 show_hba_info(int hba_index, HBA_ADAPTERATTRIBUTES *hba_info, int flags)
 {
-	printf("\n");
-	printf("HBA #%d\n", hba_index);
+	printf("Adapter #%d\n", hba_index);
 	printf("    Description:      %s\n", hba_info->ModelDescription);
 	printf("    Revision:         %s\n", hba_info->HardwareVersion);
 	printf("    Manufacturer:     %s\n", hba_info->Manufacturer);
@@ -212,6 +226,7 @@ show_hba_info(int hba_index, HBA_ADAPTER
 	printf("    Driver:           %s %s\n", hba_info->DriverName,
 						hba_info->DriverVersion);
 	printf("    Number of Ports:  %d\n", hba_info->NumberOfPorts);
+	printf("\n");
 }
 
 static void
@@ -222,7 +237,7 @@ show_port_info(int hba_index, int lp_ind
 	char buf[256];
 	int len = sizeof(buf);
 
-	printf("\n    Port #%d\n", lp_index);
+	printf("    Port #%d\n", lp_index);
 
 	printf("        Symbolic Name:     %s\n",
 					lp_info->PortSymbolicName);
@@ -256,21 +271,23 @@ show_port_info(int hba_index, int lp_ind
 
 	sa_enum_decode(buf, sizeof(buf), port_states, lp_info->PortState);
 	printf("        State:             %s\n", buf);
-
+	printf("\n");
 	/* TODO: Display PortSupportedFc4Types and PortActiveFc4Types */
 }
 
-static void
-show_target_info(int hba_index, int lp_index, int rp_index,
-		HBA_ADAPTERATTRIBUTES *hba_info,
-		HBA_PORTATTRIBUTES *rp_info)
+static void show_target_info(const char *symbolic_name, int hba_index,
+			     int lp_index, int rp_index,
+			     HBA_ADAPTERATTRIBUTES *hba_info,
+			     HBA_PORTATTRIBUTES *rp_info)
 {
 	char buf[256];
 	u_int32_t tgt_id;
 	int rc;
+	char *ifname;
+
+	ifname = get_ifname_from_symbolic_name(symbolic_name);
 
-	printf("Target #%d @ %s\n",
-				rp_index, hba_info->NodeSymbolicName + 5);
+	printf("Target #%d @ %s\n", rp_index, ifname);
 
 	rc = sa_sys_read_line(rp_info->OSDeviceName, "roles", buf, sizeof(buf));
 	printf("    Roles:            %s\n", buf);
@@ -296,8 +313,7 @@ show_target_info(int hba_index, int lp_i
 
 	sa_enum_decode(buf, sizeof(buf), port_states, rp_info->PortState);
 	printf("    State:            %s\n", buf);
-
-	printf("    \n");
+	printf("\n");
 }
 
 static void
@@ -906,7 +922,6 @@ scan_device_map(HBA_HANDLE hba_handle,
 		    opt_info->l_lun_id_present &&
 		    ep->ScsiId.ScsiOSLun != opt_info->l_lun_id)
 			continue;
-
 		dev = ep->ScsiId.OSDeviceName;
 		if (strstr(dev, "/dev/") == dev)
 			dev += 5;
@@ -934,7 +949,6 @@ scan_device_map(HBA_HANDLE hba_handle,
 #endif
 		if (status != HBA_STATUS_OK)
 			continue;
-
 		if (opt_info->t_flag) {
 			if (!print_header) {
 				show_short_lun_info_header();
@@ -956,8 +970,11 @@ scan_device_map(HBA_HANDLE hba_handle,
 #endif
 	}
 
+	/* Newline at the end of the short lun report */
+	if (opt_info->t_flag)
+		printf("\n");
+
 	free(map);
-	printf("\n");
 }
 
 static void
@@ -1051,7 +1068,9 @@ display_port_stats(struct opt_info *opt_
 			continue;
 		}
 
-		if (strstr(port_attrs.PortSymbolicName, opt_info->ifname)) {
+		if (!check_symbolic_name_for_interface(
+			    port_attrs.PortSymbolicName,
+			    opt_info->ifname)) {
 			found = 1;
 			break;
 		}
@@ -1209,7 +1228,7 @@ display_adapter_info(struct opt_info *op
 
 		for (j = 0; j < lport_cnt_per_hba; j++) {
 			retval = HBA_GetAdapterPortAttributes(
-					hba_handle, j, &port_attrs);
+				hba_handle, j, &port_attrs);
 			if (retval != HBA_STATUS_OK) {
 				fprintf(stderr,
 					"HBA_GetAdapterPortAttributes failed, "
@@ -1218,12 +1237,16 @@ display_adapter_info(struct opt_info *op
 			}
 
 			lp_index++;
-			if (opt_info->ifname &&
-			    !strstr(port_attrs.PortSymbolicName,
-					opt_info->ifname))
-				continue;
-			show_port_info(hba_index, lp_index, &hba_attrs,
-					&port_attrs);
+
+			if (strlen(opt_info->ifname)) {
+				if (check_symbolic_name_for_interface(
+					    port_attrs.PortSymbolicName,
+					    opt_info->ifname))
+					continue;
+			}
+
+			show_port_info(hba_index, lp_index,
+				       &hba_attrs, &port_attrs);
 		}
 		HBA_CloseAdapter(hba_handle);
 	}
@@ -1300,10 +1323,13 @@ display_target_info(struct opt_info *opt
 			}
 
 			lp_index++;
-			if (opt_info->ifname &&
-			    !strstr(port_attrs.PortSymbolicName,
-					opt_info->ifname))
-				continue;
+
+			if (strlen(opt_info->ifname)) {
+				if (check_symbolic_name_for_interface(
+					    port_attrs.PortSymbolicName,
+					    opt_info->ifname))
+					continue;
+			}
 
 			for (rp_index = 0;
 			     rp_index < port_attrs.NumberofDiscoveredPorts;
@@ -1329,10 +1355,20 @@ display_target_info(struct opt_info *opt
 				    rport_attrs.PortFcId != opt_info->l_fcid)
 					continue;
 
-				show_target_info(hba_index, lp_index,
-						 rp_index, &hba_attrs,
-						 &rport_attrs);
+				/*
+				 * Skip any targets that are not FCP targets
+				 */
+				if (is_fcp_target(&rport_attrs))
+					continue;
+
+				show_target_info(port_attrs.PortSymbolicName,
+						 hba_index, lp_index, rp_index,
+						 &hba_attrs, &rport_attrs);
 
+				/*
+				 * This will print the LUN table
+				 * under the target.
+				 */
 				scan_device_map(hba_handle, &hba_attrs,
 						&port_attrs, &rport_attrs,
 						opt_info);
Index: fcoe-utils-1.0.8/fcoemon.c
===================================================================
--- fcoe-utils-1.0.8.orig/fcoemon.c
+++ fcoe-utils-1.0.8/fcoemon.c
@@ -1,5 +1,5 @@
 /*
- * Copyright(c) 2009 Intel Corporation. All rights reserved.
+ * Copyright(c) 2010 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,
@@ -18,15 +18,12 @@
  */
 
 #include <ctype.h>
-#include <errno.h>
 #include <getopt.h>
 #include <malloc.h>
 #include <signal.h>
 #include <stddef.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <string.h>
-#include <strings.h>
 #include <time.h>
 #include <libgen.h>
 #include <ulimit.h>
@@ -53,10 +50,7 @@
 #include <dcbd/clif_cmds.h>
 #include <dcbd/common.h>	/* for event msg level definitions */
 
-#include "net_types.h"
-#include "fc_types.h"
-
-#include "fcoe_utils.h"
+#include "fcoe_utils_version.h"
 #include "fcoemon_utils.h"
 #include "fcoemon.h"
 #include "fcoe_clif.h"
@@ -88,17 +82,12 @@
 #define FCOE_ENABLE 	SYSFS_FCOE "/enable"
 #define FCOE_DISABLE	SYSFS_FCOE "/disable"
 
-static char *fcoemon_version =
-"fcoemon v" FCOE_UTILS_VERSION "\n Copyright (c) 2009, Intel Corporation.\n";
-
 enum fcm_srv_status {
 	fcm_success = 0,
 	fcm_fail,
 	fcm_no_action
 };
 
-static struct fcm_srv_data *srv_data;
-
 /*
  * fcoe service configuration data
  * Note: These information are read in from the fcoe service
@@ -115,8 +104,8 @@ struct fcoe_port {
 	int dcb_required;
 
 	/* following track data required to manage FCoE interface state */
-	u_int32_t action;      /* current state */
-	u_int32_t last_action; /* last action */
+	enum fcp_action action;      /* current state */
+	enum fcp_action last_action; /* last action */
 	int last_msg_type;     /* last rtnetlink msg type received on if name */
 	struct sock_info *sock_reply;
 };
@@ -295,8 +284,8 @@ static int fcm_read_config_files(void)
 	char val[CONFIG_MAX_VAL_LEN + 1];
 	DIR *dir;
 	struct dirent *dp;
-	struct fcoe_port *curr;
-	struct fcoe_port *next;
+	struct fcoe_port *curr = NULL;
+	struct fcoe_port *next = NULL;
 	int rc;
 
 	dir = opendir(CONFIG_DIR);
@@ -544,6 +533,7 @@ static void fcp_set_next_action(struct f
 		case FCP_ENABLE_IF:
 		case FCP_DISABLE_IF:
 		case FCP_RESET_IF:
+		case FCP_SCAN_IF:
 			p->action = action;
 			break;
 		case FCP_ACTIVATE_IF:
@@ -572,6 +562,7 @@ static void fcp_set_next_action(struct f
 		case FCP_DESTROY_IF:
 		case FCP_DISABLE_IF:
 		case FCP_RESET_IF:
+		case FCP_SCAN_IF:
 			p->action = action;
 			break;
 		default:
@@ -595,11 +586,13 @@ static void fcp_set_next_action(struct f
 		}
 		break;
 	case FCP_RESET_IF:
+	case FCP_SCAN_IF:
 		switch (action) {
 		case FCP_DESTROY_IF:
 		case FCP_ENABLE_IF:
 		case FCP_DISABLE_IF:
 		case FCP_RESET_IF:
+		case FCP_SCAN_IF:
 			p->action = action;
 			break;
 		case FCP_ACTIVATE_IF:
@@ -1764,7 +1757,6 @@ static void fcm_dcbd_event(char *msg, si
 			FCM_LOG_DEV_DBG(ff,
 					"Operational config changed");
 	}
-	return;
 }
 
 static void fcm_cli_reply(struct sock_info *r, int status)
@@ -1833,13 +1825,35 @@ static void fcm_fcoe_action(struct fcm_n
 		break;
 	case FCP_RESET_IF:
 		FCM_LOG_DBG("OP: RESET %s\n", p->ifname);
-		if (fcoeclif_validate_interface(ifname, fchost, FCHOSTBUFLEN)) {
+		/*
+		 * This call validates that the interface name
+		 * has an active fcoe session by checking for
+		 * the fc_host in sysfs.
+		 */
+		if (fcoe_find_fchost(ifname, fchost, FCHOSTBUFLEN)) {
 			fcm_cli_reply(p->sock_reply, CLI_FAIL);
 			return;
 		}
+
 		sprintf(path, "%s/%s/issue_lip", SYSFS_FCHOST, fchost);
 		rc = fcm_fcoe_if_action(path, "1");
 		break;
+	case FCP_SCAN_IF:
+		FCM_LOG_DBG("OP: SCAN %s\n", p->ifname);
+		/*
+		 * This call validates that the interface name
+		 * has an active fcoe session by checking for
+		 * the fc_host in sysfs.
+		 */
+		if (fcoe_find_fchost(ifname, fchost, FCHOSTBUFLEN)) {
+			fcm_cli_reply(p->sock_reply, CLI_FAIL);
+			return;
+		}
+
+		sprintf(path, "%s/%s/device/scsi_host/%s/scan",
+			SYSFS_FCHOST, fchost, fchost);
+		rc = fcm_fcoe_if_action(path, "- - -");
+		break;
 	default:
 		return;
 		break;
@@ -2012,9 +2026,7 @@ next_port:
 
 static void fcm_usage(void)
 {
-	printf("%s\n", fcoemon_version);
 	printf("Usage: %s\n"
-	       "\t [-e|--exec <exec>]\n"
 	       "\t [-f|--foreground]\n"
 	       "\t [-d|--debug]\n"
 	       "\t [-s|--syslog]\n"
@@ -2139,7 +2151,7 @@ static int fcm_cli_destroy(char *ifname,
 	return fcm_fail;
 }
 
-static int fcm_cli_reset(char *ifname, int cmd, struct sock_info **r)
+static int fcm_cli_action(char *ifname, int cmd, struct sock_info **r)
 {
 	struct fcoe_port *p;
 
@@ -2178,7 +2190,7 @@ int fcm_save_reply(struct sock_info **r,
  */
 static void fcm_srv_receive(void *arg)
 {
-	struct fcm_srv_data *fcm_srv_rdata = arg;
+	struct fcm_srv_info *srv_info = arg;
 	struct clif_data *data;
 	struct sockaddr_un from;
 	socklen_t fromlen = sizeof(struct sockaddr_un);
@@ -2187,7 +2199,7 @@ static void fcm_srv_receive(void *arg)
 	char *ifname;
 	int res, cmd, snum;
 
-	snum = fcm_srv_rdata->srv_sock;
+	snum = srv_info->srv_sock;
 	res = recvfrom(snum, buf, sizeof(buf) - 1,
 			MSG_DONTWAIT, (struct sockaddr *)&from, &fromlen);
 	if (res < 0) {
@@ -2204,30 +2216,34 @@ static void fcm_srv_receive(void *arg)
 		goto err;
 
 	switch (cmd) {
-	case FCP_CREATE_IF:
+	case CLIF_CREATE_CMD:
 		FCM_LOG_DBG("FCMON CREATE\n");
 		if (fcm_save_reply(&reply, &from, fromlen, snum))
 			goto err_out;
 		if (fcm_cli_create(ifname, FCP_CREATE_IF, &reply))
 			goto err_out;
 		break;
-	case FCP_DESTROY_IF:
+	case CLIF_DESTROY_CMD:
 		FCM_LOG_DBG("FCMON DESTROY\n");
 		if (fcm_save_reply(&reply, &from, fromlen, snum))
 			goto err_out;
 		if (fcm_cli_destroy(ifname, FCP_DESTROY_IF, &reply))
 			goto err_out;
 		break;
-	case FCP_RESET_IF:
+	case CLIF_RESET_CMD:
 		FCM_LOG_DBG("FCMON RESET\n");
 		if (fcm_save_reply(&reply, &from, fromlen, snum))
 			goto err_out;
-		if (fcm_cli_reset(ifname, FCP_RESET_IF, &reply))
+		if (fcm_cli_action(ifname, FCP_RESET_IF, &reply))
+			goto err_out;
+		break;
+	case CLIF_SCAN_CMD:
+		FCM_LOG_DBG("FCMON SCAN\n");
+		if (fcm_save_reply(&reply, &from, fromlen, snum))
+			goto err_out;
+		if (fcm_cli_action(ifname, FCP_SCAN_IF, &reply))
 			goto err_out;
 		break;
-	default:
-		fprintf(stderr, "BAD COMMAND\n");
-		goto err_out;
 	}
 
 	free(ifname);
@@ -2239,136 +2255,80 @@ err_out:
 err:
 	snprintf(rbuf, MSG_RBUF, "%d", CLI_FAIL);
 	sendto(snum, rbuf, MSG_RBUF, 0, (struct sockaddr *)&from, fromlen);
-	return;
 }
 
-static int fcm_srv_create(struct fcm_srv_data *srv_data)
+static int fcm_srv_create(struct fcm_srv_info *srv_info)
 {
 	struct sockaddr_un addr;
-	int s = -1;
-	char *fname = NULL;
-	int retry;
-	size_t len;
-
-	srv_data->srv_sock = -1;
+	int rc = 0;
 
-	if (srv_data->srv_interface == NULL)
-		return -1;
-
-	if (mkdir(srv_data->srv_interface, S_IRWXU | S_IRWXG) < 0) {
+	if (mkdir(FCM_SRV_DIR, S_IRWXU | S_IRWXG) < 0) {
 		if (errno == EEXIST) {
-			FCM_LOG_DBG("fcm_srv_create: directory existed.");
+			FCM_LOG_ERR(errno, "Failed to create socket "
+				    "directory %s, this indicates that "
+				    "fcoemon was not shutdown cleanly",
+				    FCM_SRV_DIR);
 		} else {
-			FCM_LOG_ERR(errno, "fcm_srv_create: mkdir[interface]");
-			goto fail;
+			rc = errno;
+			FCM_LOG_ERR(errno, "Failed to create socket "
+				    "directory %s\n", FCM_SRV_DIR);
+			goto err;
 		}
 	}
 
-	if (srv_data->srv_if_gid_set &&
-	    chown(srv_data->srv_interface, 0,
-		  srv_data->srv_if_gid) < 0) {
-		FCM_LOG_ERR(errno, "fcm_srv_create: chown[srv_interface]");
-		goto fail;
-	}
-
-	if (strlen(srv_data->srv_interface) + 1 + strlen(srv_data->iface)
-	    >= sizeof(addr.sun_path))
-		goto fail;
-
-	s = socket(PF_UNIX, SOCK_DGRAM, 0);
-	if (s < 0) {
-		FCM_LOG_ERR(errno, "socket(PF_UNIX)");
-		goto fail;
+	srv_info->srv_sock = socket(PF_UNIX, SOCK_DGRAM, 0);
+	if (srv_info->srv_sock < 0) {
+		FCM_LOG_ERR(errno, "Failed to create socket\n");
+		rc = errno;
+		goto err_rmdir;
 	}
 
 	memset(&addr, 0, sizeof(addr));
 	addr.sun_family = AF_UNIX;
+	strncpy(addr.sun_path, CLIF_SOCK_FILE, sizeof(addr.sun_path));
 
-	len = strlen(srv_data->srv_interface) + strlen(srv_data->iface) + 2;
-	fname = malloc(len);
-	memset(fname, 0, len);
-	if (fname == NULL)
-		goto fail;
-
-	snprintf(fname, len, "%s/%s",
-		 srv_data->srv_interface, srv_data->iface);
-	fname[len - 1] = '\0';
-
-	strncpy(addr.sun_path, fname, sizeof(addr.sun_path));
-	for (retry = 0; retry < 2; retry++) {
-		if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
-			if (errno == EADDRINUSE)
-				unlink(fname);
-		} else {
-			break;
-		}
-	}
-	if (retry == 2) {
-		FCM_LOG_ERR(errno, "bind(PF_UNIX)");
-		goto fail;
-	}
-
-	if (srv_data->srv_if_gid_set &&
-	    chown(fname, 0, srv_data->srv_if_gid) < 0) {
-		FCM_LOG_ERR(errno, "chown[srv_interface/ifname]");
-		goto fail;
-	}
+	/*
+	 * If there was a previous socket file unlink. If we don't
+	 * then bind will fail.
+	 */
+	unlink(CLIF_SOCK_FILE);
 
-	if (chmod(fname, S_IRWXU | S_IRWXG) < 0) {
-		FCM_LOG_ERR(errno, "chmod[srv_interface/ifname]");
-		goto fail;
+	if (bind(srv_info->srv_sock, (struct sockaddr *)&addr,
+		 sizeof(addr)) < 0) {
+		FCM_LOG_ERR(errno, "Failed to bind socket\n");
+		rc = errno;
+		goto err_close;
 	}
-	free(fname);
 
-	srv_data->srv_sock = s;
-	FCM_LOG_DBG("fcm_srv_create: created");
-	sa_select_add_fd(s, fcm_srv_receive, NULL, NULL, srv_data);
+	sa_select_add_fd(srv_info->srv_sock, fcm_srv_receive,
+			 NULL, NULL, srv_info);
 
-	return 0;
+	FCM_LOG_DBG("Successfully created socket, socket file and binding\n");
 
-fail:
-	if (s >= 0)
-		close(s);
-	if (fname) {
-		unlink(fname);
-		free(fname);
-	}
-	return -1;
-}
+	return rc;
 
-/*
- * Create fcoemon server interface
- */
-static void fcm_srv_init(void)
-{
-	if (!srv_data) {
-		srv_data = malloc(sizeof(struct fcm_srv_data));
-		if (srv_data == NULL) {
-			FCM_LOG_ERR(errno, "srv_data malloc error\n");
-			exit(EXIT_FAILURE);
-		}
-	}
-
-	srv_data->srv_interface = (char *)FCM_SRV_DIR;
-	strncpy(srv_data->iface, CLIF_IFNAME, sizeof(CLIF_IFNAME)+1);
-	srv_data->srv_if_gid_set = 0;
-	srv_data->srv_if_gid = 0;
+err_close:
+	close(srv_info->srv_sock);
+	unlink(CLIF_SOCK_FILE);
 
-	if (fcm_srv_create(srv_data))
-		FCM_LOG_ERR(errno, "fcm_srv_init : fcm_srv_create() failed");
+err_rmdir:
+	rmdir(FCM_SRV_DIR);
 
+err:
+	return rc;
 }
 
-static void fcm_srv_shutdown(void)
+static void fcm_srv_destroy(struct fcm_srv_info *srv_info)
 {
 	FCM_LOG_DBG("Shutdown fcmon server");
-	close(srv_data->srv_sock);
-	free(srv_data);
-	return;
+	close(srv_info->srv_sock);
+	unlink(CLIF_SOCK_FILE);
+	rmdir(FCM_SRV_DIR);
 }
 
 int main(int argc, char **argv)
 {
+	struct fcm_srv_info srv_info;
 	struct sigaction sig;
 	int fcm_fg = 0;
 	int rc;
@@ -2394,7 +2354,7 @@ int main(int argc, char **argv)
 			enable_syslog(1);
 			break;
 		case 'v':
-			printf("%s\n", fcoemon_version);
+			printf("%s\n", FCOE_UTILS_VERSION);
 			return 0;
 		case 'h':
 		default:
@@ -2432,25 +2392,26 @@ int main(int argc, char **argv)
 	 */
 	memset(&sig, 0, sizeof(sig));
 	sig.sa_handler = fcm_sig;
+
 	rc = sigaction(SIGINT, &sig, NULL);
 	if (rc < 0) {
-		FCM_LOG_ERR(errno, "sigaction failed");
+		FCM_LOG_ERR(errno, "Failed to register handler for SIGINT");
 		exit(1);
 	}
 	rc = sigaction(SIGTERM, &sig, NULL);
 	if (rc < 0) {
-		FCM_LOG_ERR(errno, "sigaction failed");
+		FCM_LOG_ERR(errno, "Failed to register handler for SIGTERM");
 		exit(1);
 	}
 	rc = sigaction(SIGHUP, &sig, NULL);
 	if (rc < 0) {
-		FCM_LOG_ERR(errno, "sigaction failed");
+		FCM_LOG_ERR(errno, "Failed to register handler for SIGHUP");
 		exit(1);
 	}
 	fcm_pidfile_create();
 
 	/* check fcoe module */
-	if (fcoeclif_checkdir(SYSFS_FCOE)) {
+	if (fcoe_checkdir(SYSFS_FCOE)) {
 		FCM_LOG_ERR(errno, "make sure FCoE driver module is loaded!");
 		exit(1);
 	}
@@ -2458,7 +2419,7 @@ int main(int argc, char **argv)
 	fcm_fcoe_init();
 	fcm_link_init();	/* NETLINK_ROUTE protocol */
 	fcm_dcbd_init();
-	fcm_srv_init();
+	fcm_srv_create(&srv_info);
 	sa_select_set_callback(fcm_handle_changes);
 
 	rc = sa_select_loop();
@@ -2467,7 +2428,7 @@ int main(int argc, char **argv)
 		exit(EXIT_FAILURE);
 	}
 	fcm_dcbd_shutdown();
-	fcm_srv_shutdown();
+	fcm_srv_destroy(&srv_info);
 	fcm_cleanup();
 	return 0;
 }
Index: fcoe-utils-1.0.8/fcoemon.h
===================================================================
--- fcoe-utils-1.0.8.orig/fcoemon.h
+++ fcoe-utils-1.0.8/fcoemon.h
@@ -20,6 +20,8 @@
 #ifndef _FCOEMON_H_
 #define _FCOEMON_H_
 
+#include "fcoe_utils.h"
+
 struct fcoe_config {
 	int debug;
 	int use_syslog;
@@ -88,6 +90,7 @@ enum fcp_action {
    FCP_CREATE_IF,       /* create FCoE interface */
    FCP_DESTROY_IF,      /* destroy FCoE interface */
    FCP_RESET_IF,        /* reset FCoE interface */
+   FCP_SCAN_IF,         /* scan FCoE interface */
    FCP_ENABLE_IF,       /* enable FCoE interface */
    FCP_DISABLE_IF,      /* disable FCoE interface */
    FCP_ACTIVATE_IF,     /* create or enable FCoE interface */
@@ -143,24 +146,17 @@ struct fcm_netif {
 /*
  * Description of fcoe socket server interface
  */
-struct fcm_srv_data {
-	char iface[IFNAMSIZ+1];
-	char *srv_interface;
-	gid_t srv_if_gid;
-	int srv_if_gid_set;
+struct fcm_srv_info {
 	int srv_sock;
 };
 
 TAILQ_HEAD(fcm_netif_head, fcm_netif);
 
 struct fcm_netif_head fcm_netif_head;
-extern char build_date[];
 
 static void fcm_dcbd_init(void);
 static void fcm_dcbd_shutdown(void);
 static void fcm_fcoe_init(void);
-static void fcm_srv_init(void);
-static void fcm_srv_shutdown(void);
 static struct fcm_netif *fcm_netif_lookup(char *);
 static struct fcm_netif *fcm_netif_lookup_create(char *);
 static int fcm_link_init(void);
Index: fcoe-utils-1.0.8/fcping.c
===================================================================
--- fcoe-utils-1.0.8.orig/fcping.c
+++ fcoe-utils-1.0.8/fcping.c
@@ -1,5 +1,5 @@
 /*
- * Copyright(c) 2009 Intel Corporation. All rights reserved.
+ * Copyright(c) 2010 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,
@@ -54,6 +54,8 @@ typedef uint8_t u8;
 #include <scsi/fc/fc_els.h>
 #include <scsi/scsi_bsg_fc.h>
 
+#include "fcoe_utils.h"
+
 static const char *cmdname;
 
 #define FC_MAX_PAYLOAD  (2112U - sizeof(net32_t))
@@ -69,8 +71,9 @@ static void
 fp_usage()
 {
 	fprintf(stderr,
-	"Usage: %s [-fqx] -i <interval> -c <count> -h <hba> -s <size> \\\n"
-	"                [ -F <FC-ID> | -P <WWPN> | -N <WWNN>]\n"
+	"Usage: %s [-fqx] -i <interval> [ -c <count> ] -h <hba> "
+	"[ -s <size> ] \n"
+	"              [ -F <FC-ID> | -P <WWPN> | -N <WWNN>]\n"
 	"  flags: \n"
 	"     -f:            Flood ping\n"
 	"     -q:            Quiet! just print summary\n"
@@ -547,7 +550,9 @@ fp_find_hba(void)
 			}
 			break;
 		default:
-			if (!strstr(port_attrs.PortSymbolicName, fp_hba)) {
+			if (check_symbolic_name_for_interface(
+				    port_attrs.PortSymbolicName,
+				    fp_hba)) {
 				HBA_CloseAdapter(hba_handle);
 				continue;
 			}
Index: fcoe-utils-1.0.8/fipvlan.c
===================================================================
--- fcoe-utils-1.0.8.orig/fipvlan.c
+++ fcoe-utils-1.0.8/fipvlan.c
@@ -1,5 +1,5 @@
 /*
- * Copyright(c) 2009 Intel Corporation. All rights reserved.
+ * Copyright(c) 2010 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,
@@ -36,7 +36,7 @@
 #include <arpa/inet.h>
 #include <linux/netlink.h>
 #include <linux/rtnetlink.h>
-#include "fcoe_utils.h"
+#include "fcoe_utils_version.h"
 #include "fip.h"
 #include "log.h"
 #include "list.h"
openSUSE Build Service is sponsored by