aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc
diff options
context:
space:
mode:
authorJon Paul Maloy <jon.maloy@ericsson.com>2014-01-07 17:02:42 -0500
committerDavid S. Miller <davem@davemloft.net>2014-01-07 18:44:25 -0500
commitb9d4c33935bb5673fa9f721ecf85e5029c847f08 (patch)
treef344976736d65ae68527568c8194e945ae1dc232 /net/tipc
parent170b3927b4c4f6e105964f81ae985fc9772b1f9b (diff)
tipc: remove 'has_redundant_link' flag from STATE link protocol messages
The flag 'has_redundant_link' is defined only in RESET and ACTIVATE protocol messages. Due to an ambiguity in the protocol specification it is currently also transferred in STATE messages. Its value is used to initialize a link state variable, 'permit_changeover', which is used to inhibit futile link failover attempts when it is known that the peer node has no working links at the moment, although the local node may still think it has one. The fact that 'has_redundant_link' incorrectly is read from STATE messages has the effect that 'permit_changeover' sometimes gets a wrong value, and permanently blocks any links from being re-established. Such failures can only occur in in dual-link systems, and are extremely rare. This bug seems to have always been present in the code. Furthermore, since commit b4b5610223f17790419b03eaa962b0e3ecf930d7 ("tipc: Ensure both nodes recognize loss of contact between them"), the 'permit_changeover' field serves no purpose any more. The task of enforcing 'lost contact' cycles at both peer endpoints is now taken by a new mechanism, using the flags WAIT_NODE_DOWN and WAIT_PEER_DOWN in struct tipc_node to abort unnecessary failover attempts. We therefore remove the 'has_redundant_link' flag from STATE messages, as well as the now redundant 'permit_changeover' variable. Signed-off-by: Jon Maloy <jon.maloy@ericsson.com> Reviewed-by: Ying Xue <ying.xue@windriver.com> Reviewed-by: Paul Gortmaker <paul.gortmaker@windriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc')
-rw-r--r--net/tipc/link.c10
-rw-r--r--net/tipc/node.h2
2 files changed, 1 insertions, 11 deletions
diff --git a/net/tipc/link.c b/net/tipc/link.c
index bb48b9685020..9fb0f6b96b45 100644
--- a/net/tipc/link.c
+++ b/net/tipc/link.c
@@ -438,8 +438,7 @@ void tipc_link_reset(struct tipc_link *l_ptr)
438 tipc_node_link_down(l_ptr->owner, l_ptr); 438 tipc_node_link_down(l_ptr->owner, l_ptr);
439 tipc_bearer_remove_dest(l_ptr->b_ptr, l_ptr->addr); 439 tipc_bearer_remove_dest(l_ptr->b_ptr, l_ptr->addr);
440 440
441 if (was_active_link && tipc_node_active_links(l_ptr->owner) && 441 if (was_active_link && tipc_node_active_links(l_ptr->owner)) {
442 l_ptr->owner->permit_changeover) {
443 l_ptr->reset_checkpoint = checkpoint; 442 l_ptr->reset_checkpoint = checkpoint;
444 l_ptr->exp_msg_count = START_CHANGEOVER; 443 l_ptr->exp_msg_count = START_CHANGEOVER;
445 } 444 }
@@ -1838,8 +1837,6 @@ static void link_recv_proto_msg(struct tipc_link *l_ptr, struct sk_buff *buf)
1838 if (tipc_own_addr > msg_prevnode(msg)) 1837 if (tipc_own_addr > msg_prevnode(msg))
1839 l_ptr->b_ptr->net_plane = msg_net_plane(msg); 1838 l_ptr->b_ptr->net_plane = msg_net_plane(msg);
1840 1839
1841 l_ptr->owner->permit_changeover = msg_redundant_link(msg);
1842
1843 switch (msg_type(msg)) { 1840 switch (msg_type(msg)) {
1844 1841
1845 case RESET_MSG: 1842 case RESET_MSG:
@@ -2001,11 +1998,6 @@ void tipc_link_failover_send_queue(struct tipc_link *l_ptr)
2001 if (!tunnel) 1998 if (!tunnel)
2002 return; 1999 return;
2003 2000
2004 if (!l_ptr->owner->permit_changeover) {
2005 pr_warn("%speer did not permit changeover\n", link_co_err);
2006 return;
2007 }
2008
2009 tipc_msg_init(&tunnel_hdr, CHANGEOVER_PROTOCOL, 2001 tipc_msg_init(&tunnel_hdr, CHANGEOVER_PROTOCOL,
2010 ORIGINAL_MSG, INT_H_SIZE, l_ptr->addr); 2002 ORIGINAL_MSG, INT_H_SIZE, l_ptr->addr);
2011 msg_set_bearer_id(&tunnel_hdr, l_ptr->peer_bearer_id); 2003 msg_set_bearer_id(&tunnel_hdr, l_ptr->peer_bearer_id);
diff --git a/net/tipc/node.h b/net/tipc/node.h
index d4bb654c858d..63e2e8ead2fe 100644
--- a/net/tipc/node.h
+++ b/net/tipc/node.h
@@ -64,7 +64,6 @@
64 * @working_links: number of working links to node (both active and standby) 64 * @working_links: number of working links to node (both active and standby)
65 * @block_setup: bit mask of conditions preventing link establishment to node 65 * @block_setup: bit mask of conditions preventing link establishment to node
66 * @link_cnt: number of links to node 66 * @link_cnt: number of links to node
67 * @permit_changeover: non-zero if node has redundant links to this system
68 * @signature: node instance identifier 67 * @signature: node instance identifier
69 * @bclink: broadcast-related info 68 * @bclink: broadcast-related info
70 * @acked: sequence # of last outbound b'cast message acknowledged by node 69 * @acked: sequence # of last outbound b'cast message acknowledged by node
@@ -89,7 +88,6 @@ struct tipc_node {
89 int link_cnt; 88 int link_cnt;
90 int working_links; 89 int working_links;
91 int block_setup; 90 int block_setup;
92 int permit_changeover;
93 u32 signature; 91 u32 signature;
94 struct { 92 struct {
95 u32 acked; 93 u32 acked;