diff options
author | Gerrit Renker <gerrit@erg.abdn.ac.uk> | 2010-06-21 21:14:35 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-06-26 00:33:15 -0400 |
commit | 59b80802a8a18b64d38b51aa168253684b2649d5 (patch) | |
tree | b6be92f705d00796733e03e43041605b74d0ce5f | |
parent | a7d13fbf85375698879d16f118af77fbfcc2de44 (diff) |
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: Gerrit Renker <gerrit@erg.abdn.ac.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/dccp/input.c | 13 | ||||
-rw-r--r-- | net/dccp/options.c | 6 |
2 files changed, 16 insertions, 3 deletions
diff --git a/net/dccp/input.c b/net/dccp/input.c index 6beb6a7d6fba..10c957a88f4f 100644 --- a/net/dccp/input.c +++ b/net/dccp/input.c | |||
@@ -430,7 +430,7 @@ static int dccp_rcv_request_sent_state_process(struct sock *sk, | |||
430 | if (dccp_parse_options(sk, NULL, skb)) | 430 | if (dccp_parse_options(sk, NULL, skb)) |
431 | return 1; | 431 | return 1; |
432 | 432 | ||
433 | /* Obtain usec RTT sample from SYN exchange (used by CCID 3) */ | 433 | /* Obtain usec RTT sample from SYN exchange (used by TFRC). */ |
434 | if (likely(dp->dccps_options_received.dccpor_timestamp_echo)) | 434 | if (likely(dp->dccps_options_received.dccpor_timestamp_echo)) |
435 | dp->dccps_syn_rtt = dccp_sample_rtt(sk, 10 * (tstamp - | 435 | dp->dccps_syn_rtt = dccp_sample_rtt(sk, 10 * (tstamp - |
436 | dp->dccps_options_received.dccpor_timestamp_echo)); | 436 | dp->dccps_options_received.dccpor_timestamp_echo)); |
@@ -535,6 +535,8 @@ static int dccp_rcv_respond_partopen_state_process(struct sock *sk, | |||
535 | const struct dccp_hdr *dh, | 535 | const struct dccp_hdr *dh, |
536 | const unsigned len) | 536 | const unsigned len) |
537 | { | 537 | { |
538 | struct dccp_sock *dp = dccp_sk(sk); | ||
539 | u32 sample = dp->dccps_options_received.dccpor_timestamp_echo; | ||
538 | int queued = 0; | 540 | int queued = 0; |
539 | 541 | ||
540 | switch (dh->dccph_type) { | 542 | switch (dh->dccph_type) { |
@@ -559,7 +561,14 @@ static int dccp_rcv_respond_partopen_state_process(struct sock *sk, | |||
559 | if (sk->sk_state == DCCP_PARTOPEN) | 561 | if (sk->sk_state == DCCP_PARTOPEN) |
560 | inet_csk_clear_xmit_timer(sk, ICSK_TIME_DACK); | 562 | inet_csk_clear_xmit_timer(sk, ICSK_TIME_DACK); |
561 | 563 | ||
562 | dccp_sk(sk)->dccps_osr = DCCP_SKB_CB(skb)->dccpd_seq; | 564 | /* Obtain usec RTT sample from SYN exchange (used by TFRC). */ |
565 | if (likely(sample)) { | ||
566 | long delta = dccp_timestamp() - sample; | ||
567 | |||
568 | dp->dccps_syn_rtt = dccp_sample_rtt(sk, 10 * delta); | ||
569 | } | ||
570 | |||
571 | dp->dccps_osr = DCCP_SKB_CB(skb)->dccpd_seq; | ||
563 | dccp_set_state(sk, DCCP_OPEN); | 572 | dccp_set_state(sk, DCCP_OPEN); |
564 | 573 | ||
565 | if (dh->dccph_type == DCCP_PKT_DATAACK || | 574 | if (dh->dccph_type == DCCP_PKT_DATAACK || |
diff --git a/net/dccp/options.c b/net/dccp/options.c index 4973badb5d55..bfda087bd90d 100644 --- a/net/dccp/options.c +++ b/net/dccp/options.c | |||
@@ -529,7 +529,7 @@ int dccp_insert_options(struct sock *sk, struct sk_buff *skb) | |||
529 | if (DCCP_SKB_CB(skb)->dccpd_type == DCCP_PKT_REQUEST) { | 529 | if (DCCP_SKB_CB(skb)->dccpd_type == DCCP_PKT_REQUEST) { |
530 | /* | 530 | /* |
531 | * Obtain RTT sample from Request/Response exchange. | 531 | * Obtain RTT sample from Request/Response exchange. |
532 | * This is currently used in CCID 3 initialisation. | 532 | * This is currently used for TFRC initialisation. |
533 | */ | 533 | */ |
534 | if (dccp_insert_option_timestamp(skb)) | 534 | if (dccp_insert_option_timestamp(skb)) |
535 | return -1; | 535 | return -1; |
@@ -562,6 +562,10 @@ int dccp_insert_options_rsk(struct dccp_request_sock *dreq, struct sk_buff *skb) | |||
562 | if (dccp_feat_insert_opts(NULL, dreq, skb)) | 562 | if (dccp_feat_insert_opts(NULL, dreq, skb)) |
563 | return -1; | 563 | return -1; |
564 | 564 | ||
565 | /* Obtain RTT sample from Response/Ack exchange (used by TFRC). */ | ||
566 | if (dccp_insert_option_timestamp(skb)) | ||
567 | return -1; | ||
568 | |||
565 | if (dreq->dreq_timestamp_echo != 0 && | 569 | if (dreq->dreq_timestamp_echo != 0 && |
566 | dccp_insert_option_timestamp_echo(NULL, dreq, skb)) | 570 | dccp_insert_option_timestamp_echo(NULL, dreq, skb)) |
567 | return -1; | 571 | return -1; |