|
|
|
[PATCH 1/4] dccp: Prevent Congestion Window > Sequence Window | |
| [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] | |
Add a check to prevent CCID 2 from increasing the Congestion Window
greater than the Sequence Window. Doing so causes useless Syncs and
drops in throughput.
Also add code to adjust the sequence window to be about 5 times the
number of packets in the network (RFC 4340 7.5.2) and to adjust the Ack
Ratio so that the remote sequence window will hold about 5 times the
number of packets in the network.
---
Signed-off-by: Samuel Jero
diff --git a/net/dccp/ccids/ccid2.c b/net/dccp/ccids/ccid2.c
index 8f35c36..b70ed1d 100644
--- a/net/dccp/ccids/ccid2.c
+++ b/net/dccp/ccids/ccid2.c
@@ -106,6 +106,27 @@ static void ccid2_change_l_ack_ratio(struct sock *sk, u32 val)
ccid2_pr_debug("changing local ack ratio to %u\n", val);
dp->dccps_l_ack_ratio = val;
+ dccp_feat_signal_nn_change(sk, DCCPF_ACK_RATIO, val);
+ return;
+}
+
+static void ccid2_change_l_seq_window(struct sock *sk, u64 val)
+{
+ struct dccp_sock *dp = dccp_sk(sk);
+
+ if (val < DCCPF_SEQ_WMIN)
+ val = DCCPF_SEQ_WMIN;
+
+ if (val > DCCPF_SEQ_WMAX)
+ val = DCCPF_SEQ_WMAX;
+
+ if (val == dp->dccps_l_seq_win)
+ return;
+
+ dp->dccps_l_seq_win = val;
+ dccp_feat_signal_nn_change(sk,
+ DCCPF_SEQUENCE_WINDOW, dp->dccps_l_seq_win);
+ return;
}
static void ccid2_hc_tx_rto_expire(unsigned long data)
@@ -418,17 +438,33 @@ static void ccid2_new_ack(struct sock *sk, struct ccid2_seq *seqp,
unsigned int *maxincr)
{
struct ccid2_hc_tx_sock *hc = ccid2_hc_tx_sk(sk);
-
- if (hc->tx_cwnd < hc->tx_ssthresh) {
- if (*maxincr > 0 && ++hc->tx_packets_acked == 2) {
- hc->tx_cwnd += 1;
- *maxincr -= 1;
- hc->tx_packets_acked = 0;
+ struct dccp_sock *dp = dccp_sk(sk);
+ int r_seq_used = hc->tx_cwnd/dp->dccps_l_ack_ratio;
+
+ if ((hc->tx_cwnd < dp->dccps_l_seq_win)
+ && (r_seq_used < dp->dccps_r_seq_win)) {
+ if (hc->tx_cwnd < hc->tx_ssthresh) {
+ if (*maxincr > 0 && ++hc->tx_packets_acked == 2) {
+ hc->tx_cwnd += 1;
+ *maxincr -= 1;
+ hc->tx_packets_acked = 0;
+ }
+ } else if (++hc->tx_packets_acked >= hc->tx_cwnd) {
+ hc->tx_cwnd += 1;
+ hc->tx_packets_acked = 0;
}
- } else if (++hc->tx_packets_acked >= hc->tx_cwnd) {
- hc->tx_cwnd += 1;
- hc->tx_packets_acked = 0;
}
+
+ if (r_seq_used*5 >= dp->dccps_r_seq_win)
+ ccid2_change_l_ack_ratio(sk, dp->dccps_l_ack_ratio*2);
+ else if (r_seq_used*5 < (dp->dccps_r_seq_win/2))
+ ccid2_change_l_ack_ratio(sk, dp->dccps_l_ack_ratio/2);
+
+ if (hc->tx_cwnd*5 >= dp->dccps_l_seq_win)
+ ccid2_change_l_seq_window(sk, dp->dccps_l_seq_win*2);
+ else if (hc->tx_cwnd*5 < (dp->dccps_l_seq_win/2))
+ ccid2_change_l_seq_window(sk, dp->dccps_l_seq_win/2);
+
/*
* FIXME: RTT is sampled several times per acknowledgment (for each
* entry in the Ack Vector), instead of once per Ack (as in TCP SACK).
Attachment:
signature.asc
Description: This is a digitally signed message part
![]() |