- 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:
Hannes Reinecke 2013-12-06 08:32:04 +00:00 committed by Git OBS Bridge
parent e582bd4af9
commit 726eac0e10
19 changed files with 1492 additions and 5 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

@ -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

View File

@ -39,13 +39,32 @@ 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 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
Patch101: fcoe-utils-1.0.29-make.patch
Patch102: fcoe-utils-1.0.18-help.patch
Patch103: fcoe-utils-1.0.28-format-strings.patch
Patch104: 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
Patch105: fcoe-utils-1.0.29-as-needed.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-build
%description
@ -60,6 +79,23 @@ 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
%patch101 -p1
%patch102 -p1
%patch103 -p1
%patch104 -p1
%patch105 -p1
%build
autoreconf -vi