aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc/node.c
diff options
context:
space:
mode:
authorJon Paul Maloy <jon.maloy@ericsson.com>2016-07-11 16:08:37 -0400
committerDavid S. Miller <davem@davemloft.net>2016-07-12 01:42:12 -0400
commit1fc07f3e1541cc49cc159beb3fdefc5013570eda (patch)
tree00e709e7385452d902efb63cc36768cffb954de7 /net/tipc/node.c
parenta71eb720355c28eaeb2de0c4d960247c69bb2c6f (diff)
tipc: reset all unicast links when broadcast send link fails
In test situations with many nodes and a heavily stressed system we have observed that the transmission broadcast link may fail due to an excessive number of retransmissions of the same packet. In such situations we need to reset all unicast links to all peers, in order to reset and re-synchronize the broadcast link. In this commit, we add a new function tipc_bearer_reset_all() to be used in such situations. The function scans across all bearers and resets all their pertaining links. Acked-by: Ying Xue <ying.xue@windriver.com> Signed-off-by: Jon Maloy <jon.maloy@ericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/node.c')
-rw-r--r--net/tipc/node.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/net/tipc/node.c b/net/tipc/node.c
index e01e2c71b5a1..23d4761842a0 100644
--- a/net/tipc/node.c
+++ b/net/tipc/node.c
@@ -1297,10 +1297,6 @@ static void tipc_node_bc_rcv(struct net *net, struct sk_buff *skb, int bearer_id
1297 1297
1298 rc = tipc_bcast_rcv(net, be->link, skb); 1298 rc = tipc_bcast_rcv(net, be->link, skb);
1299 1299
1300 /* Broadcast link reset may happen at reassembly failure */
1301 if (rc & TIPC_LINK_DOWN_EVT)
1302 tipc_node_reset_links(n);
1303
1304 /* Broadcast ACKs are sent on a unicast link */ 1300 /* Broadcast ACKs are sent on a unicast link */
1305 if (rc & TIPC_LINK_SND_BC_ACK) { 1301 if (rc & TIPC_LINK_SND_BC_ACK) {
1306 tipc_node_read_lock(n); 1302 tipc_node_read_lock(n);
@@ -1320,6 +1316,17 @@ static void tipc_node_bc_rcv(struct net *net, struct sk_buff *skb, int bearer_id
1320 spin_unlock_bh(&be->inputq2.lock); 1316 spin_unlock_bh(&be->inputq2.lock);
1321 tipc_sk_mcast_rcv(net, &be->arrvq, &be->inputq2); 1317 tipc_sk_mcast_rcv(net, &be->arrvq, &be->inputq2);
1322 } 1318 }
1319
1320 if (rc & TIPC_LINK_DOWN_EVT) {
1321 /* Reception reassembly failure => reset all links to peer */
1322 if (!tipc_link_is_up(be->link))
1323 tipc_node_reset_links(n);
1324
1325 /* Retransmission failure => reset all links to all peers */
1326 if (!tipc_link_is_up(tipc_bc_sndlink(net)))
1327 tipc_bearer_reset_all(net);
1328 }
1329
1323 tipc_node_put(n); 1330 tipc_node_put(n);
1324} 1331}
1325 1332