diff options
Diffstat (limited to 'external_libs/python/dpkt-1.8.6.2/dpkt/ppp.py')
-rw-r--r-- | external_libs/python/dpkt-1.8.6.2/dpkt/ppp.py | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/external_libs/python/dpkt-1.8.6.2/dpkt/ppp.py b/external_libs/python/dpkt-1.8.6.2/dpkt/ppp.py new file mode 100644 index 00000000..282bdd98 --- /dev/null +++ b/external_libs/python/dpkt-1.8.6.2/dpkt/ppp.py @@ -0,0 +1,66 @@ +# $Id: ppp.py 65 2010-03-26 02:53:51Z dugsong $ +# -*- coding: utf-8 -*- +"""Point-to-Point Protocol.""" + +import struct +import dpkt + +# XXX - finish later + +# http://www.iana.org/assignments/ppp-numbers +PPP_IP = 0x21 # Internet Protocol +PPP_IP6 = 0x57 # Internet Protocol v6 + +# Protocol field compression +PFC_BIT = 0x01 + + +class PPP(dpkt.Packet): + __hdr__ = ( + ('p', 'B', PPP_IP), + ) + _protosw = {} + + @classmethod + def set_p(cls, p, pktclass): + cls._protosw[p] = pktclass + + @classmethod + def get_p(cls, p): + return cls._protosw[p] + + def unpack(self, buf): + dpkt.Packet.unpack(self, buf) + if self.p & PFC_BIT == 0: + self.p = struct.unpack('>H', buf[:2])[0] + self.data = self.data[1:] + try: + self.data = self._protosw[self.p](self.data) + setattr(self, self.data.__class__.__name__.lower(), self.data) + except (KeyError, struct.error, dpkt.UnpackError): + pass + + def pack_hdr(self): + try: + if self.p > 0xff: + return struct.pack('>H', self.p) + return dpkt.Packet.pack_hdr(self) + except struct.error, e: + raise dpkt.PackError(str(e)) + + +def __load_protos(): + g = globals() + for k, v in g.iteritems(): + if k.startswith('PPP_'): + name = k[4:] + modname = name.lower() + try: + mod = __import__(modname, g) + except ImportError: + continue + PPP.set_p(v, getattr(mod, name)) + + +if not PPP._protosw: + __load_protos() |