aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc
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
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')
-rw-r--r--net/tipc/bearer.c15
-rw-r--r--net/tipc/bearer.h1
-rw-r--r--net/tipc/node.c15
3 files changed, 27 insertions, 4 deletions
diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c
index bf8f05c3eb82..a597708ae381 100644
--- a/net/tipc/bearer.c
+++ b/net/tipc/bearer.c
@@ -330,6 +330,21 @@ static int tipc_reset_bearer(struct net *net, struct tipc_bearer *b)
330 return 0; 330 return 0;
331} 331}
332 332
333/* tipc_bearer_reset_all - reset all links on all bearers
334 */
335void tipc_bearer_reset_all(struct net *net)
336{
337 struct tipc_net *tn = tipc_net(net);
338 struct tipc_bearer *b;
339 int i;
340
341 for (i = 0; i < MAX_BEARERS; i++) {
342 b = rcu_dereference_rtnl(tn->bearer_list[i]);
343 if (b)
344 tipc_reset_bearer(net, b);
345 }
346}
347
333/** 348/**
334 * bearer_disable 349 * bearer_disable
335 * 350 *
diff --git a/net/tipc/bearer.h b/net/tipc/bearer.h
index f686e41b5abb..60e49c3be19c 100644
--- a/net/tipc/bearer.h
+++ b/net/tipc/bearer.h
@@ -198,6 +198,7 @@ void tipc_bearer_add_dest(struct net *net, u32 bearer_id, u32 dest);
198void tipc_bearer_remove_dest(struct net *net, u32 bearer_id, u32 dest); 198void tipc_bearer_remove_dest(struct net *net, u32 bearer_id, u32 dest);
199struct tipc_bearer *tipc_bearer_find(struct net *net, const char *name); 199struct tipc_bearer *tipc_bearer_find(struct net *net, const char *name);
200struct tipc_media *tipc_media_find(const char *name); 200struct tipc_media *tipc_media_find(const char *name);
201void tipc_bearer_reset_all(struct net *net);
201int tipc_bearer_setup(void); 202int tipc_bearer_setup(void);
202void tipc_bearer_cleanup(void); 203void tipc_bearer_cleanup(void);
203void tipc_bearer_stop(struct net *net); 204void tipc_bearer_stop(struct net *net);
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