diff options
author | Dan Klein <danklei@csi-kiwi-03.cisco.com> | 2015-09-20 15:53:42 +0300 |
---|---|---|
committer | Dan Klein <danklei@csi-kiwi-03.cisco.com> | 2015-09-20 15:53:42 +0300 |
commit | 28fef018f75b5a54ac69ac7c919127bf47f5b61f (patch) | |
tree | c21c2af8dfe7c05bee170e96fc923458b8894be6 /scripts/external_libs/dpkt-1.8.6/dpkt/snoop.py | |
parent | a78680a896f65dd6733d27d99e9cd8440eb185e9 (diff) | |
parent | 56dbd342eb97fc087611157ce8e965088b7f9bf8 (diff) |
Pushed Stateless progress (along with Packet Builder module)
Diffstat (limited to 'scripts/external_libs/dpkt-1.8.6/dpkt/snoop.py')
-rw-r--r-- | scripts/external_libs/dpkt-1.8.6/dpkt/snoop.py | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/scripts/external_libs/dpkt-1.8.6/dpkt/snoop.py b/scripts/external_libs/dpkt-1.8.6/dpkt/snoop.py new file mode 100644 index 00000000..3374feb2 --- /dev/null +++ b/scripts/external_libs/dpkt-1.8.6/dpkt/snoop.py @@ -0,0 +1,118 @@ +# $Id$ + +"""Snoop file format.""" + +import sys, time +import dpkt + +# RFC 1761 + +SNOOP_MAGIC = 0x736E6F6F70000000L + +SNOOP_VERSION = 2 + +SDL_8023 = 0 +SDL_8024 = 1 +SDL_8025 = 2 +SDL_8026 = 3 +SDL_ETHER = 4 +SDL_HDLC = 5 +SDL_CHSYNC = 6 +SDL_IBMCC = 7 +SDL_FDDI = 8 +SDL_OTHER = 9 + + +dltoff = { SDL_ETHER:14 } + +class PktHdr(dpkt.Packet): + """snoop packet header.""" + __byte_order__ = '!' + __hdr__ = ( + ('orig_len', 'I', 0), + ('incl_len', 'I', 0), + ('rec_len', 'I', 0), + ('cum_drops', 'I', 0), + ('ts_sec', 'I', 0), + ('ts_usec', 'I', 0), + ) + +class FileHdr(dpkt.Packet): + """snoop file header.""" + __byte_order__ = '!' + __hdr__ = ( + ('magic', 'Q', SNOOP_MAGIC), + ('v', 'I', SNOOP_VERSION), + ('linktype', 'I', SDL_ETHER), + ) + +class Writer(object): + """Simple snoop dumpfile writer.""" + def __init__(self, fileobj, linktype=SDL_ETHER): + self.__f = fileobj + fh = FileHdr(linktype=linktype) + self.__f.write(str(fh)) + + def writepkt(self, pkt, ts=None): + if ts is None: + ts = time.time() + s = str(pkt) + n = len(s) + pad_len = 4 - n % 4 if n % 4 else 0 + ph = PktHdr(orig_len=n,incl_len=n, + rec_len=PktHdr.__hdr_len__+n+pad_len, + ts_sec=int(ts), + ts_usec=int((int(ts) - float(ts)) * 1000000.0)) + self.__f.write(str(ph)) + self.__f.write(s + '\0' * pad_len) + + def close(self): + self.__f.close() + +class Reader(object): + """Simple pypcap-compatible snoop file reader.""" + + def __init__(self, fileobj): + self.name = fileobj.name + self.fd = fileobj.fileno() + self.__f = fileobj + buf = self.__f.read(FileHdr.__hdr_len__) + self.__fh = FileHdr(buf) + self.__ph = PktHdr + if self.__fh.magic != SNOOP_MAGIC: + raise ValueError, 'invalid snoop header' + self.dloff = dltoff[self.__fh.linktype] + self.filter = '' + + def fileno(self): + return self.fd + + def datalink(self): + return self.__fh.linktype + + def setfilter(self, value, optimize=1): + return NotImplementedError + + def readpkts(self): + return list(self) + + def dispatch(self, cnt, callback, *args): + if cnt > 0: + for i in range(cnt): + ts, pkt = self.next() + callback(ts, pkt, *args) + else: + for ts, pkt in self: + callback(ts, pkt, *args) + + def loop(self, callback, *args): + self.dispatch(0, callback, *args) + + def __iter__(self): + self.__f.seek(FileHdr.__hdr_len__) + while 1: + buf = self.__f.read(PktHdr.__hdr_len__) + if not buf: break + hdr = self.__ph(buf) + buf = self.__f.read(hdr.rec_len - PktHdr.__hdr_len__) + yield (hdr.ts_sec + (hdr.ts_usec / 1000000.0), buf[:hdr.incl_len]) |