- Include fipvlan update from upstream/SLES11 SP3
- Small fixes from upstream OBS-URL: https://build.opensuse.org/package/show/network:fcoe/fcoe-utils?expand=0&rev=7
This commit is contained in:
parent
e582bd4af9
commit
726eac0e10
95
0001-man-Fix-small-typo-regarding-fcf-option.patch
Normal file
95
0001-man-Fix-small-typo-regarding-fcf-option.patch
Normal 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
|
||||||
|
|
29
0002-Don-t-call-AM_INIT_AUTOMAKE-twice.patch
Normal file
29
0002-Don-t-call-AM_INIT_AUTOMAKE-twice.patch
Normal 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
|
||||||
|
|
52
0003-fipvlan-fails-on-powerpc.patch
Normal file
52
0003-fipvlan-fails-on-powerpc.patch
Normal 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
|
||||||
|
|
@ -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
|
||||||
|
|
53
0005-fipvlan-start-VLAN-interface-from-netlink-handler.patch
Normal file
53
0005-fipvlan-start-VLAN-interface-from-netlink-handler.patch
Normal 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
|
||||||
|
|
110
0006-fipvlan-Extract-create_missing_vlan-function-from-lo.patch
Normal file
110
0006-fipvlan-Extract-create_missing_vlan-function-from-lo.patch
Normal 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
|
||||||
|
|
143
0007-fipvlan-create-VLANs-from-netlink-handler.patch
Normal file
143
0007-fipvlan-create-VLANs-from-netlink-handler.patch
Normal 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
|
||||||
|
|
154
0008-fipvlan-Start-FCoE-from-netlink-handler.patch
Normal file
154
0008-fipvlan-Start-FCoE-from-netlink-handler.patch
Normal 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
|
||||||
|
|
73
0009-fipvlan-Update-wait-loop-to-wait-for-VLANs.patch
Normal file
73
0009-fipvlan-Update-wait-loop-to-wait-for-VLANs.patch
Normal 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
|
||||||
|
|
34
0010-fipvlan-Re-send-VLAN-discovery.patch
Normal file
34
0010-fipvlan-Re-send-VLAN-discovery.patch
Normal 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
|
||||||
|
|
61
0011-fipvlan-update-manpage.patch
Normal file
61
0011-fipvlan-update-manpage.patch
Normal 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
|
||||||
|
|
171
0012-fipvlan-Leave-link-up-if-requested.patch
Normal file
171
0012-fipvlan-Leave-link-up-if-requested.patch
Normal 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
|
||||||
|
|
43
0013-fipvlan-Update-manpage-to-reflect-correct-timeout.patch
Normal file
43
0013-fipvlan-Update-manpage-to-reflect-correct-timeout.patch
Normal 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
|
||||||
|
|
@ -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
|
||||||
|
|
36
0015-fipvlan-break-out-of-receive-loop-on-error.patch
Normal file
36
0015-fipvlan-break-out-of-receive-loop-on-error.patch
Normal 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
|
||||||
|
|
129
0016-fipvlan-handle-errors-from-fip-socket-creation.patch
Normal file
129
0016-fipvlan-handle-errors-from-fip-socket-creation.patch
Normal 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
|
||||||
|
|
174
0017-fipvlan-filter-interfaces-from-rtnl_getlink.patch
Normal file
174
0017-fipvlan-filter-interfaces-from-rtnl_getlink.patch
Normal 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
|
||||||
|
|
@ -1,3 +1,9 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Fri Dec 6 09:11:57 CET 2013 - hare@suse.de
|
||||||
|
|
||||||
|
- Include fipvlan update from upstream/SLES11 SP3
|
||||||
|
- Small fixes from upstream
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Thu Oct 10 15:22:26 UTC 2013 - tchvatal@suse.com
|
Thu Oct 10 15:22:26 UTC 2013 - tchvatal@suse.com
|
||||||
|
|
||||||
|
@ -39,13 +39,32 @@ Source1: fcoe.service
|
|||||||
Source2: fcoe.config
|
Source2: fcoe.config
|
||||||
Source20: mkinitrd-boot.sh
|
Source20: mkinitrd-boot.sh
|
||||||
Source22: mkinitrd-setup.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 from Fedora
|
# Patches from Fedora
|
||||||
Patch1: fcoe-utils-1.0.29-make.patch
|
Patch101: fcoe-utils-1.0.29-make.patch
|
||||||
Patch2: fcoe-utils-1.0.18-help.patch
|
Patch102: fcoe-utils-1.0.18-help.patch
|
||||||
Patch3: fcoe-utils-1.0.28-format-strings.patch
|
Patch103: fcoe-utils-1.0.28-format-strings.patch
|
||||||
Patch4: fcoe-utils-1.0.28-systemd-doc.patch
|
Patch104: fcoe-utils-1.0.28-systemd-doc.patch
|
||||||
# PATCH-FIX-UPSTREAM: fcoe-utils-1.0.29-as-needed.patch
|
# PATCH-FIX-UPSTREAM: fcoe-utils-1.0.29-as-needed.patch
|
||||||
Patch5: fcoe-utils-1.0.29-as-needed.patch
|
Patch105: fcoe-utils-1.0.29-as-needed.patch
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||||
|
|
||||||
%description
|
%description
|
||||||
@ -60,6 +79,23 @@ connections.
|
|||||||
%patch3 -p1
|
%patch3 -p1
|
||||||
%patch4 -p1
|
%patch4 -p1
|
||||||
%patch5 -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
|
||||||
|
%patch101 -p1
|
||||||
|
%patch102 -p1
|
||||||
|
%patch103 -p1
|
||||||
|
%patch104 -p1
|
||||||
|
%patch105 -p1
|
||||||
|
|
||||||
%build
|
%build
|
||||||
autoreconf -vi
|
autoreconf -vi
|
||||||
|
Loading…
x
Reference in New Issue
Block a user