1
2
3 """Point-to-Point Protocol."""
4
5 import struct
6 import dpkt
7
8
9
10
11 PPP_IP = 0x21
12 PPP_IP6 = 0x57
13
14
15 PFC_BIT = 0x01
16
17 -class PPP(dpkt.Packet):
18 __hdr__ = (
19 ('p', 'B', PPP_IP),
20 )
21 _protosw = {}
22
23 - def set_p(cls, p, pktclass):
25 set_p = classmethod(set_p)
26
29 get_p = classmethod(get_p)
30
32 dpkt.Packet.unpack(self, buf)
33 if self.p & PFC_BIT == 0:
34 self.p = struct.unpack('>H', buf[:2])[0]
35 self.data = self.data[1:]
36 try:
37 self.data = self._protosw[self.p](self.data)
38 setattr(self, self.data.__class__.__name__.lower(), self.data)
39 except (KeyError, struct.error, dpkt.UnpackError):
40 pass
41
49
51 import os
52 d = dict.fromkeys([ x[:-3] for x in os.listdir(os.path.dirname(__file__) or '.') if x.endswith('.py') ])
53 g = globals()
54 for k, v in g.iteritems():
55 if k.startswith('PPP_'):
56 name = k[4:]
57 modname = name.lower()
58 if modname in d:
59 mod = __import__(modname, g)
60 PPP.set_p(v, getattr(mod, name))
61
62 if not PPP._protosw:
63 __load_protos()
64