Skip to content
Snippets Groups Projects
Commit 1c93ff72 authored by Phil's avatar Phil
Browse files

Fixed TimeStampField (ticket #125)

parent 1d1768bb
No related branches found
No related tags found
No related merge requests found
......@@ -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%")
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment