summaryrefslogtreecommitdiffstats
path: root/scripts/external_libs/scapy-2.3.1/scapy/fields.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/external_libs/scapy-2.3.1/scapy/fields.py')
-rw-r--r--scripts/external_libs/scapy-2.3.1/scapy/fields.py909
1 files changed, 0 insertions, 909 deletions
diff --git a/scripts/external_libs/scapy-2.3.1/scapy/fields.py b/scripts/external_libs/scapy-2.3.1/scapy/fields.py
deleted file mode 100644
index 8bb8c970..00000000
--- a/scripts/external_libs/scapy-2.3.1/scapy/fields.py
+++ /dev/null
@@ -1,909 +0,0 @@
-## This file is part of Scapy
-## See http://www.secdev.org/projects/scapy for more informations
-## Copyright (C) Philippe Biondi <phil@secdev.org>
-## This program is published under a GPLv2 license
-
-"""
-Fields: basic data structures that make up parts of packets.
-"""
-
-import struct,copy,socket
-from config import conf
-from volatile import *
-from data import *
-from utils import *
-from base_classes import BasePacket,Gen,Net
-
-
-############
-## Fields ##
-############
-
-class Field:
- """For more informations on how this work, please refer to
- http://www.secdev.org/projects/scapy/files/scapydoc.pdf
- chapter ``Adding a New Field''"""
- islist=0
- holds_packets=0
- def __init__(self, name, default, fmt="H"):
- self.name = name
- if fmt[0] in "@=<>!":
- self.fmt = fmt
- else:
- self.fmt = "!"+fmt
- self.default = self.any2i(None,default)
- self.sz = struct.calcsize(self.fmt)
- self.owners = []
- self.offset =0;
-
- def get_size_bytes (self):
- if hasattr(self, 'size'):
- return 0; # bitfield
- else:
- return self.sz
-
- def register_owner(self, cls):
- self.owners.append(cls)
-
- def i2len(self, pkt, x):
- """Convert internal value to a length usable by a FieldLenField"""
- return self.sz
- def i2count(self, pkt, x):
- """Convert internal value to a number of elements usable by a FieldLenField.
- Always 1 except for list fields"""
- return 1
- def h2i(self, pkt, x):
- """Convert human value to internal value"""
- return x
- def i2h(self, pkt, x):
- """Convert internal value to human value"""
- return x
- def m2i(self, pkt, x):
- """Convert machine value to internal value"""
- return x
- def i2m(self, pkt, x):
- """Convert internal value to machine value"""
- if x is None:
- x = 0
- return x
- def any2i(self, pkt, x):
- """Try to understand the most input values possible and make an internal value from them"""
- return self.h2i(pkt, x)
- def i2repr(self, pkt, x):
- """Convert internal value to a nice representation"""
- return repr(self.i2h(pkt,x))
- def addfield(self, pkt, s, val):
- """Add an internal value to a string"""
- return s+struct.pack(self.fmt, self.i2m(pkt,val))
- def getfield(self, pkt, s):
- """Extract an internal value from a string"""
- return s[self.sz:], self.m2i(pkt, struct.unpack(self.fmt, s[:self.sz])[0])
- def do_copy(self, x):
- if hasattr(x, "copy"):
- return x.copy()
- if type(x) is list:
- x = x[:]
- for i in xrange(len(x)):
- if isinstance(x[i], BasePacket):
- x[i] = x[i].copy()
- return x
- def __repr__(self):
- return "<Field (%s).%s>" % (",".join(x.__name__ for x in self.owners),self.name)
- def copy(self):
- return copy.deepcopy(self)
- def randval(self):
- """Return a volatile object whose value is both random and suitable for this field"""
- fmtt = self.fmt[-1]
- if fmtt in "BHIQ":
- return {"B":RandByte,"H":RandShort,"I":RandInt, "Q":RandLong}[fmtt]()
- elif fmtt == "s":
- if self.fmt[0] in "0123456789":
- l = int(self.fmt[:-1])
- else:
- l = int(self.fmt[1:-1])
- return RandBin(l)
- else:
- warning("no random class for [%s] (fmt=%s)." % (self.name, self.fmt))
-
-
-
-
-class Emph:
- fld = ""
- def __init__(self, fld):
- self.fld = fld
- def __getattr__(self, attr):
- return getattr(self.fld,attr)
- def __hash__(self):
- return hash(self.fld)
- def __eq__(self, other):
- return self.fld == other
-
-
-class ActionField:
- _fld = None
- def __init__(self, fld, action_method, **kargs):
- self._fld = fld
- self._action_method = action_method
- self._privdata = kargs
- def any2i(self, pkt, val):
- getattr(pkt, self._action_method)(val, self._fld, **self._privdata)
- return getattr(self._fld, "any2i")(pkt, val)
- def __getattr__(self, attr):
- return getattr(self._fld,attr)
-
-
-class ConditionalField:
- fld = None
- def __init__(self, fld, cond):
- self.fld = fld
- self.cond = cond
- def _evalcond(self,pkt):
- return self.cond(pkt)
-
- def getfield(self, pkt, s):
- if self._evalcond(pkt):
- return self.fld.getfield(pkt,s)
- else:
- return s,None
-
- def addfield(self, pkt, s, val):
- if self._evalcond(pkt):
- return self.fld.addfield(pkt,s,val)
- else:
- return s
- def __getattr__(self, attr):
- return getattr(self.fld,attr)
-
-
-class PadField:
- """Add bytes after the proxified field so that it ends at the specified
- alignment from its begining"""
- _fld = None
- def __init__(self, fld, align, padwith=None):
- self._fld = fld
- self._align = align
- self._padwith = padwith or ""
-
- def padlen(self, flen):
- return -flen%self._align
-
- def getfield(self, pkt, s):
- remain,val = self._fld.getfield(pkt,s)
- padlen = self.padlen(len(s)-len(remain))
- return remain[padlen:], val
-
- def addfield(self, pkt, s, val):
- sval = self._fld.addfield(pkt, "", val)
- return s+sval+struct.pack("%is" % (self.padlen(len(sval))), self._padwith)
-
- def __getattr__(self, attr):
- return getattr(self._fld,attr)
-
-
-class MACField(Field):
- def __init__(self, name, default):
- Field.__init__(self, name, default, "6s")
- def i2m(self, pkt, x):
- if x is None:
- return "\0\0\0\0\0\0"
- return mac2str(x)
- def m2i(self, pkt, x):
- return str2mac(x)
- def any2i(self, pkt, x):
- if type(x) is str and len(x) is 6:
- x = self.m2i(pkt, x)
- return x
- def i2repr(self, pkt, x):
- x = self.i2h(pkt, x)
- if self in conf.resolve:
- x = conf.manufdb._resolve_MAC(x)
- return x
- def randval(self):
- return RandMAC()
-
-
-class IPField(Field):
- def __init__(self, name, default):
- Field.__init__(self, name, default, "4s")
- def h2i(self, pkt, x):
- if type(x) is str:
- try:
- inet_aton(x)
- except socket.error:
- x = Net(x)
- elif type(x) is list:
- x = [self.h2i(pkt, n) for n in x]
- return x
- def resolve(self, x):
- if self in conf.resolve:
- try:
- ret = socket.gethostbyaddr(x)[0]
- except:
- pass
- else:
- if ret:
- return ret
- return x
- def i2m(self, pkt, x):
- return inet_aton(x)
- def m2i(self, pkt, x):
- return inet_ntoa(x)
- def any2i(self, pkt, x):
- return self.h2i(pkt,x)
- def i2repr(self, pkt, x):
- return self.resolve(self.i2h(pkt, x))
- def randval(self):
- return RandIP()
-
-class SourceIPField(IPField):
- def __init__(self, name, dstname):
- IPField.__init__(self, name, None)
- self.dstname = dstname
- def i2m(self, pkt, x):
- if x is None:
- iff,x,gw = pkt.route()
- if x is None:
- x = "0.0.0.0"
- return IPField.i2m(self, pkt, x)
- def i2h(self, pkt, x):
- if x is None:
- dst=getattr(pkt,self.dstname)
- if isinstance(dst,Gen):
- r = map(conf.route.route, dst)
- r.sort()
- if r[0] != r[-1]:
- warning("More than one possible route for %s"%repr(dst))
- iff,x,gw = r[0]
- else:
- iff,x,gw = conf.route.route(dst)
- return IPField.i2h(self, pkt, x)
-
-
-
-
-class ByteField(Field):
- def __init__(self, name, default):
- Field.__init__(self, name, default, "B")
-
-class XByteField(ByteField):
- def i2repr(self, pkt, x):
- return lhex(self.i2h(pkt, x))
-
-class OByteField(ByteField):
- def i2repr(self, pkt, x):
- return "%03o"%self.i2h(pkt, x)
-
-class X3BytesField(XByteField):
- def __init__(self, name, default):
- Field.__init__(self, name, default, "!I")
- def addfield(self, pkt, s, val):
- return s+struct.pack(self.fmt, self.i2m(pkt,val))[1:4]
- def getfield(self, pkt, s):
- return s[3:], self.m2i(pkt, struct.unpack(self.fmt, "\x00"+s[:3])[0])
-
-class ThreeBytesField(X3BytesField, ByteField):
- def i2repr(self, pkt, x):
- return ByteField.i2repr(self, pkt, x)
-
-
-class ShortField(Field):
- def __init__(self, name, default):
- Field.__init__(self, name, default, "H")
-
-class LEShortField(Field):
- def __init__(self, name, default):
- Field.__init__(self, name, default, "<H")
-
-class XShortField(ShortField):
- def i2repr(self, pkt, x):
- return lhex(self.i2h(pkt, x))
-
-
-class IntField(Field):
- def __init__(self, name, default):
- Field.__init__(self, name, default, "I")
-
-class SignedIntField(Field):
- def __init__(self, name, default):
- Field.__init__(self, name, default, "i")
- def randval(self):
- return RandSInt()
-
-class LEIntField(Field):
- def __init__(self, name, default):
- Field.__init__(self, name, default, "<I")
-
-class LESignedIntField(Field):
- def __init__(self, name, default):
- Field.__init__(self, name, default, "<i")
- def randval(self):
- return RandSInt()
-
-class XIntField(IntField):
- def i2repr(self, pkt, x):
- return lhex(self.i2h(pkt, x))
-
-
-class LongField(Field):
- def __init__(self, name, default):
- Field.__init__(self, name, default, "Q")
-
-class XLongField(LongField):
- def i2repr(self, pkt, x):
- return lhex(self.i2h(pkt, x))
-
-class IEEEFloatField(Field):
- def __init__(self, name, default):
- Field.__init__(self, name, default, "f")
-
-class IEEEDoubleField(Field):
- def __init__(self, name, default):
- Field.__init__(self, name, default, "d")
-
-
-class StrField(Field):
- def __init__(self, name, default, fmt="H", remain=0):
- Field.__init__(self,name,default,fmt)
- self.remain = remain
- def i2len(self, pkt, i):
- return len(i)
- def i2m(self, pkt, x):
- if x is None:
- x = ""
- elif type(x) is not str:
- x=str(x)
- return x
- def addfield(self, pkt, s, val):
- return s+self.i2m(pkt, val)
- def getfield(self, pkt, s):
- if self.remain == 0:
- return "",self.m2i(pkt, s)
- else:
- return s[-self.remain:],self.m2i(pkt, s[:-self.remain])
- def randval(self):
- return RandBin(RandNum(0,1200))
-
-class PacketField(StrField):
- holds_packets=1
- def __init__(self, name, default, cls, remain=0):
- StrField.__init__(self, name, default, remain=remain)
- self.cls = cls
- def i2m(self, pkt, i):
- return str(i)
- def m2i(self, pkt, m):
- return self.cls(m)
- def getfield(self, pkt, s):
- i = self.m2i(pkt, s)
- remain = ""
- if conf.padding_layer in i:
- r = i[conf.padding_layer]
- del(r.underlayer.payload)
- remain = r.load
- return remain,i
-
-class PacketLenField(PacketField):
- holds_packets=1
- def __init__(self, name, default, cls, length_from=None):
- PacketField.__init__(self, name, default, cls)
- self.length_from = length_from
- def getfield(self, pkt, s):
- l = self.length_from(pkt)
- try:
- i = self.m2i(pkt, s[:l])
- except Exception:
- if conf.debug_dissector:
- raise
- i = conf.raw_layer(load=s[:l])
- return s[l:],i
-
-
-class PacketListField(PacketField):
- islist = 1
- holds_packets=1
- def __init__(self, name, default, cls, count_from=None, length_from=None):
- if default is None:
- default = [] # Create a new list for each instance
- PacketField.__init__(self, name, default, cls)
- self.count_from = count_from
- self.length_from = length_from
-
-
- def any2i(self, pkt, x):
- if type(x) is not list:
- return [x]
- else:
- return x
- def i2count(self, pkt, val):
- if type(val) is list:
- return len(val)
- return 1
- def i2len(self, pkt, val):
- return sum( len(p) for p in val )
- def do_copy(self, x):
- return map(lambda p:p.copy(), x)
- def getfield(self, pkt, s):
- c = l = None
- if self.length_from is not None:
- l = self.length_from(pkt)
- elif self.count_from is not None:
- c = self.count_from(pkt)
-
- lst = []
- ret = ""
- remain = s
- if l is not None:
- remain,ret = s[:l],s[l:]
- while remain:
- if c is not None:
- if c <= 0:
- break
- c -= 1
- try:
- p = self.m2i(pkt,remain)
- except Exception:
- if conf.debug_dissector:
- raise
- p = conf.raw_layer(load=remain)
- remain = ""
- else:
- if conf.padding_layer in p:
- pad = p[conf.padding_layer]
- remain = pad.load
- del(pad.underlayer.payload)
- else:
- remain = ""
- lst.append(p)
- return remain+ret,lst
- def addfield(self, pkt, s, val):
- return s+"".join(map(str, val))
-
-
-class StrFixedLenField(StrField):
- def __init__(self, name, default, length=None, length_from=None):
- StrField.__init__(self, name, default)
- self.length_from = length_from
- if length is not None:
- self.length_from = lambda pkt,length=length: length
- def i2repr(self, pkt, v):
- if type(v) is str:
- v = v.rstrip("\0")
- return repr(v)
- def getfield(self, pkt, s):
- l = self.length_from(pkt)
- return s[l:], self.m2i(pkt,s[:l])
- def addfield(self, pkt, s, val):
- l = self.length_from(pkt)
- return s+struct.pack("%is"%l,self.i2m(pkt, val))
- def randval(self):
- try:
- l = self.length_from(None)
- except:
- l = RandNum(0,200)
- return RandBin(l)
-
-class StrFixedLenEnumField(StrFixedLenField):
- def __init__(self, name, default, length=None, enum=None, length_from=None):
- StrFixedLenField.__init__(self, name, default, length=length, length_from=length_from)
- self.enum = enum
- def i2repr(self, pkt, v):
- r = v.rstrip("\0")
- rr = repr(r)
- if v in self.enum:
- rr = "%s (%s)" % (rr, self.enum[v])
- elif r in self.enum:
- rr = "%s (%s)" % (rr, self.enum[r])
- return rr
-
-class NetBIOSNameField(StrFixedLenField):
- def __init__(self, name, default, length=31):
- StrFixedLenField.__init__(self, name, default, length)
- def i2m(self, pkt, x):
- l = self.length_from(pkt)/2
- if x is None:
- x = ""
- x += " "*(l)
- x = x[:l]
- x = "".join(map(lambda x: chr(0x41+(ord(x)>>4))+chr(0x41+(ord(x)&0xf)), x))
- x = " "+x
- return x
- def m2i(self, pkt, x):
- x = x.strip("\x00").strip(" ")
- return "".join(map(lambda x,y: chr((((ord(x)-1)&0xf)<<4)+((ord(y)-1)&0xf)), x[::2],x[1::2]))
-
-class StrLenField(StrField):
- def __init__(self, name, default, fld=None, length_from=None):
- StrField.__init__(self, name, default)
- self.length_from = length_from
- def getfield(self, pkt, s):
- l = self.length_from(pkt)
- return s[l:], self.m2i(pkt,s[:l])
-
-class FieldListField(Field):
- islist=1
- def __init__(self, name, default, field, length_from=None, count_from=None):
- if default is None:
- default = [] # Create a new list for each instance
- Field.__init__(self, name, default)
- self.count_from = count_from
- self.length_from = length_from
- self.field = field
-
- def i2count(self, pkt, val):
- if type(val) is list:
- return len(val)
- return 1
- def i2len(self, pkt, val):
- return sum( self.field.i2len(pkt,v) for v in val )
-
- def i2m(self, pkt, val):
- if val is None:
- val = []
- return val
- def any2i(self, pkt, x):
- if type(x) is not list:
- return [x]
- else:
- return x
- def addfield(self, pkt, s, val):
- val = self.i2m(pkt, val)
- for v in val:
- s = self.field.addfield(pkt, s, v)
- return s
- def getfield(self, pkt, s):
- c = l = None
- if self.length_from is not None:
- l = self.length_from(pkt)
- elif self.count_from is not None:
- c = self.count_from(pkt)
-
- val = []
- ret=""
- if l is not None:
- s,ret = s[:l],s[l:]
-
- while s:
- if c is not None:
- if c <= 0:
- break
- c -= 1
- s,v = self.field.getfield(pkt, s)
- val.append(v)
- return s+ret, val
-
-class FieldLenField(Field):
- def __init__(self, name, default, length_of=None, fmt = "H", count_of=None, adjust=lambda pkt,x:x, fld=None):
- Field.__init__(self, name, default, fmt)
- self.length_of=length_of
- self.count_of=count_of
- self.adjust=adjust
- if fld is not None:
- FIELD_LENGTH_MANAGEMENT_DEPRECATION(self.__class__.__name__)
- self.length_of = fld
- def i2m(self, pkt, x):
- if x is None:
- if self.length_of is not None:
- fld,fval = pkt.getfield_and_val(self.length_of)
- f = fld.i2len(pkt, fval)
- else:
- fld,fval = pkt.getfield_and_val(self.count_of)
- f = fld.i2count(pkt, fval)
- x = self.adjust(pkt,f)
- return x
-
-class StrNullField(StrField):
- def addfield(self, pkt, s, val):
- return s+self.i2m(pkt, val)+"\x00"
- def getfield(self, pkt, s):
- l = s.find("\x00")
- if l < 0:
- #XXX \x00 not found
- return "",s
- return s[l+1:],self.m2i(pkt, s[:l])
- def randval(self):
- return RandTermString(RandNum(0,1200),"\x00")
-
-class StrStopField(StrField):
- def __init__(self, name, default, stop, additionnal=0):
- Field.__init__(self, name, default)
- self.stop=stop
- self.additionnal=additionnal
- def getfield(self, pkt, s):
- l = s.find(self.stop)
- if l < 0:
- return "",s
-# raise Scapy_Exception,"StrStopField: stop value [%s] not found" %stop
- l += len(self.stop)+self.additionnal
- return s[l:],s[:l]
- def randval(self):
- return RandTermString(RandNum(0,1200),self.stop)
-
-class LenField(Field):
- def i2m(self, pkt, x):
- if x is None:
- x = len(pkt.payload)
- return x
-
-class BCDFloatField(Field):
- def i2m(self, pkt, x):
- return int(256*x)
- def m2i(self, pkt, x):
- return x/256.0
-
-class BitField(Field):
- def __init__(self, name, default, size):
- Field.__init__(self, name, default)
- self.rev = size < 0
- self.size = abs(size)
- def reverse(self, val):
- if self.size == 16:
- val = socket.ntohs(val)
- elif self.size == 32:
- val = socket.ntohl(val)
- return val
-
- def addfield(self, pkt, s, val):
- val = self.i2m(pkt, val)
- if type(s) is tuple:
- s,bitsdone,v = s
- else:
- bitsdone = 0
- v = 0
- if self.rev:
- val = self.reverse(val)
- v <<= self.size
- v |= val & ((1L<<self.size) - 1)
- bitsdone += self.size
- while bitsdone >= 8:
- bitsdone -= 8
- s = s+struct.pack("!B", v >> bitsdone)
- v &= (1L<<bitsdone)-1
- if bitsdone:
- return s,bitsdone,v
- else:
- return s
- def getfield(self, pkt, s):
- if type(s) is tuple:
- s,bn = s
- else:
- bn = 0
- # we don't want to process all the string
- nb_bytes = (self.size+bn-1)/8 + 1
- w = s[:nb_bytes]
-
- # split the substring byte by byte
- bytes = struct.unpack('!%dB' % nb_bytes , w)
-
- b = 0L
- for c in range(nb_bytes):
- b |= long(bytes[c]) << (nb_bytes-c-1)*8
-
- # get rid of high order bits
- b &= (1L << (nb_bytes*8-bn)) - 1
-
- # remove low order bits
- b = b >> (nb_bytes*8 - self.size - bn)
-
- if self.rev:
- b = self.reverse(b)
-
- bn += self.size
- s = s[bn/8:]
- bn = bn%8
- b = self.m2i(pkt, b)
- if bn:
- return (s,bn),b
- else:
- return s,b
- def randval(self):
- return RandNum(0,2**self.size-1)
-
-
-class BitFieldLenField(BitField):
- def __init__(self, name, default, size, length_of=None, count_of=None, adjust=lambda pkt,x:x):
- BitField.__init__(self, name, default, size)
- self.length_of=length_of
- self.count_of=count_of
- self.adjust=adjust
- def i2m(self, pkt, x):
- return FieldLenField.i2m.im_func(self, pkt, x)
-
-
-class XBitField(BitField):
- def i2repr(self, pkt, x):
- return lhex(self.i2h(pkt,x))
-
-
-class EnumField(Field):
- def __init__(self, name, default, enum, fmt = "H"):
- i2s = self.i2s = {}
- s2i = self.s2i = {}
- if type(enum) is list:
- keys = xrange(len(enum))
- else:
- keys = enum.keys()
- if filter(lambda x: type(x) is str, keys):
- i2s,s2i = s2i,i2s
- for k in keys:
- i2s[k] = enum[k]
- s2i[enum[k]] = k
- Field.__init__(self, name, default, fmt)
- def any2i_one(self, pkt, x):
- if type(x) is str:
- x = self.s2i[x]
- return x
- def i2repr_one(self, pkt, x):
- if self not in conf.noenum and not isinstance(x,VolatileValue) and x in self.i2s:
- return self.i2s[x]
- return repr(x)
-
- def any2i(self, pkt, x):
- if type(x) is list:
- return map(lambda z,pkt=pkt:self.any2i_one(pkt,z), x)
- else:
- return self.any2i_one(pkt,x)
- def i2repr(self, pkt, x):
- if type(x) is list:
- return map(lambda z,pkt=pkt:self.i2repr_one(pkt,z), x)
- else:
- return self.i2repr_one(pkt,x)
-
-class CharEnumField(EnumField):
- def __init__(self, name, default, enum, fmt = "1s"):
- EnumField.__init__(self, name, default, enum, fmt)
- k = self.i2s.keys()
- if k and len(k[0]) != 1:
- self.i2s,self.s2i = self.s2i,self.i2s
- def any2i_one(self, pkt, x):
- if len(x) != 1:
- x = self.s2i[x]
- return x
-
-class BitEnumField(BitField,EnumField):
- def __init__(self, name, default, size, enum):
- EnumField.__init__(self, name, default, enum)
- self.rev = size < 0
- self.size = abs(size)
- def any2i(self, pkt, x):
- return EnumField.any2i(self, pkt, x)
- def i2repr(self, pkt, x):
- return EnumField.i2repr(self, pkt, x)
-
-class ShortEnumField(EnumField):
- def __init__(self, name, default, enum):
- EnumField.__init__(self, name, default, enum, "H")
-
-class LEShortEnumField(EnumField):
- def __init__(self, name, default, enum):
- EnumField.__init__(self, name, default, enum, "<H")
-
-class ByteEnumField(EnumField):
- def __init__(self, name, default, enum):
- EnumField.__init__(self, name, default, enum, "B")
-
-class IntEnumField(EnumField):
- def __init__(self, name, default, enum):
- EnumField.__init__(self, name, default, enum, "I")
-
-class SignedIntEnumField(EnumField):
- def __init__(self, name, default, enum):
- EnumField.__init__(self, name, default, enum, "i")
- def randval(self):
- return RandSInt()
-
-class LEIntEnumField(EnumField):
- def __init__(self, name, default, enum):
- EnumField.__init__(self, name, default, enum, "<I")
-
-class XShortEnumField(ShortEnumField):
- def i2repr_one(self, pkt, x):
- if self not in conf.noenum and not isinstance(x,VolatileValue) and x in self.i2s:
- return self.i2s[x]
- return lhex(x)
-
-class MultiEnumField(EnumField):
- def __init__(self, name, default, enum, depends_on, fmt = "H"):
-
- self.depends_on = depends_on
- self.i2s_multi = enum
- self.s2i_multi = {}
- self.s2i_all = {}
- for m in enum:
- self.s2i_multi[m] = s2i = {}
- for k,v in enum[m].iteritems():
- s2i[v] = k
- self.s2i_all[v] = k
- Field.__init__(self, name, default, fmt)
- def any2i_one(self, pkt, x):
- if type (x) is str:
- v = self.depends_on(pkt)
- if v in self.s2i_multi:
- s2i = self.s2i_multi[v]
- if x in s2i:
- return s2i[x]
- return self.s2i_all[x]
- return x
- def i2repr_one(self, pkt, x):
- v = self.depends_on(pkt)
- if v in self.i2s_multi:
- return self.i2s_multi[v].get(x,x)
- return x
-
-class BitMultiEnumField(BitField,MultiEnumField):
- def __init__(self, name, default, size, enum, depends_on):
- MultiEnumField.__init__(self, name, default, enum)
- self.rev = size < 0
- self.size = abs(size)
- def any2i(self, pkt, x):
- return MultiEnumField.any2i(self, pkt, x)
- def i2repr(self, pkt, x):
- return MultiEnumField.i2repr(self, pkt, x)
-
-
-# Little endian long field
-class LELongField(Field):
- def __init__(self, name, default):
- Field.__init__(self, name, default, "<Q")
-
-# Little endian fixed length field
-class LEFieldLenField(FieldLenField):
- def __init__(self, name, default, length_of=None, fmt = "<H", count_of=None, adjust=lambda pkt,x:x, fld=None):
- FieldLenField.__init__(self, name, default, length_of=length_of, fmt=fmt, fld=fld, adjust=adjust)
-
-
-class FlagsField(BitField):
- def __init__(self, name, default, size, names):
- self.multi = type(names) is list
- if self.multi:
- self.names = map(lambda x:[x], names)
- else:
- self.names = names
- BitField.__init__(self, name, default, size)
- def any2i(self, pkt, x):
- if type(x) is str:
- if self.multi:
- x = map(lambda y:[y], x.split("+"))
- y = 0
- for i in x:
- y |= 1 << self.names.index(i)
- x = y
- return x
- def i2repr(self, pkt, x):
- if type(x) is list or type(x) is tuple:
- return repr(x)
- if self.multi:
- r = []
- else:
- r = ""
- i=0
- while x:
- if x & 1:
- r += self.names[i]
- i += 1
- x >>= 1
- if self.multi:
- r = "+".join(r)
- return r
-
-
-
-
-class FixedPointField(BitField):
- def __init__(self, name, default, size, frac_bits=16):
- self.frac_bits = frac_bits
- BitField.__init__(self, name, default, size)
-
- def any2i(self, pkt, val):
- if val is None:
- return val
- ival = int(val)
- fract = int( (val-ival) * 2**self.frac_bits )
- return (ival << self.frac_bits) | fract
-
- def i2h(self, pkt, val):
- int_part = val >> self.frac_bits
- frac_part = val & (1L << self.frac_bits) - 1
- frac_part /= 2.0**self.frac_bits
- return int_part+frac_part
- def i2repr(self, pkt, val):
- return self.i2h(pkt, val)