Skip to contentSkip to conversation

: Provide 10s of microsecond timesource

PATCH In review Gerrit Renker 2 participants 2 messages Aug 23, 2007 Networking

lore
Share & tools
lore
#0 lore raw

PATCH v2 2/3 : Provide 10s of microsecond timesource

I have thought this over - the solutions I came up with were all complicated and I think it is not worth making it more complicated if the issue only occurs every 11.9 hours. But added a warning note in the timer comments, so that other timestamp users may take preventive action, if necessary.

--------------------> Patch v2 <----------------------------------------- [DCCP]: Provide 10s of microsecond timesource

This provides a timesource, conveniently used for DCCP timestamps, which returns the elapsed time in 10s of microseconds since initialisation. This makes for a wrap-around time of about 11.9 hours, which should be sufficient for most applications.

---
 net/dccp/dccp.h    |    2 ++
 net/dccp/options.c |    2 +-
 net/dccp/proto.c   |    2 ++
 net/dccp/timer.c   |   21 +++++++++++++++++++++
 4 files changed, 26 insertions(+), 1 deletion(-)
net/dccp/dccp.h +2 -0
@@ -396,6 +396,8 @@ extern int dccp_insert_options(struct so
 extern int dccp_insert_option_elapsed_time(struct sock *sk,
 					    struct sk_buff *skb,
 					    u32 elapsed_time);
+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,
net/dccp/options.c +1 -1
@@ -372,7 +372,7 @@ EXPORT_SYMBOL_GPL(dccp_insert_option_ela
 
 int dccp_insert_option_timestamp(struct sock *sk, struct sk_buff *skb)
 {
-	__be32 now = htonl(((suseconds_t)ktime_to_us(ktime_get_real())) / 10);
+	__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 */
 
net/dccp/proto.c +2 -0
@@ -1076,6 +1076,8 @@ static int __init dccp_init(void)
 	rc = dccp_sysctl_init();
 	if (rc)
 		goto out_ackvec_exit;
+
+	dccp_timestamping_init();
 out:
 	return rc;
 out_ackvec_exit:
net/dccp/timer.c +21 -0
@@ -291,3 +291,24 @@ void dccp_init_xmit_timers(struct sock *
 	inet_csk_init_xmit_timers(sk, &dccp_write_timer, &dccp_delack_timer,
 				  &dccp_keepalive_timer);
 }
+
+static ktime_t dccp_timestamp_seed;
+/**
+ * dccp_timestamp  -  10s of microseconds time source
+ * Returns the number of 10s of microseconds since loading DCCP. This is native
+ * DCCP time difference format (RFC 4340, sec. 13).
+ * Please note: This will wrap around about circa every 11.9 hours.
+ */
+u32 dccp_timestamp(void)
+{
+	s64 delta = ktime_us_delta(ktime_get_real(), dccp_timestamp_seed);
+
+	do_div(delta, 10);
+	return delta;
+}
+EXPORT_SYMBOL_GPL(dccp_timestamp);
+
+void __init dccp_timestamping_init(void)
+{
+	dccp_timestamp_seed = ktime_get_real();
+}
#1 lore raw

Em Thu, Aug 23, 2007 at 04:10:08PM +0100, Gerrit Renker escreveu:

Quoted 4 lines

I have thought this over - the solutions I came up with were all complicated and I think it is not worth making it more complicated if the issue only occurs every 11.9 hours. But added a warning note in the timer comments, so that other timestamp users may take preventive action, if necessary.

Seems OK, I'm busy ATM but promise will test this and provide comments in time for 2.6.24.

Thanks for your work, Gerrit, keep it up!

- Arnaldo