Skip to contentSkip to conversation

options: convert dccp_insert_option_timestamp

PATCH In review Arnaldo Carvalho de Melo 2 participants 2 messages Aug 19, 2007 – Aug 21, 2007 Networking

lore
Share & tools
lore
#0 lore raw

PATCH 13/15 options: convert dccp_insert_option_timestamp

---
 net/dccp/options.c |    6 +-----
 1 files changed, 1 insertions(+), 5 deletions(-)
net/dccp/options.c +1 -5
index 95b75d8..439e25d 100644
@@ -388,11 +388,7 @@ EXPORT_SYMBOL_GPL(dccp_timestamp);
 
 int dccp_insert_option_timestamp(struct sock *sk, struct sk_buff *skb)
 {
-	struct timeval tv;
-	__be32 now;
-
-	dccp_timestamp(sk, &tv);
-	now = htonl(timeval_usecs(&tv) / 10);
+	__be32 now = htonl(((suseconds_t)ktime_to_us(ktime_get_real())) / 10);
 	/* 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 */
 
Signature · 1 line
1.5.2.2
#1 lore raw

Re: [PATCH 13/15] [DCCP] options: convert dccp_insert_option_timestamp to ktime_t

Sorry this one has a bug also - it compresses a signed 64 bit quantity into a 32-bit unsigned value. When re-interpreted as microsecond value (in dccp_sample_rtt), this gives values which are way too small.

Maybe we should keep the dccp_epoch thing, but now with ktime_t, so as to avoid large microsecond values?

In any case, the RTT sampling is not usable - it constantly produces overflow, since the timestamp option value is too small.

Please see below.

|  @@ -388,11 +388,7 @@ EXPORT_SYMBOL_GPL(dccp_timestamp);
|   
|   int dccp_insert_option_timestamp(struct sock *sk, struct sk_buff *skb)
|   {
|  -	struct timeval tv;
|  -	__be32 now;
|  -
|  -	dccp_timestamp(sk, &tv);
|  -	now = htonl(timeval_usecs(&tv) / 10);
|  +	__be32 now = htonl(((suseconds_t)ktime_to_us(ktime_get_real())) / 10);
|   	/* 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 */
|   

I debugged this by adding

int dccp_insert_option_timestamp(struct sock *sk, struct sk_buff *skb)

{
       ktime_t time = ktime_get_real();
       s64 n = ktime_to_us(time);
       u32 now;

       do_div(n, 10);
       now = n;

       printk("TIME: %lld => us = %lld => %u (%x) ", (long long) time.tv64, (long long)n, now, now);
       now = htonl(now);
       printk(" = %x\n", now);
}

... and I get values such as
TIME: 1187701891935389887 => us = 118770189193538 => 1458557250 (56efd142) = 42d1ef56

This is the cut-off, the `us' value is
6C0556efd142 and the u32 (__be32) converted value is

      56efd142

So this doesn't work - in CCID3, due to the large RTT values, the sending rate currently goes down to 7..8 kbits/sec - when I change the RTT back to normal, the rate goes back to line speed (91.6 Mbits/sec).