* [PATCH 0/2] dccp: fix slow slow-start by symmetric Syn-RTT
[not found] <ccid3_4_tfrc_slow_slow_start_issue>
@ 2010-06-22 11:14 ` Gerrit Renker
2010-06-22 11:14 ` [PATCH 1/2] dccp: remove unused function argument Gerrit Renker
2010-06-26 4:36 ` [PATCH 0/2] dccp: fix slow slow-start by symmetric Syn-RTT David Miller
0 siblings, 2 replies; 4+ messages in thread
From: Gerrit Renker @ 2010-06-22 11:14 UTC (permalink / raw)
To: davem; +Cc: dccp, netdev
This changeset fixes slow startup behaviour for DCCP streaming via
CCID-3/4 when a listening server needs to start streaming.
Patch #1: removes an unused 'sk' argument from several functions,
it is used by patch #2;
Patch #2: fixes the sluggish slow-start problem by taking an RTT
sample from the initial handshake also for listeing servers.
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 1/2] dccp: remove unused function argument
2010-06-22 11:14 ` [PATCH 0/2] dccp: fix slow slow-start by symmetric Syn-RTT Gerrit Renker
@ 2010-06-22 11:14 ` Gerrit Renker
2010-06-22 11:14 ` [PATCH 2/2] dccp: make implementation of Syn-RTT symmetric Gerrit Renker
2010-06-26 4:36 ` [PATCH 0/2] dccp: fix slow slow-start by symmetric Syn-RTT David Miller
1 sibling, 1 reply; 4+ messages in thread
From: Gerrit Renker @ 2010-06-22 11:14 UTC (permalink / raw)
To: davem; +Cc: dccp, netdev, Gerrit Renker
This removes an unused 'sk' argument from several option-inserting functions.
Signed-off-by: Gerrit Renker <gerrit@erg.abdn.ac.uk>
---
net/dccp/ackvec.c | 2 +-
net/dccp/ccids/ccid3.c | 4 ++--
net/dccp/dccp.h | 12 ++++--------
net/dccp/options.c | 14 ++++++--------
4 files changed, 13 insertions(+), 19 deletions(-)
--- a/net/dccp/ackvec.c
+++ b/net/dccp/ackvec.c
@@ -82,7 +82,7 @@ int dccp_insert_option_ackvec(struct sock *sk, struct sk_buff *skb)
elapsed_time = delta / 10;
if (elapsed_time != 0 &&
- dccp_insert_option_elapsed_time(sk, skb, elapsed_time))
+ dccp_insert_option_elapsed_time(skb, elapsed_time))
return -1;
avr = dccp_ackvec_record_new();
--- a/net/dccp/ccids/ccid3.c
+++ b/net/dccp/ccids/ccid3.c
@@ -715,9 +715,9 @@ static int ccid3_hc_rx_insert_options(struct sock *sk, struct sk_buff *skb)
x_recv = htonl(hc->rx_x_recv);
pinv = htonl(hc->rx_pinv);
- if (dccp_insert_option(sk, skb, TFRC_OPT_LOSS_EVENT_RATE,
+ if (dccp_insert_option(skb, TFRC_OPT_LOSS_EVENT_RATE,
&pinv, sizeof(pinv)) ||
- dccp_insert_option(sk, skb, TFRC_OPT_RECEIVE_RATE,
+ dccp_insert_option(skb, TFRC_OPT_RECEIVE_RATE,
&x_recv, sizeof(x_recv)))
return -1;
--- a/net/dccp/dccp.h
+++ b/net/dccp/dccp.h
@@ -446,16 +446,12 @@ extern void dccp_feat_list_purge(struct list_head *fn_list);
extern int dccp_insert_options(struct sock *sk, struct sk_buff *skb);
extern int dccp_insert_options_rsk(struct dccp_request_sock*, struct sk_buff*);
-extern int dccp_insert_option_elapsed_time(struct sock *sk,
- struct sk_buff *skb,
- u32 elapsed_time);
+extern int dccp_insert_option_elapsed_time(struct sk_buff *skb, u32 elapsed);
extern u32 dccp_timestamp(void);
extern void dccp_timestamping_init(void);
-extern int dccp_insert_option_timestamp(struct sock *sk,
- struct sk_buff *skb);
-extern int dccp_insert_option(struct sock *sk, struct sk_buff *skb,
- unsigned char option,
- const void *value, unsigned char len);
+extern int dccp_insert_option_timestamp(struct sk_buff *skb);
+extern int dccp_insert_option(struct sk_buff *skb, unsigned char option,
+ const void *value, unsigned char len);
#ifdef CONFIG_SYSCTL
extern int dccp_sysctl_init(void);
--- a/net/dccp/options.c
+++ b/net/dccp/options.c
@@ -299,9 +299,8 @@ static inline u8 dccp_ndp_len(const u64 ndp)
return likely(ndp <= USHRT_MAX) ? 2 : (ndp <= UINT_MAX ? 4 : 6);
}
-int dccp_insert_option(struct sock *sk, struct sk_buff *skb,
- const unsigned char option,
- const void *value, const unsigned char len)
+int dccp_insert_option(struct sk_buff *skb, const unsigned char option,
+ const void *value, const unsigned char len)
{
unsigned char *to;
@@ -354,8 +353,7 @@ static inline int dccp_elapsed_time_len(const u32 elapsed_time)
return elapsed_time == 0 ? 0 : elapsed_time <= 0xFFFF ? 2 : 4;
}
-int dccp_insert_option_elapsed_time(struct sock *sk, struct sk_buff *skb,
- u32 elapsed_time)
+int dccp_insert_option_elapsed_time(struct sk_buff *skb, u32 elapsed_time)
{
const int elapsed_time_len = dccp_elapsed_time_len(elapsed_time);
const int len = 2 + elapsed_time_len;
@@ -386,13 +384,13 @@ int dccp_insert_option_elapsed_time(struct sock *sk, struct sk_buff *skb,
EXPORT_SYMBOL_GPL(dccp_insert_option_elapsed_time);
-int dccp_insert_option_timestamp(struct sock *sk, struct sk_buff *skb)
+int dccp_insert_option_timestamp(struct sk_buff *skb)
{
__be32 now = htonl(dccp_timestamp());
/* yes this will overflow but that is the point as we want a
* 10 usec 32 bit timer which mean it wraps every 11.9 hours */
- return dccp_insert_option(sk, skb, DCCPO_TIMESTAMP, &now, sizeof(now));
+ return dccp_insert_option(skb, DCCPO_TIMESTAMP, &now, sizeof(now));
}
EXPORT_SYMBOL_GPL(dccp_insert_option_timestamp);
@@ -533,7 +531,7 @@ int dccp_insert_options(struct sock *sk, struct sk_buff *skb)
* Obtain RTT sample from Request/Response exchange.
* This is currently used in CCID 3 initialisation.
*/
- if (dccp_insert_option_timestamp(sk, skb))
+ if (dccp_insert_option_timestamp(skb))
return -1;
} else if (dp->dccps_hc_rx_ackvec != NULL &&
--
1.6.0.rc2
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 2/2] dccp: make implementation of Syn-RTT symmetric
2010-06-22 11:14 ` [PATCH 1/2] dccp: remove unused function argument Gerrit Renker
@ 2010-06-22 11:14 ` Gerrit Renker
0 siblings, 0 replies; 4+ messages in thread
From: Gerrit Renker @ 2010-06-22 11:14 UTC (permalink / raw)
To: davem; +Cc: dccp, netdev, Gerrit Renker
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>
---
net/dccp/input.c | 13 +++++++++++--
net/dccp/options.c | 6 +++++-
2 files changed, 16 insertions(+), 3 deletions(-)
--- 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,
if (dccp_parse_options(sk, NULL, skb))
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))
dp->dccps_syn_rtt = dccp_sample_rtt(sk, 10 * (tstamp -
dp->dccps_options_received.dccpor_timestamp_echo));
@@ -535,6 +535,8 @@ static int dccp_rcv_respond_partopen_state_process(struct sock *sk,
const struct dccp_hdr *dh,
const unsigned len)
{
+ struct dccp_sock *dp = dccp_sk(sk);
+ u32 sample = dp->dccps_options_received.dccpor_timestamp_echo;
int queued = 0;
switch (dh->dccph_type) {
@@ -559,7 +561,14 @@ static int dccp_rcv_respond_partopen_state_process(struct sock *sk,
if (sk->sk_state == DCCP_PARTOPEN)
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);
if (dh->dccph_type == DCCP_PKT_DATAACK ||
--- 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)
if (DCCP_SKB_CB(skb)->dccpd_type == DCCP_PKT_REQUEST) {
/*
* 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))
return -1;
@@ -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))
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 &&
dccp_insert_option_timestamp_echo(NULL, dreq, skb))
return -1;
--
1.6.0.rc2
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 0/2] dccp: fix slow slow-start by symmetric Syn-RTT
2010-06-22 11:14 ` [PATCH 0/2] dccp: fix slow slow-start by symmetric Syn-RTT Gerrit Renker
2010-06-22 11:14 ` [PATCH 1/2] dccp: remove unused function argument Gerrit Renker
@ 2010-06-26 4:36 ` David Miller
1 sibling, 0 replies; 4+ messages in thread
From: David Miller @ 2010-06-26 4:36 UTC (permalink / raw)
To: gerrit; +Cc: dccp, netdev
From: Gerrit Renker <gerrit@erg.abdn.ac.uk>
Date: Tue, 22 Jun 2010 13:14:33 +0200
> This changeset fixes slow startup behaviour for DCCP streaming via
> CCID-3/4 when a listening server needs to start streaming.
>
> Patch #1: removes an unused 'sk' argument from several functions,
> it is used by patch #2;
>
> Patch #2: fixes the sluggish slow-start problem by taking an RTT
> sample from the initial handshake also for listeing servers.
Both applied to net-next-2.6, thanks!
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2010-06-26 4:36 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <ccid3_4_tfrc_slow_slow_start_issue>
2010-06-22 11:14 ` [PATCH 0/2] dccp: fix slow slow-start by symmetric Syn-RTT Gerrit Renker
2010-06-22 11:14 ` [PATCH 1/2] dccp: remove unused function argument Gerrit Renker
2010-06-22 11:14 ` [PATCH 2/2] dccp: make implementation of Syn-RTT symmetric Gerrit Renker
2010-06-26 4:36 ` [PATCH 0/2] dccp: fix slow slow-start by symmetric Syn-RTT David Miller
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).