svn commit: r252941 - stable/9/sys/netinet
Michael Tuexen
tuexen at FreeBSD.org
Sun Jul 7 12:54:16 UTC 2013
Author: tuexen
Date: Sun Jul 7 12:54:15 2013
New Revision: 252941
URL: http://svnweb.freebsd.org/changeset/base/252941
Log:
MFC r242708, r242709:
Improve PR-SCTP if used in combination with NR-SACK.
Based on work done by Mohammad Rajiullah.
Modified:
stable/9/sys/netinet/sctp_constants.h
stable/9/sys/netinet/sctp_indata.c
stable/9/sys/netinet/sctp_output.c
Directory Properties:
stable/9/sys/ (props changed)
Modified: stable/9/sys/netinet/sctp_constants.h
==============================================================================
--- stable/9/sys/netinet/sctp_constants.h Sun Jul 7 12:50:04 2013 (r252940)
+++ stable/9/sys/netinet/sctp_constants.h Sun Jul 7 12:54:15 2013 (r252941)
@@ -370,6 +370,7 @@ __FBSDID("$FreeBSD$");
#define SCTP_DATAGRAM_ACKED 10010
#define SCTP_DATAGRAM_MARKED 20010
#define SCTP_FORWARD_TSN_SKIP 30010
+#define SCTP_DATAGRAM_NR_MARKED 40010
/* chunk output send from locations */
#define SCTP_OUTPUT_FROM_USR_SEND 0
Modified: stable/9/sys/netinet/sctp_indata.c
==============================================================================
--- stable/9/sys/netinet/sctp_indata.c Sun Jul 7 12:50:04 2013 (r252940)
+++ stable/9/sys/netinet/sctp_indata.c Sun Jul 7 12:54:15 2013 (r252941)
@@ -2975,9 +2975,10 @@ sctp_process_segment_range(struct sctp_t
* All chunks NOT UNSENT fall through here and are marked
* (leave PR-SCTP ones that are to skip alone though)
*/
- if (tp1->sent != SCTP_FORWARD_TSN_SKIP)
+ if ((tp1->sent != SCTP_FORWARD_TSN_SKIP) &&
+ (tp1->sent != SCTP_DATAGRAM_NR_MARKED)) {
tp1->sent = SCTP_DATAGRAM_MARKED;
-
+ }
if (tp1->rec.data.chunk_was_revoked) {
/* deflate the cwnd */
tp1->whoTo->cwnd -= tp1->book_size;
@@ -2985,6 +2986,7 @@ sctp_process_segment_range(struct sctp_t
}
/* NR Sack code here */
if (nr_sacking) {
+ tp1->sent = SCTP_DATAGRAM_NR_MARKED;
if (tp1->data) {
/*
* sa_ignore
@@ -3600,12 +3602,14 @@ sctp_try_advance_peer_ack_point(struct s
}
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;
}
if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_TRY_ADVANCE) {
- if (tp1->sent == SCTP_FORWARD_TSN_SKIP) {
+ if ((tp1->sent == SCTP_FORWARD_TSN_SKIP) ||
+ (tp1->sent == SCTP_DATAGRAM_NR_MARKED)) {
sctp_misc_ints(SCTP_FWD_TSN_CHECK,
asoc->advanced_peer_ack_point,
tp1->rec.data.TSN_seq, 0, 0);
@@ -3653,7 +3657,8 @@ sctp_try_advance_peer_ack_point(struct s
* 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;
Modified: stable/9/sys/netinet/sctp_output.c
==============================================================================
--- stable/9/sys/netinet/sctp_output.c Sun Jul 7 12:50:04 2013 (r252940)
+++ stable/9/sys/netinet/sctp_output.c Sun Jul 7 12:54:15 2013 (r252941)
@@ -10152,7 +10152,8 @@ sctp_fill_in_rest:
unsigned int cnt_of_skipped = 0;
TAILQ_FOREACH(at, &asoc->sent_queue, sctp_next) {
- if (at->sent != SCTP_FORWARD_TSN_SKIP) {
+ if ((at->sent != SCTP_FORWARD_TSN_SKIP) &&
+ (at->sent != SCTP_DATAGRAM_NR_MARKED)) {
/* no more to look at */
break;
}
More information about the svn-src-stable-9
mailing list