Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 499a121c authored by Robert Greenwalt's avatar Robert Greenwalt
Browse files

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
parent fa22de79
Loading
Loading
Loading
Loading
+13 −4
Original line number Diff line number Diff line
@@ -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);