aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/ip_options.c
diff options
context:
space:
mode:
authorDeepa Dinamani <deepa.kernel@gmail.com>2016-02-27 03:32:15 -0500
committerDavid S. Miller <davem@davemloft.net>2016-03-01 17:18:44 -0500
commit822c868532cae2cc1c51f4f18ab61c194d98aaf6 (patch)
tree64639790feb5345973a58d66bd621c3d69ac3b0d /net/ipv4/ip_options.c
parente9c0d61d5faea3e34fd995063e44ba64be6491df (diff)
net: ipv4: Convert IP network timestamps to be y2038 safe
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> 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> Acked-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org> Acked-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/ip_options.c')
-rw-r--r--net/ipv4/ip_options.c14
1 files changed, 6 insertions, 8 deletions
diff --git a/net/ipv4/ip_options.c b/net/ipv4/ip_options.c
index bd246792360b..4d158ff1def1 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,
58 if (opt->ts_needaddr) 58 if (opt->ts_needaddr)
59 ip_rt_get_source(iph+opt->ts+iph[opt->ts+2]-9, skb, rt); 59 ip_rt_get_source(iph+opt->ts+iph[opt->ts+2]-9, skb, rt);
60 if (opt->ts_needtime) { 60 if (opt->ts_needtime) {
61 struct timespec tv;
62 __be32 midtime; 61 __be32 midtime;
63 getnstimeofday(&tv); 62
64 midtime = htonl((tv.tv_sec % 86400) * MSEC_PER_SEC + tv.tv_nsec / NSEC_PER_MSEC); 63 midtime = inet_current_timestamp();
65 memcpy(iph+opt->ts+iph[opt->ts+2]-5, &midtime, 4); 64 memcpy(iph+opt->ts+iph[opt->ts+2]-5, &midtime, 4);
66 } 65 }
67 return; 66 return;
@@ -415,11 +414,10 @@ int ip_options_compile(struct net *net,
415 break; 414 break;
416 } 415 }
417 if (timeptr) { 416 if (timeptr) {
418 struct timespec tv; 417 __be32 midtime;
419 u32 midtime; 418
420 getnstimeofday(&tv); 419 midtime = inet_current_timestamp();
421 midtime = (tv.tv_sec % 86400) * MSEC_PER_SEC + tv.tv_nsec / NSEC_PER_MSEC; 420 memcpy(timeptr, &midtime, 4);
422 put_unaligned_be32(midtime, timeptr);
423 opt->is_changed = 1; 421 opt->is_changed = 1;
424 } 422 }
425 } else if ((optptr[3]&0xF) != IPOPT_TS_PRESPEC) { 423 } else if ((optptr[3]&0xF) != IPOPT_TS_PRESPEC) {