diff options
| author | Lee A. Roberts <lee.roberts@hp.com> | 2013-02-28 04:37:28 +0000 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2013-02-28 15:34:26 -0500 | 
| commit | e67f85ecd83de66d4f25f2e0f90bb0d01a52ddd8 (patch) | |
| tree | 9d9fbfbefad6f9aecfa0200d52c26b7aa5115c3b /net/sctp/ulpqueue.c | |
| parent | 70fc69bc5a54d9776ace7c99d46eb533f8fb6e89 (diff) | |
| download | olio-linux-3.10-e67f85ecd83de66d4f25f2e0f90bb0d01a52ddd8.tar.xz olio-linux-3.10-e67f85ecd83de66d4f25f2e0f90bb0d01a52ddd8.zip  | |
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/sctp/ulpqueue.c')
| -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 ada17464b65..63afddcbcd2 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)  |