• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1from enum import test
2% LLDP test campaign
3
4#
5# execute test:
6# > test/run_tests -P "load_contrib('lldp')" -t scapy/contrib/lldp.uts
7#
8
9+ Basic layer handling
10= build basic LLDP frames
11
12frm = Ether(src='01:01:01:01:01:01', dst=LLDP_NEAREST_BRIDGE_MAC)/ \
13      LLDPDUChassisID(subtype=LLDPDUChassisID.SUBTYPE_MAC_ADDRESS, id=b'\x06\x05\x04\x03\x02\x01') / \
14      LLDPDUPortID(subtype=LLDPDUPortID.SUBTYPE_MAC_ADDRESS, id=b'\x01\x02\x03\x04\x05\x06')/\
15      LLDPDUTimeToLive()/\
16      LLDPDUSystemName(system_name='mate')/\
17      LLDPDUSystemCapabilities(telephone_available=1, router_available=1, telephone_enabled=1)/\
18      LLDPDUManagementAddress(
19            management_address_subtype=LLDPDUManagementAddress.SUBTYPE_MANAGEMENT_ADDRESS_IPV4,
20            management_address='1.2.3.4',
21            interface_numbering_subtype=LLDPDUManagementAddress.SUBTYPE_INTERFACE_NUMBER_IF_INDEX,
22            interface_number=23,
23            object_id='abcd') / \
24      LLDPDUEndOfLLDPDU()
25
26frm = frm.build()
27frm = Ether(frm)
28
29= add padding if required
30
31conf.contribs['LLDP'].strict_mode_disable()
32frm = Ether(src='01:01:01:01:01:01', dst=LLDP_NEAREST_BRIDGE_MAC) / \
33      LLDPDUPortID(subtype=LLDPDUPortID.SUBTYPE_INTERFACE_NAME, id='eth0') / \
34      LLDPDUChassisID(subtype=LLDPDUChassisID.SUBTYPE_MAC_ADDRESS, id=b'\x06\x05\x04\x03\x02\x01') / \
35      LLDPDUTimeToLive() / \
36      LLDPDUEndOfLLDPDU()
37assert(len(raw(frm)) == 60)
38assert(len(raw(Ether(raw(frm))[Padding])) == 24)
39
40frm = Ether(src='01:01:01:01:01:01', dst=LLDP_NEAREST_BRIDGE_MAC) / \
41      LLDPDUPortID(subtype=LLDPDUPortID.SUBTYPE_INTERFACE_NAME, id='eth012345678901234567890123') / \
42      LLDPDUChassisID(subtype=LLDPDUChassisID.SUBTYPE_MAC_ADDRESS, id=b'\x06\x05\x04\x03\x02\x01') / \
43      LLDPDUTimeToLive() / \
44      LLDPDUEndOfLLDPDU()
45assert (len(raw(frm)) == 60)
46assert (len(raw(Ether(raw(frm))[Padding])) == 1)
47
48frm = Ether(src='01:01:01:01:01:01', dst=LLDP_NEAREST_BRIDGE_MAC) / \
49      LLDPDUPortID(subtype=LLDPDUPortID.SUBTYPE_INTERFACE_NAME, id='eth0123456789012345678901234') / \
50      LLDPDUChassisID(subtype=LLDPDUChassisID.SUBTYPE_MAC_ADDRESS, id=b'\x06\x05\x04\x03\x02\x01') / \
51      LLDPDUTimeToLive() / \
52      LLDPDUEndOfLLDPDU()
53assert (len(raw(frm)) == 60)
54try:
55      Ether(raw(frm))[Padding]
56      assert False
57except IndexError:
58      pass
59
60
61+ strict mode handling - build
62= basic frame structure
63
64conf.contribs['LLDP'].strict_mode_enable()
65
66# invalid lenght in LLDPDUEndOfLLDPDU
67try:
68      frm = Ether()/LLDPDUChassisID(id='slartibart')/LLDPDUPortID(id='42')/LLDPDUTimeToLive()/LLDPDUEndOfLLDPDU(_length=8)
69      frm.build()
70      assert False
71except LLDPInvalidLengthField:
72      pass
73
74# missing chassis id
75try:
76      frm = Ether()/LLDPDUChassisID()/LLDPDUPortID(id='42')/LLDPDUTimeToLive()/LLDPDUEndOfLLDPDU()
77      frm.build()
78      assert False
79except LLDPInvalidLengthField:
80      pass
81
82# missing management address
83try:
84      frm = Ether()/LLDPDUChassisID(id='slartibart')/LLDPDUPortID(id='42')/LLDPDUTimeToLive()/LLDPDUManagementAddress()/LLDPDUEndOfLLDPDU()
85      frm.build()
86      assert False
87except LLDPInvalidLengthField:
88      pass
89
90+ strict mode handling - dissect
91= basic frame structure
92
93conf.contribs['LLDP'].strict_mode_enable()
94# missing PortIDTLV
95try:
96      frm = Ether() / LLDPDUChassisID(id='slartibart') / LLDPDUTimeToLive() / LLDPDUEndOfLLDPDU()
97      Ether(frm.build())
98      assert False
99except LLDPInvalidFrameStructure:
100      pass
101
102# invalid order
103try:
104      frm = Ether() / LLDPDUPortID(id='42') / LLDPDUChassisID(id='slartibart') / LLDPDUTimeToLive() / LLDPDUEndOfLLDPDU()
105      Ether(frm.build())
106      assert False
107except LLDPInvalidFrameStructure:
108      pass
109
110# layer LLDPDUPortID occures twice
111try:
112      frm = Ether() / LLDPDUChassisID(id='slartibart') / LLDPDUPortID(id='42') / LLDPDUPortID(id='23')  / LLDPDUTimeToLive() / LLDPDUEndOfLLDPDU()
113      Ether(frm.build())
114      assert False
115except LLDPInvalidFrameStructure:
116      pass
117
118# missing LLDPDUEndOfLLDPDU
119try:
120      frm = Ether() / LLDPDUChassisID(id='slartibart') / LLDPDUPortID(id='42') / \
121            LLDPDUPortID(id='23') / LLDPDUTimeToLive() / LLDPDUEndOfLLDPDU()
122      Ether(frm.build())
123      assert False
124except LLDPInvalidFrameStructure:
125      pass
126
127conf.contribs['LLDP'].strict_mode_disable()
128frm = Ether()/LLDPDUChassisID()/LLDPDUTimeToLive()/LLDPDUEndOfLLDPDU()
129frm = Ether(frm.build())
130
131= length fields / value sizes checks
132
133conf.contribs['LLDP'].strict_mode_enable()
134# missing chassis id => invalid length
135try:
136      frm = Ether() / LLDPDUChassisID() / LLDPDUPortID(id='42') / LLDPDUTimeToLive() / LLDPDUEndOfLLDPDU()
137      Ether(frm.build())
138      assert False
139except LLDPInvalidLengthField:
140      pass
141
142# invalid lenght in LLDPDUEndOfLLDPDU
143try:
144      frm = Ether()/LLDPDUChassisID(id='slartibart')/LLDPDUPortID(id='42')/LLDPDUTimeToLive()/LLDPDUEndOfLLDPDU(_length=8)
145      Ether(frm.build())
146      assert False
147except LLDPInvalidLengthField:
148      pass
149
150# invalid management address
151try:
152      frm = Ether() / LLDPDUChassisID(id='slartibart') / LLDPDUPortID(id='42') / LLDPDUTimeToLive() / LLDPDUManagementAddress() / LLDPDUEndOfLLDPDU()
153      Ether(frm.build())
154      assert False
155except LLDPInvalidLengthField:
156      pass
157
158conf.contribs['LLDP'].strict_mode_disable()
159
160frm = Ether() / LLDPDUChassisID(id='slartibart') / LLDPDUPortID(id='42') / LLDPDUTimeToLive() / LLDPDUEndOfLLDPDU()
161frm = Ether(frm.build())
162
163frm = Ether() / LLDPDUChassisID() / LLDPDUPortID() / LLDPDUTimeToLive() / LLDPDUEndOfLLDPDU(_length=8)
164frm = Ether(frm.build())
165
166= test attribute values
167
168conf.contribs['LLDP'].strict_mode_enable()
169
170frm = Ether(src='01:01:01:01:01:01', dst=LLDP_NEAREST_BRIDGE_MAC)/ \
171      LLDPDUChassisID(subtype=LLDPDUChassisID.SUBTYPE_MAC_ADDRESS, id=b'\x06\x05\x04\x03\x02\x01') / \
172      LLDPDUPortID(subtype=LLDPDUPortID.SUBTYPE_MAC_ADDRESS, id=b'\x01\x02\x03\x04\x05\x06')/\
173      LLDPDUTimeToLive()/\
174      LLDPDUSystemName(system_name='things will')/\
175      LLDPDUSystemCapabilities(telephone_available=1,
176                               router_available=1,
177                               telephone_enabled=1,
178                               router_enabled=1)/\
179      LLDPDUManagementAddress(
180            management_address_subtype=LLDPDUManagementAddress.SUBTYPE_MANAGEMENT_ADDRESS_IPV4,
181            management_address='1.2.3.4',
182            interface_numbering_subtype=LLDPDUManagementAddress.SUBTYPE_INTERFACE_NUMBER_IF_INDEX,
183            interface_number=23,
184            object_id='burn') / \
185      LLDPDUSystemDescription(description='without tests.') / \
186      LLDPDUPortDescription(description='always!') / \
187      LLDPDUEndOfLLDPDU()
188
189frm = Ether(frm.build())
190
191assert str2mac(frm[LLDPDUChassisID].id) == '06:05:04:03:02:01'
192assert str2mac(frm[LLDPDUPortID].id) == '01:02:03:04:05:06'
193sys_capabilities = frm[LLDPDUSystemCapabilities]
194assert sys_capabilities.reserved_5_available == 0
195assert sys_capabilities.reserved_4_available == 0
196assert sys_capabilities.reserved_3_available == 0
197assert sys_capabilities.reserved_2_available == 0
198assert sys_capabilities.reserved_1_available == 0
199assert sys_capabilities.two_port_mac_relay_available == 0
200assert sys_capabilities.s_vlan_component_available == 0
201assert sys_capabilities.c_vlan_component_available == 0
202assert sys_capabilities.station_only_available == 0
203assert sys_capabilities.docsis_cable_device_available == 0
204assert sys_capabilities.telephone_available == 1
205assert sys_capabilities.router_available == 1
206assert sys_capabilities.wlan_access_point_available == 0
207assert sys_capabilities.mac_bridge_available == 0
208assert sys_capabilities.repeater_available == 0
209assert sys_capabilities.other_available == 0
210assert sys_capabilities.reserved_5_enabled == 0
211assert sys_capabilities.reserved_4_enabled == 0
212assert sys_capabilities.reserved_3_enabled == 0
213assert sys_capabilities.reserved_2_enabled == 0
214assert sys_capabilities.reserved_1_enabled == 0
215assert sys_capabilities.two_port_mac_relay_enabled == 0
216assert sys_capabilities.s_vlan_component_enabled == 0
217assert sys_capabilities.c_vlan_component_enabled == 0
218assert sys_capabilities.station_only_enabled == 0
219assert sys_capabilities.docsis_cable_device_enabled == 0
220assert sys_capabilities.telephone_enabled == 1
221assert sys_capabilities.router_enabled == 1
222assert sys_capabilities.wlan_access_point_enabled == 0
223assert sys_capabilities.mac_bridge_enabled == 0
224assert sys_capabilities.repeater_enabled == 0
225assert sys_capabilities.other_enabled == 0
226assert frm[LLDPDUManagementAddress].management_address == b'1.2.3.4'
227assert frm[LLDPDUSystemName].system_name == b'things will'
228assert frm[LLDPDUManagementAddress].object_id == b'burn'
229assert frm[LLDPDUSystemDescription].description == b'without tests.'
230assert frm[LLDPDUPortDescription].description == b'always!'
231