summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorLee A. Roberts <lee.roberts@hp.com>2013-02-28 08:37:28 +0400
committerDavid S. Miller <davem@davemloft.net>2013-03-01 00:34:26 +0400
commite67f85ecd83de66d4f25f2e0f90bb0d01a52ddd8 (patch)
tree9d9fbfbefad6f9aecfa0200d52c26b7aa5115c3b /net
parent70fc69bc5a54d9776ace7c99d46eb533f8fb6e89 (diff)
downloadlinux-e67f85ecd83de66d4f25f2e0f90bb0d01a52ddd8.tar.xz
sctp: fix association hangs due to reneging packets below the cumulative TSN ACK point
In sctp_ulpq_renege_list(), do not renege packets below the cumulative TSN ACK point. Signed-off-by: Lee A. Roberts <lee.roberts@hp.com> Acked-by: Vlad Yasevich <vyasevich@gmail.com> Acked-by: Neil Horman <nhorman@tuxdriver.com>
Diffstat (limited to 'net')
-rw-r--r--net/sctp/ulpqueue.c9
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,
tsnmap = &ulpq->asoc->peer.tsn_map;
- while ((skb = __skb_dequeue_tail(list)) != NULL) {
- freed += skb_headlen(skb);
+ while ((skb = skb_peek_tail(list)) != NULL) {
event = sctp_skb2event(skb);
tsn = event->tsn;
+ /* Don't renege below the Cumulative TSN ACK Point. */
+ if (TSN_lte(tsn, sctp_tsnmap_get_ctsn(tsnmap)))
+ break;
+
+ __skb_unlink(skb, list);
+ freed += skb_headlen(skb);
sctp_ulpevent_free(event);
sctp_tsnmap_renege(tsnmap, tsn);
if (freed >= needed)