|
From: Jon M. <jm...@re...> - 2023-01-04 17:00:27
|
On 1/3/23 21:42, Tung Nguyen wrote:
> This unexpected behavior is observed:
>
> node 1 | node 2
> ------ | ------
> link is established | link is established
> reboot | link is reset
> up | send discovery message
> receive discovery message |
> link is established | link is established
> send discovery message |
> | receive discovery message
> | link is reset (unexpected)
> | send reset message
> link is reset |
>
> It is due to delayed re-discovery as described in function
> tipc_node_check_dest(): "this link endpoint has already reset
> and re-established contact with the peer, before receiving a
> discovery message from that node."
>
> However, commit 598411d70f85 has changed the condition for calling
> tipc_node_link_down() which was the acceptance of new media address.
>
> This commit fixes this by restoring the old and correct behavior.
>
> Fixes: 598411d70f85 ("tipc: make link implementation independent from struct tipc_bearer")
> Signed-off-by: Tung Nguyen <tun...@de...>
> ---
> net/tipc/node.c | 12 ++++++++----
> 1 file changed, 8 insertions(+), 4 deletions(-)
>
> diff --git a/net/tipc/node.c b/net/tipc/node.c
> index 49ddc484c4fe..5e000fde8067 100644
> --- a/net/tipc/node.c
> +++ b/net/tipc/node.c
> @@ -1179,8 +1179,9 @@ void tipc_node_check_dest(struct net *net, u32 addr,
> bool addr_match = false;
> bool sign_match = false;
> bool link_up = false;
> + bool link_is_reset = false;
> bool accept_addr = false;
> - bool reset = true;
> + bool reset = false;
> char *if_name;
> unsigned long intv;
> u16 session;
> @@ -1200,14 +1201,14 @@ void tipc_node_check_dest(struct net *net, u32 addr,
> /* Prepare to validate requesting node's signature and media address */
> l = le->link;
> link_up = l && tipc_link_is_up(l);
> + link_is_reset = l && tipc_link_is_reset(l);
> addr_match = l && !memcmp(&le->maddr, maddr, sizeof(*maddr));
> sign_match = (signature == n->signature);
>
> /* These three flags give us eight permutations: */
>
> if (sign_match && addr_match && link_up) {
> - /* All is fine. Do nothing. */
> - reset = false;
> + /* All is fine. Ignore requests. */
> /* Peer node is not a container/local namespace */
> if (!n->peer_hash_mix)
> n->peer_hash_mix = hash_mixes;
> @@ -1232,6 +1233,7 @@ void tipc_node_check_dest(struct net *net, u32 addr,
> */
> accept_addr = true;
> *respond = true;
> + reset = true;
> } else if (!sign_match && addr_match && link_up) {
> /* Peer node rebooted. Two possibilities:
> * - Delayed re-discovery; this link endpoint has already
> @@ -1263,6 +1265,7 @@ void tipc_node_check_dest(struct net *net, u32 addr,
> n->signature = signature;
> accept_addr = true;
> *respond = true;
> + reset = true;
> }
>
> if (!accept_addr)
> @@ -1291,6 +1294,7 @@ void tipc_node_check_dest(struct net *net, u32 addr,
> tipc_link_fsm_evt(l, LINK_RESET_EVT);
> if (n->state == NODE_FAILINGOVER)
> tipc_link_fsm_evt(l, LINK_FAILOVER_BEGIN_EVT);
> + link_is_reset = tipc_link_is_reset(l);
> le->link = l;
> n->link_cnt++;
> tipc_node_calculate_timer(n, l);
> @@ -1303,7 +1307,7 @@ void tipc_node_check_dest(struct net *net, u32 addr,
> memcpy(&le->maddr, maddr, sizeof(*maddr));
> exit:
> tipc_node_write_unlock(n);
> - if (reset && l && !tipc_link_is_reset(l))
> + if (reset && !link_is_reset)
> tipc_node_link_down(n, b->identity, false);
> tipc_node_put(n);
> }
Acked-by: Jon Maloy <jm...@re...>
Nice job!
|