summaryrefslogtreecommitdiffstats
path: root/sys/netinet/sctp_indata.c
diff options
context:
space:
mode:
authortuexen <tuexen@FreeBSD.org>2012-11-07 20:59:00 +0000
committertuexen <tuexen@FreeBSD.org>2012-11-07 20:59:00 +0000
commit5e2e6e07537790166e0b1b09b9ddaa0ea66b9004 (patch)
tree19c5bbdd91127e308954b6a3eb4912efabf25a50 /sys/netinet/sctp_indata.c
parent5880bb21a70755ef8bba0b13147f3d963a9b6e1c (diff)
downloadFreeBSD-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.c7
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;
OpenPOWER on IntegriCloud