• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# This file is part of Scapy
2# Scapy is free software: you can redistribute it and/or modify
3# it under the terms of the GNU General Public License as published by
4# the Free Software Foundation, either version 2 of the License, or
5# any later version.
6#
7# Scapy is distributed in the hope that it will be useful,
8# but WITHOUT ANY WARRANTY; without even the implied warranty of
9# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10# GNU General Public License for more details.
11#
12# You should have received a copy of the GNU General Public License
13# along with Scapy. If not, see <http://www.gnu.org/licenses/>.
14
15# scapy.contrib.description = VLAN Query Protocol
16# scapy.contrib.status = loads
17
18from scapy.packet import *
19from scapy.fields import *
20from scapy.layers.inet import UDP
21
22class VQP(Packet):
23        name = "VQP"
24        fields_desc = [
25                ByteField("const", 1),
26                ByteEnumField("type", 1, {
27                        1:"requestPort", 2:"responseVLAN",
28                        3:"requestReconfirm", 4:"responseReconfirm"
29                }),
30                ByteEnumField("errorcodeaction", 0, {
31                        0:"none",3:"accessDenied",
32                        4:"shutdownPort", 5:"wrongDomain"
33                }),
34                ByteEnumField("unknown", 2, {
35                        2:"inGoodResponse", 6:"inRequests"
36                }),
37                IntField("seq",0),
38        ]
39
40class VQPEntry(Packet):
41        name = "VQPEntry"
42        fields_desc = [
43                IntEnumField("datatype", 0, {
44                        3073:"clientIPAddress", 3074:"portName",
45                        3075:"VLANName", 3076:"Domain", 3077:"ethernetPacket",
46                        3078:"ReqMACAddress", 3079:"unknown",
47                        3080:"ResMACAddress"
48                }),
49                FieldLenField("len", None),
50                ConditionalField(IPField("datatom", "0.0.0.0"),
51                        lambda p:p.datatype==3073),
52                ConditionalField(MACField("data", "00:00:00:00:00:00"),
53                        lambda p:p.datatype==3078),
54                ConditionalField(MACField("data", "00:00:00:00:00:00"),
55                        lambda p:p.datatype==3080),
56                ConditionalField(StrLenField("data", None,
57                        length_from=lambda p:p.len),
58                        lambda p:p.datatype not in [3073, 3078, 3080]),
59        ]
60        def post_build(self, p, pay):
61                if self.len is None:
62                        l = len(p.data)
63                        p = p[:2]+struct.pack("!H",l)+p[4:]
64                return p
65
66bind_layers(UDP,        VQP,            sport=1589)
67bind_layers(UDP,        VQP,            dport=1589)
68bind_layers(VQP,        VQPEntry,       )
69bind_layers(VQPEntry,   VQPEntry,       )
70