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