diff options
Diffstat (limited to 'net/tipc/bcast.c')
-rw-r--r-- | net/tipc/bcast.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c index 716de1ac6cb5..0d4402587fdf 100644 --- a/net/tipc/bcast.c +++ b/net/tipc/bcast.c | |||
@@ -480,18 +480,24 @@ receive: | |||
480 | tipc_node_unlock(node); | 480 | tipc_node_unlock(node); |
481 | tipc_link_recv_bundle(buf); | 481 | tipc_link_recv_bundle(buf); |
482 | } else if (msg_user(msg) == MSG_FRAGMENTER) { | 482 | } else if (msg_user(msg) == MSG_FRAGMENTER) { |
483 | int ret = tipc_link_recv_fragment(&node->bclink.defragm, | 483 | int ret; |
484 | &buf, &msg); | 484 | ret = tipc_link_recv_fragment(&node->bclink.reasm_head, |
485 | if (ret < 0) | 485 | &node->bclink.reasm_tail, |
486 | &buf); | ||
487 | if (ret == LINK_REASM_ERROR) | ||
486 | goto unlock; | 488 | goto unlock; |
487 | spin_lock_bh(&bc_lock); | 489 | spin_lock_bh(&bc_lock); |
488 | bclink_accept_pkt(node, seqno); | 490 | bclink_accept_pkt(node, seqno); |
489 | bcl->stats.recv_fragments++; | 491 | bcl->stats.recv_fragments++; |
490 | if (ret > 0) | 492 | if (ret == LINK_REASM_COMPLETE) { |
491 | bcl->stats.recv_fragmented++; | 493 | bcl->stats.recv_fragmented++; |
494 | /* Point msg to inner header */ | ||
495 | msg = buf_msg(buf); | ||
496 | spin_unlock_bh(&bc_lock); | ||
497 | goto receive; | ||
498 | } | ||
492 | spin_unlock_bh(&bc_lock); | 499 | spin_unlock_bh(&bc_lock); |
493 | tipc_node_unlock(node); | 500 | tipc_node_unlock(node); |
494 | tipc_net_route_msg(buf); | ||
495 | } else if (msg_user(msg) == NAME_DISTRIBUTOR) { | 501 | } else if (msg_user(msg) == NAME_DISTRIBUTOR) { |
496 | spin_lock_bh(&bc_lock); | 502 | spin_lock_bh(&bc_lock); |
497 | bclink_accept_pkt(node, seqno); | 503 | bclink_accept_pkt(node, seqno); |