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