summaryrefslogtreecommitdiffstats
path: root/scripts/external_libs/dpkt-1.8.6/dpkt/ppp.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/external_libs/dpkt-1.8.6/dpkt/ppp.py')
-rw-r--r--scripts/external_libs/dpkt-1.8.6/dpkt/ppp.py63
1 files changed, 63 insertions, 0 deletions
diff --git a/scripts/external_libs/dpkt-1.8.6/dpkt/ppp.py b/scripts/external_libs/dpkt-1.8.6/dpkt/ppp.py
new file mode 100644
index 00000000..f4898b95
--- /dev/null
+++ b/scripts/external_libs/dpkt-1.8.6/dpkt/ppp.py
@@ -0,0 +1,63 @@
+# $Id: ppp.py 65 2010-03-26 02:53:51Z dugsong $
+
+"""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 = {}
+
+ def set_p(cls, p, pktclass):
+ cls._protosw[p] = pktclass
+ set_p = classmethod(set_p)
+
+ def get_p(cls, p):
+ return cls._protosw[p]
+ get_p = classmethod(get_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()