diff options
Diffstat (limited to 'net/sctp/stream_interleave.c')
-rw-r--r-- | net/sctp/stream_interleave.c | 16 |
1 files changed, 6 insertions, 10 deletions
diff --git a/net/sctp/stream_interleave.c b/net/sctp/stream_interleave.c index 8c7cf8f08711..d3764c181299 100644 --- a/net/sctp/stream_interleave.c +++ b/net/sctp/stream_interleave.c | |||
@@ -3,7 +3,8 @@ | |||
3 | * | 3 | * |
4 | * This file is part of the SCTP kernel implementation | 4 | * This file is part of the SCTP kernel implementation |
5 | * | 5 | * |
6 | * These functions manipulate sctp stream queue/scheduling. | 6 | * These functions implement sctp stream message interleaving, mostly |
7 | * including I-DATA and I-FORWARD-TSN chunks process. | ||
7 | * | 8 | * |
8 | * This SCTP implementation is free software; | 9 | * This SCTP implementation is free software; |
9 | * you can redistribute it and/or modify it under the terms of | 10 | * you can redistribute it and/or modify it under the terms of |
@@ -954,12 +955,8 @@ static void sctp_renege_events(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk, | |||
954 | __u32 freed = 0; | 955 | __u32 freed = 0; |
955 | __u16 needed; | 956 | __u16 needed; |
956 | 957 | ||
957 | if (chunk) { | 958 | needed = ntohs(chunk->chunk_hdr->length) - |
958 | needed = ntohs(chunk->chunk_hdr->length); | 959 | sizeof(struct sctp_idata_chunk); |
959 | needed -= sizeof(struct sctp_idata_chunk); | ||
960 | } else { | ||
961 | needed = SCTP_DEFAULT_MAXWINDOW; | ||
962 | } | ||
963 | 960 | ||
964 | if (skb_queue_empty(&asoc->base.sk->sk_receive_queue)) { | 961 | if (skb_queue_empty(&asoc->base.sk->sk_receive_queue)) { |
965 | freed = sctp_ulpq_renege_list(ulpq, &ulpq->lobby, needed); | 962 | freed = sctp_ulpq_renege_list(ulpq, &ulpq->lobby, needed); |
@@ -971,9 +968,8 @@ static void sctp_renege_events(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk, | |||
971 | needed); | 968 | needed); |
972 | } | 969 | } |
973 | 970 | ||
974 | if (chunk && freed >= needed) | 971 | if (freed >= needed && sctp_ulpevent_idata(ulpq, chunk, gfp) <= 0) |
975 | if (sctp_ulpevent_idata(ulpq, chunk, gfp) <= 0) | 972 | sctp_intl_start_pd(ulpq, gfp); |
976 | sctp_intl_start_pd(ulpq, gfp); | ||
977 | 973 | ||
978 | sk_mem_reclaim(asoc->base.sk); | 974 | sk_mem_reclaim(asoc->base.sk); |
979 | } | 975 | } |