[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:
parent
aa97efd97a
commit
4c70f383e0
4 changed files with 26 additions and 1 deletions
|
@ -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,
|
||||
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,
|
||||
|
|
|
@ -372,7 +372,7 @@ EXPORT_SYMBOL_GPL(dccp_insert_option_elapsed_time);
|
|||
|
||||
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 */
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -291,3 +291,24 @@ void dccp_init_xmit_timers(struct sock *sk)
|
|||
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();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue