diff options
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 | |||
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 | ||