diff options
| author | David S. Miller <davem@davemloft.net> | 2016-07-11 22:42:13 -0700 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2016-07-11 22:42:13 -0700 |
| commit | ce9a4f316d1240158063c54ddea1628926cb4553 (patch) | |
| tree | 00e709e7385452d902efb63cc36768cffb954de7 /net/tipc/node.c | |
| parent | 34ee32c9a5696247be405bb0c21f3d1fc6cb5729 (diff) | |
| parent | 1fc07f3e1541cc49cc159beb3fdefc5013570eda (diff) | |
Merge branch 'tipc-fixes'
Jon Maloy says:
====================
tipc: three small fixes
Fixes for some broadcast link problems that may occur in large systems.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/node.c')
| -rw-r--r-- | net/tipc/node.c | 15 |
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 rc = tipc_bcast_rcv(net, be->link, skb); - /* Broadcast link reset may happen at reassembly failure */ - if (rc & TIPC_LINK_DOWN_EVT) - tipc_node_reset_links(n); - /* Broadcast ACKs are sent on a unicast link */ if (rc & TIPC_LINK_SND_BC_ACK) { 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 spin_unlock_bh(&be->inputq2.lock); tipc_sk_mcast_rcv(net, &be->arrvq, &be->inputq2); } + + if (rc & TIPC_LINK_DOWN_EVT) { + /* Reception reassembly failure => reset all links to peer */ + if (!tipc_link_is_up(be->link)) + tipc_node_reset_links(n); + + /* Retransmission failure => reset all links to all peers */ + if (!tipc_link_is_up(tipc_bc_sndlink(net))) + tipc_bearer_reset_all(net); + } + tipc_node_put(n); } |
