| From foo@baz Wed May 31 09:13:34 JST 2017 |
| From: Xin Long <lucien.xin@gmail.com> |
| Date: Fri, 19 May 2017 22:20:29 +0800 |
| Subject: bridge: start hello_timer when enabling KERNEL_STP in br_stp_start |
| |
| From: Xin Long <lucien.xin@gmail.com> |
| |
| |
| [ Upstream commit 6d18c732b95c0a9d35e9f978b4438bba15412284 ] |
| |
| Since commit 76b91c32dd86 ("bridge: stp: when using userspace stp stop |
| kernel hello and hold timers"), bridge would not start hello_timer if |
| stp_enabled is not KERNEL_STP when br_dev_open. |
| |
| The problem is even if users set stp_enabled with KERNEL_STP later, |
| the timer will still not be started. It causes that KERNEL_STP can |
| not really work. Users have to re-ifup the bridge to avoid this. |
| |
| This patch is to fix it by starting br->hello_timer when enabling |
| KERNEL_STP in br_stp_start. |
| |
| As an improvement, it's also to start hello_timer again only when |
| br->stp_enabled is KERNEL_STP in br_hello_timer_expired, there is |
| no reason to start the timer again when it's NO_STP. |
| |
| Fixes: 76b91c32dd86 ("bridge: stp: when using userspace stp stop kernel hello and hold timers") |
| Reported-by: Haidong Li <haili@redhat.com> |
| Signed-off-by: Xin Long <lucien.xin@gmail.com> |
| Acked-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com> |
| Reviewed-by: Ivan Vecera <cera@cera.cz> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/bridge/br_stp_if.c | 1 + |
| net/bridge/br_stp_timer.c | 2 +- |
| 2 files changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/net/bridge/br_stp_if.c |
| +++ b/net/bridge/br_stp_if.c |
| @@ -185,6 +185,7 @@ static void br_stp_start(struct net_brid |
| br_debug(br, "using kernel STP\n"); |
| |
| /* To start timers on any ports left in blocking */ |
| + mod_timer(&br->hello_timer, jiffies + br->hello_time); |
| br_port_state_selection(br); |
| } |
| |
| --- a/net/bridge/br_stp_timer.c |
| +++ b/net/bridge/br_stp_timer.c |
| @@ -40,7 +40,7 @@ static void br_hello_timer_expired(unsig |
| if (br->dev->flags & IFF_UP) { |
| br_config_bpdu_generation(br); |
| |
| - if (br->stp_enabled != BR_USER_STP) |
| + if (br->stp_enabled == BR_KERNEL_STP) |
| mod_timer(&br->hello_timer, |
| round_jiffies(jiffies + br->hello_time)); |
| } |