| From 6f099c274ce3f2e88b0408bacf5826eb05950716 Mon Sep 17 00:00:00 2001 |
| From: Hoang Le <hoang.h.le@dektech.com.au> |
| Date: Tue, 12 Nov 2019 07:40:04 +0700 |
| Subject: [PATCH] tipc: update mon's self addr when node addr generated |
| |
| commit 46cb01eeeb86fca6afe24dda1167b0cb95424e29 upstream. |
| |
| In commit 25b0b9c4e835 ("tipc: handle collisions of 32-bit node address |
| hash values"), the 32-bit node address only generated after one second |
| trial period expired. However the self's addr in struct tipc_monitor do |
| not update according to node address generated. This lead to it is |
| always zero as initial value. As result, sorting algorithm using this |
| value does not work as expected, neither neighbor monitoring framework. |
| |
| In this commit, we add a fix to update self's addr when 32-bit node |
| address generated. |
| |
| Fixes: 25b0b9c4e835 ("tipc: handle collisions of 32-bit node address hash values") |
| Acked-by: Jon Maloy <jon.maloy@ericsson.com> |
| Signed-off-by: Hoang Le <hoang.h.le@dektech.com.au> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/net/tipc/monitor.c b/net/tipc/monitor.c |
| index 6a6eae88442f..58708b4c7719 100644 |
| --- a/net/tipc/monitor.c |
| +++ b/net/tipc/monitor.c |
| @@ -665,6 +665,21 @@ void tipc_mon_delete(struct net *net, int bearer_id) |
| kfree(mon); |
| } |
| |
| +void tipc_mon_reinit_self(struct net *net) |
| +{ |
| + struct tipc_monitor *mon; |
| + int bearer_id; |
| + |
| + for (bearer_id = 0; bearer_id < MAX_BEARERS; bearer_id++) { |
| + mon = tipc_monitor(net, bearer_id); |
| + if (!mon) |
| + continue; |
| + write_lock_bh(&mon->lock); |
| + mon->self->addr = tipc_own_addr(net); |
| + write_unlock_bh(&mon->lock); |
| + } |
| +} |
| + |
| int tipc_nl_monitor_set_threshold(struct net *net, u32 cluster_size) |
| { |
| struct tipc_net *tn = tipc_net(net); |
| diff --git a/net/tipc/monitor.h b/net/tipc/monitor.h |
| index 2a21b93e0d04..ed63d2e650b0 100644 |
| --- a/net/tipc/monitor.h |
| +++ b/net/tipc/monitor.h |
| @@ -77,6 +77,7 @@ int __tipc_nl_add_monitor(struct net *net, struct tipc_nl_msg *msg, |
| u32 bearer_id); |
| int tipc_nl_add_monitor_peer(struct net *net, struct tipc_nl_msg *msg, |
| u32 bearer_id, u32 *prev_node); |
| +void tipc_mon_reinit_self(struct net *net); |
| |
| extern const int tipc_max_domain_size; |
| #endif |
| diff --git a/net/tipc/net.c b/net/tipc/net.c |
| index 85707c185360..2de3cec9929d 100644 |
| --- a/net/tipc/net.c |
| +++ b/net/tipc/net.c |
| @@ -42,6 +42,7 @@ |
| #include "node.h" |
| #include "bcast.h" |
| #include "netlink.h" |
| +#include "monitor.h" |
| |
| /* |
| * The TIPC locking policy is designed to ensure a very fine locking |
| @@ -136,6 +137,7 @@ static void tipc_net_finalize(struct net *net, u32 addr) |
| tipc_set_node_addr(net, addr); |
| tipc_named_reinit(net); |
| tipc_sk_reinit(net); |
| + tipc_mon_reinit_self(net); |
| tipc_nametbl_publish(net, TIPC_CFG_SRV, addr, addr, |
| TIPC_CLUSTER_SCOPE, 0, addr); |
| } |
| -- |
| 2.7.4 |
| |