All of lore.kernel.org
 help / color / mirror / Atom feed
From: YOSHIFUJI Hideaki <hideaki.yoshifuji@miraclelinux.com>
To: Deepa Dinamani <deepa.kernel@gmail.com>,
	netdev@vger.kernel.org, y2038@lists.linaro.org
Cc: hideaki.yoshifuji@miraclelinux.com, arnd@arndb.de,
	"David S. Miller" <davem@davemloft.net>,
	Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>,
	Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>,
	James Morris <jmorris@namei.org>,
	Patrick McHardy <kaber@trash.net>
Subject: Re: [PATCH v2 1/3] net: ipv4: Convert IP network timestamps to be y2038 safe
Date: Mon, 29 Feb 2016 13:26:57 +0900	[thread overview]
Message-ID: <56D3C891.7060209@miraclelinux.com> (raw)
In-Reply-To: <1456561938-7653-2-git-send-email-deepa.kernel@gmail.com>



Deepa Dinamani wrote:
> ICMP timestamp messages and IP source route options require
> timestamps to be in milliseconds modulo 24 hours from
> midnight UT format.
> 
> Add inet_current_timestamp() function to support this. The function
> returns the required timestamp in network byte order.
> 
> Timestamp calculation is also changed to call ktime_get_real_ts64()
> which uses struct timespec64. struct timespec64 is y2038 safe.
> Previously it called getnstimeofday() which uses struct timespec.
> struct timespec is not y2038 safe.
> 
> Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>

Acked-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>

--yoshfuji

> Cc: "David S. Miller" <davem@davemloft.net>
> Cc: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
> Cc: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>
> Cc: James Morris <jmorris@namei.org>
> Cc: Patrick McHardy <kaber@trash.net>
> ---
>  include/net/ip.h      |  2 ++
>  net/ipv4/af_inet.c    | 26 ++++++++++++++++++++++++++
>  net/ipv4/icmp.c       |  5 +----
>  net/ipv4/ip_options.c | 14 ++++++--------
>  4 files changed, 35 insertions(+), 12 deletions(-)
> 
> diff --git a/include/net/ip.h b/include/net/ip.h
> index 1a98f1c..5d3a9eb 100644
> --- a/include/net/ip.h
> +++ b/include/net/ip.h
> @@ -240,6 +240,8 @@ static inline int inet_is_local_reserved_port(struct net *net, int port)
>  }
>  #endif
>  
> +__be32 inet_current_timestamp(void);
> +
>  /* From inetpeer.c */
>  extern int inet_peer_threshold;
>  extern int inet_peer_minttl;
> diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c
> index eade66d..408e2b3 100644
> --- a/net/ipv4/af_inet.c
> +++ b/net/ipv4/af_inet.c
> @@ -1386,6 +1386,32 @@ out:
>  	return pp;
>  }
>  
> +#define SECONDS_PER_DAY	86400
> +
> +/* inet_current_timestamp - Return IP network timestamp
> + *
> + * Return milliseconds since midnight in network byte order.
> + */
> +__be32 inet_current_timestamp(void)
> +{
> +	u32 secs;
> +	u32 msecs;
> +	struct timespec64 ts;
> +
> +	ktime_get_real_ts64(&ts);
> +
> +	/* Get secs since midnight. */
> +	(void)div_u64_rem(ts.tv_sec, SECONDS_PER_DAY, &secs);
> +	/* Convert to msecs. */
> +	msecs = secs * MSEC_PER_SEC;
> +	/* Convert nsec to msec. */
> +	msecs += (u32)ts.tv_nsec / NSEC_PER_MSEC;
> +
> +	/* Convert to network byte order. */
> +	return htons(msecs);
> +}
> +EXPORT_SYMBOL(inet_current_timestamp);
> +
>  int inet_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len)
>  {
>  	if (sk->sk_family == AF_INET)
> diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c
> index 36e2697..6333489 100644
> --- a/net/ipv4/icmp.c
> +++ b/net/ipv4/icmp.c
> @@ -931,7 +931,6 @@ static bool icmp_echo(struct sk_buff *skb)
>   */
>  static bool icmp_timestamp(struct sk_buff *skb)
>  {
> -	struct timespec tv;
>  	struct icmp_bxm icmp_param;
>  	/*
>  	 *	Too short.
> @@ -942,9 +941,7 @@ static bool icmp_timestamp(struct sk_buff *skb)
>  	/*
>  	 *	Fill in the current time as ms since midnight UT:
>  	 */
> -	getnstimeofday(&tv);
> -	icmp_param.data.times[1] = htonl((tv.tv_sec % 86400) * MSEC_PER_SEC +
> -					 tv.tv_nsec / NSEC_PER_MSEC);
> +	icmp_param.data.times[1] = inet_current_timestamp();
>  	icmp_param.data.times[2] = icmp_param.data.times[1];
>  	if (skb_copy_bits(skb, 0, &icmp_param.data.times[0], 4))
>  		BUG();
> diff --git a/net/ipv4/ip_options.c b/net/ipv4/ip_options.c
> index bd24679..4d158ff 100644
> --- a/net/ipv4/ip_options.c
> +++ b/net/ipv4/ip_options.c
> @@ -58,10 +58,9 @@ void ip_options_build(struct sk_buff *skb, struct ip_options *opt,
>  		if (opt->ts_needaddr)
>  			ip_rt_get_source(iph+opt->ts+iph[opt->ts+2]-9, skb, rt);
>  		if (opt->ts_needtime) {
> -			struct timespec tv;
>  			__be32 midtime;
> -			getnstimeofday(&tv);
> -			midtime = htonl((tv.tv_sec % 86400) * MSEC_PER_SEC + tv.tv_nsec / NSEC_PER_MSEC);
> +
> +			midtime = inet_current_timestamp();
>  			memcpy(iph+opt->ts+iph[opt->ts+2]-5, &midtime, 4);
>  		}
>  		return;
> @@ -415,11 +414,10 @@ int ip_options_compile(struct net *net,
>  					break;
>  				}
>  				if (timeptr) {
> -					struct timespec tv;
> -					u32  midtime;
> -					getnstimeofday(&tv);
> -					midtime = (tv.tv_sec % 86400) * MSEC_PER_SEC + tv.tv_nsec / NSEC_PER_MSEC;
> -					put_unaligned_be32(midtime, timeptr);
> +					__be32 midtime;
> +
> +					midtime = inet_current_timestamp();
> +					memcpy(timeptr, &midtime, 4);
>  					opt->is_changed = 1;
>  				}
>  			} else if ((optptr[3]&0xF) != IPOPT_TS_PRESPEC) {
> 

-- 
Hideaki Yoshifuji <hideaki.yoshifuji@miraclelinux.com>
Technical Division, MIRACLE LINUX CORPORATION

  reply	other threads:[~2016-02-29  4:27 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-27  8:32 [PATCH v2 0/3] Convert network timestamps to be y2038 safe Deepa Dinamani
2016-02-27  8:32 ` Deepa Dinamani
2016-02-27  8:32 ` [PATCH v2 1/3] net: ipv4: Convert IP " Deepa Dinamani
2016-02-29  4:26   ` YOSHIFUJI Hideaki [this message]
2016-02-29 16:31   ` Arnd Bergmann
2016-02-27  8:32 ` [PATCH v2 2/3] net: ipv4: tcp_probe: Replace timespec with timespec64 Deepa Dinamani
2016-02-29  4:27   ` YOSHIFUJI Hideaki
2016-02-27  8:32 ` [PATCH v2 3/3] net: sctp: Convert log timestamps to be y2038 safe Deepa Dinamani
2016-02-27  8:32   ` Deepa Dinamani
2016-03-01 22:19 ` [PATCH v2 0/3] Convert network " David Miller
2016-03-01 22:19   ` David Miller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=56D3C891.7060209@miraclelinux.com \
    --to=hideaki.yoshifuji@miraclelinux.com \
    --cc=arnd@arndb.de \
    --cc=davem@davemloft.net \
    --cc=deepa.kernel@gmail.com \
    --cc=jmorris@namei.org \
    --cc=kaber@trash.net \
    --cc=kuznet@ms2.inr.ac.ru \
    --cc=netdev@vger.kernel.org \
    --cc=y2038@lists.linaro.org \
    --cc=yoshfuji@linux-ipv6.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.