[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.

Signed-off-by: Gerrit Renker <gerrit@erg.abdn.ac.uk>
Signed-off-by: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Gerrit Renker 2007-09-25 22:40:13 -07:00 committed by David S. Miller
parent aa97efd97a
commit 4c70f383e0
4 changed files with 26 additions and 1 deletions

View File

@ -396,6 +396,8 @@ extern int dccp_insert_options(struct sock *sk, struct sk_buff *skb);
extern int dccp_insert_option_elapsed_time(struct sock *sk, extern int dccp_insert_option_elapsed_time(struct sock *sk,
struct sk_buff *skb, struct sk_buff *skb,
u32 elapsed_time); u32 elapsed_time);
extern u32 dccp_timestamp(void);
extern void dccp_timestamping_init(void);
extern int dccp_insert_option_timestamp(struct sock *sk, extern int dccp_insert_option_timestamp(struct sock *sk,
struct sk_buff *skb); struct sk_buff *skb);
extern int dccp_insert_option(struct sock *sk, struct sk_buff *skb, extern int dccp_insert_option(struct sock *sk, struct sk_buff *skb,

View File

@ -372,7 +372,7 @@ 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 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 /* 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 */ * 10 usec 32 bit timer which mean it wraps every 11.9 hours */

View File

@ -1076,6 +1076,8 @@ static int __init dccp_init(void)
rc = dccp_sysctl_init(); rc = dccp_sysctl_init();
if (rc) if (rc)
goto out_ackvec_exit; goto out_ackvec_exit;
dccp_timestamping_init();
out: out:
return rc; return rc;
out_ackvec_exit: out_ackvec_exit:

View File

@ -291,3 +291,24 @@ void dccp_init_xmit_timers(struct sock *sk)
inet_csk_init_xmit_timers(sk, &dccp_write_timer, &dccp_delack_timer, inet_csk_init_xmit_timers(sk, &dccp_write_timer, &dccp_delack_timer,
&dccp_keepalive_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();
}