Commit 59b80802 authored by Gerrit Renker's avatar Gerrit Renker Committed by David S. Miller

dccp: make implementation of Syn-RTT symmetric

This patch is thanks to Andre Noll who reported the issue and helped testing.

The Syn-RTT sampled during the initial handshake currently only works for
the client sending the DCCP-Request. TFRC penalizes the absence of an RTT
sample with a very slow initial speed (1 packet per second), which delays
slow-start significantly, resulting in sluggish performance.

This patch mirrors the "Syn RTT" principle by adding a timestamp also onto
the DCCP-Response, producing an RTT sample  when the (Data)Ack completing
the handshake arrives.

Also changed the documentation to 'TFRC' since Syn RTTs are also used by CCID-4.
Signed-off-by: default avatarGerrit Renker <gerrit@erg.abdn.ac.uk>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a7d13fbf
...@@ -430,7 +430,7 @@ static int dccp_rcv_request_sent_state_process(struct sock *sk, ...@@ -430,7 +430,7 @@ static int dccp_rcv_request_sent_state_process(struct sock *sk,
if (dccp_parse_options(sk, NULL, skb)) if (dccp_parse_options(sk, NULL, skb))
return 1; return 1;
/* Obtain usec RTT sample from SYN exchange (used by CCID 3) */ /* Obtain usec RTT sample from SYN exchange (used by TFRC). */
if (likely(dp->dccps_options_received.dccpor_timestamp_echo)) if (likely(dp->dccps_options_received.dccpor_timestamp_echo))
dp->dccps_syn_rtt = dccp_sample_rtt(sk, 10 * (tstamp - dp->dccps_syn_rtt = dccp_sample_rtt(sk, 10 * (tstamp -
dp->dccps_options_received.dccpor_timestamp_echo)); dp->dccps_options_received.dccpor_timestamp_echo));
...@@ -535,6 +535,8 @@ static int dccp_rcv_respond_partopen_state_process(struct sock *sk, ...@@ -535,6 +535,8 @@ static int dccp_rcv_respond_partopen_state_process(struct sock *sk,
const struct dccp_hdr *dh, const struct dccp_hdr *dh,
const unsigned len) const unsigned len)
{ {
struct dccp_sock *dp = dccp_sk(sk);
u32 sample = dp->dccps_options_received.dccpor_timestamp_echo;
int queued = 0; int queued = 0;
switch (dh->dccph_type) { switch (dh->dccph_type) {
...@@ -559,7 +561,14 @@ static int dccp_rcv_respond_partopen_state_process(struct sock *sk, ...@@ -559,7 +561,14 @@ static int dccp_rcv_respond_partopen_state_process(struct sock *sk,
if (sk->sk_state == DCCP_PARTOPEN) if (sk->sk_state == DCCP_PARTOPEN)
inet_csk_clear_xmit_timer(sk, ICSK_TIME_DACK); inet_csk_clear_xmit_timer(sk, ICSK_TIME_DACK);
dccp_sk(sk)->dccps_osr = DCCP_SKB_CB(skb)->dccpd_seq; /* Obtain usec RTT sample from SYN exchange (used by TFRC). */
if (likely(sample)) {
long delta = dccp_timestamp() - sample;
dp->dccps_syn_rtt = dccp_sample_rtt(sk, 10 * delta);
}
dp->dccps_osr = DCCP_SKB_CB(skb)->dccpd_seq;
dccp_set_state(sk, DCCP_OPEN); dccp_set_state(sk, DCCP_OPEN);
if (dh->dccph_type == DCCP_PKT_DATAACK || if (dh->dccph_type == DCCP_PKT_DATAACK ||
......
...@@ -529,7 +529,7 @@ int dccp_insert_options(struct sock *sk, struct sk_buff *skb) ...@@ -529,7 +529,7 @@ int dccp_insert_options(struct sock *sk, struct sk_buff *skb)
if (DCCP_SKB_CB(skb)->dccpd_type == DCCP_PKT_REQUEST) { if (DCCP_SKB_CB(skb)->dccpd_type == DCCP_PKT_REQUEST) {
/* /*
* Obtain RTT sample from Request/Response exchange. * Obtain RTT sample from Request/Response exchange.
* This is currently used in CCID 3 initialisation. * This is currently used for TFRC initialisation.
*/ */
if (dccp_insert_option_timestamp(skb)) if (dccp_insert_option_timestamp(skb))
return -1; return -1;
...@@ -562,6 +562,10 @@ int dccp_insert_options_rsk(struct dccp_request_sock *dreq, struct sk_buff *skb) ...@@ -562,6 +562,10 @@ int dccp_insert_options_rsk(struct dccp_request_sock *dreq, struct sk_buff *skb)
if (dccp_feat_insert_opts(NULL, dreq, skb)) if (dccp_feat_insert_opts(NULL, dreq, skb))
return -1; return -1;
/* Obtain RTT sample from Response/Ack exchange (used by TFRC). */
if (dccp_insert_option_timestamp(skb))
return -1;
if (dreq->dreq_timestamp_echo != 0 && if (dreq->dreq_timestamp_echo != 0 &&
dccp_insert_option_timestamp_echo(NULL, dreq, skb)) dccp_insert_option_timestamp_echo(NULL, dreq, skb))
return -1; return -1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment