sctp: fix association hangs due to reneging packets below the cumulative TSN ACK...
authorLee A. Roberts <lee.roberts@hp.com>
Thu, 28 Feb 2013 04:37:28 +0000 (04:37 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 28 Feb 2013 20:34:26 +0000 (15:34 -0500)
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>
net/sctp/ulpqueue.c

index ada1746..63afddc 100644 (file)
@@ -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)