import libteam-1.28-4.el8
This commit is contained in:
parent
893f328e39
commit
48520f0dc2
2
.gitignore
vendored
2
.gitignore
vendored
@ -1 +1 @@
|
||||
SOURCES/libteam-1.27.tar.gz
|
||||
SOURCES/libteam-1.28.tar.gz
|
||||
|
@ -1 +1 @@
|
||||
2293a6081223ffa85ef3376bb4e6e1e48ed35129 SOURCES/libteam-1.27.tar.gz
|
||||
c3429d0b29ae78dd1d4899dab6fe9f13af26ff7d SOURCES/libteam-1.28.tar.gz
|
||||
|
@ -1,34 +0,0 @@
|
||||
From d9769b270608654aa7f07ce48a36f084843daf01 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <d9769b270608654aa7f07ce48a36f084843daf01.1533278517.git.lucien.xin@gmail.com>
|
||||
From: Xin Long <lucien.xin@gmail.com>
|
||||
Date: Wed, 25 Jul 2018 16:43:22 +0800
|
||||
Subject: [PATCHv2 1/2] binding/python: use SWIG_FromCharPtrAndSize for Python3
|
||||
support
|
||||
|
||||
PyString_FromStringAndSize is replaced with PyUnicode_FromStringAndSize
|
||||
in Python3, and SWIG_FromCharPtrAndSize will choose the right one with
|
||||
the check "#if PY_VERSION_HEX >= 0x0300000".
|
||||
|
||||
Fixes: 4cb7829debd7 ("add support for hw address manipulation")
|
||||
Signed-off-by: Xin Long <lucien.xin@gmail.com>
|
||||
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
|
||||
---
|
||||
binding/python/team/capi.i.in | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/binding/python/team/capi.i.in b/binding/python/team/capi.i.in
|
||||
index 5ce4659..c7a5842 100644
|
||||
--- a/binding/python/team/capi.i.in
|
||||
+++ b/binding/python/team/capi.i.in
|
||||
@@ -40,7 +40,7 @@ int team_hwaddr_set(struct team_handle *th, uint32_t ifindex, const char *addr,
|
||||
if ($1) free($1);
|
||||
}
|
||||
%typemap(argout) (char *addr, unsigned int addr_len) {
|
||||
- $result = SWIG_Python_AppendOutput($result, PyString_FromStringAndSize($1,$2));
|
||||
+ $result = SWIG_Python_AppendOutput($result, SWIG_FromCharPtrAndSize($1,$2));
|
||||
}
|
||||
%apply char *OUTPUT {char *addr};
|
||||
int team_hwaddr_get(struct team_handle *th, uint32_t ifindex, char *addr, unsigned int addr_len);
|
||||
--
|
||||
2.1.0
|
||||
|
@ -1,51 +0,0 @@
|
||||
From 87662455fc6eae38de70fd7b6f758c22ec7a443a Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <87662455fc6eae38de70fd7b6f758c22ec7a443a.1526634690.git.lucien.xin@gmail.com>
|
||||
In-Reply-To: <789591c7318a0423984037b6a8ba3f3925f4eaa7.1526634690.git.lucien.xin@gmail.com>
|
||||
References: <789591c7318a0423984037b6a8ba3f3925f4eaa7.1526634690.git.lucien.xin@gmail.com>
|
||||
From: Timothy Redaelli <tredaelli@redhat.com>
|
||||
Date: Tue, 10 Apr 2018 15:54:02 +0200
|
||||
Subject: [PATCHv2 2/3] configure.ac: Empty LDFLAGS before checking for libnl3
|
||||
|
||||
Currently since CFLAGS are dropped if you have LDFLAGS=-pie (default on RHEL)
|
||||
the rtnl_link_get_phys_port_id, rtnl_link_set_carrier and rtnl_link_get_carrier
|
||||
tests always fails:
|
||||
|
||||
/usr/bin/ld: /tmp/ccv5GdFD.o: relocation R_X86_64_PC32 against undefined symbol
|
||||
`rtnl_link_get_carrier@@libnl_3' can not be used when making a shared object;
|
||||
recompile with -fPIC
|
||||
|
||||
This commits empty LDFLAGS before launching the 3 tests and restores it
|
||||
after the tests.
|
||||
|
||||
Signed-off-by: Timothy Redaelli <tredaelli@redhat.com>
|
||||
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
|
||||
---
|
||||
configure.ac | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 60657bb..f27c15c 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -39,8 +39,10 @@ LT_INIT
|
||||
|
||||
PKG_CHECK_MODULES([LIBNL], [libnl-3.0 libnl-genl-3.0 libnl-route-3.0 libnl-cli-3.0])
|
||||
TMP_CFLAGS="$CFLAGS"
|
||||
+ TMP_LDFLAGS="$LDFLAGS"
|
||||
TMP_LIBS="$LIBS"
|
||||
CFLAGS="$CPPFLAGS $LIBNL_CFLAGS"
|
||||
+ LDFLAGS=""
|
||||
LIBS="$LIBS $LIBNL_LIBS"
|
||||
AC_CHECK_LIB([nl-route-3], [rtnl_link_get_phys_port_id],
|
||||
AC_DEFINE(HAVE_RTNL_LINK_GET_PHYS_ID, [1], [Define to 1 if you have rtnl_link_get_phys_port_id function.]))
|
||||
@@ -49,6 +51,7 @@ PKG_CHECK_MODULES([LIBNL], [libnl-3.0 libnl-genl-3.0 libnl-route-3.0 libnl-cli-3
|
||||
AC_CHECK_LIB([nl-route-3], [rtnl_link_get_carrier],
|
||||
AC_DEFINE(HAVE_RTNL_LINK_GET_CARRIER, [1], [Define to 1 if you have rtnl_link_get_carrier.]))
|
||||
CFLAGS="$TMP_CFLAGS"
|
||||
+ LDFLAGS="$TMP_LDFLAGS"
|
||||
LIBS="$TMP_LIBS"
|
||||
|
||||
PKG_CHECK_MODULES([LIBDAEMON], [libdaemon])
|
||||
--
|
||||
2.1.0
|
||||
|
@ -1,109 +0,0 @@
|
||||
From 05a7a9598fc9e616a1acf19096aeb93f7288bb35 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <05a7a9598fc9e616a1acf19096aeb93f7288bb35.1526634690.git.lucien.xin@gmail.com>
|
||||
In-Reply-To: <789591c7318a0423984037b6a8ba3f3925f4eaa7.1526634690.git.lucien.xin@gmail.com>
|
||||
References: <789591c7318a0423984037b6a8ba3f3925f4eaa7.1526634690.git.lucien.xin@gmail.com>
|
||||
From: Antti Tiainen <atiainen@forcepoint.com>
|
||||
Date: Thu, 3 May 2018 20:13:35 +0300
|
||||
Subject: [PATCHv2 3/3] libteam: don't crash when trying to print unregistered
|
||||
device name
|
||||
|
||||
team_port_str() will crash when trying to print port name that was
|
||||
just unregistered, if dellink event is handled before port removal
|
||||
event.
|
||||
|
||||
This is regression from Commit 046fb6ba0aec ("libteam: resynchronize
|
||||
ifinfo after lost RTNLGRP_LINK notifications"), which made it free
|
||||
all removed interfaces after ifinfo handlers are called.
|
||||
|
||||
Put the ifinfo_destroy_removed() back to dellink/newlink handlers as
|
||||
it was before that commit. Clean up the ifinfo list after change handlers
|
||||
only if it refreshed the entire ifinfo list after lost events.
|
||||
|
||||
There's still a rare possibility that dellink event is missed due to
|
||||
full socket receive buffer, which would cause ifinfo refresh and clearing
|
||||
removed interfaces. For this, add NULL check to team_port_str() so it
|
||||
doesn't try to print port device name in this situation.
|
||||
|
||||
Signed-off-by: Antti Tiainen <atiainen@forcepoint.com>
|
||||
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
|
||||
---
|
||||
include/team.h | 1 +
|
||||
libteam/ifinfo.c | 7 ++++++-
|
||||
libteam/libteam.c | 2 +-
|
||||
libteam/stringify.c | 3 ++-
|
||||
4 files changed, 10 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/include/team.h b/include/team.h
|
||||
index 9ae517d..b31c8d8 100644
|
||||
--- a/include/team.h
|
||||
+++ b/include/team.h
|
||||
@@ -223,6 +223,7 @@ enum {
|
||||
TEAM_PORT_CHANGE = 0x1,
|
||||
TEAM_OPTION_CHANGE = 0x2,
|
||||
TEAM_IFINFO_CHANGE = 0x4,
|
||||
+ TEAM_IFINFO_REFRESH = 0x8,
|
||||
TEAM_ANY_CHANGE = TEAM_PORT_CHANGE |
|
||||
TEAM_OPTION_CHANGE |
|
||||
TEAM_IFINFO_CHANGE,
|
||||
diff --git a/libteam/ifinfo.c b/libteam/ifinfo.c
|
||||
index 5c32a9c..46d56a2 100644
|
||||
--- a/libteam/ifinfo.c
|
||||
+++ b/libteam/ifinfo.c
|
||||
@@ -258,6 +258,8 @@ static void obj_input_newlink(struct nl_object *obj, void *arg, bool event)
|
||||
uint32_t ifindex;
|
||||
int err;
|
||||
|
||||
+ ifinfo_destroy_removed(th);
|
||||
+
|
||||
link = (struct rtnl_link *) obj;
|
||||
|
||||
ifindex = rtnl_link_get_ifindex(link);
|
||||
@@ -294,6 +296,8 @@ static void event_handler_obj_input_dellink(struct nl_object *obj, void *arg)
|
||||
uint32_t ifindex;
|
||||
int err;
|
||||
|
||||
+ ifinfo_destroy_removed(th);
|
||||
+
|
||||
link = (struct rtnl_link *) obj;
|
||||
|
||||
ifindex = rtnl_link_get_ifindex(link);
|
||||
@@ -412,7 +416,8 @@ int get_ifinfo_list(struct team_handle *th)
|
||||
}
|
||||
}
|
||||
|
||||
- ret = check_call_change_handlers(th, TEAM_IFINFO_CHANGE);
|
||||
+ ret = check_call_change_handlers(th, TEAM_IFINFO_CHANGE |
|
||||
+ TEAM_IFINFO_REFRESH);
|
||||
if (ret < 0)
|
||||
err(th, "get_ifinfo_list: check_call_change_handers failed");
|
||||
return ret;
|
||||
diff --git a/libteam/libteam.c b/libteam/libteam.c
|
||||
index 77a06dd..ce0467e 100644
|
||||
--- a/libteam/libteam.c
|
||||
+++ b/libteam/libteam.c
|
||||
@@ -236,7 +236,7 @@ int check_call_change_handlers(struct team_handle *th,
|
||||
break;
|
||||
}
|
||||
}
|
||||
- if (call_type_mask & TEAM_IFINFO_CHANGE) {
|
||||
+ if (call_type_mask & TEAM_IFINFO_REFRESH) {
|
||||
ifinfo_destroy_removed(th);
|
||||
ifinfo_clear_changed(th);
|
||||
}
|
||||
diff --git a/libteam/stringify.c b/libteam/stringify.c
|
||||
index 38f4788..f1faf90 100644
|
||||
--- a/libteam/stringify.c
|
||||
+++ b/libteam/stringify.c
|
||||
@@ -344,7 +344,8 @@ static bool __team_port_str(struct team_port *port,
|
||||
team_is_port_removed(port) ? "-" :
|
||||
team_is_port_changed(port) ? "*" : " ",
|
||||
ifindex,
|
||||
- team_get_ifinfo_ifname(ifinfo),
|
||||
+ ifinfo ? team_get_ifinfo_ifname(ifinfo) :
|
||||
+ "(removed)",
|
||||
team_is_port_link_up(port) ? "up": "down",
|
||||
team_get_port_speed(port),
|
||||
team_get_port_duplex(port) ? "FD" : "HD");
|
||||
--
|
||||
2.1.0
|
||||
|
30
SOURCES/libteam-man-fix-runner.min_ports-default-value.patch
Normal file
30
SOURCES/libteam-man-fix-runner.min_ports-default-value.patch
Normal file
@ -0,0 +1,30 @@
|
||||
From f36c191da3d65a4744582b2eb09fa297dd85f9ae Mon Sep 17 00:00:00 2001
|
||||
From: Hangbin Liu <liuhangbin@gmail.com>
|
||||
Date: Fri, 22 Feb 2019 16:27:46 +0800
|
||||
Subject: [PATCH 5/6] man: fix runner.min_ports default value
|
||||
|
||||
It should be 1 instead of 0.
|
||||
|
||||
Reported-by: LiLiang <liali@redhat.com>
|
||||
Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
|
||||
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
|
||||
---
|
||||
man/teamd.conf.5 | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/man/teamd.conf.5 b/man/teamd.conf.5
|
||||
index 9bdf46a..5b0f3e9 100644
|
||||
--- a/man/teamd.conf.5
|
||||
+++ b/man/teamd.conf.5
|
||||
@@ -240,7 +240,7 @@ Specifies the minimum number of ports that must be active before asserting carri
|
||||
.RS 7
|
||||
.PP
|
||||
Default:
|
||||
-.BR "0"
|
||||
+.BR "1"
|
||||
.RE
|
||||
.TP
|
||||
.BR "runner.agg_select_policy " (string)
|
||||
--
|
||||
2.18.1
|
||||
|
@ -1,43 +0,0 @@
|
||||
From 789591c7318a0423984037b6a8ba3f3925f4eaa7 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <789591c7318a0423984037b6a8ba3f3925f4eaa7.1526634690.git.lucien.xin@gmail.com>
|
||||
From: Francesco Giudici <fgiudici@redhat.com>
|
||||
Date: Thu, 18 Jan 2018 18:21:52 +0100
|
||||
Subject: [PATCHv2 1/3] man: fix runner.sys_prio default
|
||||
|
||||
runner.sys_prio default is 65535, not 255.
|
||||
255 is actually the default value of ports.PORTIFNAME.lacp_prio.
|
||||
|
||||
Signed-off-by: Francesco Giudici <fgiudici@redhat.com>
|
||||
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
|
||||
---
|
||||
man/teamd.conf.5 | 7 ++++++-
|
||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/man/teamd.conf.5 b/man/teamd.conf.5
|
||||
index 0545023..dc5000e 100644
|
||||
--- a/man/teamd.conf.5
|
||||
+++ b/man/teamd.conf.5
|
||||
@@ -229,7 +229,7 @@ System priority, value can be 0 \(en 65535.
|
||||
.RS 7
|
||||
.PP
|
||||
Default:
|
||||
-.BR "255"
|
||||
+.BR "65535"
|
||||
.RE
|
||||
.TP
|
||||
.BR "runner.min_ports " (int)
|
||||
@@ -269,6 +269,11 @@ Default:
|
||||
.TP
|
||||
.BR "ports.PORTIFNAME.lacp_prio " (int)
|
||||
Port priority according to LACP standard. The lower number means higher priority.
|
||||
+.RS 7
|
||||
+.PP
|
||||
+Default:
|
||||
+.BR "255"
|
||||
+.RE
|
||||
.TP
|
||||
.BR "ports.PORTIFNAME.lacp_key " (int)
|
||||
Port key according to LACP standard. It is only possible to aggregate ports with the same key.
|
||||
--
|
||||
2.1.0
|
||||
|
@ -1,159 +0,0 @@
|
||||
From efaa6ae709bb4b59efacb0bb7301be2242b058bc Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <efaa6ae709bb4b59efacb0bb7301be2242b058bc.1518205291.git.mleitner@redhat.com>
|
||||
From: Xin Long <lucien.xin@gmail.com>
|
||||
Date: Fri, 20 Oct 2017 12:35:07 +0800
|
||||
Subject: [PATCH 1/3] teamd: add port_hwaddr_changed for ab runner
|
||||
|
||||
This patch to fix an events processing race issue when adding two ports
|
||||
into one team dev with ab mode with same_all hwaddr policy:
|
||||
|
||||
team0 original hwaddr: 00:00:00:00:00:0a
|
||||
port1 original hwaddr: 00:00:00:00:00:01
|
||||
port2 original hwaddr: 00:00:00:00:00:02
|
||||
|
||||
There are two sockets in teamd: nl_cli.sock_event for ifinfo updates
|
||||
and nl_sock_event for ports/options changes. During adding two ports,
|
||||
the events on these two sockets could be:
|
||||
|
||||
nl_sock_event:
|
||||
[1] -- [2] --
|
||||
|
||||
[1]: port1 added event (added by enslaving port1)
|
||||
[2]: port2 added event (added by enslaving port2)
|
||||
|
||||
nl_cli.sock_event:
|
||||
[a1] -- [b0] -- [c1] -- [d2] -- [e2] -- [f1] --
|
||||
|
||||
[a1]: port1 ifinfo event (added by setting port1's master)
|
||||
[b0]: team0 ifinfo event (added by setting team0's hwaddr)
|
||||
[c1]: port1 ifinfo event (added by set port1's hwaddr)
|
||||
[d2]: port2 ifinfo event (added by set port2's master)
|
||||
[e2]: port2 ifinfo event (added by set port2's hwaddr)
|
||||
[f1]: port1 ifinfo event (added by set port1's hwaddr)
|
||||
|
||||
teamd can make sure the order for their processing is as above on the
|
||||
same socket, but not between two sockets. So if these events processing
|
||||
order is (monitoring team/ports' ifinfo, hwaddr, master):
|
||||
|
||||
[ 1]: team0->ifinfo = 00:00:00:00:00:0a
|
||||
team0->hwaddr = 00:00:00:00:00:01
|
||||
port1->hwaddr = 00:00:00:00:00:0a
|
||||
[a1]: port1->ifinfo = 00:00:00:00:00:01
|
||||
port1->master = team0
|
||||
[ 2]: port2->ifinfo = 00:00:00:00:00:02
|
||||
port2->hwaddr = 00:00:00:00:00:0a
|
||||
(team0->ifinfo is not updated, it's still 00:00:00:00:00:0a)
|
||||
[b0]: team0->ifinfo = 00:00:00:00:00:01
|
||||
port1->hwaddr = 00:00:00:00:00:01
|
||||
(port2->master is not yet set, port2->hwaddr couldn't be updated)
|
||||
[c1]: no changes
|
||||
[d2]: port2->ifinfo = 00:00:00:00:00:0a
|
||||
port2->master = team0
|
||||
(too late !!!)
|
||||
[e2]: no changes
|
||||
[f1]: no changes
|
||||
|
||||
Then:
|
||||
team0 final hwaddr: 00:00:00:00:00:01
|
||||
port1 final hwaddr: 00:00:00:00:00:01
|
||||
port2 final hwaddr: 00:00:00:00:00:0a <----- issue
|
||||
|
||||
This patch is to add port_hwaddr_changed for ab runner, in [e2] where
|
||||
we set it's hwaddr with team0 (port2->hwaddr = 00:00:00:00:00:01) IF
|
||||
port2->hwaddr != team0->ifinfo.
|
||||
|
||||
I think the same issue also exists in lacp and lb mode for which I will
|
||||
fix them in another patches.
|
||||
|
||||
v1 -> v2:
|
||||
fix some typos in changelog and couple of style problems in codes
|
||||
|
||||
Reported-by: Jon Nikolakakis <jnikolak@redhat.com>
|
||||
Signed-off-by: Xin Long <lucien.xin@gmail.com>
|
||||
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
|
||||
Signed-off-by: Marcelo Ricardo Leitner <mleitner@redhat.com>
|
||||
---
|
||||
teamd/teamd_runner_activebackup.c | 39 +++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 39 insertions(+)
|
||||
|
||||
diff --git a/teamd/teamd_runner_activebackup.c b/teamd/teamd_runner_activebackup.c
|
||||
index aec3a73d5ff61534c377b935fe0e5bc1f51af79d..8a3447f1a63d71055eb7a8784cbe96381ee2b451 100644
|
||||
--- a/teamd/teamd_runner_activebackup.c
|
||||
+++ b/teamd/teamd_runner_activebackup.c
|
||||
@@ -39,6 +39,8 @@ struct ab_hwaddr_policy {
|
||||
const char *name;
|
||||
int (*hwaddr_changed)(struct teamd_context *ctx,
|
||||
struct ab *ab);
|
||||
+ int (*port_hwaddr_changed)(struct teamd_context *ctx, struct ab *ab,
|
||||
+ struct teamd_port *tdport);
|
||||
int (*port_added)(struct teamd_context *ctx, struct ab *ab,
|
||||
struct teamd_port *tdport);
|
||||
int (*active_set)(struct teamd_context *ctx, struct ab *ab,
|
||||
@@ -95,6 +97,26 @@ static int ab_hwaddr_policy_same_all_hwaddr_changed(struct teamd_context *ctx,
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int
|
||||
+ab_hwaddr_policy_same_all_port_hwaddr_changed(struct teamd_context *ctx,
|
||||
+ struct ab *ab,
|
||||
+ struct teamd_port *tdport)
|
||||
+{
|
||||
+ int err;
|
||||
+
|
||||
+ if (!memcmp(team_get_ifinfo_hwaddr(tdport->team_ifinfo),
|
||||
+ ctx->hwaddr, ctx->hwaddr_len))
|
||||
+ return 0;
|
||||
+
|
||||
+ err = team_hwaddr_set(ctx->th, tdport->ifindex, ctx->hwaddr,
|
||||
+ ctx->hwaddr_len);
|
||||
+ if (err)
|
||||
+ teamd_log_err("%s: Failed to set port hardware address.",
|
||||
+ tdport->ifname);
|
||||
+
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
static int ab_hwaddr_policy_same_all_port_added(struct teamd_context *ctx,
|
||||
struct ab *ab,
|
||||
struct teamd_port *tdport)
|
||||
@@ -114,6 +136,7 @@ static int ab_hwaddr_policy_same_all_port_added(struct teamd_context *ctx,
|
||||
static const struct ab_hwaddr_policy ab_hwaddr_policy_same_all = {
|
||||
.name = "same_all",
|
||||
.hwaddr_changed = ab_hwaddr_policy_same_all_hwaddr_changed,
|
||||
+ .port_hwaddr_changed = ab_hwaddr_policy_same_all_port_hwaddr_changed,
|
||||
.port_added = ab_hwaddr_policy_same_all_port_added,
|
||||
};
|
||||
|
||||
@@ -411,6 +434,21 @@ static int ab_event_watch_hwaddr_changed(struct teamd_context *ctx, void *priv)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int ab_event_watch_port_hwaddr_changed(struct teamd_context *ctx,
|
||||
+ struct teamd_port *tdport,
|
||||
+ void *priv)
|
||||
+{
|
||||
+ struct ab *ab = priv;
|
||||
+
|
||||
+ if (!teamd_port_present(ctx, tdport))
|
||||
+ return 0;
|
||||
+
|
||||
+ if (ab->hwaddr_policy->port_hwaddr_changed)
|
||||
+ return ab->hwaddr_policy->port_hwaddr_changed(ctx, ab, tdport);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int ab_port_load_config(struct teamd_context *ctx,
|
||||
struct ab_port *ab_port)
|
||||
{
|
||||
@@ -491,6 +529,7 @@ static int ab_event_watch_prio_option_changed(struct teamd_context *ctx,
|
||||
|
||||
static const struct teamd_event_watch_ops ab_event_watch_ops = {
|
||||
.hwaddr_changed = ab_event_watch_hwaddr_changed,
|
||||
+ .port_hwaddr_changed = ab_event_watch_port_hwaddr_changed,
|
||||
.port_added = ab_event_watch_port_added,
|
||||
.port_link_changed = ab_event_watch_port_link_changed,
|
||||
.option_changed = ab_event_watch_prio_option_changed,
|
||||
--
|
||||
2.14.3
|
||||
|
@ -1,66 +0,0 @@
|
||||
From c42cc9955a93bc4bed65adf9a506f92b8df290d7 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <c42cc9955a93bc4bed65adf9a506f92b8df290d7.1518205291.git.mleitner@redhat.com>
|
||||
In-Reply-To: <efaa6ae709bb4b59efacb0bb7301be2242b058bc.1518205291.git.mleitner@redhat.com>
|
||||
References: <efaa6ae709bb4b59efacb0bb7301be2242b058bc.1518205291.git.mleitner@redhat.com>
|
||||
From: Xin Long <lucien.xin@gmail.com>
|
||||
Date: Tue, 7 Nov 2017 12:33:36 +0800
|
||||
Subject: [PATCH 3/3] teamd: add port_hwaddr_changed for lacp runner
|
||||
|
||||
To fix the same issue fixed in commit efaa6ae709bb ("teamd: add
|
||||
port_hwaddr_changed for ab runner") for lacp runner, this patch
|
||||
is to add .port_hwaddr_changed for lacp runner as well.
|
||||
|
||||
Signed-off-by: Xin Long <lucien.xin@gmail.com>
|
||||
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
|
||||
Signed-off-by: Marcelo Ricardo Leitner <mleitner@redhat.com>
|
||||
---
|
||||
teamd/teamd_runner_lacp.c | 26 ++++++++++++++++++++++++++
|
||||
1 file changed, 26 insertions(+)
|
||||
|
||||
diff --git a/teamd/teamd_runner_lacp.c b/teamd/teamd_runner_lacp.c
|
||||
index 1310f6737f6cf37b7d6fef0befb8c803178212bd..7b8f0a783cfd71aa3f8a89276f5b95bce2fc517a 100644
|
||||
--- a/teamd/teamd_runner_lacp.c
|
||||
+++ b/teamd/teamd_runner_lacp.c
|
||||
@@ -1336,6 +1336,31 @@ static int lacp_event_watch_hwaddr_changed(struct teamd_context *ctx,
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int lacp_event_watch_port_hwaddr_changed(struct teamd_context *ctx,
|
||||
+ struct teamd_port *tdport,
|
||||
+ void *priv)
|
||||
+{
|
||||
+ struct lacp_port *lacp_port;
|
||||
+ struct lacp *lacp = priv;
|
||||
+ int err;
|
||||
+
|
||||
+ if (!teamd_port_present(ctx, tdport))
|
||||
+ return 0;
|
||||
+
|
||||
+ if (!memcmp(team_get_ifinfo_hwaddr(tdport->team_ifinfo),
|
||||
+ ctx->hwaddr, ctx->hwaddr_len))
|
||||
+ return 0;
|
||||
+
|
||||
+ err = lacp_port_set_mac(ctx, tdport);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
+ lacp_port = lacp_port_get(lacp, tdport);
|
||||
+ lacp_port_actor_system_update(lacp_port);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int lacp_event_watch_admin_state_changed(struct teamd_context *ctx,
|
||||
void *priv)
|
||||
{
|
||||
@@ -1389,6 +1414,7 @@ static int lacp_event_watch_port_changed(struct teamd_context *ctx,
|
||||
|
||||
static const struct teamd_event_watch_ops lacp_event_watch_ops = {
|
||||
.hwaddr_changed = lacp_event_watch_hwaddr_changed,
|
||||
+ .port_hwaddr_changed = lacp_event_watch_port_hwaddr_changed,
|
||||
.port_added = lacp_event_watch_port_added,
|
||||
.port_removed = lacp_event_watch_port_removed,
|
||||
.port_changed = lacp_event_watch_port_changed,
|
||||
--
|
||||
2.14.3
|
||||
|
@ -1,58 +0,0 @@
|
||||
From 0164b6a460728b3a1fd3feee9e2901f1b810cf24 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <0164b6a460728b3a1fd3feee9e2901f1b810cf24.1518205291.git.mleitner@redhat.com>
|
||||
In-Reply-To: <efaa6ae709bb4b59efacb0bb7301be2242b058bc.1518205291.git.mleitner@redhat.com>
|
||||
References: <efaa6ae709bb4b59efacb0bb7301be2242b058bc.1518205291.git.mleitner@redhat.com>
|
||||
From: Xin Long <lucien.xin@gmail.com>
|
||||
Date: Tue, 7 Nov 2017 12:33:11 +0800
|
||||
Subject: [PATCH 2/3] teamd: add port_hwaddr_changed for lb runner
|
||||
|
||||
To fix the same issue fixed in commit efaa6ae709bb ("teamd: add
|
||||
port_hwaddr_changed for ab runner") for lb runner, this patch is
|
||||
to add .port_hwaddr_changed for lb runner as well.
|
||||
|
||||
Signed-off-by: Xin Long <lucien.xin@gmail.com>
|
||||
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
|
||||
Signed-off-by: Marcelo Ricardo Leitner <mleitner@redhat.com>
|
||||
---
|
||||
teamd/teamd_runner_loadbalance.c | 23 +++++++++++++++++++++++
|
||||
1 file changed, 23 insertions(+)
|
||||
|
||||
diff --git a/teamd/teamd_runner_loadbalance.c b/teamd/teamd_runner_loadbalance.c
|
||||
index a1e21303455fde55763b57b898ac5aaeb21c4b61..b9bfc13895b1a47d3e5cf552e6c720601c475d97 100644
|
||||
--- a/teamd/teamd_runner_loadbalance.c
|
||||
+++ b/teamd/teamd_runner_loadbalance.c
|
||||
@@ -87,8 +87,31 @@ static int lb_event_watch_hwaddr_changed(struct teamd_context *ctx, void *priv)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int lb_event_watch_port_hwaddr_changed(struct teamd_context *ctx,
|
||||
+ struct teamd_port *tdport,
|
||||
+ void *priv)
|
||||
+{
|
||||
+ int err;
|
||||
+
|
||||
+ if (!teamd_port_present(ctx, tdport))
|
||||
+ return 0;
|
||||
+
|
||||
+ if (!memcmp(team_get_ifinfo_hwaddr(tdport->team_ifinfo),
|
||||
+ ctx->hwaddr, ctx->hwaddr_len))
|
||||
+ return 0;
|
||||
+
|
||||
+ err = team_hwaddr_set(ctx->th, tdport->ifindex, ctx->hwaddr,
|
||||
+ ctx->hwaddr_len);
|
||||
+ if (err)
|
||||
+ teamd_log_err("%s: Failed to set port hardware address.",
|
||||
+ tdport->ifname);
|
||||
+
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
static const struct teamd_event_watch_ops lb_port_watch_ops = {
|
||||
.hwaddr_changed = lb_event_watch_hwaddr_changed,
|
||||
+ .port_hwaddr_changed = lb_event_watch_port_hwaddr_changed,
|
||||
.port_added = lb_event_watch_port_added,
|
||||
.port_removed = lb_event_watch_port_removed,
|
||||
.port_link_changed = lb_event_watch_port_link_changed,
|
||||
--
|
||||
2.14.3
|
||||
|
@ -1,191 +0,0 @@
|
||||
From b6f63db7f3c8eb3119c9449abe9ac6535965e14d Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <b6f63db7f3c8eb3119c9449abe9ac6535965e14d.1534505146.git.lucien.xin@gmail.com>
|
||||
From: Hangbin Liu <liuhangbin@gmail.com>
|
||||
Date: Wed, 8 Aug 2018 16:56:52 +0800
|
||||
Subject: [PATCHv2] teamd: add port_master_ifindex_changed for
|
||||
teamd_event_watch_ops
|
||||
|
||||
When we add port to new active-backup teams with multi threads. After
|
||||
the port is set to link up and trigger function obj_input_newlink(),
|
||||
it's possible that there is no master index in rtnl link info. So the
|
||||
team slave's master_ifindex is not updated.
|
||||
|
||||
On the other hand, the port is up and trigger functions like
|
||||
- teamd_link_watch_check_link_up()
|
||||
- teamd_event_port_link_changed()
|
||||
- ab_event_watch_port_link_changed()
|
||||
- ab_link_watch_handler()
|
||||
- teamd_for_each_tdport()
|
||||
- teamd_get_next_tdport()
|
||||
- teamd_port_present()
|
||||
|
||||
Here the teamd_port_present() failed as the port master ifindex is not
|
||||
update to team ifindex yet. Finally we get nothing and no active port
|
||||
is set.
|
||||
|
||||
Here is the reproducer:
|
||||
|
||||
\#bin/bash
|
||||
if [ -z $1 ] || [ -z $2 ]; then
|
||||
echo "Usage: $0 iface1 iface2"
|
||||
exit 1
|
||||
else
|
||||
iface1=$1
|
||||
iface2=$2
|
||||
fi
|
||||
|
||||
WAIT=2
|
||||
COUNT=0
|
||||
|
||||
start_team()
|
||||
{
|
||||
local num=$1
|
||||
local iface=$2
|
||||
teamd -o -n -U -d -t team$num -c '{"runner": {"name": "activebackup"},"link_watch": {"name": "ethtool"}}' -gg
|
||||
teamdctl team$num port add $iface
|
||||
}
|
||||
|
||||
while :; do
|
||||
echo "-----------------------------------------------------------"
|
||||
let "COUNT++"
|
||||
echo "Loop $COUNT"
|
||||
|
||||
teamd -k -t team1
|
||||
teamd -k -t team2
|
||||
sleep "$WAIT"
|
||||
start_team 1 $iface1 &
|
||||
start_team 2 $iface2 &
|
||||
sleep "$WAIT"
|
||||
|
||||
if teamdctl team1 state | grep -q "active port: $iface1" && \
|
||||
teamdctl team2 state | grep -q "active port: $iface2"; then
|
||||
echo "Pass"
|
||||
else
|
||||
echo "FAIL"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
Failure as follows:
|
||||
|
||||
]# teamdctl teamX state dump
|
||||
"runner": {
|
||||
"active_port": ""
|
||||
},
|
||||
|
||||
Currently we only reproduced this with active-backup mode(I could reproduce it
|
||||
in VM easily, but hard to reproduce it on physical machines).
|
||||
|
||||
Fix it by adding a new teamd_event_watch_ops port_master_ifindex_changed for
|
||||
active-backup mode.
|
||||
|
||||
V2: update commit description from Jamie Bainbridge's reply.
|
||||
v3: update description and reproducer.
|
||||
|
||||
Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
|
||||
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
|
||||
---
|
||||
teamd/teamd.h | 5 +++++
|
||||
teamd/teamd_events.c | 19 +++++++++++++++++++
|
||||
teamd/teamd_ifinfo_watch.c | 5 +++++
|
||||
teamd/teamd_runner_activebackup.c | 8 ++++++++
|
||||
4 files changed, 37 insertions(+)
|
||||
|
||||
diff --git a/teamd/teamd.h b/teamd/teamd.h
|
||||
index 5dbfb9b..3934fc2 100644
|
||||
--- a/teamd/teamd.h
|
||||
+++ b/teamd/teamd.h
|
||||
@@ -189,6 +189,9 @@ struct teamd_event_watch_ops {
|
||||
struct teamd_port *tdport, void *priv);
|
||||
int (*port_ifname_changed)(struct teamd_context *ctx,
|
||||
struct teamd_port *tdport, void *priv);
|
||||
+ int (*port_master_ifindex_changed)(struct teamd_context *ctx,
|
||||
+ struct teamd_port *tdport,
|
||||
+ void *priv);
|
||||
int (*option_changed)(struct teamd_context *ctx,
|
||||
struct team_option *option, void *priv);
|
||||
char *option_changed_match_name;
|
||||
@@ -208,6 +211,8 @@ int teamd_event_ifinfo_hwaddr_changed(struct teamd_context *ctx,
|
||||
struct team_ifinfo *ifinfo);
|
||||
int teamd_event_ifinfo_ifname_changed(struct teamd_context *ctx,
|
||||
struct team_ifinfo *ifinfo);
|
||||
+int teamd_event_ifinfo_master_ifindex_changed(struct teamd_context *ctx,
|
||||
+ struct team_ifinfo *ifinfo);
|
||||
int teamd_event_ifinfo_admin_state_changed(struct teamd_context *ctx,
|
||||
struct team_ifinfo *ifinfo);
|
||||
int teamd_events_init(struct teamd_context *ctx);
|
||||
diff --git a/teamd/teamd_events.c b/teamd/teamd_events.c
|
||||
index 1a95974..65aa46a 100644
|
||||
--- a/teamd/teamd_events.c
|
||||
+++ b/teamd/teamd_events.c
|
||||
@@ -167,6 +167,25 @@ int teamd_event_ifinfo_ifname_changed(struct teamd_context *ctx,
|
||||
return 0;
|
||||
}
|
||||
|
||||
+int teamd_event_ifinfo_master_ifindex_changed(struct teamd_context *ctx,
|
||||
+ struct team_ifinfo *ifinfo)
|
||||
+{
|
||||
+ struct event_watch_item *watch;
|
||||
+ uint32_t ifindex = team_get_ifinfo_ifindex(ifinfo);
|
||||
+ struct teamd_port *tdport = teamd_get_port(ctx, ifindex);
|
||||
+ int err;
|
||||
+
|
||||
+ list_for_each_node_entry(watch, &ctx->event_watch_list, list) {
|
||||
+ if (watch->ops->port_master_ifindex_changed && tdport) {
|
||||
+ err = watch->ops->port_master_ifindex_changed(ctx, tdport,
|
||||
+ watch->priv);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+ }
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
int teamd_event_ifinfo_admin_state_changed(struct teamd_context *ctx,
|
||||
struct team_ifinfo *ifinfo)
|
||||
{
|
||||
diff --git a/teamd/teamd_ifinfo_watch.c b/teamd/teamd_ifinfo_watch.c
|
||||
index f334ff6..6a19532 100644
|
||||
--- a/teamd/teamd_ifinfo_watch.c
|
||||
+++ b/teamd/teamd_ifinfo_watch.c
|
||||
@@ -59,6 +59,11 @@ static int ifinfo_change_handler_func(struct team_handle *th, void *priv,
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
+ if (team_is_ifinfo_master_ifindex_changed(ifinfo)) {
|
||||
+ err = teamd_event_ifinfo_master_ifindex_changed(ctx, ifinfo);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+ }
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
diff --git a/teamd/teamd_runner_activebackup.c b/teamd/teamd_runner_activebackup.c
|
||||
index 8a3447f..f92d341 100644
|
||||
--- a/teamd/teamd_runner_activebackup.c
|
||||
+++ b/teamd/teamd_runner_activebackup.c
|
||||
@@ -520,6 +520,13 @@ static int ab_event_watch_port_link_changed(struct teamd_context *ctx,
|
||||
return ab_link_watch_handler(ctx, priv);
|
||||
}
|
||||
|
||||
+static int ab_event_watch_port_master_ifindex_changed(struct teamd_context *ctx,
|
||||
+ struct teamd_port *tdport,
|
||||
+ void *priv)
|
||||
+{
|
||||
+ return ab_link_watch_handler(ctx, priv);
|
||||
+}
|
||||
+
|
||||
static int ab_event_watch_prio_option_changed(struct teamd_context *ctx,
|
||||
struct team_option *option,
|
||||
void *priv)
|
||||
@@ -532,6 +539,7 @@ static const struct teamd_event_watch_ops ab_event_watch_ops = {
|
||||
.port_hwaddr_changed = ab_event_watch_port_hwaddr_changed,
|
||||
.port_added = ab_event_watch_port_added,
|
||||
.port_link_changed = ab_event_watch_port_link_changed,
|
||||
+ .port_master_ifindex_changed = ab_event_watch_port_master_ifindex_changed,
|
||||
.option_changed = ab_event_watch_prio_option_changed,
|
||||
.option_changed_match_name = "priority",
|
||||
};
|
||||
--
|
||||
2.1.0
|
||||
|
@ -0,0 +1,68 @@
|
||||
From c8b356a3cd363af10d71e21a4fb7dc26cf90b5bc Mon Sep 17 00:00:00 2001
|
||||
From: Hangbin Liu <liuhangbin@gmail.com>
|
||||
Date: Mon, 7 Jan 2019 15:58:49 +0800
|
||||
Subject: [PATCH 2/6] teamd: config: update local prio to kernel
|
||||
|
||||
Team port's priority will affect the active port selection. Update the
|
||||
local config is not enough. We also need to update kernel configs.
|
||||
|
||||
Reported-by: Liang Li <liali@redhat.com>
|
||||
Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
|
||||
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
|
||||
---
|
||||
teamd/teamd_config.c | 32 ++++++++++++++++++++++++++++++++
|
||||
1 file changed, 32 insertions(+)
|
||||
|
||||
diff --git a/teamd/teamd_config.c b/teamd/teamd_config.c
|
||||
index 94158ce..69b25de 100644
|
||||
--- a/teamd/teamd_config.c
|
||||
+++ b/teamd/teamd_config.c
|
||||
@@ -155,6 +155,31 @@ errout:
|
||||
return err;
|
||||
}
|
||||
|
||||
+static int teamd_config_port_set(struct teamd_context *ctx, const char *port_name,
|
||||
+ json_t *port_obj)
|
||||
+{
|
||||
+ struct teamd_port *tdport;
|
||||
+ json_t *config;
|
||||
+ int tmp, err;
|
||||
+
|
||||
+ tdport = teamd_get_port_by_ifname(ctx, port_name);
|
||||
+ if (!tdport)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ config = json_object_get(port_obj, "prio");
|
||||
+ if (json_is_integer(config)) {
|
||||
+ tmp = json_integer_value(config);
|
||||
+ err = team_set_port_priority(ctx->th, tdport->ifindex, tmp);
|
||||
+ if (err) {
|
||||
+ teamd_log_err("%s: Failed to set \"priority\".",
|
||||
+ tdport->ifname);
|
||||
+ return err;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
int teamd_config_port_update(struct teamd_context *ctx, const char *port_name,
|
||||
const char *json_port_cfg_str)
|
||||
{
|
||||
@@ -184,6 +209,13 @@ int teamd_config_port_update(struct teamd_context *ctx, const char *port_name,
|
||||
if (err)
|
||||
teamd_log_err("%s: Failed to update existing config "
|
||||
"port object", port_name);
|
||||
+ else {
|
||||
+ err = teamd_config_port_set(ctx, port_name, port_new_obj);
|
||||
+ if (err)
|
||||
+ teamd_log_err("%s: Failed to update config to kernel",
|
||||
+ port_name);
|
||||
+ }
|
||||
+
|
||||
new_port_decref:
|
||||
json_decref(port_new_obj);
|
||||
return err;
|
||||
--
|
||||
2.18.1
|
||||
|
@ -1,48 +0,0 @@
|
||||
From 45912ded9cb5166d8286a6a4fb53bfe9fffcd8a9 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <45912ded9cb5166d8286a6a4fb53bfe9fffcd8a9.1518009078.git.mleitner@redhat.com>
|
||||
From: Xin Long <lucien.xin@gmail.com>
|
||||
Date: Wed, 11 Oct 2017 14:17:38 +0800
|
||||
Subject: [PATCH] teamd: do not process lacpdu before the port ifinfo is set
|
||||
|
||||
Now the port ifinfo will be set in obj_input_newlink when a RTM_NEWLINK
|
||||
event is received.
|
||||
|
||||
But when a port is being added, if a lacpdu gets received on this port
|
||||
before the RTM_NEWLINK event, lacpdu_recv will process the packet with
|
||||
incorrect port ifinfo.
|
||||
|
||||
In Patrick's case, as ifinfo->master_ifindex was 0, it would skip this
|
||||
port in teamd_for_each_tdport, which caused lacp_port->agg_lead not to
|
||||
be updated in lacp_switch_agg_lead. Later the lacp_port actor would go
|
||||
to a unexpected state.
|
||||
|
||||
This patch is to avoid it by checking teamd_port_present in lacpdu_recv
|
||||
so that it would not process lacpdu before the port ifinfo is set.
|
||||
|
||||
Reported-by: Patrick Talbert <ptalbert@redhat.com>
|
||||
Tested-by: Patrick Talbert <ptalbert@redhat.com>
|
||||
Signed-off-by: Xin Long <lucien.xin@gmail.com>
|
||||
Reviewed-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
|
||||
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
|
||||
Signed-off-by: Marcelo Ricardo Leitner <mleitner@redhat.com>
|
||||
---
|
||||
teamd/teamd_runner_lacp.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/teamd/teamd_runner_lacp.c b/teamd/teamd_runner_lacp.c
|
||||
index 5601278696a9f263f6bfe71642b2db971c9314b9..1310f6737f6cf37b7d6fef0befb8c803178212bd 100644
|
||||
--- a/teamd/teamd_runner_lacp.c
|
||||
+++ b/teamd/teamd_runner_lacp.c
|
||||
@@ -1075,6 +1075,9 @@ static int lacpdu_recv(struct lacp_port *lacp_port)
|
||||
if (err <= 0)
|
||||
return err;
|
||||
|
||||
+ if (!teamd_port_present(lacp_port->ctx, lacp_port->tdport))
|
||||
+ return 0;
|
||||
+
|
||||
if (!lacpdu_check(&lacpdu)) {
|
||||
teamd_log_warn("malformed LACP PDU came.");
|
||||
return 0;
|
||||
--
|
||||
2.14.3
|
||||
|
@ -0,0 +1,74 @@
|
||||
From 8c7614abf5993d92e332a800f244bdebd7c9a2c8 Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <8c7614abf5993d92e332a800f244bdebd7c9a2c8.1562149642.git.lucien.xin@gmail.com>
|
||||
From: Xin Long <lucien.xin@gmail.com>
|
||||
Date: Tue, 2 Jul 2019 19:33:56 +0800
|
||||
Subject: [PATCH] teamd: improve the error output for non-integer port prio
|
||||
|
||||
This patch is to improve the error log when users pass
|
||||
a non-integer value to set port's prio. After that, we
|
||||
can remove the error output for teamd_config_port_set
|
||||
failure from teamd_config_port_update.
|
||||
|
||||
Signed-off-by: Xin Long <lucien.xin@gmail.com>
|
||||
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
|
||||
---
|
||||
teamd/teamd_config.c | 30 +++++++++++++++---------------
|
||||
1 file changed, 15 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/teamd/teamd_config.c b/teamd/teamd_config.c
|
||||
index 1bf85ac..610ad5f 100644
|
||||
--- a/teamd/teamd_config.c
|
||||
+++ b/teamd/teamd_config.c
|
||||
@@ -167,17 +167,19 @@ static int teamd_config_port_set(struct teamd_context *ctx, const char *port_nam
|
||||
return 0;
|
||||
|
||||
config = json_object_get(port_obj, "prio");
|
||||
- if (json_is_integer(config)) {
|
||||
- tmp = json_integer_value(config);
|
||||
- err = team_set_port_priority(ctx->th, tdport->ifindex, tmp);
|
||||
- if (err) {
|
||||
- teamd_log_err("%s: Failed to set \"priority\".",
|
||||
- tdport->ifname);
|
||||
- return err;
|
||||
- }
|
||||
+ if (!json_is_integer(config)) {
|
||||
+ teamd_log_err("%s: Failed to get integer for \"priority\".",
|
||||
+ tdport->ifname);
|
||||
+ return -ENOENT;
|
||||
}
|
||||
|
||||
- return 0;
|
||||
+ tmp = json_integer_value(config);
|
||||
+ err = team_set_port_priority(ctx->th, tdport->ifindex, tmp);
|
||||
+ if (err)
|
||||
+ teamd_log_err("%s: Failed to update \"priority\" to kernel",
|
||||
+ tdport->ifname);
|
||||
+
|
||||
+ return err;
|
||||
}
|
||||
|
||||
int teamd_config_port_update(struct teamd_context *ctx, const char *port_name,
|
||||
@@ -206,16 +208,14 @@ int teamd_config_port_update(struct teamd_context *ctx, const char *port_name,
|
||||
/* replace existing object content */
|
||||
json_object_clear(port_obj);
|
||||
err = json_object_update(port_obj, port_new_obj);
|
||||
- if (err)
|
||||
+ if (err) {
|
||||
teamd_log_err("%s: Failed to update existing config "
|
||||
"port object", port_name);
|
||||
- else {
|
||||
- err = teamd_config_port_set(ctx, port_name, port_new_obj);
|
||||
- if (err)
|
||||
- teamd_log_err("%s: Failed to update config to kernel",
|
||||
- port_name);
|
||||
+ goto new_port_decref;
|
||||
}
|
||||
|
||||
+ err = teamd_config_port_set(ctx, port_name, port_new_obj);
|
||||
+
|
||||
new_port_decref:
|
||||
json_decref(port_new_obj);
|
||||
return err;
|
||||
--
|
||||
2.18.1
|
||||
|
@ -0,0 +1,74 @@
|
||||
From 54f137c10579bf97800c61ebb13e732aa1d843e6 Mon Sep 17 00:00:00 2001
|
||||
From: Hangbin Liu <liuhangbin@gmail.com>
|
||||
Date: Fri, 8 Mar 2019 19:28:55 +0800
|
||||
Subject: [PATCH 6/6] teamd: lacp: update port state according to partner's
|
||||
sync bit
|
||||
|
||||
According to 6.4.15 of IEEE 802.1AX-2014, Figure 6-22, the state that the
|
||||
port is selected moves MUX state from DETACHED to ATTACHED.
|
||||
|
||||
But ATTACHED state does not mean that the port can send and receive user
|
||||
frames. COLLECTING_DISTRIBUTION state is the state that the port can send
|
||||
and receive user frames. To move MUX state from ATTACHED to
|
||||
COLLECTING_DISTRIBUTION, the partner state should be sync as well as the
|
||||
port selected.
|
||||
|
||||
In function lacp_port_actor_update(), only INFO_STATE_SYNCHRONIZATION
|
||||
should be set to the actor.state when the port is selected.
|
||||
INFO_STATE_COLLECTING and INFO_STATE_DISTRIBUTING should be set to false
|
||||
with ATTACHED mode and set to true when INFO_STATE_SYNCHRONIZATION of
|
||||
partner.state is set.
|
||||
|
||||
In function lacp_port_should_be_{enabled, disabled}(), we also need to
|
||||
check the INFO_STATE_SYNCHRONIZATION bit of partner.state.
|
||||
|
||||
Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
|
||||
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
|
||||
---
|
||||
teamd/teamd_runner_lacp.c | 16 +++++++++++-----
|
||||
1 file changed, 11 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/teamd/teamd_runner_lacp.c b/teamd/teamd_runner_lacp.c
|
||||
index 555aa06..d292d69 100644
|
||||
--- a/teamd/teamd_runner_lacp.c
|
||||
+++ b/teamd/teamd_runner_lacp.c
|
||||
@@ -333,7 +333,8 @@ static int lacp_port_should_be_enabled(struct lacp_port *lacp_port)
|
||||
struct lacp *lacp = lacp_port->lacp;
|
||||
|
||||
if (lacp_port_selected(lacp_port) &&
|
||||
- lacp_port->agg_lead == lacp->selected_agg_lead)
|
||||
+ lacp_port->agg_lead == lacp->selected_agg_lead &&
|
||||
+ lacp_port->partner.state & INFO_STATE_SYNCHRONIZATION)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
@@ -343,7 +344,8 @@ static int lacp_port_should_be_disabled(struct lacp_port *lacp_port)
|
||||
struct lacp *lacp = lacp_port->lacp;
|
||||
|
||||
if (!lacp_port_selected(lacp_port) ||
|
||||
- lacp_port->agg_lead != lacp->selected_agg_lead)
|
||||
+ lacp_port->agg_lead != lacp->selected_agg_lead ||
|
||||
+ !(lacp_port->partner.state & INFO_STATE_SYNCHRONIZATION))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
@@ -914,9 +916,13 @@ static void lacp_port_actor_update(struct lacp_port *lacp_port)
|
||||
if (lacp_port->lacp->cfg.fast_rate)
|
||||
state |= INFO_STATE_LACP_TIMEOUT;
|
||||
if (lacp_port_selected(lacp_port) &&
|
||||
- lacp_port_agg_selected(lacp_port))
|
||||
- state |= INFO_STATE_SYNCHRONIZATION |
|
||||
- INFO_STATE_COLLECTING | INFO_STATE_DISTRIBUTING;
|
||||
+ lacp_port_agg_selected(lacp_port)) {
|
||||
+ state |= INFO_STATE_SYNCHRONIZATION;
|
||||
+ state &= ~(INFO_STATE_COLLECTING | INFO_STATE_DISTRIBUTING);
|
||||
+ if (lacp_port->partner.state & INFO_STATE_SYNCHRONIZATION)
|
||||
+ state |= INFO_STATE_COLLECTING |
|
||||
+ INFO_STATE_DISTRIBUTING;
|
||||
+ }
|
||||
if (lacp_port->state == PORT_STATE_EXPIRED)
|
||||
state |= INFO_STATE_EXPIRED;
|
||||
if (lacp_port->state == PORT_STATE_DEFAULTED)
|
||||
--
|
||||
2.18.1
|
||||
|
@ -0,0 +1,38 @@
|
||||
From 5f355301b7cafbb51b036ad1e5af38e79d4330d6 Mon Sep 17 00:00:00 2001
|
||||
From: Hangbin Liu <liuhangbin@gmail.com>
|
||||
Date: Fri, 11 Jan 2019 09:57:10 +0800
|
||||
Subject: [PATCH 3/6] teamd: lw: arp_ping: only check arp reply message
|
||||
|
||||
Currently we check both arp request and reply message for arp_ping link
|
||||
watch. But if we enabled validate_active and validate_inactive at the
|
||||
same time, we will receive the other slave's arp request as the switch
|
||||
broadcasts arp request message. i.e. slave1 receives arp request from
|
||||
slave2 and vice versa.
|
||||
|
||||
Then the arp check will pass even the target is unreachable. Fix it by
|
||||
only check arp reply message.
|
||||
|
||||
Reported-by: LiLiang <liali@redhat.com>
|
||||
Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
|
||||
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
|
||||
---
|
||||
teamd/teamd_lw_arp_ping.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/teamd/teamd_lw_arp_ping.c b/teamd/teamd_lw_arp_ping.c
|
||||
index 01cd6e1..81806f0 100644
|
||||
--- a/teamd/teamd_lw_arp_ping.c
|
||||
+++ b/teamd/teamd_lw_arp_ping.c
|
||||
@@ -336,7 +336,8 @@ static int lw_ap_receive(struct lw_psr_port_priv *psr_ppriv)
|
||||
if (ap.ah.ar_hrd != htons(ll_my.sll_hatype) ||
|
||||
ap.ah.ar_pro != htons(ETH_P_IP) ||
|
||||
ap.ah.ar_hln != ll_my.sll_halen ||
|
||||
- ap.ah.ar_pln != 4) {
|
||||
+ ap.ah.ar_pln != 4 ||
|
||||
+ ap.ah.ar_op != htons(ARPOP_REPLY)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
--
|
||||
2.18.1
|
||||
|
@ -0,0 +1,35 @@
|
||||
From 6bf0e87387878654186bcf7287e0eda59b1c2f2c Mon Sep 17 00:00:00 2001
|
||||
From: Hangbin Liu <liuhangbin@gmail.com>
|
||||
Date: Thu, 21 Feb 2019 17:37:46 +0800
|
||||
Subject: [PATCH 4/6] teamd: lw: nsna_ping: only send ns on enabled port
|
||||
|
||||
We forget to check forced_send when using nsna_ping link_watch.
|
||||
Ns is sent from all ports, which cause switch mac flapping. Some
|
||||
reply packets are delivered to disabled port and dropped directly.
|
||||
|
||||
Fix it by checking forced_send and only send ns on enabled port.
|
||||
|
||||
Reported-by: LiLiang <liali@redhat.com>
|
||||
Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
|
||||
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
|
||||
---
|
||||
teamd/teamd_lw_nsna_ping.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/teamd/teamd_lw_nsna_ping.c b/teamd/teamd_lw_nsna_ping.c
|
||||
index 127d950..82371c4 100644
|
||||
--- a/teamd/teamd_lw_nsna_ping.c
|
||||
+++ b/teamd/teamd_lw_nsna_ping.c
|
||||
@@ -203,6 +203,9 @@ static int lw_nsnap_send(struct lw_psr_port_priv *psr_ppriv)
|
||||
struct sockaddr_in6 sendto_addr;
|
||||
struct ns_packet nsp;
|
||||
|
||||
+ if (!(psr_ppriv->common.forced_send))
|
||||
+ return 0;
|
||||
+
|
||||
err = teamd_getsockname_hwaddr(psr_ppriv->sock, &ll_my,
|
||||
sizeof(nsp.hwaddr));
|
||||
if (err)
|
||||
--
|
||||
2.18.1
|
||||
|
62
SOURCES/libteam-teamd-remove-port-if-adding-fails.patch
Normal file
62
SOURCES/libteam-teamd-remove-port-if-adding-fails.patch
Normal file
@ -0,0 +1,62 @@
|
||||
From 0f1b2fac03361c5d2bac34e4b19922c60c5c06c6 Mon Sep 17 00:00:00 2001
|
||||
From: Hangbin Liu <liuhangbin@gmail.com>
|
||||
Date: Wed, 13 Mar 2019 15:04:29 +0800
|
||||
Subject: [PATCH 1/3] teamd: remove port if adding fails
|
||||
|
||||
When we add a port to team via teamdctl, some drivers do not support
|
||||
changing mac address after dev opened, which would lead to the failure
|
||||
of port_obj_create(). The call path looks like below for LACP mode:
|
||||
|
||||
- port_obj_create()
|
||||
- port_priv_init_all()
|
||||
- lacp_port_added()
|
||||
- lacp_port_set_mac()
|
||||
|
||||
Currently, we only destroy the port object if adding port fails. But the
|
||||
port is still enslaved to team in kernel. IP link command shows the port
|
||||
is a team_slave, but teamdctl state shows nothing. This may make users
|
||||
confused.
|
||||
|
||||
Fix it by removing the port if adding fails.
|
||||
|
||||
v2: also calls teamd_port_remove in port_obj_remove()
|
||||
|
||||
Reported-by: Vladimir Benes <vbenes@redhat.com>
|
||||
Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
|
||||
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
|
||||
---
|
||||
teamd/teamd_per_port.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/teamd/teamd_per_port.c b/teamd/teamd_per_port.c
|
||||
index 09d1dc7..f98a90d 100644
|
||||
--- a/teamd/teamd_per_port.c
|
||||
+++ b/teamd/teamd_per_port.c
|
||||
@@ -42,6 +42,8 @@ struct port_obj {
|
||||
};
|
||||
|
||||
#define _port(port_obj) (&(port_obj)->port)
|
||||
+static int teamd_port_remove(struct teamd_context *ctx,
|
||||
+ struct teamd_port *tdport);
|
||||
|
||||
int teamd_port_priv_create_and_get(void **ppriv, struct teamd_port *tdport,
|
||||
const struct teamd_port_priv *pp,
|
||||
@@ -203,6 +205,7 @@ static int port_obj_create(struct teamd_context *ctx,
|
||||
teamd_event_port_removed:
|
||||
teamd_event_port_removed(ctx, tdport);
|
||||
list_del:
|
||||
+ teamd_port_remove(ctx, tdport);
|
||||
port_obj_destroy(ctx, port_obj);
|
||||
port_obj_free(port_obj);
|
||||
return err;
|
||||
@@ -214,6 +217,7 @@ static void port_obj_remove(struct teamd_context *ctx,
|
||||
struct teamd_port *tdport = _port(port_obj);
|
||||
|
||||
teamd_event_port_removed(ctx, tdport);
|
||||
+ teamd_port_remove(ctx, tdport);
|
||||
port_obj_destroy(ctx, port_obj);
|
||||
port_obj_free(port_obj);
|
||||
}
|
||||
--
|
||||
2.18.1
|
||||
|
@ -0,0 +1,52 @@
|
||||
From 2bf8652cce4303d3ae79dff8bdef10dfae27439b Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <2bf8652cce4303d3ae79dff8bdef10dfae27439b.1562149639.git.lucien.xin@gmail.com>
|
||||
From: Xin Long <lucien.xin@gmail.com>
|
||||
Date: Tue, 2 Jul 2019 19:30:43 +0800
|
||||
Subject: [PATCH] teamd: return 0 if tdport doesn't exist in
|
||||
teamd_config_port_set
|
||||
|
||||
This issue can be reproduced by doing:
|
||||
|
||||
# ip link add dummy1 type dummy
|
||||
# teamd -t team0 -c '{"runner": {"name": "activebackup"}}' -d
|
||||
# teamdctl team0 port config update dummy1 '{"prio": -10}'
|
||||
# ip link set dummy0 master team0
|
||||
|
||||
and the error shows:
|
||||
|
||||
libteamdctl: usock: Error message received: "ConfigUpdateFail"
|
||||
libteamdctl: usock: Error message content: "Failed to update config."
|
||||
command call failed (Invalid argument)
|
||||
|
||||
It's a regression caused by Commit c8b356a3cd36 ("teamd: config: update
|
||||
local prio to kernel") where it requires the tdport has to exist when
|
||||
a tdport config is being updated. However teamd supports for the port
|
||||
config going first before the port being enslaved.
|
||||
|
||||
This issue breaks how NM-team starts a team device. Here to fix it by
|
||||
returning 0 even if the tdport doesn't exist in teamd_config_port_set.
|
||||
|
||||
Reported-by: Radek Vykydal <rvykydal@redhat.com>
|
||||
Fixes: c8b356a3cd36 ("teamd: config: update local prio to kernel")
|
||||
Signed-off-by: Xin Long <lucien.xin@gmail.com>
|
||||
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
|
||||
---
|
||||
teamd/teamd_config.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/teamd/teamd_config.c b/teamd/teamd_config.c
|
||||
index 34fef1f..1bf85ac 100644
|
||||
--- a/teamd/teamd_config.c
|
||||
+++ b/teamd/teamd_config.c
|
||||
@@ -164,7 +164,7 @@ static int teamd_config_port_set(struct teamd_context *ctx, const char *port_nam
|
||||
|
||||
tdport = teamd_get_port_by_ifname(ctx, port_name);
|
||||
if (!tdport)
|
||||
- return -ENODEV;
|
||||
+ return 0;
|
||||
|
||||
config = json_object_get(port_obj, "prio");
|
||||
if (json_is_integer(config)) {
|
||||
--
|
||||
2.18.1
|
||||
|
@ -0,0 +1,42 @@
|
||||
From 4dc3a7a042c88193f0371a33f1043919843e6447 Mon Sep 17 00:00:00 2001
|
||||
From: Xin Long <lucien.xin@gmail.com>
|
||||
Date: Mon, 1 Apr 2019 16:15:24 +0800
|
||||
Subject: [PATCH 2/3] teamd: tdport has to exist if item->per_port is set in
|
||||
__find_by_item_path
|
||||
|
||||
The issue can be reproduced by:
|
||||
|
||||
# teamd -c '{"device":"team0", "runner":{"name":"lacp"}}' &
|
||||
# teamdctl team0 state item set runner.aggregator.selected true
|
||||
|
||||
teamd process will abort in lacp_port_state_aggregator_selected_set()
|
||||
as gsc->info.tdport was set to NULL in teamd_state_item_value_set()
|
||||
|
||||
The item 'runner.aggregator.selected' is of per_port = true, and it
|
||||
shouldn't allow to call its setter/getter().
|
||||
|
||||
This patch is to add the check for it in __find_by_item_path() called
|
||||
by teamd_state_item_value_get/set().
|
||||
|
||||
Fixes: 6c00aaf02553 ("teamd: add support for state item write operation")
|
||||
Signed-off-by: Xin Long <lucien.xin@gmail.com>
|
||||
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
|
||||
---
|
||||
teamd/teamd_state.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/teamd/teamd_state.c b/teamd/teamd_state.c
|
||||
index ab64db9..0714880 100644
|
||||
--- a/teamd/teamd_state.c
|
||||
+++ b/teamd/teamd_state.c
|
||||
@@ -333,6 +333,7 @@ static int __find_by_item_path(struct teamd_state_val_item **p_item,
|
||||
list_for_each_node_entry(item, &ctx->state_val_list, list) {
|
||||
/* item->subpath[0] == '.' */
|
||||
if (!strcmp(item->subpath + 1, subpath) &&
|
||||
+ (!item->per_port || tdport) &&
|
||||
(!item->tdport || item->tdport == tdport)) {
|
||||
*p_item = item;
|
||||
*p_tdport = tdport;
|
||||
--
|
||||
2.18.1
|
||||
|
@ -0,0 +1,76 @@
|
||||
From 90e5279ce0241838d5687739b3bc795235b7d53b Mon Sep 17 00:00:00 2001
|
||||
From: Xin Long <lucien.xin@gmail.com>
|
||||
Date: Mon, 15 Apr 2019 16:56:35 +0800
|
||||
Subject: [PATCH 3/3] teamd: use enabled option_changed to sync enabled to
|
||||
link_up for lb runner
|
||||
|
||||
LiLiang found an issue that after adding two ports into a team device with
|
||||
lb mode their enabled option sometimes is false.
|
||||
|
||||
It was caused by the unexpected events order:
|
||||
|
||||
0. team_port_add() in kernel.
|
||||
1. port_change event A1 sent to userspace.
|
||||
2. option_change event B1 sent to userspace.
|
||||
3. port_change event A2 sent to userspace IF port is up now.
|
||||
4. process port_change event A1 and set port's enabled option 'false'.
|
||||
5. option_change event B2 sent to userspace.
|
||||
6. process option_change event B1 and sync enabled option (value = 1).
|
||||
7. process port_change event A2 and do nothing as enabled option is 1.
|
||||
8. process option_change event B2 and sync enabled option (value = 0).
|
||||
|
||||
In kernel, when the port is still down after dev_open(), which happens more
|
||||
often since it changed to use netif_oper_up() to check the state instead of
|
||||
netif_carrier_ok(), the event A2 in Step 3 can be sent at any moment. When
|
||||
it's ahead of Step 4, Step 7 won't set enabled option to 1 as Step 8 comes
|
||||
late.
|
||||
|
||||
As the port up event can be triggered by dev_watchdog at anytime in kernel,
|
||||
the port_change and option_change events order can not be controlled. What
|
||||
can only be done here is to correct it at Step 8, to sync enabled option to
|
||||
link_up.
|
||||
|
||||
So this patch is to add enabled option_changed for lb mode to do this sync.
|
||||
|
||||
Reported-by: LiLiang <liali@redhat.com>
|
||||
Signed-off-by: Xin Long <lucien.xin@gmail.com>
|
||||
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
|
||||
---
|
||||
teamd/teamd_runner_loadbalance.c | 15 +++++++++++++++
|
||||
1 file changed, 15 insertions(+)
|
||||
|
||||
diff --git a/teamd/teamd_runner_loadbalance.c b/teamd/teamd_runner_loadbalance.c
|
||||
index b9bfc13..a581472 100644
|
||||
--- a/teamd/teamd_runner_loadbalance.c
|
||||
+++ b/teamd/teamd_runner_loadbalance.c
|
||||
@@ -109,12 +109,27 @@ static int lb_event_watch_port_hwaddr_changed(struct teamd_context *ctx,
|
||||
return err;
|
||||
}
|
||||
|
||||
+static int lb_event_watch_enabled_option_changed(struct teamd_context *ctx,
|
||||
+ struct team_option *option,
|
||||
+ void *priv)
|
||||
+{
|
||||
+ struct teamd_port *tdport;
|
||||
+
|
||||
+ tdport = teamd_get_port(ctx, team_get_option_port_ifindex(option));
|
||||
+ if (!tdport)
|
||||
+ return 0;
|
||||
+
|
||||
+ return lb_event_watch_port_link_changed(ctx, tdport, priv);
|
||||
+}
|
||||
+
|
||||
static const struct teamd_event_watch_ops lb_port_watch_ops = {
|
||||
.hwaddr_changed = lb_event_watch_hwaddr_changed,
|
||||
.port_hwaddr_changed = lb_event_watch_port_hwaddr_changed,
|
||||
.port_added = lb_event_watch_port_added,
|
||||
.port_removed = lb_event_watch_port_removed,
|
||||
.port_link_changed = lb_event_watch_port_link_changed,
|
||||
+ .option_changed = lb_event_watch_enabled_option_changed,
|
||||
+ .option_changed_match_name = "enabled",
|
||||
};
|
||||
|
||||
static int lb_init(struct teamd_context *ctx, void *priv)
|
||||
--
|
||||
2.18.1
|
||||
|
31
SOURCES/libteam-teamnl-update-help-message.patch
Normal file
31
SOURCES/libteam-teamnl-update-help-message.patch
Normal file
@ -0,0 +1,31 @@
|
||||
From 6e67aa89a746ff98d4b4f4fa3c778aa31d4d2c7f Mon Sep 17 00:00:00 2001
|
||||
From: Hangbin Liu <liuhangbin@gmail.com>
|
||||
Date: Mon, 17 Dec 2018 16:58:34 +0800
|
||||
Subject: [PATCH 1/6] teamnl: update help message
|
||||
|
||||
Update help message so people could know we support port name directly.
|
||||
|
||||
Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
|
||||
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
|
||||
---
|
||||
utils/teamnl.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/utils/teamnl.c b/utils/teamnl.c
|
||||
index e8de7e2..c53345d 100644
|
||||
--- a/utils/teamnl.c
|
||||
+++ b/utils/teamnl.c
|
||||
@@ -521,7 +521,9 @@ static void print_help(const char *argv0) {
|
||||
|
||||
printf(
|
||||
"%s [options] teamdevname command [command args]\n"
|
||||
- "\t-h --help Show this help\n",
|
||||
+ "\t-h --help Show this help\n"
|
||||
+ "\t-p --port_name team slave port name\n"
|
||||
+ "\t-a --array_index team option array index\n",
|
||||
argv0);
|
||||
printf("Commands:\n");
|
||||
for (i = 0; i < CMD_TYPE_COUNT; i++) {
|
||||
--
|
||||
2.18.1
|
||||
|
@ -1,38 +0,0 @@
|
||||
From eb3b18e87be7aab31bdfa51a882210b24596dc9d Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <eb3b18e87be7aab31bdfa51a882210b24596dc9d.1533278517.git.lucien.xin@gmail.com>
|
||||
In-Reply-To: <d9769b270608654aa7f07ce48a36f084843daf01.1533278517.git.lucien.xin@gmail.com>
|
||||
References: <d9769b270608654aa7f07ce48a36f084843daf01.1533278517.git.lucien.xin@gmail.com>
|
||||
From: Xin Long <lucien.xin@gmail.com>
|
||||
Date: Fri, 27 Jul 2018 17:07:47 +0800
|
||||
Subject: [PATCHv2 2/2] utils: check to_stdout return correctly in bond2team
|
||||
|
||||
to_stdout is a function, not a string, so fix the check on
|
||||
its return in bond2team.
|
||||
|
||||
v1->v2:
|
||||
improve the coding style as Flavio suggested.
|
||||
|
||||
Fixes: d5a1c8ee9e36 ("utils: add bond2team conversion tool")
|
||||
Signed-off-by: Xin Long <lucien.xin@gmail.com>
|
||||
Acked-by: Flavio Leitner <fbl@sysclose.org>
|
||||
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
|
||||
---
|
||||
utils/bond2team | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/utils/bond2team b/utils/bond2team
|
||||
index f8d46ef..fc81c4b 100755
|
||||
--- a/utils/bond2team
|
||||
+++ b/utils/bond2team
|
||||
@@ -623,7 +623,7 @@ team_ifcfg_write()
|
||||
team_ifcfg_deliver()
|
||||
{
|
||||
pr_dbg "${FUNCNAME} $*"
|
||||
- if [ ! to_stdout ]; then
|
||||
+ if ! to_stdout; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
--
|
||||
2.1.0
|
||||
|
@ -1,21 +1,22 @@
|
||||
Name: libteam
|
||||
Version: 1.27
|
||||
Release: 10%{?dist}
|
||||
Version: 1.28
|
||||
Release: 4%{?dist}
|
||||
Summary: Library for controlling team network device
|
||||
Group: System Environment/Libraries
|
||||
License: LGPLv2+
|
||||
URL: http://www.libteam.org
|
||||
Source: http://www.libteam.org/files/libteam-%{version}.tar.gz
|
||||
Patch1: libteam-teamd-do-not-process-lacpdu-before-the-port-ifinfo-i.patch
|
||||
Patch2: libteam-teamd-add-port_hwaddr_changed-for-ab-runner.patch
|
||||
Patch3: libteam-teamd-add-port_hwaddr_changed-for-lb-runner.patch
|
||||
Patch4: libteam-teamd-add-port_hwaddr_changed-for-lacp-runner.patch
|
||||
Patch5: libteam-man-fix-runner.sys_prio-default.patch
|
||||
Patch6: libteam-configure.ac-Empty-LDFLAGS-before-checking-for-libnl.patch
|
||||
Patch7: libteam-libteam-don-t-crash-when-trying-to-print-unregistere.patch
|
||||
Patch8: libteam-binding-python-use-SWIG_FromCharPtrAndSize-for-Pytho.patch
|
||||
Patch9: libteam-utils-check-to_stdout-return-correctly-in-bond2team.patch
|
||||
Patch10: libteam-teamd-add-port_master_ifindex_changed-for-teamd_even.patch
|
||||
Patch1: libteam-teamnl-update-help-message.patch
|
||||
Patch2: libteam-teamd-config-update-local-prio-to-kernel.patch
|
||||
Patch3: libteam-teamd-lw-arp_ping-only-check-arp-reply-message.patch
|
||||
Patch4: libteam-teamd-lw-nsna_ping-only-send-ns-on-enabled-port.patch
|
||||
Patch5: libteam-man-fix-runner.min_ports-default-value.patch
|
||||
Patch6: libteam-teamd-lacp-update-port-state-according-to-partner-s-.patch
|
||||
Patch7: libteam-teamd-remove-port-if-adding-fails.patch
|
||||
Patch8: libteam-teamd-tdport-has-to-exist-if-item-per_port-is-set-in.patch
|
||||
Patch9: libteam-teamd-use-enabled-option_changed-to-sync-enabled-to-.patch
|
||||
Patch10: libteam-teamd-return-0-if-tdport-doesn-t-exist-in-teamd_conf.patch
|
||||
Patch11: libteam-teamd-improve-the-error-output-for-non-integer-port-.patch
|
||||
BuildRequires: jansson-devel
|
||||
BuildRequires: libdaemon-devel
|
||||
BuildRequires: libnl3-devel
|
||||
@ -174,6 +175,32 @@ cd binding/python
|
||||
%{_sysconfdir}/sysconfig/network-scripts/ifdown-TeamPort
|
||||
|
||||
%changelog
|
||||
* Mon Jul 15 2019 Xin Long <lxin@redhat.com> - 1.28-4
|
||||
- gating: run VM with more RAM [1722449]
|
||||
* Wed Jul 03 2019 Xin Long <lxin@redhat.com> - 1.28-3
|
||||
- teamd: return 0 if tdport doesn't exist in teamd_config_port_set [1722449]
|
||||
- teamd: improve the error output for non-integer port prio
|
||||
* Mon Apr 29 2019 Xin Long <lxin@redhat.com> - 1.28-2
|
||||
- teamd: use enabled option_changed to sync enabled to link_up for lb runner [1668132]
|
||||
- teamd: tdport has to exist if item->per_port is set in __find_by_item_path [1687336]
|
||||
- teamd: remove port if adding fails [1668744]
|
||||
* Wed Apr 17 2019 Xin Long <lxin@redhat.com> - 1.28-1
|
||||
- teamd: lacp: update port state according to partner's sync bit
|
||||
- man: fix runner.min_ports default value [1679853]
|
||||
- teamd: lw: nsna_ping: only send ns on enabled port [1671195]
|
||||
- teamd: lw: arp_ping: only check arp reply message [1663093]
|
||||
- teamd: config: update local prio to kernel [1657113]
|
||||
- teamnl: update help message
|
||||
- 1.28 release
|
||||
- teamd: lacp: send LACPDU when port state transitions from DEFAULT to CURRENT
|
||||
- man teamd.conf: Document ARP Ping link_watch.vlanid option
|
||||
- man teamd.conf: fix indentation of link_watch.send_always
|
||||
- libteam/options: fix s32/u32 data storage on big endian
|
||||
- teamd: add an option to force log output to stdout, stderr or syslog
|
||||
- teamd: add port_master_ifindex_changed for teamd_event_watch_ops
|
||||
- man: add 'random' to the list of available runners
|
||||
- examples: fix duplex comparison against best port
|
||||
|
||||
* Thu Jan 10 2019 Xin Long <lxin@redhat.com> - 1.27-10
|
||||
- add new package network-scripts-team [1659846]
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user