1
2
3 """PPP-over-Ethernet."""
4 from __future__ import absolute_import
5
6 import struct
7 import codecs
8
9 from . import dpkt
10 from . import ppp
11 from .decorators import deprecated
12
13
14 PPPoE_PADI = 0x09
15 PPPoE_PADO = 0x07
16 PPPoE_PADR = 0x19
17 PPPoE_PADS = 0x65
18 PPPoE_PADT = 0xA7
19 PPPoE_SESSION = 0x00
20
21
22 -class PPPoE(dpkt.Packet):
23 """PPP-over-Ethernet.
24
25 TODO: Longer class information....
26
27 Attributes:
28 __hdr__: Header fields of PPPoE.
29 TODO.
30 """
31
32 __hdr__ = (
33 ('_v_type', 'B', 0x11),
34 ('code', 'B', 0),
35 ('session', 'H', 0),
36 ('len', 'H', 0)
37 )
38
39 @property
42
43 @v.setter
46
47 @property
50
51 @type.setter
54
64
65
66 -class PPP(ppp.PPP):
95
98 s = ("11070000002801010000010300046413"
99 "85180102000442524153010400103d0f"
100 "0587062484f2df32b9ddfd77bd5b")
101 s = codecs.decode(s, 'hex')
102 p = PPPoE(s)
103
104 assert p.code == PPPoE_PADO
105 assert p.v == 1
106 assert p.type == 1
107
108 s = ("11190000002801010000010300046413"
109 "85180102000442524153010400103d0f"
110 "0587062484f2df32b9ddfd77bd5b")
111 s = codecs.decode(s, 'hex')
112 p = PPPoE(s)
113
114 assert p.code == PPPoE_PADR
115
116 assert p.pack_hdr() == s[:6]
117
120 s = "11000011000cc0210101000a050605fcd459"
121 s = codecs.decode(s, 'hex')
122 p = PPPoE(s)
123
124 assert p.code == PPPoE_SESSION
125 assert isinstance(p.ppp, PPP)
126 assert p.data.p == 0xc021
127 assert len(p.data.data) == 10
128
129 assert p.data.pack_hdr() == b"\xc0\x21"
130
131 s = ("110000110066005760000000003c3a40fc000000000000000000000000000001"
132 "fc0000000002010000000000000100018100bf291f9700010102030405060708"
133 "090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728"
134 "292a2b2c2d2e2f3031323334")
135 s = codecs.decode(s, 'hex')
136 p = PPPoE(s)
137 assert p.code == PPPoE_SESSION
138 assert isinstance(p.ppp, PPP)
139 assert p.data.p == ppp.PPP_IP6
140 assert p.data.data.p == 58
141
142 assert p.ppp.pack_hdr() == b"\x57"
143
151
156
157
158
159