tipc: fix unexpected link reset due to discovery messages
[platform/kernel/linux-rpi.git] / net / tipc / node.c
index 49ddc48..5e000fd 100644 (file)
@@ -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);
 }