diff options
author | Dave Airlie <airlied@redhat.com> | 2016-07-26 17:26:29 +1000 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2016-07-26 17:26:29 +1000 |
commit | 5e580523d9128a4d8364fe89d36c38fc7819c8dd (patch) | |
tree | 852fb2427d980830ae8686a91e4ca5873f259ab9 /net/tipc/node.c | |
parent | c11dea5b0290984fa48111957ba3fdc5b3bdae5a (diff) | |
parent | 523d939ef98fd712632d93a5a2b588e477a7565e (diff) |
Backmerge tag 'v4.7' into drm-next
Linux 4.7
As requested by Daniel Vetter as the conflicts were getting messy.
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); } |