aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYing Xue <ying.xue@windriver.com>2015-03-25 06:09:40 -0400
committerDavid S. Miller <davem@davemloft.net>2015-03-25 11:43:32 -0400
commitbc14b8d6a98eb0747126cd517b468148b9e1c7ac (patch)
tree188f60c5051b38a7d32a072b88c90767b5f39f91
parent358e048d670a0feeb030effd1a3611cc6288fa70 (diff)
tipc: fix a link reset issue due to retransmission failures
When a node joins a cluster while we are transmitting a fragment stream over the broadcast link, it's missing the preceding fragments needed to build a meaningful message. As a result, the node has to drop it. However, as the fragment message is not acknowledged to its sender before it's dropped, it accidentally causes link reset of retransmission failure on the node. Reported-by: Erik Hugne <erik.hugne@ericsson.com> Signed-off-by: Ying Xue <ying.xue@windriver.com> Reviewed-by: Erik Hugne <erik.hugne@ericsson.com> Tested-by: Erik Hugne <erik.hugne@ericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--net/tipc/bcast.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c
index 5aff0844d4d3..52307397e0b1 100644
--- a/net/tipc/bcast.c
+++ b/net/tipc/bcast.c
@@ -523,11 +523,13 @@ receive:
523 tipc_bclink_unlock(net); 523 tipc_bclink_unlock(net);
524 tipc_node_unlock(node); 524 tipc_node_unlock(node);
525 } else if (msg_user(msg) == MSG_FRAGMENTER) { 525 } else if (msg_user(msg) == MSG_FRAGMENTER) {
526 tipc_buf_append(&node->bclink.reasm_buf, &buf);
527 if (unlikely(!buf && !node->bclink.reasm_buf))
528 goto unlock;
529 tipc_bclink_lock(net); 526 tipc_bclink_lock(net);
530 bclink_accept_pkt(node, seqno); 527 bclink_accept_pkt(node, seqno);
528 tipc_buf_append(&node->bclink.reasm_buf, &buf);
529 if (unlikely(!buf && !node->bclink.reasm_buf)) {
530 tipc_bclink_unlock(net);
531 goto unlock;
532 }
531 bcl->stats.recv_fragments++; 533 bcl->stats.recv_fragments++;
532 if (buf) { 534 if (buf) {
533 bcl->stats.recv_fragmented++; 535 bcl->stats.recv_fragmented++;