From 499a121c13672294fd691aea190b4d4560768665 Mon Sep 17 00:00:00 2001 From: Robert Greenwalt Date: Thu, 15 Apr 2010 12:31:55 -0700 Subject: [PATCH] Fix SntpClient to give accurate time info. Old calc was off by 2x and was affected by the user-settable system clock. The error came because it was calculating the offset between our clock and the NTP clock and the algebra had two factors of the offset instead of the desired 1. bug:2600010 Change-Id: I0856091d32b50e6909e4889fb98df819e0aeabbe --- core/java/android/net/SntpClient.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/core/java/android/net/SntpClient.java b/core/java/android/net/SntpClient.java index 28134b29156d2..550cc24db1db1 100644 --- a/core/java/android/net/SntpClient.java +++ b/core/java/android/net/SntpClient.java @@ -103,13 +103,22 @@ public class SntpClient long receiveTime = readTimeStamp(buffer, RECEIVE_TIME_OFFSET); long transmitTime = readTimeStamp(buffer, TRANSMIT_TIME_OFFSET); long roundTripTime = responseTicks - requestTicks - (transmitTime - receiveTime); - long clockOffset = (receiveTime - originateTime) + (transmitTime - responseTime); + // receiveTime = originateTime + transit + skew + // responseTime = transmitTime + transit - skew + // clockOffset = ((receiveTime - originateTime) + (transmitTime - responseTime))/2 + // = ((originateTime + transit + skew - originateTime) + + // (transmitTime - (transmitTime + transit - skew)))/2 + // = ((transit + skew) + (transmitTime - transmitTime - transit + skew))/2 + // = (transit + skew - transit + skew)/2 + // = (2 * skew)/2 = skew + long clockOffset = ((receiveTime - originateTime) + (transmitTime - responseTime))/2; if (Config.LOGD) Log.d(TAG, "round trip: " + roundTripTime + " ms"); if (Config.LOGD) Log.d(TAG, "clock offset: " + clockOffset + " ms"); - // save our results - mNtpTime = requestTime + clockOffset; - mNtpTimeReference = requestTicks; + // save our results - use the times on this side of the network latency + // (response rather than request time) + mNtpTime = responseTime + clockOffset; + mNtpTimeReference = responseTicks; mRoundTripTime = roundTripTime; } catch (Exception e) { if (Config.LOGD) Log.d(TAG, "request time failed: " + e);