Accepting request 209641 from network:fcoe

- Reshuffle patches for upstream integration:
  * Add patch 0018-Add-missing-DESTDIR-when-installing-bash-completion.patch
  * Add patch 0019-Fix-build-with-Wl-as-needed.patch
  * Add patch 0020-Fix-integer-formatting.patch
  * Add patch 0021-fcnsq-Fixup-help-text.patch
  * Add patch 0022-fcnsq-Fixup-64bit-integer-handling.patch
- Add systemd integration patches:
  * Add patch 0023-fcoemon-add-systemd-service-file.patch
  * Add patch 0024-fcoemon-systemd-socket-activation.patch
- Remove obsolete patch fcoe-utils-1.0.18-help.patch
- Remove obsolete patch fcoe-utils-1.0.28-format-strings.patch
- Remove obsolete patch fcoe-utils-1.0.28-systemd-doc.patch
- Remove obsolete patch fcoe-utils-1.0.29-as-needed.patch

- Small fixes from upstream
  * Add patch 0001-man-Fix-small-typo-regarding-fcf-option.patch
  * Add patch 0002-Don-t-call-AM_INIT_AUTOMAKE-twice.patch
- Include fipvlan update from upstream/SLES11 SP3
  * Add patch 0003-fipvlan-fails-on-powerpc.patch
  * Add patch 0004-fipvlan-Only-shutdown-interfaces-if-no-vlans-are-cre.patch
  * Add patch 0005-fipvlan-start-VLAN-interface-from-netlink-handler.patch
  * Add patch 0006-fipvlan-Extract-create_missing_vlan-function-from-lo.patch
  * Add patch 0007-fipvlan-create-VLANs-from-netlink-handler.patch
  * Add patch 0008-fipvlan-Start-FCoE-from-netlink-handler.patch
  * Add patch 0009-fipvlan-Update-wait-loop-to-wait-for-VLANs.patch
  * Add patch 0010-fipvlan-Re-send-VLAN-discovery.patch
  * Add patch 0011-fipvlan-update-manpage.patch
  * Add patch 0012-fipvlan-Leave-link-up-if-requested.patch
  * Add patch 0013-fipvlan-Update-manpage-to-reflect-correct-timeout.patch
  * Add patch 0014-fipvlan-Do-not-shut-down-FCoE-connections-on-physica.patch

OBS-URL: https://build.opensuse.org/request/show/209641
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/fcoe-utils?expand=0&rev=2
This commit is contained in:
Stephan Kulow 2013-12-09 06:05:17 +00:00 committed by Git OBS Bridge
commit f84dbcac87
30 changed files with 1942 additions and 135 deletions

View File

@ -0,0 +1,95 @@
From fd085bc2188785859b9ab1f6d27d0fe061baf88c Mon Sep 17 00:00:00 2001
From: Robert Love <robert.w.love@intel.com>
Date: Tue, 15 Oct 2013 01:48:18 +0000
Subject: [PATCH 01/17] man: Fix small typo regarding --fcf option
The option is coded as '--fcf', so fix the documentation
to match the implementation.
Reported-by: Xiaowei Li <xiaoli@redhat.com>
Signed-off-by: Robert Love <robert.w.love@intel.com>
---
doc/fcoeadm.8 | 18 +++++++-----------
doc/fcoeadm.txt | 4 ++--
2 files changed, 9 insertions(+), 13 deletions(-)
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 <http://docbook.sf.net/>
-.\" Date: 11/08/2012
+.\" Generator: DocBook XSL Stylesheets v1.78.1 <http://docbook.sf.net/>
+.\" 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.
--
1.8.1.4

View File

@ -0,0 +1,29 @@
From 0f63a3ed3a12b4f88f5dd49983cdf3f9b24e9fc8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Petr=20=C5=A0abata?= <contyk@redhat.com>
Date: Thu, 7 Nov 2013 11:31:11 +0000
Subject: [PATCH 02/17] Don't call AM_INIT_AUTOMAKE twice
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This fixes build issues with automake 1.14+.
Signed-off-by: Petr Šabata <contyk@redhat.com>
Signed-off-by: Robert Love <robert.w.love@intel.com>
---
configure.ac | 1 -
1 file changed, 1 deletion(-)
diff --git a/configure.ac b/configure.ac
index 73c140f..bb1385b 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])
--
1.8.1.4

View File

@ -0,0 +1,52 @@
From 921a055f5ea6b68f16db585e985eb24b4c32be2c Mon Sep 17 00:00:00 2001
From: Raju Chakraborty <rajuchak@linux.vnet.ibm.com>
Date: Mon, 18 Nov 2013 14:33:13 +0000
Subject: [PATCH 03/17] fipvlan fails on powerpc
fipvlan fails to execute properly on powerpc architecture.
# fipvlan -a
Try 'fipvlan --help' for more information
#
# fipvlan --create --start eth1
Try 'fipvlan --help' for more information
#
In power pc systems, when there are no more arguments to be parsed, getopt_long
should return -1. But gdb output shows that it c is 255 whereas in intel system
it shows -1 properly.
"char" must not be trusted when signing is important! Different arches (and even
different gcc versions on the same arch) may default char to signed or unsigned.
Ideally, a portable program should always use signed char or unsigned char when
it depends on the signedness of an object. But many programs have been written
to use plain char and expect it to be signed, or expect it to be unsigned,
depending on the machines they were written for. In this case the variable c
is expected to behave as signed and hence using signed would be the safe option.
http://gcc.gnu.org/onlinedocs/gcc-4.8.1/gcc/C-Dialect-Options.html
Signed-off-by: Raju Chakraborty<rajuchak@linux.vnet.ibm.com>
Signed-off-by: Robert Love <robert.w.love@intel.com>
---
fipvlan.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fipvlan.c b/fipvlan.c
index 6f8cf39..e51358f 100644
--- a/fipvlan.c
+++ b/fipvlan.c
@@ -471,7 +471,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);
--
1.8.1.4

View File

@ -0,0 +1,46 @@
From 29d172232050386b456da62bf873278bb90d4676 Mon Sep 17 00:00:00 2001
From: Hannes Reinecke <hare@suse.de>
Date: Tue, 19 Nov 2013 20:26:01 +0000
Subject: [PATCH 04/17] fipvlan: Only shutdown interfaces if no vlans are
created
Instead of having to check the individual stages we can
easier just check if any vlans are created. Vlans are
only created if the user specified '--create', so if
no VLANs are created either the user has not specified
it or some error occured along the line. In either case
we can shutdown the interface.
Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Robert Love <robert.w.love@intel.com>
---
fipvlan.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/fipvlan.c b/fipvlan.c
index e51358f..4559e07 100644
--- a/fipvlan.c
+++ b/fipvlan.c
@@ -857,8 +857,7 @@ static void cleanup_interfaces(void)
if (config.automode) {
TAILQ_FOREACH(iff, &interfaces, list_node) {
- if (iff->linkup_sent &&
- (!iff->running || !iff->req_sent || !iff->resp_recv)) {
+ if (iff->linkup_sent && TAILQ_EMPTY(&iff->vlans)) {
FIP_LOG_DBG("shutdown if %d",
iff->ifindex);
rtnl_set_iff_down(iff->ifindex, NULL);
@@ -872,8 +871,7 @@ static void cleanup_interfaces(void)
skipped++;
continue;
}
- if (iff->linkup_sent &&
- (!iff->running || !iff->req_sent || !iff->resp_recv)) {
+ if (iff->linkup_sent && TAILQ_EMPTY(&iff->vlans)) {
FIP_LOG_DBG("shutdown if %d",
iff->ifindex);
rtnl_set_iff_down(iff->ifindex, NULL);
--
1.8.1.4

View File

@ -0,0 +1,53 @@
From ef209fd4f68fb90f85f89612ebbf9c3e8843f33c Mon Sep 17 00:00:00 2001
From: Hannes Reinecke <hare@suse.de>
Date: Tue, 19 Nov 2013 20:26:02 +0000
Subject: [PATCH 05/17] fipvlan: start VLAN interface from netlink handler
Instead of starting the VLAN interface after the call to
vlan_create() we should rather start it after the netlink
message has been received. Otherwise we have a race window
as we might try to start a network interface which isn't
present yet.
Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Robert Love <robert.w.love@intel.com>
---
fipvlan.c | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/fipvlan.c b/fipvlan.c
index 4559e07..148d823 100644
--- a/fipvlan.c
+++ b/fipvlan.c
@@ -416,11 +416,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 */
@@ -581,7 +586,6 @@ create_missing_vlans_list(struct fcf_list_head *list, const char *label)
vlan_name, strerror(-rc));
else
printf("Created VLAN device %s\n", vlan_name);
- rtnl_set_iff_up(0, vlan_name);
}
printf("\n");
}
--
1.8.1.4

View File

@ -0,0 +1,110 @@
From 6ce709fd271ace5a549a43f11343638273684916 Mon Sep 17 00:00:00 2001
From: Hannes Reinecke <hare@suse.de>
Date: Tue, 19 Nov 2013 20:26:03 +0000
Subject: [PATCH 06/17] fipvlan: Extract create_missing_vlan function from loop
No functional change.
Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Robert Love <robert.w.love@intel.com>
---
fipvlan.c | 74 +++++++++++++++++++++++++++++++++++----------------------------
1 file changed, 41 insertions(+), 33 deletions(-)
diff --git a/fipvlan.c b/fipvlan.c
index 148d823..d91cc1c 100644
--- a/fipvlan.c
+++ b/fipvlan.c
@@ -544,48 +544,56 @@ 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_missing_vlan(struct fcf *fcf, const char *label)
{
- struct fcf *fcf;
struct iff *real_dev, *vlan;
char vlan_name[IFNAMSIZ];
int rc;
+ real_dev = lookup_iff(fcf->ifindex, NULL);
+ if (!real_dev) {
+ FIP_LOG_ERR(ENODEV,
+ "lost device %d with discovered %s?\n",
+ fcf->ifindex, label);
+ 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);
+ return -EPERM;
+ }
+ 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);
+ return -EEXIST;
+ }
+ 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)
+ printf("Failed to create VLAN device %s\n\t%s\n",
+ vlan_name, strerror(-rc));
+ else
+ printf("Created VLAN device %s\n", vlan_name);
+ return rc;
+}
+
+static void
+create_missing_vlans_list(struct fcf_list_head *list, const char *label)
+{
+ struct fcf *fcf;
+
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;
- }
- 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;
- }
- 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)
- printf("Failed to create VLAN device %s\n\t%s\n",
- vlan_name, strerror(-rc));
- else
- printf("Created VLAN device %s\n", vlan_name);
+ create_missing_vlan(fcf, label);
}
printf("\n");
}
--
1.8.1.4

View File

@ -0,0 +1,143 @@
From ac1fc202b5efda33df3445c2a60709264a0032e5 Mon Sep 17 00:00:00 2001
From: Hannes Reinecke <hare@suse.de>
Date: Tue, 19 Nov 2013 20:26:04 +0000
Subject: [PATCH 07/17] fipvlan: create VLANs from netlink handler
Instead of having its own loop we should better create VLANs
directly from the netlink handler. With this we can eliminate
the create_missing_vlans() loop.
Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Robert Love <robert.w.love@intel.com>
---
fipvlan.c | 77 +++++++++++++++++++++++++--------------------------------------
1 file changed, 30 insertions(+), 47 deletions(-)
diff --git a/fipvlan.c b/fipvlan.c
index d91cc1c..501f79c 100644
--- a/fipvlan.c
+++ b/fipvlan.c
@@ -157,6 +157,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 +318,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;
@@ -545,7 +550,7 @@ static int rtnl_listener_handler(struct nlmsghdr *nh, UNUSED void *arg)
}
static int
-create_missing_vlan(struct fcf *fcf, const char *label)
+create_and_start_vlan(struct fcf *fcf, bool vn2vn)
{
struct iff *real_dev, *vlan;
char vlan_name[IFNAMSIZ];
@@ -555,7 +560,7 @@ create_missing_vlan(struct fcf *fcf, const char *label)
if (!real_dev) {
FIP_LOG_ERR(ENODEV,
"lost device %d with discovered %s?\n",
- fcf->ifindex, label);
+ fcf->ifindex, vn2vn ? "VN2VN" : "FCF");
return -ENXIO;
}
if (!fcf->vlan) {
@@ -565,45 +570,31 @@ create_missing_vlan(struct fcf *fcf, const char *label)
* started on the physical interface itself.
*/
FIP_LOG_DBG("VLAN id is 0 for %s\n", real_dev->ifname);
- return -EPERM;
- }
- 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);
- return -EEXIST;
- }
- 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)
- printf("Failed to create VLAN device %s\n\t%s\n",
- vlan_name, strerror(-rc));
- else
+ 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);
+ 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) {
+ printf("Failed to create VLAN device %s\n\t%s\n",
+ vlan_name, strerror(-rc));
+ return rc;
+ }
printf("Created VLAN device %s\n", vlan_name);
- return rc;
-}
-
-static void
-create_missing_vlans_list(struct fcf_list_head *list, const char *label)
-{
- struct fcf *fcf;
-
- if (!config.create)
- return;
-
- TAILQ_FOREACH(fcf, list, list_node) {
- create_missing_vlan(fcf, label);
}
- printf("\n");
-}
-
-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 (config.start && !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);
+ }
+ return rc;
}
static int fcoe_mod_instance_start(const char *ifname)
@@ -957,14 +948,6 @@ int main(int argc, char **argv)
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();
--
1.8.1.4

View File

@ -0,0 +1,154 @@
From 16e421a30caae0e2968941c7bde48f512d9ec106 Mon Sep 17 00:00:00 2001
From: Hannes Reinecke <hare@suse.de>
Date: Tue, 19 Nov 2013 20:26:05 +0000
Subject: [PATCH 08/17] fipvlan: Start FCoE from netlink handler
Whenever a VLAN or real device is found to have a FCF record
we can go ahead and start FCoE. With this change we can remove
the start_fcoe() loop.
Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Robert Love <robert.w.love@intel.com>
---
fipvlan.c | 83 ++++++++++++++++++++++++++++++++++++---------------------------
1 file changed, 47 insertions(+), 36 deletions(-)
diff --git a/fipvlan.c b/fipvlan.c
index 501f79c..9261b1d 100644
--- a/fipvlan.c
+++ b/fipvlan.c
@@ -139,6 +139,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;
};
@@ -367,8 +368,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);
@@ -383,12 +390,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;
}
@@ -588,11 +621,19 @@ create_and_start_vlan(struct fcf *fcf, bool vn2vn)
}
printf("Created VLAN device %s\n", vlan_name);
}
- if (config.start && !vlan->running) {
- FIP_LOG_DBG("%s if %d not running, "
- "starting", vlan == real_dev ? "real" : "vlan",
+ if (!config.start)
+ return rc;
+
+ 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;
}
@@ -669,34 +710,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;
@@ -948,8 +961,6 @@ int main(int argc, char **argv)
do_vlan_discovery();
rc = print_results();
- if (!rc && config.start)
- start_fcoe();
cleanup_interfaces();
--
1.8.1.4

View File

@ -0,0 +1,73 @@
From 9f5e376f3cf16bdd83d731fdc02a877e78a75c26 Mon Sep 17 00:00:00 2001
From: Hannes Reinecke <hare@suse.de>
Date: Tue, 19 Nov 2013 20:26:06 +0000
Subject: [PATCH 09/17] fipvlan: Update wait loop to wait for VLANs
The wait loop should be waiting for any VLAN to become activated,
otherwise we might fail too early.
Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Robert Love <robert.w.love@intel.com>
---
fipvlan.c | 35 ++++++++++++++++++++++++++++++-----
1 file changed, 30 insertions(+), 5 deletions(-)
diff --git a/fipvlan.c b/fipvlan.c
index 9261b1d..e7a0016 100644
--- a/fipvlan.c
+++ b/fipvlan.c
@@ -845,7 +845,7 @@ 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) {
@@ -856,13 +856,38 @@ retry:
goto retry;
}
recv_loop(200);
- TAILQ_FOREACH(iff, &interfaces, list_node)
+ TAILQ_FOREACH(iff, &interfaces, list_node) {
+ 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) {
+ if (iff->req_sent && !iff->resp_recv) {
FIP_LOG_DBG("VLAN discovery RETRY [%d]", retry_count);
- goto retry;
+ 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)
--
1.8.1.4

View File

@ -0,0 +1,34 @@
From 3ded1660f3e2eb79e4dd8155996b0802b6ee664b Mon Sep 17 00:00:00 2001
From: Hannes Reinecke <hare@suse.de>
Date: Tue, 19 Nov 2013 20:26:07 +0000
Subject: [PATCH 10/17] fipvlan: Re-send VLAN discovery
Some switches might decide to discard the VLAN discovery request,
so we should rather re-send it whenever we need to retry.
At worst we will be receiving several responses, but they'll be
discarded.
Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Robert Love <robert.w.love@intel.com>
---
fipvlan.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/fipvlan.c b/fipvlan.c
index e7a0016..9ef4025 100644
--- a/fipvlan.c
+++ b/fipvlan.c
@@ -865,7 +865,9 @@ retry:
}
/* if we did not receive a response, retry */
if (iff->req_sent && !iff->resp_recv) {
- FIP_LOG_DBG("VLAN discovery RETRY [%d]", retry_count);
+ FIP_LOG_DBG("if %d: VLAN discovery RETRY [%d]",
+ iff->ifindex, retry_count);
+ iff->req_sent = false;
retry_iff++;
continue;
}
--
1.8.1.4

View File

@ -0,0 +1,61 @@
From 9ade5c67217915aaf38a9e239503d3c982ab6300 Mon Sep 17 00:00:00 2001
From: Hannes Reinecke <hare@suse.de>
Date: Tue, 19 Nov 2013 20:26:08 +0000
Subject: [PATCH 11/17] fipvlan: update manpage
'-d' was missing on one instance.
Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Robert Love <robert.w.love@intel.com>
---
doc/fipvlan.8 | 8 ++++----
doc/fipvlan.txt | 3 ++-
2 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/doc/fipvlan.8 b/doc/fipvlan.8
index f81cb3a..5eebfbf 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 <http://docbook.sf.net/>
-.\" Date: 03/18/2013
+.\" Generator: DocBook XSL Stylesheets v1.78.1 <http://docbook.sf.net/>
+.\" 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,7 +29,7 @@
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] \fIinterfaces\fR
.sp
\fBfipvlan\fR \-a|\-\-auto [\-c|\-\-create] [\-d|\-\-debug] [\-s|\-\-start] [\-m|\-\-mode fabric|vn2vn] [\-l|\-\-link\-retry \fIcount\fR]
.sp
diff --git a/doc/fipvlan.txt b/doc/fipvlan.txt
index 9699197..0f2151e 100644
--- a/doc/fipvlan.txt
+++ b/doc/fipvlan.txt
@@ -19,7 +19,8 @@ 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] _interfaces_
*fipvlan* -a|--auto [-c|--create] [-d|--debug]
[-s|--start] [-m|--mode fabric|vn2vn] [-l|--link-retry _count_]
--
1.8.1.4

View File

@ -0,0 +1,171 @@
From 0559d7dd7f3e1fff5a76d45bf4c0ca5944640af6 Mon Sep 17 00:00:00 2001
From: Hannes Reinecke <hare@suse.de>
Date: Tue, 19 Nov 2013 20:26:09 +0000
Subject: [PATCH 12/17] fipvlan: Leave link up if requested
This patch adds an option '-u' / '--link-up' to leave the network
interface running if a FIP response has been received.
Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Robert Love <robert.w.love@intel.com>
---
doc/fipvlan.8 | 9 +++++++--
doc/fipvlan.txt | 6 +++++-
fipvlan.c | 37 ++++++++++++++++++++++++++-----------
3 files changed, 38 insertions(+), 14 deletions(-)
diff --git a/doc/fipvlan.8 b/doc/fipvlan.8
index 5eebfbf..927e557 100644
--- a/doc/fipvlan.8
+++ b/doc/fipvlan.8
@@ -29,9 +29,9 @@
fipvlan \- Fibre Channel over Ethernet VLAN Discovery
.SH "SYNOPSIS"
.sp
-\fBfipvlan\fR [\-c|\-\-create] [\-d|\-\-debug] [\-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
@@ -86,6 +86,11 @@ Retry check for link up to
times\&. The link state is checked every 500 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
.RS 4
Display a help message with basic usage instructions
diff --git a/doc/fipvlan.txt b/doc/fipvlan.txt
index 0f2151e..cbed16f 100644
--- a/doc/fipvlan.txt
+++ b/doc/fipvlan.txt
@@ -20,10 +20,11 @@ fipvlan - Fibre Channel over Ethernet VLAN Discovery
SYNOPSIS
--------
*fipvlan* [-c|--create] [-d|--debug] [-s|--start]
- [-m|--mode fabric|vn2vn] _interfaces_
+ [-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
@@ -76,6 +77,9 @@ OPTIONS
Retry check for link up to _count_ times. The link state is
checked every 500 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/fipvlan.c b/fipvlan.c
index 9ef4025..a865481 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 = "",
};
@@ -478,7 +480,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' },
@@ -488,6 +490,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 }
@@ -505,6 +508,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);
@@ -551,6 +555,9 @@ static void parse_cmdline(int argc, char **argv)
exit(1);
}
break;
+ case 'u':
+ config.link_up = true;
+ break;
case 'h':
help(0);
break;
@@ -900,11 +907,15 @@ static void cleanup_interfaces(void)
if (config.automode) {
TAILQ_FOREACH(iff, &interfaces, list_node) {
- if (iff->linkup_sent && TAILQ_EMPTY(&iff->vlans)) {
- FIP_LOG_DBG("shutdown if %d",
- iff->ifindex);
- rtnl_set_iff_down(iff->ifindex, NULL);
- iff->linkup_sent = false;
+ if (iff->linkup_sent) {
+ if (config.link_up && iff->resp_recv)
+ continue;
+ if (TAILQ_EMPTY(&iff->vlans)) {
+ FIP_LOG_DBG("shutdown if %d",
+ iff->ifindex);
+ rtnl_set_iff_down(iff->ifindex, NULL);
+ iff->linkup_sent = false;
+ }
}
}
} else {
@@ -914,11 +925,15 @@ static void cleanup_interfaces(void)
skipped++;
continue;
}
- if (iff->linkup_sent && TAILQ_EMPTY(&iff->vlans)) {
- FIP_LOG_DBG("shutdown if %d",
- iff->ifindex);
- rtnl_set_iff_down(iff->ifindex, NULL);
- iff->linkup_sent = false;
+ if (iff->linkup_sent) {
+ if (config.link_up && iff->resp_recv)
+ continue;
+ if (TAILQ_EMPTY(&iff->vlans)) {
+ FIP_LOG_DBG("shutdown if %d",
+ iff->ifindex);
+ rtnl_set_iff_down(iff->ifindex, NULL);
+ iff->linkup_sent = false;
+ }
}
}
}
--
1.8.1.4

View File

@ -0,0 +1,43 @@
From 08d9872fb579c0764115beadf588cc52c9f7d97a Mon Sep 17 00:00:00 2001
From: Hannes Reinecke <hare@suse.de>
Date: Tue, 19 Nov 2013 20:26:10 +0000
Subject: [PATCH 13/17] fipvlan: Update manpage to reflect correct timeout
The timeout per loop is 1000ms, not 500ms.
Signed-off-by: Lee Duncan <lduncan@suse.com>
Signed-off-by: Robert Love <robert.w.love@intel.com>
---
doc/fipvlan.8 | 2 +-
doc/fipvlan.txt | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/doc/fipvlan.8 b/doc/fipvlan.8
index 927e557..1d2b707 100644
--- a/doc/fipvlan.8
+++ b/doc/fipvlan.8
@@ -83,7 +83,7 @@ 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
diff --git a/doc/fipvlan.txt b/doc/fipvlan.txt
index cbed16f..5ba0324 100644
--- a/doc/fipvlan.txt
+++ b/doc/fipvlan.txt
@@ -75,7 +75,7 @@ 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.
--
1.8.1.4

View File

@ -0,0 +1,42 @@
From 86928f2be78cfb80ff61856e1b7189ed88c836c1 Mon Sep 17 00:00:00 2001
From: Hannes Reinecke <hare@suse.de>
Date: Tue, 19 Nov 2013 20:26:11 +0000
Subject: [PATCH 14/17] fipvlan: Do not shut down FCoE connections on physical
interface
When FCoE is started on the physical interface fipvlan will
shutdown the interface upon exit.
References: bnc#814151
Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Robert Love <robert.w.love@intel.com>
---
fipvlan.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/fipvlan.c b/fipvlan.c
index a865481..3c91930 100644
--- a/fipvlan.c
+++ b/fipvlan.c
@@ -910,6 +910,8 @@ static void cleanup_interfaces(void)
if (iff->linkup_sent) {
if (config.link_up && iff->resp_recv)
continue;
+ if (iff->fcoe_started)
+ continue;
if (TAILQ_EMPTY(&iff->vlans)) {
FIP_LOG_DBG("shutdown if %d",
iff->ifindex);
@@ -928,6 +930,8 @@ static void cleanup_interfaces(void)
if (iff->linkup_sent) {
if (config.link_up && iff->resp_recv)
continue;
+ if (iff->fcoe_started)
+ continue;
if (TAILQ_EMPTY(&iff->vlans)) {
FIP_LOG_DBG("shutdown if %d",
iff->ifindex);
--
1.8.1.4

View File

@ -0,0 +1,36 @@
From 78ea81aaef57b5b40fdc86335a7e6a432a72ad48 Mon Sep 17 00:00:00 2001
From: Hannes Reinecke <hare@suse.de>
Date: Tue, 19 Nov 2013 20:26:12 +0000
Subject: [PATCH 15/17] fipvlan: break out of receive loop on error
When fip_recv() returns an error we need to break out of the
receive loop; otherwise we might be stuck in there forever.
Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Robert Love <robert.w.love@intel.com>
---
fipvlan.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/fipvlan.c b/fipvlan.c
index 3c91930..198f0ee 100644
--- a/fipvlan.c
+++ b/fipvlan.c
@@ -772,8 +772,12 @@ 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;
+ }
}
}
}
--
1.8.1.4

View File

@ -0,0 +1,129 @@
From 45d0e704e82b1c00d3e45745ac3d466fce4c953c Mon Sep 17 00:00:00 2001
From: Hannes Reinecke <hare@suse.de>
Date: Tue, 19 Nov 2013 20:26:13 +0000
Subject: [PATCH 16/17] fipvlan: handle errors from fip socket creation
If we don't receive a SAN MAC address it's pointless to try
to create a socket, as FCoE itself cannot continue. So we
should be handling errors from socket creation and abort
VLAN discovery early.
Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Robert Love <robert.w.love@intel.com>
---
fipvlan.c | 19 ++++++++++++-------
lib/fip.c | 20 ++++++++++++++------
2 files changed, 26 insertions(+), 13 deletions(-)
diff --git a/fipvlan.c b/fipvlan.c
index 198f0ee..5bedea1 100644
--- a/fipvlan.c
+++ b/fipvlan.c
@@ -790,7 +790,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;
@@ -812,6 +812,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);
@@ -819,13 +823,14 @@ 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)
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);
--
1.8.1.4

View File

@ -0,0 +1,174 @@
From 6bde8d1b9f63a7d110fab53e3791040cbe9b101f Mon Sep 17 00:00:00 2001
From: Hannes Reinecke <hare@suse.de>
Date: Tue, 19 Nov 2013 20:26:14 +0000
Subject: [PATCH 17/17] fipvlan: filter interfaces from rtnl_getlink
Instead of carrying around two different ways on selecting
interfaces we should be filter the list of possible interfaces
during RTM_GETLINK / RTM_NEWLINK and use only one list.
This safes us from having implement two codepaths for doing
the same thing.
Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Robert Love <robert.w.love@intel.com>
---
fipvlan.c | 98 ++++++++++++++++++++++++++++-----------------------------------
1 file changed, 43 insertions(+), 55 deletions(-)
diff --git a/fipvlan.c b/fipvlan.c
index 5bedea1..1b8492d 100644
--- a/fipvlan.c
+++ b/fipvlan.c
@@ -447,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 */
@@ -836,22 +849,10 @@ static int probe_fip_interface(struct iff *iff)
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;
}
@@ -865,7 +866,8 @@ static void do_vlan_discovery(void)
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;
@@ -873,6 +875,11 @@ retry:
}
recv_loop(200);
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);
@@ -911,47 +918,23 @@ 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) {
- if (config.link_up && iff->resp_recv)
- continue;
- 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);
- 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) {
- if (config.link_up && iff->resp_recv)
- continue;
- 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);
- iff->linkup_sent = false;
- }
+ 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);
+ iff->linkup_sent = false;
}
}
}
-
}
+
/* this is to not require headers from libcap */
static inline int capget(cap_user_header_t hdrp, cap_user_data_t datap)
{
@@ -1003,13 +986,18 @@ 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);
}
--
1.8.1.4

View File

@ -0,0 +1,26 @@
From 51cfb504c434a8a0a1df9fa7c3cd9000c4e53d92 Mon Sep 17 00:00:00 2001
From: Hannes Reinecke <hare@suse.de>
Date: Fri, 6 Dec 2013 11:08:23 +0100
Subject: Add missing 'DESTDIR' when installing bash completion
Signed-off-by: Hannes Reinecke <hare@suse.de>
---
Makefile.am | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Makefile.am b/Makefile.am
index 5cbc15f..e93aa8f 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -67,7 +67,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 \
--
1.8.1.4

View File

@ -1,7 +1,21 @@
diff -urN fcoe-utils-1.0.29.old/Makefile.am fcoe-utils-1.0.29/Makefile.am
--- fcoe-utils-1.0.29.old/Makefile.am 2013-10-10 17:20:17.341411557 +0200
+++ fcoe-utils-1.0.29/Makefile.am 2013-10-10 17:20:58.284411552 +0200
@@ -9,21 +9,18 @@
From a76be731a5e5262abf0c8deadf8f4f541559b9f8 Mon Sep 17 00:00:00 2001
From: Hannes Reinecke <hare@suse.de>
Date: Fri, 6 Dec 2013 11:23:34 +0100
Subject: Fix build with '-Wl,--as-needed'
The libraries need to be specified correctly to get '--as-needed'
to work.
Signed-off-by: Hannes Reinecke <hare@suse.de>
---
Makefile.am | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/Makefile.am b/Makefile.am
index e93aa8f..ba08924 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
@ -26,3 +40,6 @@ diff -urN fcoe-utils-1.0.29.old/Makefile.am fcoe-utils-1.0.29/Makefile.am
## rules for building fipvlan
fipvlan_SOURCES = fipvlan.c
--
1.8.1.4

View File

@ -1,63 +1,22 @@
diff --git a/fcnsq.c b/fcnsq.c
index 45dff40..c5b78b9 100644
--- a/fcnsq.c
+++ b/fcnsq.c
@@ -24,6 +24,7 @@
#include <stdarg.h>
#include <stdbool.h>
#include <unistd.h>
+#include <inttypes.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
@@ -227,7 +228,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)
@@ -248,7 +249,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)
@@ -373,11 +374,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);
@@ -402,7 +404,8 @@ int main(int argc, char *argv[])
if (cmd)
help(-1);
cmd = c;
- sscanf(optarg, "%llx", &wwnn);
+ sscanf(optarg, "%jx", &wwnn_tmp);
+ wwnn = (u64)wwnn_tmp;
break;
}
}
From d61a3d41a935a389c3cf6d4040905a4e296095c5 Mon Sep 17 00:00:00 2001
From: Hannes Reinecke <hare@suse.de>
Date: Fri, 6 Dec 2013 11:54:49 +0100
Subject: Fix integer formatting
Properly use inttypes when printing 64bit values.
Signed-off-by: Hannes Reinecke <hare@suse.de>
---
fcoeadm_display.c | 4 ++--
fcoemon.c | 2 +-
fcping.c | 11 ++++++-----
3 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/fcoeadm_display.c b/fcoeadm_display.c
index e1cbd48..a6cf7a3 100644
index 287e370..9b96aa7 100644
--- a/fcoeadm_display.c
+++ b/fcoeadm_display.c
@@ -1426,8 +1426,8 @@ void print_fcoe_fcf_device(void *ep, void *arg)
@@ -1417,8 +1417,8 @@ static void print_fcoe_fcf_device(void *ep, UNUSED void *arg)
if (!buf)
buf = temp;
printf(" Connection Mode: %s\n", buf);
@ -69,10 +28,10 @@ index e1cbd48..a6cf7a3 100644
printf(" MAC Address: %s\n", mac);
printf(" FCF Priority: %u\n", fcf->priority);
diff --git a/fcoemon.c b/fcoemon.c
index 80360fd..23fae9e 100644
index a5babfa..be4c74d 100644
--- a/fcoemon.c
+++ b/fcoemon.c
@@ -2640,7 +2640,7 @@ static void fcm_dcbd_get_oper(struct fcm_netif *ff, char *resp, char *cp)
@@ -2637,7 +2637,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 "
@ -82,7 +41,7 @@ index 80360fd..23fae9e 100644
} else {
if (val && fcoe_config.debug)
diff --git a/fcping.c b/fcping.c
index bc51d5f..f92516f 100644
index c6f74a6..399b778 100644
--- a/fcping.c
+++ b/fcping.c
@@ -25,6 +25,7 @@
@ -93,7 +52,7 @@ index bc51d5f..f92516f 100644
#include <errno.h>
#include <string.h>
#include <time.h>
@@ -812,17 +813,17 @@ static void fp_check_data_len()
@@ -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"
@ -116,3 +75,6 @@ index bc51d5f..f92516f 100644
}
/*
--
1.8.1.4

View File

@ -0,0 +1,28 @@
From a300e36092c51953cc55691f2d7514ee14ba1431 Mon Sep 17 00:00:00 2001
From: Hannes Reinecke <hare@suse.de>
Date: Fri, 6 Dec 2013 11:22:02 +0100
Subject: fcnsq: Fixup help text
The help text was missing the '-q' short option.
Signed-off-by: Hannes Reinecke <hare@suse.de>
---
fcnsq.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fcnsq.c b/fcnsq.c
index 7b45a32..2510f1c 100644
--- a/fcnsq.c
+++ b/fcnsq.c
@@ -365,7 +365,7 @@ static void help(int status)
" --gspn <port id>\n"
" --gsnn <world wide node name>\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"
);
--
1.8.1.4

View File

@ -0,0 +1,78 @@
From 0fc2690e701941dfa71ae207286b39b7d99ed801 Mon Sep 17 00:00:00 2001
From: Hannes Reinecke <hare@suse.de>
Date: Fri, 6 Dec 2013 11:57:30 +0100
Subject: fcnsq: Fixup 64bit integer handling
Signed-off-by: Hannes Reinecke <hare@suse.de>
---
fcnsq.c | 18 ++++++++++++------
1 file changed, 12 insertions(+), 6 deletions(-)
diff --git a/fcnsq.c b/fcnsq.c
index 2510f1c..68a0697 100644
--- a/fcnsq.c
+++ b/fcnsq.c
@@ -24,6 +24,7 @@
#include <stdarg.h>
#include <stdbool.h>
#include <unistd.h>
+#include <inttypes.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
@@ -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)
@@ -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;
}
}
--
1.8.1.4

View File

@ -0,0 +1,99 @@
From bf7f4b232fec6767e767287d2f04cd782467000d Mon Sep 17 00:00:00 2001
From: Hannes Reinecke <hare@suse.de>
Date: Fri, 6 Dec 2013 11:32:20 +0100
Subject: fcoemon: add systemd service file
Add fcoe.service file to start fcoemon from systemd
Signed-off-by: Hannes Reinecke <hare@suse.de>
---
Makefile.am | 5 +++++
configure.ac | 8 ++++++++
doc/fcoemon.8 | 2 +-
doc/fcoemon.txt | 1 +
etc/systemd/fcoe.service | 13 +++++++++++++
5 files changed, 28 insertions(+), 1 deletion(-)
create mode 100644 etc/systemd/fcoe.service
diff --git a/Makefile.am b/Makefile.am
index ba08924..012b560 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -41,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
+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
diff --git a/configure.ac b/configure.ac
index bb1385b..107d039 100644
--- a/configure.ac
+++ b/configure.ac
@@ -17,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/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..09ee5a2 100644
--- a/doc/fcoemon.txt
+++ b/doc/fcoemon.txt
@@ -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/etc/systemd/fcoe.service b/etc/systemd/fcoe.service
new file mode 100644
index 0000000..4834e43
--- /dev/null
+++ b/etc/systemd/fcoe.service
@@ -0,0 +1,13 @@
+[Unit]
+Description=Open-FCoE initiator daemon
+After=syslog.target network.target
+
+[Service]
+Type=forking
+EnvironmentFile=/etc/sysconfig/fcoe
+ExecStartPre=/sbin/modprobe -qa $SUPPORTED_DRIVERS
+ExecStart=/usr/sbin/fcoemon $FCOEMON_OPTS
+
+[Install]
+WantedBy=multi-user.target
+Also=lldpad.socket
--
1.8.1.4

View File

@ -0,0 +1,130 @@
From a8993f1a41d65d5b6e1a4fef081eb2d84bb0426b Mon Sep 17 00:00:00 2001
From: Hannes Reinecke <hare@suse.de>
Date: Fri, 6 Dec 2013 10:59:19 +0100
Subject: fcoemon: systemd socket activation
Implement systemd socket activation on the CLIF socket.
Signed-off-by: Hannes Reinecke <hare@suse.de>
---
Makefile.am | 2 +-
etc/systemd/fcoe.service | 3 ++-
etc/systemd/fcoemon.socket | 6 ++++++
fcoemon.c | 44 +++++++++++++++++++++++++++++++++++++++++++-
4 files changed, 52 insertions(+), 3 deletions(-)
create mode 100644 etc/systemd/fcoemon.socket
diff --git a/Makefile.am b/Makefile.am
index 012b560..e7df6f5 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -43,7 +43,7 @@ dist_fcoe_config_DATA = etc/cfg-ethx
## install systemd service files
if HAVE_SYSTEMD
-systemdsystemunit_DATA = etc/systemd/fcoe.service
+systemdsystemunit_DATA = etc/systemd/fcoe.service etc/systemd/fcoemon.socket
endif
## man pages for fcoeadm and fcoemon
diff --git a/etc/systemd/fcoe.service b/etc/systemd/fcoe.service
index 4834e43..5e5c8a2 100644
--- a/etc/systemd/fcoe.service
+++ b/etc/systemd/fcoe.service
@@ -3,7 +3,7 @@ Description=Open-FCoE initiator daemon
After=syslog.target network.target
[Service]
-Type=forking
+Type=simple
EnvironmentFile=/etc/sysconfig/fcoe
ExecStartPre=/sbin/modprobe -qa $SUPPORTED_DRIVERS
ExecStart=/usr/sbin/fcoemon $FCOEMON_OPTS
@@ -11,3 +11,4 @@ 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/fcoemon.c b/fcoemon.c
index be4c74d..5e4f8d7 100644
--- a/fcoemon.c
+++ b/fcoemon.c
@@ -3546,12 +3546,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 +3612,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);
--
1.8.1.4

View File

@ -1,13 +0,0 @@
diff --git a/fcnsq.c b/fcnsq.c
index 8722b21..466a85e 100644
--- a/fcnsq.c
+++ b/fcnsq.c
@@ -360,7 +360,7 @@ static void help(int status)
" --gspn <port id>\n"
" --gsnn <world wide node name>\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"
);

View File

@ -1,25 +0,0 @@
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..09ee5a2 100644
--- a/doc/fcoemon.txt
+++ b/doc/fcoemon.txt
@@ -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
-----------------------

View File

@ -11,12 +11,3 @@ index 5cbc15f..57bdbdb 100644
## pass the sysconfdir into the C proprocessor
AM_CPPFLAGS += -DSYSCONFDIR="\"${sysconfdir}\"" -D_FORTIFY_SOURCE=2
AM_CFLAGS = -Wall -Wformat=2 -Werror -Wmissing-prototypes -Wstrict-prototypes
@@ -67,7 +67,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 \

View File

@ -1,3 +1,43 @@
-------------------------------------------------------------------
Fri Dec 6 12:54:33 CET 2013 - hare@suse.de
- Reshuffle patches for upstream integration:
* Add patch 0018-Add-missing-DESTDIR-when-installing-bash-completion.patch
* Add patch 0019-Fix-build-with-Wl-as-needed.patch
* Add patch 0020-Fix-integer-formatting.patch
* Add patch 0021-fcnsq-Fixup-help-text.patch
* Add patch 0022-fcnsq-Fixup-64bit-integer-handling.patch
- Add systemd integration patches:
* Add patch 0023-fcoemon-add-systemd-service-file.patch
* Add patch 0024-fcoemon-systemd-socket-activation.patch
- Remove obsolete patch fcoe-utils-1.0.18-help.patch
- Remove obsolete patch fcoe-utils-1.0.28-format-strings.patch
- Remove obsolete patch fcoe-utils-1.0.28-systemd-doc.patch
- Remove obsolete patch fcoe-utils-1.0.29-as-needed.patch
-------------------------------------------------------------------
Fri Dec 6 09:11:57 CET 2013 - hare@suse.de
- Small fixes from upstream
* Add patch 0001-man-Fix-small-typo-regarding-fcf-option.patch
* Add patch 0002-Don-t-call-AM_INIT_AUTOMAKE-twice.patch
- Include fipvlan update from upstream/SLES11 SP3
* Add patch 0003-fipvlan-fails-on-powerpc.patch
* Add patch 0004-fipvlan-Only-shutdown-interfaces-if-no-vlans-are-cre.patch
* Add patch 0005-fipvlan-start-VLAN-interface-from-netlink-handler.patch
* Add patch 0006-fipvlan-Extract-create_missing_vlan-function-from-lo.patch
* Add patch 0007-fipvlan-create-VLANs-from-netlink-handler.patch
* Add patch 0008-fipvlan-Start-FCoE-from-netlink-handler.patch
* Add patch 0009-fipvlan-Update-wait-loop-to-wait-for-VLANs.patch
* Add patch 0010-fipvlan-Re-send-VLAN-discovery.patch
* Add patch 0011-fipvlan-update-manpage.patch
* Add patch 0012-fipvlan-Leave-link-up-if-requested.patch
* Add patch 0013-fipvlan-Update-manpage-to-reflect-correct-timeout.patch
* Add patch 0014-fipvlan-Do-not-shut-down-FCoE-connections-on-physica.patch
* Add patch 0015-fipvlan-break-out-of-receive-loop-on-error.patch
* Add patch 0016-fipvlan-handle-errors-from-fip-socket-creation.patch
* Add patch 0017-fipvlan-filter-interfaces-from-rtnl_getlink.patch
-------------------------------------------------------------------
Thu Oct 10 15:22:26 UTC 2013 - tchvatal@suse.com

View File

@ -26,7 +26,7 @@ BuildRequires: libtool
BuildRequires: open-lldp-devel
Requires: device-mapper
Requires: iproute
BuildRequires: systemd
BuildRequires: systemd-devel
%systemd_requires
Version: 1.0.29
Release: 0
@ -35,17 +35,39 @@ License: GPL-2.0
Group: System/Daemons
# git://open-fcoe.org/fcoe/fcoe-utils.git
Source0: %{name}-%{version}.tar.xz
Source1: fcoe.service
Source2: fcoe.config
Source20: mkinitrd-boot.sh
Source22: mkinitrd-setup.sh
# Patches from git repository
Patch1: 0001-man-Fix-small-typo-regarding-fcf-option.patch
Patch2: 0002-Don-t-call-AM_INIT_AUTOMAKE-twice.patch
Patch3: 0003-fipvlan-fails-on-powerpc.patch
Patch4: 0004-fipvlan-Only-shutdown-interfaces-if-no-vlans-are-cre.patch
Patch5: 0005-fipvlan-start-VLAN-interface-from-netlink-handler.patch
Patch6: 0006-fipvlan-Extract-create_missing_vlan-function-from-lo.patch
Patch7: 0007-fipvlan-create-VLANs-from-netlink-handler.patch
Patch8: 0008-fipvlan-Start-FCoE-from-netlink-handler.patch
Patch9: 0009-fipvlan-Update-wait-loop-to-wait-for-VLANs.patch
Patch10: 0010-fipvlan-Re-send-VLAN-discovery.patch
Patch11: 0011-fipvlan-update-manpage.patch
Patch12: 0012-fipvlan-Leave-link-up-if-requested.patch
Patch13: 0013-fipvlan-Update-manpage-to-reflect-correct-timeout.patch
Patch14: 0014-fipvlan-Do-not-shut-down-FCoE-connections-on-physica.patch
Patch15: 0015-fipvlan-break-out-of-receive-loop-on-error.patch
Patch16: 0016-fipvlan-handle-errors-from-fip-socket-creation.patch
Patch17: 0017-fipvlan-filter-interfaces-from-rtnl_getlink.patch
# Patches to be upstreamed
Patch18: 0018-Add-missing-DESTDIR-when-installing-bash-completion.patch
Patch19: 0019-Fix-build-with-Wl-as-needed.patch
Patch20: 0020-Fix-integer-formatting.patch
Patch21: 0021-fcnsq-Fixup-help-text.patch
Patch22: 0022-fcnsq-Fixup-64bit-integer-handling.patch
Patch23: 0023-fcoemon-add-systemd-service-file.patch
Patch24: 0024-fcoemon-systemd-socket-activation.patch
# Patches from Fedora
Patch1: fcoe-utils-1.0.29-make.patch
Patch2: fcoe-utils-1.0.18-help.patch
Patch3: fcoe-utils-1.0.28-format-strings.patch
Patch4: fcoe-utils-1.0.28-systemd-doc.patch
# PATCH-FIX-UPSTREAM: fcoe-utils-1.0.29-as-needed.patch
Patch5: fcoe-utils-1.0.29-as-needed.patch
Patch101: fcoe-utils-1.0.29-make.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-build
%description
@ -60,6 +82,26 @@ connections.
%patch3 -p1
%patch4 -p1
%patch5 -p1
%patch6 -p1
%patch7 -p1
%patch8 -p1
%patch9 -p1
%patch10 -p1
%patch11 -p1
%patch12 -p1
%patch13 -p1
%patch14 -p1
%patch15 -p1
%patch16 -p1
%patch17 -p1
%patch18 -p1
%patch19 -p1
%patch20 -p1
%patch21 -p1
%patch22 -p1
%patch23 -p1
%patch24 -p1
%patch101 -p1
%build
autoreconf -vi
@ -77,8 +119,6 @@ install -m 755 %{S:20} ${RPM_BUILD_ROOT}/lib/mkinitrd/scripts/boot-fcoe.sh
install -m 755 %{S:22} ${RPM_BUILD_ROOT}/lib/mkinitrd/scripts/setup-fcoe.sh
# unitfile
mkdir -p %{buildroot}%{_unitdir}
install -p -m 644 %{SOURCE1} %{buildroot}%{_unitdir}
ln -s %{_sbindir}/service %{buildroot}%{_sbindir}/rcfcoe
# config
@ -118,10 +158,11 @@ exit 0
%{_sbindir}/*
%{_mandir}/man8/*
%{_unitdir}/fcoe.service
%{_unitdir}/fcoemon.socket
%{_sysconfdir}/fcoe/
%config(noreplace) %{_sysconfdir}/fcoe/config
%config(noreplace) %{_sysconfdir}/fcoe/cfg-ethx
%{_sysconfdir}/bash_completion.d/
%config %{_sysconfdir}/bash_completion.d/
/var/adm/fillup-templates/sysconfig.fcoe
%{_libexecdir}/fcoe/
/lib/mkinitrd

View File

@ -1,12 +0,0 @@
[Unit]
Description=Open-FCoE Inititator.
After=syslog.target network.target lldpad.service
[Service]
Type=forking
EnvironmentFile=/etc/sysconfig/fcoe
ExecStartPre=/sbin/modprobe -qa $SUPPORTED_DRIVERS
ExecStart=/usr/sbin/fcoemon $FCOEMON_OPTS
[Install]
WantedBy=multi-user.target