@@ -13,7 +13,6 @@ module Ntp.Packet
13
13
) where
14
14
15
15
16
- import Control.Lens (each , (^..) )
17
16
import Control.Monad (replicateM_ )
18
17
import Data.Binary (Binary (.. ))
19
18
import Data.Binary.Get (getInt8 , getWord32be , getWord8 , skip )
@@ -41,9 +40,17 @@ instance Binary NtpPacket where
41
40
42
41
replicateM_ 5 $ putWord32be 0
43
42
44
- mapM_ putWord32be $ realMcsToNtp ntpOriginTime ^.. each
45
- mapM_ putWord32be $ realMcsToNtp ntpReceivedTime ^.. each
46
- mapM_ putWord32be $ realMcsToNtp ntpTransmitTime ^.. each
43
+ let (osec, ofrac) = realMcsToNtp ntpOriginTime
44
+ putWord32be osec
45
+ putWord32be ofrac
46
+
47
+ let (rsec, rfrac) = realMcsToNtp ntpReceivedTime
48
+ putWord32be rsec
49
+ putWord32be rfrac
50
+
51
+ let (tsec, tfrac) = realMcsToNtp ntpTransmitTime
52
+ putWord32be tsec
53
+ putWord32be tfrac
47
54
48
55
get = do
49
56
ntpParams <- getWord8
@@ -84,7 +91,9 @@ ntpToRealMcs sec frac =
84
91
let -- microseconds
85
92
secMicro :: Integer
86
93
secMicro = (fromIntegral sec - ntpTimestampDelta) * 1000000
87
- -- Each fraction resolves to 232 pico seconds (`232 ≈ 10000000/4294`)
94
+ -- We divide 1 second into 2 ^ 32 parts, giving 2.3283064365386963e-10
95
+ -- as the quantum. A picosecond is 10e-12 of a second, so this is 232
96
+ -- picoseconds or `1/4294` of a millisecond.
88
97
-- ref: https://tools.ietf.org/html/rfc5905#section-6
89
98
fracMicro :: Integer
90
99
fracMicro = (fromIntegral frac) `div` 4294
0 commit comments