diff --git a/fcoe-utils-1.0.29-29-g9267509.patch b/fcoe-utils-1.0.29-29-g9267509.patch
deleted file mode 100644
index db59faa..0000000
--- a/fcoe-utils-1.0.29-29-g9267509.patch
+++ /dev/null
@@ -1,1283 +0,0 @@
-sync to v1.0.29-29-g9267509
-
-9267509 fcoeadm: display strings for new port speeds
-671b7f9 fcoemon: Fix IEEE state machine
-4982e60 man: Fix typo in fcoemon documentation
-f90bbd7 FIPVLAN: Really break out of the recv_loop upon fip_recv error
-fa308a6 doc: Update QUICKSTART/INSTALL docs for systemd init file install
-09caead fcoemon: systemd socket activation
-41e9d79 fcoemon: add systemd service file
-d8deef2 fcnsq: Fixup 64bit integer handling
-6750b2a fcnsq: Fixup help text
-e566b3e Fix integer formatting
-9869390 build: Fix build with '-Wl,--as-needed'
-0e5d536 build: Add missing 'DESTDIR' when installing bash completion
-6bde8d1 fipvlan: filter interfaces from rtnl_getlink
-45d0e70 fipvlan: handle errors from fip socket creation
-78ea81a fipvlan: break out of receive loop on error
-86928f2 fipvlan: Do not shut down FCoE connections on physical interface
-08d9872 fipvlan: Update manpage to reflect correct timeout
-0559d7d fipvlan: Leave link up if requested
-9ade5c6 fipvlan: update manpage
-3ded166 fipvlan: Re-send VLAN discovery
-9f5e376 fipvlan: Update wait loop to wait for VLANs
-16e421a fipvlan: Start FCoE from netlink handler
-ac1fc20 fipvlan: create VLANs from netlink handler
-6ce709f fipvlan: Extract create_missing_vlan function from loop
-ef209fd fipvlan: start VLAN interface from netlink handler
-29d1722 fipvlan: Only shutdown interfaces if no vlans are created
-921a055 fipvlan fails on powerpc
-0f63a3e Don't call AM_INIT_AUTOMAKE twice
-fd085bc man: Fix small typo regarding --fcf option
----
- INSTALL | 3 +
- Makefile.am | 16 ++-
- QUICKSTART | 3 +
- configure.ac | 9 +-
- doc/fcoeadm.8 | 18 +--
- doc/fcoeadm.txt | 4 +-
- doc/fcoemon.8 | 2 +-
- doc/fcoemon.txt | 3 +-
- doc/fipvlan.8 | 17 ++-
- doc/fipvlan.txt | 9 +-
- etc/systemd/fcoe.service | 14 ++
- etc/systemd/fcoemon.socket | 6 +
- fcnsq.c | 20 ++-
- fcoeadm_display.c | 10 +-
- fcoemon.c | 100 ++++++++++++--
- fcping.c | 11 +-
- fipvlan.c | 327 ++++++++++++++++++++++++++-------------------
- lib/fip.c | 20 ++-
- 18 files changed, 394 insertions(+), 198 deletions(-)
-
-diff --git a/INSTALL b/INSTALL
-index 3abdf07..ea8c95e 100644
---- a/INSTALL
-+++ b/INSTALL
-@@ -19,6 +19,9 @@ DEPENDENCIES
-
- 1) Bootstrap, configure, make and make install
- # ./bootstrap.sh
-+ Either execute the next line for System V init script install
- # rpm --eval "%configure" | sh
-+ or the following line to install systemd unit scripts
-+ # rpm --eval "%configure --with-systemdsystemunitdir=/" | sh
- # make
- # make install
-diff --git a/Makefile.am b/Makefile.am
-index 5cbc15f..e7df6f5 100644
---- a/Makefile.am
-+++ b/Makefile.am
-@@ -9,21 +9,18 @@ AM_CFLAGS = -Wall -Wformat=2 -Werror -Wmissing-prototypes -Wstrict-prototypes
-
- ## rules for building fcoeadm
- fcoeadm_SOURCES = fcoeadm.c fcoeadm_display.c
--fcoeadm_LDADD = lib/libutil.a libopenfcoe.a
-+fcoeadm_LDADD = lib/libutil.a libopenfcoe.a $(HBAAPI_LIBS)
- fcoeadm_CFLAGS = $(AM_CFLAGS) $(HBAAPI_CFLAGS)
--fcoeadm_LDFLAGS = $(AM_LDFLAGS) $(HBAAPI_LIBS)
-
- ## rules for building fcoemon
- fcoemon_SOURCES = fcoemon.c
--fcoemon_LDADD = lib/libutil.a
-+fcoemon_LDADD = lib/libutil.a -lrt
- fcoemon_CFLAGS = $(AM_CFLAGS) $(DCBD_CFLAGS)
--fcoemon_LDFLAGS = $(AM_LDFLAGS) -lrt
-
- ## rules for building fcping
- fcping_SOURCES = fcping.c
--fcping_LDADD = lib/libutil.a
-+fcping_LDADD = lib/libutil.a $(HBAAPI_LIBS) -lrt
- fcping_CFLAGS = $(AM_CFLAGS) $(HBAAPI_CFLAGS)
--fcping_LDFLAGS = $(AM_LDFLAGS) $(HBAAPI_LIBS) -lrt
-
- ## rules for building fipvlan
- fipvlan_SOURCES = fipvlan.c
-@@ -44,6 +41,11 @@ noinst_HEADERS = fcoeadm_display.h fcoe_clif.h fcoemon.h \
- fcoe_configdir = ${sysconfdir}/fcoe
- dist_fcoe_config_DATA = etc/cfg-ethx
-
-+## install systemd service files
-+if HAVE_SYSTEMD
-+systemdsystemunit_DATA = etc/systemd/fcoe.service etc/systemd/fcoemon.socket
-+endif
-+
- ## man pages for fcoeadm and fcoemon
- dist_man_MANS = doc/fcoeadm.8 doc/fcoemon.8 doc/fipvlan.8 doc/fcrls.8 \
- doc/fcnsq.8 doc/fcping.8
-@@ -67,7 +69,7 @@ init_d_SCRIPTS = etc/initd/fcoe
-
- dist_noinst_DATA = README COPYING INSTALL fcoe-utils.spec etc/config
-
--BASH_COMPLETION_DIR=/etc/bash_completion.d/
-+BASH_COMPLETION_DIR=$(DESTDIR)/etc/bash_completion.d/
-
- install-data-hook:
- if [ ! -f ${DESTDIR}${fcoe_configdir}/config ] ; then \
-diff --git a/QUICKSTART b/QUICKSTART
-index 6fc82b3..c001bc1 100644
---- a/QUICKSTART
-+++ b/QUICKSTART
-@@ -201,7 +201,10 @@ PROCESS
- 2) Bootstrap, configure, make and make install
- # cd fcoe-utils
- # ./bootstrap.sh
-+ Either execute the next line for System V init script install
- # rpm --eval "%configure" | sh
-+ or the following line to install systemd unit scripts
-+ # rpm --eval "%configure --with-systemdsystemunitdir=/" | sh
- # make
- # make install
-
-diff --git a/configure.ac b/configure.ac
-index 73c140f..107d039 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -1,5 +1,4 @@
- AC_INIT([fcoe-utils], [1.0.29], [fcoe-devel@open-fcoe.org])
--AM_INIT_AUTOMAKE([foreign])
-
- m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
- AM_INIT_AUTOMAKE([foreign])
-@@ -18,6 +17,14 @@ AC_SUBST([LLDPAD_CFLAGS])
- PKG_CHECK_MODULES([LIBHBALINUX], [libhbalinux >= 1.0.13])
- AC_SUBST([LIBHBALINUX_CFLAGS])
-
-+PKG_PROG_PKG_CONFIG
-+AC_ARG_WITH([systemdsystemunitdir],
-+ AS_HELP_STRING([--with-systemdsystemunitdir=DIR],
-+ [Directory for systemd service files]), [],
-+ [with_systemdsystemunitdir=$($PKG_CONFIG --variable=systemdsystemunitdir systemd)])
-+AC_SUBST([systemdsystemunitdir], [$with_systemdsystemunitdir])
-+AM_CONDITIONAL(HAVE_SYSTEMD, [test -n "$with_systemdsystemunitdir"])
-+
- AC_CONFIG_FILES([Makefile fcoe-utils.spec include/fcoe_utils_version.h])
- AC_OUTPUT
-
-diff --git a/doc/fcoeadm.8 b/doc/fcoeadm.8
-index 11da6e3..2fefd70 100644
---- a/doc/fcoeadm.8
-+++ b/doc/fcoeadm.8
-@@ -1,13 +1,13 @@
- '\" t
- .\" Title: fcoeadm
- .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author]
--.\" Generator: DocBook XSL Stylesheets v1.76.1
--.\" Date: 11/08/2012
-+.\" Generator: DocBook XSL Stylesheets v1.78.1
-+.\" Date: 10/14/2013
- .\" Manual: Open-FCoE Tools
- .\" Source: Open-FCoE
- .\" Language: English
- .\"
--.TH "FCOEADM" "8" "11/08/2012" "Open\-FCoE" "Open\-FCoE Tools"
-+.TH "FCOEADM" "8" "10/14/2013" "Open\-FCoE" "Open\-FCoE Tools"
- .\" -----------------------------------------------------------------
- .\" * Define some portability stuff
- .\" -----------------------------------------------------------------
-@@ -39,7 +39,7 @@ fcoeadm \- The Open\-FCoE Administration Tool
- .sp
- \fBfcoeadm\fR \-i|\-\-interface [\fIethX\fR]
- .sp
--\fBfcoeadm\fR \-f|\-\-fcfs [\fIethX\fR]
-+\fBfcoeadm\fR \-f|\-\-fcf [\fIethX\fR]
- .sp
- \fBfcoeadm\fR \-t|\-\-target [\fIethX\fR]
- .sp
-@@ -91,7 +91,7 @@ Rescan for new targets and LUNs on the provided instance\&. This command will no
- Show information about the FCoE instance on the specified network interface, or all FCoE instances if no network interface is specified\&.
- .RE
- .PP
--\fB\-f\fR, \fB\-\-fcfs\fR [\fIethX\fR]
-+\fB\-f\fR, \fB\-\-fcf\fR [\fIethX\fR]
- .RS 4
- Show information about the discovered Fibre Channel Forwarders (FCFs) on the specified network interface, or all discovered FCFs if no network interface is specified\&.
- .RE
-@@ -143,13 +143,9 @@ command\&.
- .RE
- .SH "INTERFACE NAMES"
- .sp
--The actual name for \fIethX\fR depends on the \fBAUTO_VLAN\fR setting in
--the fcoemon interface configuration (/etc/fcoe/cfg-ethX, see \fBfcoemon\fR)\&.
-+The actual name for \fIethX\fR depends on the \fBAUTO_VLAN\fR setting in the fcoemon interface configuration (/etc/fcoe/cfg\-ethX, see \fBfcoemon\fR)\&.
- .sp
--If \fBAUTO_VLAN\fR is set to \fIyes\fR, the interface name \fIethX\fR
--references the network device itself. If \fBAUTO_VLAN\fR is set to
--\fIno\fR, the interface name \fIethX\fR references the VLAN device\&.
--.RE
-+If \fBAUTO_VLAN\fR is set to \fIyes\fR, the interface name \fIethX\fR references the network device itself\&. If \fBAUTO_VLAN\fR is set to \fIno\fR, the interface name \fIethX\fR references the VLAN device\&.
- .SH "EXAMPLES"
- .sp
- Creates an FCoE instance on eth2\&.101
-diff --git a/doc/fcoeadm.txt b/doc/fcoeadm.txt
-index 788625c..28ed482 100644
---- a/doc/fcoeadm.txt
-+++ b/doc/fcoeadm.txt
-@@ -29,7 +29,7 @@ SYNOPSIS
-
- *fcoeadm* -i|--interface [_ethX_]
-
--*fcoeadm* -f|--fcfs [_ethX_]
-+*fcoeadm* -f|--fcf [_ethX_]
-
- *fcoeadm* -t|--target [_ethX_]
-
-@@ -89,7 +89,7 @@ OPERATIONS
- Show information about the FCoE instance on the specified network
- interface, or all FCoE instances if no network interface is specified.
-
--*-f*, *--fcfs* [_ethX_]::
-+*-f*, *--fcf* [_ethX_]::
- Show information about the discovered Fibre Channel Forwarders (FCFs)
- on the specified network interface, or all discovered FCFs if no
- network interface is specified.
-diff --git a/doc/fcoemon.8 b/doc/fcoemon.8
-index e9a045b..020394e 100644
---- a/doc/fcoemon.8
-+++ b/doc/fcoemon.8
-@@ -358,7 +358,7 @@ indicates whether a FIP responder should be activated on this device to support
- Note that the attached Ethernet peer device (e\&.g\&. FCoE capable switch port) must have compatible settings For DCB and FCoE to function properly\&.
- .SS "/etc/init\&.d/fcoe"
- .sp
--This is the \fBfcoe\fR system service script\&. This script is invoked by the init process or by the service command to start and stop the \fBfcoemon\fR\&.
-+This is the \fBfcoe\fR system service script\&. This script is invoked by the init process or by the service command to start and stop the \fBfcoemon\fR\&. On systemd-enabled systems, \fBfcoemon\fR is controlled via the \fBfcoe.service\fR unit.
- .SH "VLAN NAMING CONVENTIONS"
- .sp
- If a new VLAN device is created (see the description of the \fIAUTO_VLAN\fR setting above), it will have the name \fIdev\fR\&.\fIvlan\fR\-fcoe; where \fIdev\fR is the name of the Ethernet parent device and \fIvlan\fR is the discovered VLAN ID number\&.
-diff --git a/doc/fcoemon.txt b/doc/fcoemon.txt
-index ec15197..7ccf892 100644
---- a/doc/fcoemon.txt
-+++ b/doc/fcoemon.txt
-@@ -56,7 +56,7 @@ OPTIONS
- *-d*, *--debug*::
- Enable debugging messages.
- *-l*, *--legacy*::
-- Force fcoemon to use the legacy /sys/modlue/libfcoe/parameters/
-+ Force fcoemon to use the legacy /sys/module/libfcoe/parameters/
- interface. The default is to use the newer /sys/bus/fcoe/ interfaces
- if they are available.
- *-s*, *--syslog*::
-@@ -214,6 +214,7 @@ must have compatible settings For DCB and FCoE to function properly.
- ~~~~~~~~~~~~~~~~
- This is the *fcoe* system service script. This script is invoked by the
- init process or by the service command to start and stop the *fcoemon*.
-+On systemd-enabled systems, *fcoemon* is controlled via the *fcoe.service* unit.
-
- VLAN NAMING CONVENTIONS
- -----------------------
-diff --git a/doc/fipvlan.8 b/doc/fipvlan.8
-index f81cb3a..1d2b707 100644
---- a/doc/fipvlan.8
-+++ b/doc/fipvlan.8
-@@ -1,13 +1,13 @@
- '\" t
- .\" Title: fipvlan
- .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author]
--.\" Generator: DocBook XSL Stylesheets v1.76.1
--.\" Date: 03/18/2013
-+.\" Generator: DocBook XSL Stylesheets v1.78.1
-+.\" Date: 12/02/2013
- .\" Manual: Open-FCoE Tools
- .\" Source: Open-FCoE
- .\" Language: English
- .\"
--.TH "FIPVLAN" "8" "03/18/2013" "Open\-FCoE" "Open\-FCoE Tools"
-+.TH "FIPVLAN" "8" "12/02/2013" "Open\-FCoE" "Open\-FCoE Tools"
- .\" -----------------------------------------------------------------
- .\" * Define some portability stuff
- .\" -----------------------------------------------------------------
-@@ -29,9 +29,9 @@
- fipvlan \- Fibre Channel over Ethernet VLAN Discovery
- .SH "SYNOPSIS"
- .sp
--\fBfipvlan\fR [\-c|\-\-create] [\-s|\-\-start] [\-m|\-\-mode fabric|vn2vn] \fIinterfaces\fR
-+\fBfipvlan\fR [\-c|\-\-create] [\-d|\-\-debug] [\-s|\-\-start] [\-m|\-\-mode fabric|vn2vn] [\-u|\-\-link\-up] \fIinterfaces\fR
- .sp
--\fBfipvlan\fR \-a|\-\-auto [\-c|\-\-create] [\-d|\-\-debug] [\-s|\-\-start] [\-m|\-\-mode fabric|vn2vn] [\-l|\-\-link\-retry \fIcount\fR]
-+\fBfipvlan\fR \-a|\-\-auto [\-c|\-\-create] [\-d|\-\-debug] [\-s|\-\-start] [\-m|\-\-mode fabric|vn2vn] [\-l|\-\-link\-retry \fIcount\fR] [\-u|\-\-link\-up]
- .sp
- \fBfipvlan\fR \-h|\-\-help
- .sp
-@@ -83,7 +83,12 @@ to VLAN interface names\&.
- .RS 4
- Retry check for link up to
- \fIcount\fR
--times\&. The link state is checked every 500 ms\&. The default number of retries is 20\&.
-+times\&. The link state is checked every 1000 ms\&. The default number of retries is 20\&.
-+.RE
-+.PP
-+\fB\-u\fR, \fB\-\-link\-up\fR
-+.RS 4
-+Leave link up if a FIP response has been received\&.
- .RE
- .PP
- \fB\-h\fR, \fB\-\-help\fR
-diff --git a/doc/fipvlan.txt b/doc/fipvlan.txt
-index 9699197..5ba0324 100644
---- a/doc/fipvlan.txt
-+++ b/doc/fipvlan.txt
-@@ -19,10 +19,12 @@ fipvlan - Fibre Channel over Ethernet VLAN Discovery
-
- SYNOPSIS
- --------
--*fipvlan* [-c|--create] [-s|--start] [-m|--mode fabric|vn2vn] _interfaces_
-+*fipvlan* [-c|--create] [-d|--debug] [-s|--start]
-+ [-m|--mode fabric|vn2vn] [-u|--link-up] _interfaces_
-
- *fipvlan* -a|--auto [-c|--create] [-d|--debug]
- [-s|--start] [-m|--mode fabric|vn2vn] [-l|--link-retry _count_]
-+ [-u|--link-up]
-
- *fipvlan* -h|--help
-
-@@ -73,7 +75,10 @@ OPTIONS
-
- *-l*, *--link-retry* _count_::
- Retry check for link up to _count_ times. The link state is
-- checked every 500 ms. The default number of retries is 20.
-+ checked every 1000 ms. The default number of retries is 20.
-+
-+*-u*, *--link-up*::
-+ Leave link up if a FIP response has been received.
-
- *-h*, *--help*::
- Display a help message with basic usage instructions
-diff --git a/etc/systemd/fcoe.service b/etc/systemd/fcoe.service
-new file mode 100644
-index 0000000..5e5c8a2
---- /dev/null
-+++ b/etc/systemd/fcoe.service
-@@ -0,0 +1,14 @@
-+[Unit]
-+Description=Open-FCoE initiator daemon
-+After=syslog.target network.target
-+
-+[Service]
-+Type=simple
-+EnvironmentFile=/etc/sysconfig/fcoe
-+ExecStartPre=/sbin/modprobe -qa $SUPPORTED_DRIVERS
-+ExecStart=/usr/sbin/fcoemon $FCOEMON_OPTS
-+
-+[Install]
-+WantedBy=multi-user.target
-+Also=lldpad.socket
-+Also=fcoemon.socket
-diff --git a/etc/systemd/fcoemon.socket b/etc/systemd/fcoemon.socket
-new file mode 100644
-index 0000000..4de8715
---- /dev/null
-+++ b/etc/systemd/fcoemon.socket
-@@ -0,0 +1,6 @@
-+[Socket]
-+ListenDatagram=@/com/intel/fcoemon
-+PassCredentials=true
-+
-+[Install]
-+WantedBy=sockets.target
-diff --git a/fcnsq.c b/fcnsq.c
-index 7b45a32..1597cd5 100644
---- a/fcnsq.c
-+++ b/fcnsq.c
-@@ -24,6 +24,7 @@
- #include
- #include
- #include
-+#include
- #include
- #include
- #include
-@@ -228,7 +229,7 @@ static int gpn_id(int bsg, u32 fcid)
- rjt = gn_id(bsg, fcid, FC_NS_GPN_ID, &wwpn);
- if (rjt)
- goto fail;
-- print_result("Port Name", "%16.16llx\n", wwpn);
-+ print_result("Port Name", "%16.16jx\n", (uintmax_t)wwpn);
- return 0;
- fail:
- if (rjt == (u16) ~0)
-@@ -249,7 +250,7 @@ static int gnn_id(int bsg, u32 fcid)
- rjt = gn_id(bsg, fcid, FC_NS_GNN_ID, &wwnn);
- if (rjt)
- goto fail;
-- print_result("Node Name", "%16.16llx\n", wwnn);
-+ print_result("Node Name", "%16.16jx\n", (uintmax_t)wwnn);
- return 0;
- fail:
- if (rjt == (u16) ~0)
-@@ -365,7 +366,7 @@ static void help(int status)
- " --gspn \n"
- " --gsnn \n"
- "Options:\n"
-- " --quiet print minimal results on success, and no error messages\n"
-+ " --quiet|-q print minimal results on success, and no error messages\n"
- "\n"
- "Port IDs and World Wide Names must be specified in hexadecimal.\n"
- );
-@@ -376,11 +377,12 @@ int main(int argc, char *argv[])
- {
- char *bsg;
- int bsg_dev;
-- u32 port_id;
-- u64 wwnn;
-+ u32 port_id = 0;
-+ u64 wwnn = 0;
- int rc = 0;
- enum commands cmd = 0;
- char c;
-+ uintmax_t wwnn_tmp = 0;
-
- while(1) {
- c = getopt_long_only(argc, argv, "", options, NULL);
-@@ -399,13 +401,17 @@ int main(int argc, char *argv[])
- if (cmd)
- help(-1);
- cmd = c;
-- sscanf(optarg, "%x", &port_id);
-+ if (sscanf(optarg, "%x", &port_id) != 1)
-+ help(-1);
- break;
- case GSNN_NN:
- if (cmd)
- help(-1);
- cmd = c;
-- sscanf(optarg, "%llx", &wwnn);
-+ if (sscanf(optarg, "%jx", &wwnn_tmp) == 1)
-+ wwnn = (u64)wwnn_tmp;
-+ else
-+ help(-1);
- break;
- }
- }
-diff --git a/fcoeadm_display.c b/fcoeadm_display.c
-index 287e370..9b96170 100644
---- a/fcoeadm_display.c
-+++ b/fcoeadm_display.c
-@@ -110,7 +110,13 @@ struct sa_nameval port_speeds[] = {
- { "Unknown", HBA_PORTSPEED_UNKNOWN },
- { "1 Gbit", HBA_PORTSPEED_1GBIT },
- { "2 Gbit", HBA_PORTSPEED_2GBIT },
-+ { "4 Gbit", HBA_PORTSPEED_4GBIT },
- { "10 Gbit", HBA_PORTSPEED_10GBIT },
-+ { "8 Gbit", HBA_PORTSPEED_8GBIT },
-+ { "16 Gbit", HBA_PORTSPEED_16GBIT },
-+ { "32 Gbit", HBA_PORTSPEED_32GBIT },
-+ { "20 Gbit", HBA_PORTSPEED_20GBIT },
-+ { "40 Gbit", HBA_PORTSPEED_40GBIT },
- { "Not Negotiated", HBA_PORTSPEED_NOT_NEGOTIATED },
- { NULL, 0 }
- };
-@@ -1417,8 +1423,8 @@ static void print_fcoe_fcf_device(void *ep, UNUSED void *arg)
- if (!buf)
- buf = temp;
- printf(" Connection Mode: %s\n", buf);
-- printf(" Fabric Name: 0x%016lx\n", fcf->fabric_name);
-- printf(" Switch Name 0x%016lx\n", fcf->switch_name);
-+ printf(" Fabric Name: 0x%016" PRIx64 "\n", fcf->fabric_name);
-+ printf(" Switch Name 0x%016" PRIx64 "\n", fcf->switch_name);
- mac2str(fcf->mac, mac, MAX_STR_LEN);
- printf(" MAC Address: %s\n", mac);
- printf(" FCF Priority: %u\n", fcf->priority);
-diff --git a/fcoemon.c b/fcoemon.c
-index a5babfa..b3120bc 100644
---- a/fcoemon.c
-+++ b/fcoemon.c
-@@ -1357,12 +1357,8 @@ ieee_state_set(struct fcm_netif *ff, enum ieee_state new_state)
- getstr(&ieee_states, new_state));
- }
-
-- if (new_state == IEEE_GET_STATE) {
-- ff->ieee_state = new_state;
-+ if (new_state == IEEE_GET_STATE)
- clear_ieee_info(ff);
-- ieee_get_req(ff);
-- return;
-- }
-
- ff->ieee_state = new_state;
- ff->ieee_resp_pending = 0;
-@@ -2637,7 +2633,7 @@ static void fcm_dcbd_get_oper(struct fcm_netif *ff, char *resp, char *cp)
-
- if (ep) {
- FCM_LOG_DEV(ff, "Invalid get oper response "
-- "parse error byte %ld, resp %s", ep - cp, cp);
-+ "parse error byte %td, resp %s", ep - cp, cp);
- fcm_dcbd_state_set(ff, FCD_ERROR);
- } else {
- if (val && fcoe_config.debug)
-@@ -3035,6 +3031,50 @@ static void fcm_fcoe_action(struct fcoe_port *p)
-
- /*
- * Called for all ports. For FCoE ports and candidates,
-+ * get IEEE DCBX information and set the next action.
-+ */
-+static void fcm_netif_ieee_advance(struct fcm_netif *ff)
-+{
-+ enum fcp_action action;
-+
-+ ASSERT(ff);
-+ ASSERT(fcm_clif);
-+
-+ if (fcm_clif->cl_busy)
-+ return;
-+
-+ if (ff->ieee_resp_pending)
-+ return;
-+
-+ switch (ff->ieee_state) {
-+ case IEEE_INIT:
-+ break;
-+ case IEEE_GET_STATE:
-+ ieee_get_req(ff);
-+ break;
-+ case IEEE_DONE:
-+ action = validate_ieee_info(ff);
-+ switch (action) {
-+ case FCP_DESTROY_IF:
-+ case FCP_ENABLE_IF:
-+ case FCP_ACTIVATE_IF:
-+ fcp_action_set(ff->ifname, action);
-+ break;
-+ case FCP_DISABLE_IF:
-+ case FCP_ERROR:
-+ fcp_action_set(ff->ifname, FCP_DISABLE_IF);
-+ break;
-+ case FCP_WAIT:
-+ default:
-+ break;
-+ }
-+ default:
-+ break;
-+ }
-+}
-+
-+/*
-+ * Called for all ports. For FCoE ports and candidates,
- * get information and send to dcbd.
- */
- static void fcm_netif_advance(struct fcm_netif *ff)
-@@ -3161,8 +3201,10 @@ static void fcm_handle_changes(void)
- /*
- * Perform pending actions (dcbd queries) on network interfaces.
- */
-- TAILQ_FOREACH(ff, &fcm_netif_head, ff_list)
-+ TAILQ_FOREACH(ff, &fcm_netif_head, ff_list) {
- fcm_netif_advance(ff);
-+ fcm_netif_ieee_advance(ff);
-+ }
-
- /*
- * Perform actions on FCoE ports
-@@ -3546,12 +3588,54 @@ err:
- sendto(snum, rbuf, MSG_RBUF, 0, (struct sockaddr *)&from, fromlen);
- }
-
-+static int fcm_systemd_socket(void)
-+{
-+ char *env, *ptr;
-+ unsigned int p, l;
-+
-+ env = getenv("LISTEN_PID");
-+ if (!env)
-+ return -1;
-+
-+ p = strtoul(env, &ptr, 10);
-+ if (ptr && ptr == env) {
-+ FCM_LOG_DBG("Invalid value '%s' for LISTEN_PID\n", env);
-+ return -1;
-+ }
-+ if ((pid_t)p != getpid()) {
-+ FCM_LOG_DBG("Invalid PID '%d' from LISTEN_PID\n", p);
-+ return -1;
-+ }
-+ env = getenv("LISTEN_FDS");
-+ if (!env) {
-+ FCM_LOG_DBG("LISTEN_FDS is not set\n");
-+ return -1;
-+ }
-+ l = strtoul(env, &ptr, 10);
-+ if (ptr && ptr == env) {
-+ FCM_LOG_DBG("Invalid value '%s' for LISTEN_FDS\n", env);
-+ return -1;
-+ }
-+ if (l != 1) {
-+ FCM_LOG_DBG("LISTEN_FDS specified %d fds\n", l);
-+ return -1;
-+ }
-+ /* systemd returns fds with an offset of '3' */
-+ return 3;
-+}
-+
- static int fcm_srv_create(struct fcm_srv_info *srv_info)
- {
- socklen_t addrlen;
- struct sockaddr_un addr;
- int rc = 0;
-
-+ srv_info->srv_sock = fcm_systemd_socket();
-+ if (srv_info->srv_sock > 0) {
-+ FCM_LOG_DBG("Using systemd socket\n");
-+ goto out_done;
-+ }
-+
- srv_info->srv_sock = socket(AF_LOCAL, SOCK_DGRAM, 0);
- if (srv_info->srv_sock < 0) {
- FCM_LOG_ERR(errno, "Failed to create socket\n");
-@@ -3570,7 +3654,7 @@ static int fcm_srv_create(struct fcm_srv_info *srv_info)
- rc = errno;
- goto err_close;
- }
--
-+out_done:
- sa_select_add_fd(srv_info->srv_sock, fcm_srv_receive,
- NULL, NULL, srv_info);
-
-diff --git a/fcping.c b/fcping.c
-index c6f74a6..399b778 100644
---- a/fcping.c
-+++ b/fcping.c
-@@ -25,6 +25,7 @@
- #include
- #include
- #include
-+#include
- #include
- #include
- #include
-@@ -810,17 +811,17 @@ static void fp_check_data_len(void)
- printf("Maximum ECHO data allowed by the Fabric (0x%06x) : %d bytes.\n"
- "Maximum ECHO data allowed by the Source (0x%06x) : %d bytes.\n"
- "Maximum ECHO data allowed by the Target (0x%06x) : %d bytes.\n"
-- "Maximum ECHO data requested from user input (-s) : %lu "
-+ "Maximum ECHO data requested from user input (-s) : %" PRIu32 " "
- "(default %d) bytes.\n",
- FC_WKA_FABRIC_CONTROLLER, flen, sid, slen, fp_did, dlen,
-- fp_len - FP_LEN_ECHO, FP_LEN_DEF);
-+ (uint32_t)(fp_len - FP_LEN_ECHO), FP_LEN_DEF);
-
- /* fp_len is the total payload, including 4 bytes for ECHO command */
- fp_len = MIN(fp_len, plen + FP_LEN_ECHO);
-- printf("Actual FC ELS ECHO data size used : %lu bytes.\n"
-+ printf("Actual FC ELS ECHO data size used : %" PRIu32 " bytes.\n"
- "Actual FC ELS ECHO payload size used : %d bytes "
-- "(including %ld bytes ECHO command).\n",
-- fp_len - FP_LEN_ECHO, fp_len, FP_LEN_ECHO);
-+ "(including %zu bytes ECHO command).\n",
-+ (uint32_t)(fp_len - FP_LEN_ECHO), fp_len, FP_LEN_ECHO);
- }
-
- /*
-diff --git a/fipvlan.c b/fipvlan.c
-index 6f8cf39..cc71412 100644
---- a/fipvlan.c
-+++ b/fipvlan.c
-@@ -67,6 +67,7 @@ struct {
- bool start;
- bool vn2vn;
- bool debug;
-+ bool link_up;
- int link_retry;
- char suffix[256];
- } config = {
-@@ -76,6 +77,7 @@ struct {
- .create = false,
- .vn2vn = false,
- .debug = false,
-+ .link_up = false,
- .link_retry = 20,
- .suffix = "",
- };
-@@ -139,6 +141,7 @@ struct iff {
- bool req_sent;
- bool resp_recv;
- bool fip_ready;
-+ bool fcoe_started;
- TAILQ_ENTRY(iff) list_node;
- struct iff_list_head vlans;
- };
-@@ -157,6 +160,8 @@ struct fcf {
- struct fcf_list_head fcfs = TAILQ_HEAD_INITIALIZER(fcfs);
- static struct fcf_list_head vn2vns = TAILQ_HEAD_INITIALIZER(vn2vns);
-
-+static int create_and_start_vlan(struct fcf *fcf, bool vn2vn);
-+
- static struct fcf *lookup_fcf(struct fcf_list_head *head, int ifindex,
- uint16_t vlan, unsigned char *mac)
- {
-@@ -316,6 +321,9 @@ static int fip_recv_vlan_note(struct fiphdr *fh, int ifindex, bool vn2vn)
- fcf->vlan = vlan;
- memcpy(fcf->mac_addr, tlvs.mac->mac_addr, ETHER_ADDR_LEN);
- TAILQ_INSERT_TAIL(head, fcf, list_node);
-+ if (!config.create)
-+ continue;
-+ create_and_start_vlan(fcf, vn2vn);
- }
-
- return 0;
-@@ -362,8 +370,14 @@ static void rtnl_recv_newlink(struct nlmsghdr *nh)
- struct rtattr *linkinfo[__IFLA_INFO_MAX];
- struct rtattr *vlan[__IFLA_VLAN_MAX];
- struct iff *iff, *real_dev;
-+ struct fcf_list_head *head;
- bool running;
-
-+ if (config.vn2vn)
-+ head = &vn2vns;
-+ else
-+ head = &fcfs;
-+
- FIP_LOG_DBG("RTM_NEWLINK: ifindex %d, type %d, flags %x",
- ifm->ifi_index, ifm->ifi_type, ifm->ifi_flags);
-
-@@ -378,12 +392,38 @@ static void rtnl_recv_newlink(struct nlmsghdr *nh)
- running = !!(ifm->ifi_flags & (IFF_RUNNING | IFF_SLAVE));
- iff = lookup_iff(ifm->ifi_index, NULL);
- if (iff) {
-+ int ifindex;
-+
- /* already tracking, update operstate and return */
- iff->running = running;
-- if (iff->running)
-- pfd_add(iff->ps);
-- else
-+ if (!iff->running) {
- pfd_remove(iff->ps);
-+ return;
-+ }
-+ pfd_add(iff->ps);
-+ if (!config.start)
-+ return;
-+
-+ FIP_LOG_DBG("Checking for FCoE on %sif %d",
-+ iff->is_vlan ? "VLAN " : "", iff->ifindex);
-+ if (iff->is_vlan) {
-+ real_dev = find_vlan_real_dev(iff);
-+ if (!real_dev) {
-+ FIP_LOG_ERR(ENODEV, "VLAN %d without a parent",
-+ iff->ifindex);
-+ return;
-+ }
-+ ifindex = real_dev->ifindex;
-+ } else
-+ ifindex = iff->ifindex;
-+
-+ if (!iff->fcoe_started &&
-+ lookup_fcf(head, ifindex, iff->vid, NULL)) {
-+ printf("Starting FCoE on interface %s\n",
-+ iff->ifname);
-+ fcoe_instance_start(iff->ifname);
-+ iff->fcoe_started = true;
-+ }
- return;
- }
-
-@@ -407,6 +447,19 @@ static void rtnl_recv_newlink(struct nlmsghdr *nh)
- memcpy(iff->mac_addr, RTA_DATA(ifla[IFLA_ADDRESS]), ETHER_ADDR_LEN);
- strncpy(iff->ifname, RTA_DATA(ifla[IFLA_IFNAME]), IFNAMSIZ);
-
-+ if (!config.automode) {
-+ int i, iff_selected = 0;
-+
-+ for (i = 0; i < config.namec; i++) {
-+ if (!strcmp(iff->ifname, config.namev[i]))
-+ iff_selected = 1;
-+ }
-+ if (!iff_selected) {
-+ FIP_LOG_DBG("ignoring if %s\n", iff->ifname);
-+ free(iff);
-+ return;
-+ }
-+ }
- if (ifla[IFLA_LINKINFO]) {
- parse_linkinfo(linkinfo, ifla[IFLA_LINKINFO]);
- /* Track VLAN devices separately */
-@@ -416,11 +469,16 @@ static void rtnl_recv_newlink(struct nlmsghdr *nh)
- parse_vlaninfo(vlan, linkinfo[IFLA_INFO_DATA]);
- iff->vid = *(int *)RTA_DATA(vlan[IFLA_VLAN_ID]);
- real_dev = find_vlan_real_dev(iff);
-- if (real_dev)
-- TAILQ_INSERT_TAIL(&real_dev->vlans,
-- iff, list_node);
-- else
-+ if (!real_dev) {
- free(iff);
-+ return;
-+ }
-+ TAILQ_INSERT_TAIL(&real_dev->vlans, iff, list_node);
-+ if (!iff->running) {
-+ FIP_LOG_DBG("vlan if %d not running, "
-+ "starting", iff->ifindex);
-+ rtnl_set_iff_up(iff->ifindex, NULL);
-+ }
- return;
- }
- /* ignore bonding interfaces */
-@@ -435,7 +493,7 @@ static void rtnl_recv_newlink(struct nlmsghdr *nh)
-
- /* command line arguments */
-
--#define GETOPT_STR "acdf:l:m:shv"
-+#define GETOPT_STR "acdf:l:m:suhv"
-
- static const struct option long_options[] = {
- { "auto", no_argument, NULL, 'a' },
-@@ -445,6 +503,7 @@ static const struct option long_options[] = {
- { "suffix", required_argument, NULL, 'f' },
- { "link-retry", required_argument, NULL, 'l' },
- { "mode", required_argument, NULL, 'm' },
-+ { "link-up", required_argument, NULL, 'u' },
- { "help", no_argument, NULL, 'h' },
- { "version", no_argument, NULL, 'v' },
- { NULL, 0, NULL, 0 }
-@@ -462,6 +521,7 @@ static void help(int status)
- " -f, --suffix Append the suffix to VLAN interface name\n"
- " -l, --link-retry Number of retries for link up\n"
- " -m, --mode Link mode, either fabric or vn2vn\n"
-+ " -u, --link-up Leave link up after FIP response\n"
- " -h, --help Display this help and exit\n"
- " -v, --version Display version information and exit\n",
- exe);
-@@ -471,7 +531,7 @@ static void help(int status)
-
- static void parse_cmdline(int argc, char **argv)
- {
-- char c;
-+ signed char c;
-
- while (1) {
- c = getopt_long(argc, argv, GETOPT_STR, long_options, NULL);
-@@ -508,6 +568,9 @@ static void parse_cmdline(int argc, char **argv)
- exit(1);
- }
- break;
-+ case 'u':
-+ config.link_up = true;
-+ break;
- case 'h':
- help(0);
- break;
-@@ -539,59 +602,60 @@ static int rtnl_listener_handler(struct nlmsghdr *nh, UNUSED void *arg)
- return -1;
- }
-
--static void
--create_missing_vlans_list(struct fcf_list_head *list, const char *label)
-+static int
-+create_and_start_vlan(struct fcf *fcf, bool vn2vn)
- {
-- struct fcf *fcf;
- struct iff *real_dev, *vlan;
- char vlan_name[IFNAMSIZ];
- int rc;
-
-- if (!config.create)
-- return;
--
-- TAILQ_FOREACH(fcf, list, list_node) {
-- real_dev = lookup_iff(fcf->ifindex, NULL);
-- if (!real_dev) {
-- FIP_LOG_ERR(ENODEV,
-- "lost device %d with discovered %s?\n",
-- fcf->ifindex, label);
-- continue;
-- }
-- if (!fcf->vlan) {
-- /*
-- * If the vlan notification has VLAN id 0,
-- * skip creating vlan interface, and FCoE is
-- * started on the physical interface itself.
-- */
-- FIP_LOG_DBG("VLAN id is 0 for %s\n", real_dev->ifname);
-- continue;
-- }
-+ real_dev = lookup_iff(fcf->ifindex, NULL);
-+ if (!real_dev) {
-+ FIP_LOG_ERR(ENODEV,
-+ "lost device %d with discovered %s?\n",
-+ fcf->ifindex, vn2vn ? "VN2VN" : "FCF");
-+ return -ENXIO;
-+ }
-+ if (!fcf->vlan) {
-+ /*
-+ * If the vlan notification has VLAN id 0,
-+ * skip creating vlan interface, and FCoE is
-+ * started on the physical interface itself.
-+ */
-+ FIP_LOG_DBG("VLAN id is 0 for %s\n", real_dev->ifname);
-+ vlan = real_dev;
-+ } else {
- vlan = lookup_vlan(fcf->ifindex, fcf->vlan);
- if (vlan) {
- FIP_LOG_DBG("VLAN %s.%d already exists as %s\n",
- real_dev->ifname, fcf->vlan, vlan->ifname);
-- continue;
-+ return 0;
- }
- snprintf(vlan_name, IFNAMSIZ, "%s.%d%s",
- real_dev->ifname, fcf->vlan, config.suffix);
- rc = vlan_create(fcf->ifindex, fcf->vlan, vlan_name);
-- if (rc < 0)
-+ if (rc < 0) {
- printf("Failed to create VLAN device %s\n\t%s\n",
- vlan_name, strerror(-rc));
-- else
-- printf("Created VLAN device %s\n", vlan_name);
-- rtnl_set_iff_up(0, vlan_name);
-+ return rc;
-+ }
-+ printf("Created VLAN device %s\n", vlan_name);
- }
-- printf("\n");
--}
-+ if (!config.start)
-+ return rc;
-
--static void create_missing_vlans(void)
--{
-- if (!TAILQ_EMPTY(&fcfs))
-- create_missing_vlans_list(&fcfs, "FCF");
-- if (!TAILQ_EMPTY(&vn2vns))
-- create_missing_vlans_list(&vn2vns, "VN2VN");
-+ if (!vlan->running) {
-+ FIP_LOG_DBG("%s if %d not running, starting",
-+ vlan == real_dev ? "real" : "vlan",
-+ vlan->ifindex);
-+ rtnl_set_iff_up(vlan->ifindex, NULL);
-+ } else if (!vlan->fcoe_started) {
-+ printf("Starting FCoE on interface %s\n",
-+ vlan->ifname);
-+ fcoe_instance_start(vlan->ifname);
-+ vlan->fcoe_started = true;
-+ }
-+ return rc;
- }
-
- static int fcoe_mod_instance_start(const char *ifname)
-@@ -666,34 +730,6 @@ static void determine_libfcoe_interface(void)
- }
- }
-
--static void start_fcoe(void)
--{
-- struct fcf_list_head *head;
-- struct fcf *fcf;
-- struct iff *iff;
--
-- if (config.vn2vn)
-- head = &vn2vns;
-- else
-- head = &fcfs;
--
-- TAILQ_FOREACH(fcf, head, list_node) {
-- if (fcf->vlan)
-- iff = lookup_vlan(fcf->ifindex, fcf->vlan);
-- else
-- iff = lookup_iff(fcf->ifindex, NULL);
-- if (!iff) {
-- FIP_LOG_ERR(ENODEV,
-- "Cannot start FCoE on VLAN %d, ifindex %d, "
-- "because the VLAN device does not exist",
-- fcf->vlan, fcf->ifindex);
-- continue;
-- }
-- printf("Starting FCoE on interface %s\n", iff->ifname);
-- fcoe_instance_start(iff->ifname);
-- }
--}
--
- static void print_list(struct fcf_list_head *list, const char *label)
- {
- struct iff *iff;
-@@ -749,9 +785,15 @@ static void recv_loop(int timeout)
- rtnl_recv(pfd[0].fd, rtnl_listener_handler, NULL);
- /* everything else should be FIP packet sockets */
- for (i = 1; i < pfd_len; i++) {
-- if (pfd[i].revents & POLLIN)
-- fip_recv(pfd[i].fd, fip_vlan_handler, NULL);
-+ if (pfd[i].revents & POLLIN) {
-+ rc = fip_recv(pfd[i].fd, fip_vlan_handler,
-+ NULL);
-+ if (rc < 0)
-+ break;
-+ }
- }
-+ if (i < pfd_len)
-+ break;
- }
- }
-
-@@ -763,7 +805,7 @@ static void find_interfaces(int ns)
-
- static int probe_fip_interface(struct iff *iff)
- {
-- int origdev = 1;
-+ int origdev = 1, rc;
-
- if (iff->resp_recv)
- return 0;
-@@ -785,6 +827,10 @@ static int probe_fip_interface(struct iff *iff)
-
- if (!iff->fip_ready) {
- iff->ps = fip_socket(iff->ifindex, FIP_NONE);
-+ if (iff->ps < 0) {
-+ FIP_LOG_DBG("if %d not ready\n", iff->ifindex);
-+ return 0;
-+ }
- setsockopt(iff->ps, SOL_PACKET, PACKET_ORIGDEV,
- &origdev, sizeof(origdev));
- pfd_add(iff->ps);
-@@ -792,34 +838,23 @@ static int probe_fip_interface(struct iff *iff)
- }
-
- if (config.vn2vn)
-- fip_send_vlan_request(iff->ps, iff->ifindex, iff->mac_addr,
-- FIP_ALL_VN2VN);
-+ rc = fip_send_vlan_request(iff->ps, iff->ifindex,
-+ iff->mac_addr, FIP_ALL_VN2VN);
- else
-- fip_send_vlan_request(iff->ps, iff->ifindex, iff->mac_addr,
-- FIP_ALL_FCF);
-- iff->req_sent = true;
-- return 0;
-+ rc = fip_send_vlan_request(iff->ps, iff->ifindex,
-+ iff->mac_addr, FIP_ALL_FCF);
-+ if (rc == 0)
-+ iff->req_sent = true;
-+ return rc == 0 ? 0 : 1;
- }
-
- static int send_vlan_requests(void)
- {
- struct iff *iff;
-- int i;
- int skipped = 0;
-
-- if (config.automode) {
-- TAILQ_FOREACH(iff, &interfaces, list_node) {
-- skipped += probe_fip_interface(iff);
-- }
-- } else {
-- for (i = 0; i < config.namec; i++) {
-- iff = lookup_iff(0, config.namev[i]);
-- if (!iff) {
-- skipped++;
-- continue;
-- }
-- skipped += probe_fip_interface(iff);
-- }
-+ TAILQ_FOREACH(iff, &interfaces, list_node) {
-+ skipped += probe_fip_interface(iff);
- }
- return skipped;
- }
-@@ -829,51 +864,70 @@ static void do_vlan_discovery(void)
- struct iff *iff;
- int retry_count = 0;
- int skip_retry_count = 0;
-- int skipped = 0;
-+ int skipped = 0, retry_iff = 0;
- retry:
- skipped += send_vlan_requests();
- if (skipped && skip_retry_count++ < config.link_retry) {
-- FIP_LOG_DBG("waiting for IFF_RUNNING [%d]\n", skip_retry_count);
-+ FIP_LOG_DBG("waiting for IFF_RUNNING [%d/%d]\n",
-+ skip_retry_count, config.link_retry);
- recv_loop(500);
- skipped = 0;
- retry_count = 0;
- goto retry;
- }
- recv_loop(200);
-- TAILQ_FOREACH(iff, &interfaces, list_node)
-+ TAILQ_FOREACH(iff, &interfaces, list_node) {
-+ if (!iff->fip_ready) {
-+ FIP_LOG_DBG("if %d: skipping, FIP not ready\n",
-+ iff->ifindex);
-+ continue;
-+ }
-+ if (!iff->running && iff->linkup_sent) {
-+ FIP_LOG_DBG("if %d: waiting for IFF_RUNNING [%d]\n",
-+ iff->ifindex, retry_count);
-+ retry_iff++;
-+ continue;
-+ }
- /* if we did not receive a response, retry */
-- if (iff->req_sent && !iff->resp_recv &&
-- retry_count++ < MAX_VLAN_RETRIES) {
-- FIP_LOG_DBG("VLAN discovery RETRY [%d]", retry_count);
-- goto retry;
-+ if (iff->req_sent && !iff->resp_recv) {
-+ FIP_LOG_DBG("if %d: VLAN discovery RETRY [%d]",
-+ iff->ifindex, retry_count);
-+ iff->req_sent = false;
-+ retry_iff++;
-+ continue;
- }
-+ if (config.create) {
-+ struct iff *vlan;
-+
-+ TAILQ_FOREACH(vlan, &iff->vlans, list_node) {
-+ if (!vlan->running) {
-+ FIP_LOG_DBG("vlan %d: waiting for "
-+ "IFF_RUNNING [%d]",
-+ vlan->ifindex, retry_count);
-+ retry_iff++;
-+ continue;
-+ }
-+ }
-+ }
-+ }
-+ if (retry_iff && retry_count++ < config.link_retry) {
-+ recv_loop(1000);
-+ retry_iff = 0;
-+ goto retry;
-+ }
- }
-
- static void cleanup_interfaces(void)
- {
- struct iff *iff;
-- int i;
-- int skipped = 0;
-
-- if (config.automode) {
-- TAILQ_FOREACH(iff, &interfaces, list_node) {
-- if (iff->linkup_sent &&
-- (!iff->running || !iff->req_sent || !iff->resp_recv)) {
-- FIP_LOG_DBG("shutdown if %d",
-- iff->ifindex);
-- rtnl_set_iff_down(iff->ifindex, NULL);
-- iff->linkup_sent = false;
-- }
-- }
-- } else {
-- for (i = 0; i < config.namec; i++) {
-- iff = lookup_iff(0, config.namev[i]);
-- if (!iff) {
-- skipped++;
-+ TAILQ_FOREACH(iff, &interfaces, list_node) {
-+ if (iff->linkup_sent) {
-+ if (config.link_up && iff->resp_recv)
- continue;
-- }
-- if (iff->linkup_sent &&
-- (!iff->running || !iff->req_sent || !iff->resp_recv)) {
-+ if (iff->fcoe_started)
-+ continue;
-+ if (TAILQ_EMPTY(&iff->vlans)) {
- FIP_LOG_DBG("shutdown if %d",
- iff->ifindex);
- rtnl_set_iff_down(iff->ifindex, NULL);
-@@ -881,8 +935,8 @@ static void cleanup_interfaces(void)
- }
- }
- }
--
- }
-+
- /* this is to not require headers from libcap */
- static inline int capget(cap_user_header_t hdrp, cap_user_data_t datap)
- {
-@@ -934,29 +988,24 @@ int main(int argc, char **argv)
- determine_libfcoe_interface();
-
- find_interfaces(ns);
-- while ((TAILQ_EMPTY(&interfaces)) && ++find_cnt < 5) {
-- FIP_LOG_DBG("no interfaces found, trying again");
-- find_interfaces(ns);
-- }
-+ if (config.automode)
-+ while ((TAILQ_EMPTY(&interfaces)) && ++find_cnt < 5) {
-+ FIP_LOG_DBG("no interfaces found, trying again");
-+ find_interfaces(ns);
-+ }
-
- if (TAILQ_EMPTY(&interfaces)) {
-- FIP_LOG_ERR(ENODEV, "no interfaces to perform discovery on");
-+ if (config.automode)
-+ FIP_LOG_ERR(ENODEV,
-+ "no interfaces to perform discovery on");
-+ else
-+ FIP_LOG("no interfaces to perform discovery on");
- exit(1);
- }
-
- do_vlan_discovery();
-
- rc = print_results();
-- if (!rc && config.create) {
-- create_missing_vlans();
-- /*
-- * need to listen for the RTM_NETLINK messages
-- * about the new VLAN devices
-- */
-- recv_loop(500);
-- }
-- if (!rc && config.start)
-- start_fcoe();
-
- cleanup_interfaces();
-
-diff --git a/lib/fip.c b/lib/fip.c
-index 73bf03e..6657b61 100644
---- a/lib/fip.c
-+++ b/lib/fip.c
-@@ -95,10 +95,11 @@ static int fip_get_sanmac(int ifindex, unsigned char *addr)
- * @mac: MAC address to add or delete
- * @multi: false if unicast, true if multicast address
- */
--static void
-+static int
- fip_socket_add_addr(int s, int ifindex, bool add, const __u8 *mac, bool multi)
- {
- struct packet_mreq mr;
-+ int rc = 0;
-
- memset(&mr, 0, sizeof(mr));
- mr.mr_ifindex = ifindex;
-@@ -107,9 +108,12 @@ fip_socket_add_addr(int s, int ifindex, bool add, const __u8 *mac, bool multi)
- memcpy(mr.mr_address, mac, ETHER_ADDR_LEN);
- if (setsockopt(s, SOL_PACKET,
- add ? PACKET_ADD_MEMBERSHIP : PACKET_DROP_MEMBERSHIP,
-- &mr, sizeof(mr)) < 0)
-+ &mr, sizeof(mr)) < 0) {
- FIP_LOG_DBG("PACKET_%s_MEMBERSHIP:failed\n",
- add ? "ADD" : "DROP");
-+ rc = -errno;
-+ }
-+ return rc;
- }
-
- /**
-@@ -118,16 +122,16 @@ fip_socket_add_addr(int s, int ifindex, bool add, const __u8 *mac, bool multi)
- * @ifindex: network interface index to send on
- * @add: 1 to add 0 to del
- */
--static void fip_socket_sanmac(int s, int ifindex, int add)
-+static int fip_socket_sanmac(int s, int ifindex, int add)
- {
- unsigned char smac[ETHER_ADDR_LEN];
-
- if (fip_get_sanmac(ifindex, smac)) {
- FIP_LOG_DBG("%s: no sanmac, ifindex %d\n", __func__, ifindex);
-- return;
-+ return -ENXIO;
- }
-
-- fip_socket_add_addr(s, ifindex, add, smac, false);
-+ return fip_socket_add_addr(s, ifindex, add, smac, false);
- }
-
- /**
-@@ -210,7 +214,11 @@ int fip_socket(int ifindex, enum fip_multi multi)
- if (s < 0)
- return s;
-
-- fip_socket_sanmac(s, ifindex, 1);
-+ rc = fip_socket_sanmac(s, ifindex, 1);
-+ if (rc < 0) {
-+ close(s);
-+ return rc;
-+ }
- if (multi != FIP_NONE)
- fip_socket_multi(s, ifindex, true, multi);
-
diff --git a/fcoe-utils-1.0.29-pass-flags-to-fcoemon-to-enable-vn2vn-mode.patch b/fcoe-utils-1.0.29-pass-flags-to-fcoemon-to-enable-vn2vn-mode.patch
deleted file mode 100644
index 020b428..0000000
--- a/fcoe-utils-1.0.29-pass-flags-to-fcoemon-to-enable-vn2vn-mode.patch
+++ /dev/null
@@ -1,45 +0,0 @@
-From 50e1aaa1b8b6856a890ae3f036ae9439b24c40c3 Mon Sep 17 00:00:00 2001
-From: Chris Leech
-Date: Fri, 24 Oct 2014 14:36:53 -0700
-Subject: [PATCH] pass flags to fcoemon to enable vn2vn mode
-
----
- fcoeadm.c | 8 +++-----
- 1 file changed, 3 insertions(+), 5 deletions(-)
-
-diff --git a/fcoeadm.c b/fcoeadm.c
-index 07ff690..776b4e3 100644
---- a/fcoeadm.c
-+++ b/fcoeadm.c
-@@ -286,7 +286,7 @@ int main(int argc, char *argv[])
- }
-
- ifname = argv[optind];
-- rc = fcoeadm_action(cmd, ifname, CLIF_FLAGS_NONE);
-+ rc = fcoeadm_action(cmd, ifname, flags);
- break;
- case 'r':
- cmd = CLIF_RESET_CMD;
-@@ -303,8 +303,7 @@ int main(int argc, char *argv[])
- ifname = argv[optind];
- rc = fcoe_validate_fcoe_conn(ifname);
- if (!rc)
-- rc = fcoeadm_action(cmd, ifname,
-- CLIF_FLAGS_NONE);
-+ rc = fcoeadm_action(cmd, ifname, flags);
- break;
-
- case 'i':
-@@ -405,8 +404,7 @@ int main(int argc, char *argv[])
- rc = display_port_stats(ifname, stat_interval);
- break;
- case 'p':
-- rc = fcoeadm_action(CLIF_PID_CMD, NULL,
-- CLIF_FLAGS_NONE);
-+ rc = fcoeadm_action(CLIF_PID_CMD, NULL, flags);
- break;
-
- case 'b':
---
-1.9.3
-
diff --git a/fcoe-utils-ggc7-fmt-truc-err.patch b/fcoe-utils-ggc7-fmt-truc-err.patch
new file mode 100644
index 0000000..3de42b4
--- /dev/null
+++ b/fcoe-utils-ggc7-fmt-truc-err.patch
@@ -0,0 +1,53 @@
+diff --git a/fipvlan.c b/fipvlan.c
+index 7c00c7c..065b742 100644
+--- a/fipvlan.c
++++ b/fipvlan.c
+@@ -621,8 +621,10 @@ create_and_start_vlan(struct fcf *fcf, bool vn2vn)
+ real_dev->ifname, fcf->vlan, vlan->ifname);
+ rc = 0;
+ } else {
+- snprintf(vlan_name, IFNAMSIZ, "%s.%d%s",
+- real_dev->ifname, fcf->vlan, config.suffix);
++ rc = snprintf(vlan_name, IFNAMSIZ, "%s.%d%s",
++ real_dev->ifname, fcf->vlan, config.suffix);
++ if (rc >= IFNAMSIZ)
++ return -E2BIG;
+ rc = vlan_create(fcf->ifindex, fcf->vlan, vlan_name);
+ if (rc < 0)
+ printf("Failed to create VLAN device %s\n\t%s\n",
+diff --git a/libopenfcoe.c b/libopenfcoe.c
+index 07090d5..98fb975 100644
+--- a/libopenfcoe.c
++++ b/libopenfcoe.c
+@@ -59,6 +59,7 @@ static int add_fcoe_fcf_device(struct dirent *dp, void *arg)
+ {
+ struct fcoe_ctlr_device *ctlr = (struct fcoe_ctlr_device *)arg;
+ struct fcoe_fcf_device *fcf;
++ int rc;
+
+ if (!strstr(dp->d_name, "fcf") ||
+ (!strcmp(dp->d_name, "fcf_dev_loss_tmo")))
+@@ -71,8 +72,10 @@ static int add_fcoe_fcf_device(struct dirent *dp, void *arg)
+ memset(fcf, 0, sizeof(struct fcoe_fcf_device));
+
+ /* Save the path */
+- snprintf(fcf->path, sizeof(fcf->path),
+- "%s/%s", ctlr->path, dp->d_name);
++ rc = snprintf(fcf->path, sizeof(fcf->path),
++ "%s/%s", ctlr->path, dp->d_name);
++ if (rc >= sizeof(fcf->path))
++ goto fail;
+
+ /* Use the index from the logical enumeration */
+ fcf->index = atoi(dp->d_name + sizeof("fcf_") - 1);
+@@ -198,7 +201,9 @@ static int read_fcoe_ctlr_device(struct dirent *dp, void *arg)
+ sa_sys_read_line(ctlr->path, "mode", buf, sizeof(buf));
+ sa_enum_encode(fip_conn_type_table, buf, &ctlr->mode);
+
+- snprintf(lesb_path, sizeof(lesb_path), "%s/lesb/", ctlr->path);
++ rc = snprintf(lesb_path, sizeof(lesb_path), "%s/lesb/", ctlr->path);
++ if (rc >= sizeof(lesb_path))
++ goto fail;
+
+ /* Get LESB statistics */
+ sa_sys_read_u32(lesb_path, "link_fail",
diff --git a/fcoe-utils-v1.0.30-1-fcoemon-Rework-daemonizing-and-error-handling.patch b/fcoe-utils-v1.0.30-1-fcoemon-Rework-daemonizing-and-error-handling.patch
deleted file mode 100644
index 320ecd9..0000000
--- a/fcoe-utils-v1.0.30-1-fcoemon-Rework-daemonizing-and-error-handling.patch
+++ /dev/null
@@ -1,78 +0,0 @@
-From f3af6bad75d7f6c90b9a170cbf9e4748ab4bb24e Mon Sep 17 00:00:00 2001
-From: Johannes Thumshirn
-Date: Mon, 18 May 2015 17:02:59 +0000
-Subject: [PATCH] fcoemon: Rework daemonizing and error handling
-
-Rework error handling, which leads to daemonizing later in order to get the
-error handling into effect.
-
-Signed-off-by: Johannes Thumshirn
-Signed-off-by: Vasu Dev
----
- fcoemon.c | 31 ++++++++++++++++++++++---------
- 1 file changed, 22 insertions(+), 9 deletions(-)
-
-diff --git a/fcoemon.c b/fcoemon.c
-index 3b5210c..c5edd1b 100644
---- a/fcoemon.c
-+++ b/fcoemon.c
-@@ -3719,11 +3719,6 @@ int main(int argc, char **argv)
- if (argc != optind)
- fcm_usage();
-
-- if (!fcm_fg && daemon(0, !fcoe_config.use_syslog)) {
-- FCM_LOG("Starting daemon failed");
-- exit(EXIT_FAILURE);
-- }
--
- umask(0);
-
- /*
-@@ -3770,22 +3765,40 @@ int main(int argc, char **argv)
- }
-
- fcm_fcoe_init();
-- fcm_fc_events_init();
-- fcm_link_init(); /* NETLINK_ROUTE protocol */
-+ rc = fcm_fc_events_init();
-+ if (rc != 0)
-+ exit(1);
-+
-+ rc = fcm_link_init(); /* NETLINK_ROUTE protocol */
-+ if (rc != 0)
-+ goto err_cleanup;
-+
- fcm_dcbd_init();
-- fcm_srv_create(&srv_info);
-+ rc = fcm_srv_create(&srv_info);
-+ if (rc != 0)
-+ goto err_cleanup;
-+
-+ if (!fcm_fg && daemon(0, !fcoe_config.use_syslog)) {
-+ FCM_LOG("Starting daemon failed");
-+ goto err_cleanup;
-+ }
-+
- sa_select_set_callback(fcm_handle_changes);
-
- rc = sa_select_loop();
- if (rc < 0) {
- FCM_LOG_ERR(rc, "select error\n");
-- exit(EXIT_FAILURE);
-+ goto err_cleanup;
- }
- fcm_dcbd_shutdown();
- fcm_srv_destroy(&srv_info);
- if (rc == SIGHUP)
- fcm_cleanup();
- return 0;
-+
-+err_cleanup:
-+ fcm_cleanup();
-+ exit(1);
- }
-
- /*******************************************************
---
-2.1.0
-
diff --git a/fcoe-utils-v1.0.30-2-fcoemon-fix-IEEE-state-machine.patch b/fcoe-utils-v1.0.30-2-fcoemon-fix-IEEE-state-machine.patch
deleted file mode 100644
index 3af11b9..0000000
--- a/fcoe-utils-v1.0.30-2-fcoemon-fix-IEEE-state-machine.patch
+++ /dev/null
@@ -1,83 +0,0 @@
-From 91c0c8c0a37af40b3fb4a37df6490a226348d152 Mon Sep 17 00:00:00 2001
-From: Vasu Dev
-Date: Fri, 5 Jun 2015 14:52:10 -0700
-Subject: [PATCH] fcoemon: fix IEEE state machine
-
-Fix IEEE state machine for these issues:-
-
- - fcoeadm scan not working
- - fcoeadm reset not working
- - periodic fipvlan issuance even after fcoe instance created
-
-These issues are due to current IEEE states are not correctly
-handled. The validate_ieee_info() return either activate or
-wait actions and out of that only activate is really used to
-enable fcoe instance and none other action are applicable in
-IEEE state machine, so reduced to only activate and then
-advance the state machine to new IEEE_ACTIVE state to allow
-processing of scan & reset command once interface activated.
-
-This also fixes fipvlan issuance issue beside fixing scan and
-reset fcoeadm commands.
-
-Signed-off-by: Vasu Dev
-Tested-By: Jack Morgan
----
- fcoemon.c | 19 +++++++------------
- fcoemon.h | 1 +
- 2 files changed, 8 insertions(+), 12 deletions(-)
-
-diff --git a/fcoemon.c b/fcoemon.c
-index c5edd1b..c0af99b 100644
---- a/fcoemon.c
-+++ b/fcoemon.c
-@@ -1341,6 +1341,7 @@ STR_ARR(ieee_states, "Unknown", "Out of range",
- [IEEE_INIT] = "IEEE_INIT",
- [IEEE_GET_STATE] = "IEEE_GET_STATE",
- [IEEE_DONE] = "IEEE_DONE",
-+ [IEEE_ACTIVE] = "IEEE_ACTIVE",
- );
-
- static void
-@@ -3054,20 +3055,14 @@ static void fcm_netif_ieee_advance(struct fcm_netif *ff)
- break;
- case IEEE_DONE:
- action = validate_ieee_info(ff);
-- switch (action) {
-- case FCP_DESTROY_IF:
-- case FCP_ENABLE_IF:
-- case FCP_ACTIVATE_IF:
-+ if (action == FCP_ACTIVATE_IF) {
- fcp_action_set(ff->ifname, action);
-- break;
-- case FCP_DISABLE_IF:
-- case FCP_ERROR:
-- fcp_action_set(ff->ifname, FCP_DISABLE_IF);
-- break;
-- case FCP_WAIT:
-- default:
-- break;
-+ ieee_state_set(ff, IEEE_ACTIVE);
- }
-+ break;
-+ case IEEE_ACTIVE:
-+ /* TBD enable and disable if needed in IEEE mode */
-+ break;
- default:
- break;
- }
-diff --git a/fcoemon.h b/fcoemon.h
-index c2ed7b1..3869bae 100644
---- a/fcoemon.h
-+++ b/fcoemon.h
-@@ -80,6 +80,7 @@ enum ieee_state {
- IEEE_INIT = 0, /* Starting state */
- IEEE_GET_STATE, /* Getting IEEE DCB state */
- IEEE_DONE, /* Received IEEE DCB state */
-+ IEEE_ACTIVE, /* IEEE is in ACTIVE state */
- IEEE_ERROR, /* Error receiving IEEE DCB state */
- };
-
---
-2.1.0
-
diff --git a/fcoe-utils-v1.0.30-3-sanmac-isn-t-required.patch b/fcoe-utils-v1.0.30-3-sanmac-isn-t-required.patch
deleted file mode 100644
index 67c583e..0000000
--- a/fcoe-utils-v1.0.30-3-sanmac-isn-t-required.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From 8065e01707c3306380c684712e547fcf0e4e55da Mon Sep 17 00:00:00 2001
-From: Chris Leech
-Date: Thu, 5 Feb 2015 11:46:31 -0800
-Subject: [PATCH] sanmac isn't required
-
-Signed-off-by: Chris Leech
----
- lib/fip.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/lib/fip.c b/lib/fip.c
-index 6657b61..5e5b179 100644
---- a/lib/fip.c
-+++ b/lib/fip.c
-@@ -215,7 +215,7 @@ int fip_socket(int ifindex, enum fip_multi multi)
- return s;
-
- rc = fip_socket_sanmac(s, ifindex, 1);
-- if (rc < 0) {
-+ if (rc < 0 && rc != -ENXIO) {
- close(s);
- return rc;
- }
---
-2.1.0
-
diff --git a/fcoe-utils-v1.0.30-fcoeadm-fix-display-when-some-netdevs-don-t-have-ser.patch b/fcoe-utils-v1.0.30-fcoeadm-fix-display-when-some-netdevs-don-t-have-ser.patch
deleted file mode 100644
index 92d7800..0000000
--- a/fcoe-utils-v1.0.30-fcoeadm-fix-display-when-some-netdevs-don-t-have-ser.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From cc0037c0091a2b9baf04a5101ec83a6ec8db448b Mon Sep 17 00:00:00 2001
-From: Chris Leech
-Date: Mon, 6 Jul 2015 20:43:56 -0700
-Subject: [PATCH] fcoeadm: fix display when some netdevs don't have serial
- numbers
-
----
- fcoeadm_display.c | 5 ++---
- 1 file changed, 2 insertions(+), 3 deletions(-)
-
-diff --git a/fcoeadm_display.c b/fcoeadm_display.c
-index 9b96170..3b7fff9 100644
---- a/fcoeadm_display.c
-+++ b/fcoeadm_display.c
-@@ -1294,9 +1294,8 @@ enum fcoe_status display_adapter_info(const char *ifname)
- continue;
- }
-
-- if (!strncmp(hba_attrs->SerialNumber,
-- shba_attrs->SerialNumber,
-- strlen(hba_attrs->SerialNumber))) {
-+ if (!strcmp(hba_attrs->SerialNumber,
-+ shba_attrs->SerialNumber)) {
- show_port_info(sport_attrs);
- hba_table_list->hba_table[j].displayed = 1;
- }
---
-2.1.0
-
diff --git a/fcoe-utils.spec b/fcoe-utils.spec
index 2185e0c..c6f14a5 100644
--- a/fcoe-utils.spec
+++ b/fcoe-utils.spec
@@ -1,34 +1,29 @@
# https://fedoraproject.org/wiki/Packaging:Guidelines#Compiler_flags
%global _hardened_build 1
-%global checkout 91c0c8c
+%global checkout f5cbb9a
Name: fcoe-utils
-Version: 1.0.30
-Release: 5.git%{checkout}%{?dist}
+Version: 1.0.32
+Release: 1%{?dist}
Summary: Fibre Channel over Ethernet utilities
Group: Applications/System
License: GPLv2
URL: http://www.open-fcoe.org
# git://open-fcoe.org/fcoe/fcoe-utils.git
-Source0: %{name}-%{version}.tar.gz
+Source0: https://github.com/morbidrsa/fcoe-utils/archive/v%{version}.tar.gz#/%{name}-%{version}.tar.gz
Source1: quickstart.txt
Source2: fcoe.service
Source3: fcoe.config
ExcludeArch: ppc s390
-Patch1: fcoe-utils-v1.0.30-1-fcoemon-Rework-daemonizing-and-error-handling.patch
-Patch2: fcoe-utils-v1.0.30-2-fcoemon-fix-IEEE-state-machine.patch
-Patch3: fcoe-utils-v1.0.30-3-sanmac-isn-t-required.patch
-Patch4: fcoe-utils-v1.0.30-fcoeadm-fix-display-when-some-netdevs-don-t-have-ser.patch
+Patch0: fcoe-utils-ggc7-fmt-truc-err.patch
BuildRequires: autoconf
BuildRequires: automake
-BuildRequires: libhbaapi-devel >= 2.2.9-6
-BuildRequires: libhbalinux-devel >= 1.0.17-1
+BuildRequires: libpciaccess-devel
BuildRequires: libtool
BuildRequires: lldpad-devel >= 0.9.43
BuildRequires: systemd
Requires: lldpad >= 0.9.43
-Requires: libhbalinux >= 1.0.16-5
Requires: iproute
Requires: device-mapper-multipath
Requires(post): systemd
@@ -86,6 +81,9 @@ rm -f %{buildroot}/%{_sysconfdir}/fcoe/config
%{_libexecdir}/fcoe/
%changelog
+* Thu Feb 09 2017 Chris Leech - 1.0.32-1
+- update to 1.0.32
+
* Wed Feb 03 2016 Fedora Release Engineering - 1.0.30-5.git91c0c8c
- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
diff --git a/sources b/sources
index a15b7e8..54a1ef9 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-6fcbb0e06a2af0bc1f2f5453d1042eaf fcoe-utils-1.0.30.tar.gz
+SHA512 (fcoe-utils-1.0.32.tar.gz) = 45b4ba5618f6d7a99ac206a158b4abd38201f0b29c46601a9f70425ae2610fb2688db5b276ef835699e71eeba1db65cc88e76e45cbc645d5f846ef6032a08874