From 1c93ff72dbeddfb3d741e3f1e6a3d440a42de3bb Mon Sep 17 00:00:00 2001
From: Phil <phil@secdev.org>
Date: Thu, 14 Aug 2008 02:09:55 +0200
Subject: [PATCH] Fixed TimeStampField (ticket #125)

---
 scapy/layers/ntp.py | 63 +++++++++++++++++++--------------------------
 1 file changed, 27 insertions(+), 36 deletions(-)

diff --git a/scapy/layers/ntp.py b/scapy/layers/ntp.py
index 996d1727..ffebdfc6 100644
--- a/scapy/layers/ntp.py
+++ b/scapy/layers/ntp.py
@@ -3,46 +3,37 @@
 ## Copyright (C) Philippe Biondi <phil@secdev.org>
 ## This program is published under a GPLv2 license
 
+import time
 from scapy.packet import *
 from scapy.fields import *
 from scapy.layers.inet import UDP
 
+
 # seconds between 01-01-1900 and 01-01-1970
-ntp_basetime = 2208988800
+_NTP_BASETIME = 2208988800
 
-class TimeStampField(BitField):
-    def __init__(self, name, default, size):
-        BitField.__init__(self, name, default, size)
-        self.size  = size
-    def getfield(self, pkt, s):
-        s,timestamp = BitField.getfield(self, pkt, s)
+class TimeStampField(FixedPointField):
+    def __init__(self, name, default):
+        FixedPointField.__init__(self, name, default, 64, 32)
 
-        if timestamp:
-            # timestamp is a 64 bits field :
-            #  + first 32 bits : number of seconds since 1900
-            #  + last 32 bits  : fraction part
-            timestamp >>= 32
-            timestamp -= ntp_basetime
-            
-            from time import gmtime, strftime
-            b = strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime(timestamp))
-        else:
-            b = 'None'
-        
-        return s, b
-    def addfield(self, pkt, s, val):
-        t = -1
+    def i2repr(self, pkt, val):
+        if val is None:
+            return "--"
+        val = self.i2h(pkt,val)
+        if val < _NTP_BASETIME:
+            return val
+        return time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime(val-_NTP_BASETIME))
+
+    def any2i(self, pkt, val):
         if type(val) is str:
-            from time import strptime, mktime
-            t = int(mktime(strptime(val))) + ntp_basetime + 3600
-        else:
-            if val == -1:
-                from time import time
-                t = int(time()) + ntp_basetime
-            else:
-                t = val
-        t <<= 32
-        return BitField.addfield(self,pkt,s, t)
+            return int(time.mktime(time.strptime(val))) + _NTP_BASETIME + 3600 # XXX
+        return FixedPointField.any2i(self,pkt,val)
+    
+    def i2m(self, pkt, val):
+        if val is None:
+            val = FixedPointField.any2i(self, pkt, time.time()+_NTP_BASETIME)
+        return FixedPointField.i2m(self, pkt, val)
+        
 
 
 class NTP(Packet):
@@ -70,10 +61,10 @@ class NTP(Packet):
          FixedPointField('delay', 0, size=32, frac_bits=16),
          FixedPointField('dispersion', 0, size=32, frac_bits=16),
          IPField('id', "127.0.0.1"),
-         TimeStampField('ref', 0, 64),
-         TimeStampField('orig', -1, 64),  # -1 means current time
-         TimeStampField('recv', 0, 64),
-         TimeStampField('sent', -1, 64) 
+         TimeStampField('ref', 0),
+         TimeStampField('orig', None),  # None means current time
+         TimeStampField('recv', 0),
+         TimeStampField('sent', None) 
          ]
     def mysummary(self):
         return self.sprintf("NTP v%ir,NTP.version%, %NTP.mode%")
-- 
GitLab