[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
|
@ -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,
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue