diff options
author | tuexen <tuexen@FreeBSD.org> | 2012-11-07 20:59:00 +0000 |
---|---|---|
committer | tuexen <tuexen@FreeBSD.org> | 2012-11-07 20:59:00 +0000 |
commit | 5e2e6e07537790166e0b1b09b9ddaa0ea66b9004 (patch) | |
tree | 19c5bbdd91127e308954b6a3eb4912efabf25a50 /sys/netinet/sctp_indata.c | |
parent | 5880bb21a70755ef8bba0b13147f3d963a9b6e1c (diff) | |
download | FreeBSD-src-5e2e6e07537790166e0b1b09b9ddaa0ea66b9004.zip FreeBSD-src-5e2e6e07537790166e0b1b09b9ddaa0ea66b9004.tar.gz |
Improve PR-SCTP if used in combination with NR-SACK.
Based on work done by Mohammad Rajiullah.
MFC after: 1 week
Diffstat (limited to 'sys/netinet/sctp_indata.c')
-rw-r--r-- | sys/netinet/sctp_indata.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/sys/netinet/sctp_indata.c b/sys/netinet/sctp_indata.c index ac776a8..c827da1 100644 --- a/sys/netinet/sctp_indata.c +++ b/sys/netinet/sctp_indata.c @@ -2985,6 +2985,7 @@ sctp_process_segment_range(struct sctp_tcb *stcb, struct sctp_tmit_chunk **p_tp1 } /* NR Sack code here */ if (nr_sacking) { + tp1->sent = SCTP_DATAGRAM_NR_MARKED; if (tp1->data) { /* * sa_ignore @@ -3600,7 +3601,8 @@ sctp_try_advance_peer_ack_point(struct sctp_tcb *stcb, } TAILQ_FOREACH_SAFE(tp1, &asoc->sent_queue, sctp_next, tp2) { if (tp1->sent != SCTP_FORWARD_TSN_SKIP && - tp1->sent != SCTP_DATAGRAM_RESEND) { + tp1->sent != SCTP_DATAGRAM_RESEND && + tp1->sent != SCTP_DATAGRAM_NR_MARKED) { /* no chance to advance, out of here */ break; } @@ -3653,7 +3655,8 @@ sctp_try_advance_peer_ack_point(struct sctp_tcb *stcb, * the chunk, advance our peer ack point and we can check * the next chunk. */ - if (tp1->sent == SCTP_FORWARD_TSN_SKIP) { + if ((tp1->sent == SCTP_FORWARD_TSN_SKIP) || + (tp1->sent == SCTP_DATAGRAM_NR_MARKED)) { /* advance PeerAckPoint goes forward */ if (SCTP_TSN_GT(tp1->rec.data.TSN_seq, asoc->advanced_peer_ack_point)) { asoc->advanced_peer_ack_point = tp1->rec.data.TSN_seq; |