diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/sctp/ulpqueue.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/net/sctp/ulpqueue.c b/net/sctp/ulpqueue.c index ada17464b65b..63afddcbcd2c 100644 --- a/net/sctp/ulpqueue.c +++ b/net/sctp/ulpqueue.c | |||
@@ -969,11 +969,16 @@ static __u16 sctp_ulpq_renege_list(struct sctp_ulpq *ulpq, | |||
969 | 969 | ||
970 | tsnmap = &ulpq->asoc->peer.tsn_map; | 970 | tsnmap = &ulpq->asoc->peer.tsn_map; |
971 | 971 | ||
972 | while ((skb = __skb_dequeue_tail(list)) != NULL) { | 972 | while ((skb = skb_peek_tail(list)) != NULL) { |
973 | freed += skb_headlen(skb); | ||
974 | event = sctp_skb2event(skb); | 973 | event = sctp_skb2event(skb); |
975 | tsn = event->tsn; | 974 | tsn = event->tsn; |
976 | 975 | ||
976 | /* Don't renege below the Cumulative TSN ACK Point. */ | ||
977 | if (TSN_lte(tsn, sctp_tsnmap_get_ctsn(tsnmap))) | ||
978 | break; | ||
979 | |||
980 | __skb_unlink(skb, list); | ||
981 | freed += skb_headlen(skb); | ||
977 | sctp_ulpevent_free(event); | 982 | sctp_ulpevent_free(event); |
978 | sctp_tsnmap_renege(tsnmap, tsn); | 983 | sctp_tsnmap_renege(tsnmap, tsn); |
979 | if (freed >= needed) | 984 | if (freed >= needed) |