Changeset 869:770fe5cb569e

Show
Ignore:
Timestamp:
08/14/08 02:09:55 (5 months ago)
Author:
Phil <phil@secdev.org>
Message:

Fixed TimeStampField? (ticket #125)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • scapy/layers/ntp.py

    r868 r869  
    44## This program is published under a GPLv2 license 
    55 
     6import time 
    67from scapy.packet import * 
    78from scapy.fields import * 
    89from scapy.layers.inet import UDP 
    910 
     11 
    1012# seconds between 01-01-1900 and 01-01-1970 
    11 ntp_basetime = 2208988800 
     13_NTP_BASETIME = 2208988800 
    1214 
    13 class TimeStampField(BitField): 
    14     def __init__(self, name, default, size): 
    15         BitField.__init__(self, name, default, size) 
    16         self.size  = size 
    17     def getfield(self, pkt, s): 
    18         s,timestamp = BitField.getfield(self, pkt, s) 
     15class TimeStampField(FixedPointField): 
     16    def __init__(self, name, default): 
     17        FixedPointField.__init__(self, name, default, 64, 32) 
    1918 
    20         if timestamp: 
    21             # timestamp is a 64 bits field : 
    22             #  + first 32 bits : number of seconds since 1900 
    23             #  + last 32 bits  : fraction part 
    24             timestamp >>= 32 
    25             timestamp -= ntp_basetime 
    26              
    27             from time import gmtime, strftime 
    28             b = strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime(timestamp)) 
    29         else: 
    30             b = 'None' 
     19    def i2repr(self, pkt, val): 
     20        if val is None: 
     21            return "--" 
     22        val = self.i2h(pkt,val) 
     23        if val < _NTP_BASETIME: 
     24            return val 
     25        return time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime(val-_NTP_BASETIME)) 
     26 
     27    def any2i(self, pkt, val): 
     28        if type(val) is str: 
     29            return int(time.mktime(time.strptime(val))) + _NTP_BASETIME + 3600 # XXX 
     30        return FixedPointField.any2i(self,pkt,val) 
     31     
     32    def i2m(self, pkt, val): 
     33        if val is None: 
     34            val = FixedPointField.any2i(self, pkt, time.time()+_NTP_BASETIME) 
     35        return FixedPointField.i2m(self, pkt, val) 
    3136         
    32         return s, b 
    33     def addfield(self, pkt, s, val): 
    34         t = -1 
    35         if type(val) is str: 
    36             from time import strptime, mktime 
    37             t = int(mktime(strptime(val))) + ntp_basetime + 3600 
    38         else: 
    39             if val == -1: 
    40                 from time import time 
    41                 t = int(time()) + ntp_basetime 
    42             else: 
    43                 t = val 
    44         t <<= 32 
    45         return BitField.addfield(self,pkt,s, t) 
    4637 
    4738 
     
    7162         FixedPointField('dispersion', 0, size=32, frac_bits=16), 
    7263         IPField('id', "127.0.0.1"), 
    73          TimeStampField('ref', 0, 64), 
    74          TimeStampField('orig', -1, 64),  # -1 means current time 
    75          TimeStampField('recv', 0, 64), 
    76          TimeStampField('sent', -1, 64)  
     64         TimeStampField('ref', 0), 
     65         TimeStampField('orig', None),  # None means current time 
     66         TimeStampField('recv', 0), 
     67         TimeStampField('sent', None)  
    7768         ] 
    7869    def mysummary(self):