Changeset 869:770fe5cb569e
- 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
| r868 |
r869 |
|
| 4 | 4 | ## This program is published under a GPLv2 license |
|---|
| 5 | 5 | |
|---|
| | 6 | import time |
|---|
| 6 | 7 | from scapy.packet import * |
|---|
| 7 | 8 | from scapy.fields import * |
|---|
| 8 | 9 | from scapy.layers.inet import UDP |
|---|
| 9 | 10 | |
|---|
| | 11 | |
|---|
| 10 | 12 | # seconds between 01-01-1900 and 01-01-1970 |
|---|
| 11 | | ntp_basetime = 2208988800 |
|---|
| | 13 | _NTP_BASETIME = 2208988800 |
|---|
| 12 | 14 | |
|---|
| 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) |
|---|
| | 15 | class TimeStampField(FixedPointField): |
|---|
| | 16 | def __init__(self, name, default): |
|---|
| | 17 | FixedPointField.__init__(self, name, default, 64, 32) |
|---|
| 19 | 18 | |
|---|
| 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) |
|---|
| 31 | 36 | |
|---|
| 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) |
|---|
| 46 | 37 | |
|---|
| 47 | 38 | |
|---|
| … | … | |
| 71 | 62 | FixedPointField('dispersion', 0, size=32, frac_bits=16), |
|---|
| 72 | 63 | 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) |
|---|
| 77 | 68 | ] |
|---|
| 78 | 69 | def mysummary(self): |
|---|