diff options
Diffstat (limited to 'net/tipc/node.c')
| -rw-r--r-- | net/tipc/node.c | 14 | 
1 files changed, 13 insertions, 1 deletions
| diff --git a/net/tipc/node.c b/net/tipc/node.c index 68014f1b6976..2afc4f8c37a7 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c @@ -111,6 +111,7 @@ struct tipc_node {  	int action_flags;  	struct list_head list;  	int state; +	bool failover_sent;  	u16 sync_point;  	int link_cnt;  	u16 working_links; @@ -680,6 +681,7 @@ static void __tipc_node_link_up(struct tipc_node *n, int bearer_id,  		*slot0 = bearer_id;  		*slot1 = bearer_id;  		tipc_node_fsm_evt(n, SELF_ESTABL_CONTACT_EVT); +		n->failover_sent = false;  		n->action_flags |= TIPC_NOTIFY_NODE_UP;  		tipc_link_set_active(nl, true);  		tipc_bcast_add_peer(n->net, nl, xmitq); @@ -911,6 +913,7 @@ void tipc_node_check_dest(struct net *net, u32 addr,  	bool reset = true;  	char *if_name;  	unsigned long intv; +	u16 session;  	*dupl_addr = false;  	*respond = false; @@ -997,9 +1000,10 @@ void tipc_node_check_dest(struct net *net, u32 addr,  			goto exit;  		if_name = strchr(b->name, ':') + 1; +		get_random_bytes(&session, sizeof(u16));  		if (!tipc_link_create(net, if_name, b->identity, b->tolerance,  				      b->net_plane, b->mtu, b->priority, -				      b->window, mod(tipc_net(net)->random), +				      b->window, session,  				      tipc_own_addr(net), addr, peer_id,  				      n->capabilities,  				      tipc_bc_sndlink(n->net), n->bc_entry.link, @@ -1615,6 +1619,14 @@ static bool tipc_node_check_state(struct tipc_node *n, struct sk_buff *skb,  			tipc_skb_queue_splice_tail_init(tipc_link_inputq(pl),  							tipc_link_inputq(l));  		} +		/* If parallel link was already down, and this happened before +		 * the tunnel link came up, FAILOVER was never sent. Ensure that +		 * FAILOVER is sent to get peer out of NODE_FAILINGOVER state. +		 */ +		if (n->state != NODE_FAILINGOVER && !n->failover_sent) { +			tipc_link_create_dummy_tnl_msg(l, xmitq); +			n->failover_sent = true; +		}  		/* If pkts arrive out of order, use lowest calculated syncpt */  		if (less(syncpt, n->sync_point))  			n->sync_point = syncpt; |