diff options
Diffstat (limited to 'net/tipc/node.c')
| -rw-r--r-- | net/tipc/node.c | 38 | 
1 files changed, 24 insertions, 14 deletions
diff --git a/net/tipc/node.c b/net/tipc/node.c index 5b44c3041be4..f7069299943f 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c @@ -1,7 +1,7 @@  /*   * net/tipc/node.c: TIPC node management routines   * - * Copyright (c) 2000-2006, 2012 Ericsson AB + * Copyright (c) 2000-2006, 2012-2014, Ericsson AB   * Copyright (c) 2005-2006, 2010-2014, Wind River Systems   * All rights reserved.   * @@ -155,21 +155,25 @@ void tipc_node_link_up(struct tipc_node *n_ptr, struct tipc_link *l_ptr)  	if (!active[0]) {  		active[0] = active[1] = l_ptr;  		node_established_contact(n_ptr); -		return; +		goto exit;  	}  	if (l_ptr->priority < active[0]->priority) {  		pr_info("New link <%s> becomes standby\n", l_ptr->name); -		return; +		goto exit;  	}  	tipc_link_dup_queue_xmit(active[0], l_ptr);  	if (l_ptr->priority == active[0]->priority) {  		active[0] = l_ptr; -		return; +		goto exit;  	}  	pr_info("Old link <%s> becomes standby\n", active[0]->name);  	if (active[1] != active[0])  		pr_info("Old link <%s> becomes standby\n", active[1]->name);  	active[0] = active[1] = l_ptr; +exit: +	/* Leave room for changeover header when returning 'mtu' to users: */ +	n_ptr->act_mtus[0] = active[0]->max_pkt - INT_H_SIZE; +	n_ptr->act_mtus[1] = active[1]->max_pkt - INT_H_SIZE;  }  /** @@ -229,6 +233,19 @@ void tipc_node_link_down(struct tipc_node *n_ptr, struct tipc_link *l_ptr)  		tipc_link_failover_send_queue(l_ptr);  	else  		node_lost_contact(n_ptr); + +	/* Leave room for changeover header when returning 'mtu' to users: */ +	if (active[0]) { +		n_ptr->act_mtus[0] = active[0]->max_pkt - INT_H_SIZE; +		n_ptr->act_mtus[1] = active[1]->max_pkt - INT_H_SIZE; +		return; +	} + +	/* Loopback link went down? No fragmentation needed from now on. */ +	if (n_ptr->addr == tipc_own_addr) { +		n_ptr->act_mtus[0] = MAX_MSG_SIZE; +		n_ptr->act_mtus[1] = MAX_MSG_SIZE; +	}  }  int tipc_node_active_links(struct tipc_node *n_ptr) @@ -457,8 +474,6 @@ int tipc_node_get_linkname(u32 bearer_id, u32 addr, char *linkname, size_t len)  void tipc_node_unlock(struct tipc_node *node)  {  	LIST_HEAD(nsub_list); -	struct tipc_link *link; -	int pkt_sz = 0;  	u32 addr = 0;  	if (likely(!node->action_flags)) { @@ -471,18 +486,13 @@ void tipc_node_unlock(struct tipc_node *node)  		node->action_flags &= ~TIPC_NOTIFY_NODE_DOWN;  	}  	if (node->action_flags & TIPC_NOTIFY_NODE_UP) { -		link = node->active_links[0];  		node->action_flags &= ~TIPC_NOTIFY_NODE_UP; -		if (link) { -			pkt_sz = ((link->max_pkt - INT_H_SIZE) / ITEM_SIZE) * -				  ITEM_SIZE; -			addr = node->addr; -		} +		addr = node->addr;  	}  	spin_unlock_bh(&node->lock);  	if (!list_empty(&nsub_list))  		tipc_nodesub_notify(&nsub_list); -	if (pkt_sz) -		tipc_named_node_up(pkt_sz, addr); +	if (addr) +		tipc_named_node_up(addr);  }  |