1 from 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 12 frm = 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 26 frm = frm.build() 27 frm = Ether(frm) 28 29 = add padding if required 30 31 conf.contribs['LLDP'].strict_mode_disable() 32 frm = 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() 37 assert(len(raw(frm)) == 60) 38 assert(len(raw(Ether(raw(frm))[Padding])) == 24) 39 40 frm = 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() 45 assert (len(raw(frm)) == 60) 46 assert (len(raw(Ether(raw(frm))[Padding])) == 1) 47 48 frm = 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() 53 assert (len(raw(frm)) == 60) 54 try: 55 Ether(raw(frm))[Padding] 56 assert False 57 except IndexError: 58 pass 59 60 61 + strict mode handling - build 62 = basic frame structure 63 64 conf.contribs['LLDP'].strict_mode_enable() 65 66 # invalid lenght in LLDPDUEndOfLLDPDU 67 try: 68 frm = Ether()/LLDPDUChassisID(id='slartibart')/LLDPDUPortID(id='42')/LLDPDUTimeToLive()/LLDPDUEndOfLLDPDU(_length=8) 69 frm.build() 70 assert False 71 except LLDPInvalidLengthField: 72 pass 73 74 # missing chassis id 75 try: 76 frm = Ether()/LLDPDUChassisID()/LLDPDUPortID(id='42')/LLDPDUTimeToLive()/LLDPDUEndOfLLDPDU() 77 frm.build() 78 assert False 79 except LLDPInvalidLengthField: 80 pass 81 82 # missing management address 83 try: 84 frm = Ether()/LLDPDUChassisID(id='slartibart')/LLDPDUPortID(id='42')/LLDPDUTimeToLive()/LLDPDUManagementAddress()/LLDPDUEndOfLLDPDU() 85 frm.build() 86 assert False 87 except LLDPInvalidLengthField: 88 pass 89 90 + strict mode handling - dissect 91 = basic frame structure 92 93 conf.contribs['LLDP'].strict_mode_enable() 94 # missing PortIDTLV 95 try: 96 frm = Ether() / LLDPDUChassisID(id='slartibart') / LLDPDUTimeToLive() / LLDPDUEndOfLLDPDU() 97 Ether(frm.build()) 98 assert False 99 except LLDPInvalidFrameStructure: 100 pass 101 102 # invalid order 103 try: 104 frm = Ether() / LLDPDUPortID(id='42') / LLDPDUChassisID(id='slartibart') / LLDPDUTimeToLive() / LLDPDUEndOfLLDPDU() 105 Ether(frm.build()) 106 assert False 107 except LLDPInvalidFrameStructure: 108 pass 109 110 # layer LLDPDUPortID occures twice 111 try: 112 frm = Ether() / LLDPDUChassisID(id='slartibart') / LLDPDUPortID(id='42') / LLDPDUPortID(id='23') / LLDPDUTimeToLive() / LLDPDUEndOfLLDPDU() 113 Ether(frm.build()) 114 assert False 115 except LLDPInvalidFrameStructure: 116 pass 117 118 # missing LLDPDUEndOfLLDPDU 119 try: 120 frm = Ether() / LLDPDUChassisID(id='slartibart') / LLDPDUPortID(id='42') / \ 121 LLDPDUPortID(id='23') / LLDPDUTimeToLive() / LLDPDUEndOfLLDPDU() 122 Ether(frm.build()) 123 assert False 124 except LLDPInvalidFrameStructure: 125 pass 126 127 conf.contribs['LLDP'].strict_mode_disable() 128 frm = Ether()/LLDPDUChassisID()/LLDPDUTimeToLive()/LLDPDUEndOfLLDPDU() 129 frm = Ether(frm.build()) 130 131 = length fields / value sizes checks 132 133 conf.contribs['LLDP'].strict_mode_enable() 134 # missing chassis id => invalid length 135 try: 136 frm = Ether() / LLDPDUChassisID() / LLDPDUPortID(id='42') / LLDPDUTimeToLive() / LLDPDUEndOfLLDPDU() 137 Ether(frm.build()) 138 assert False 139 except LLDPInvalidLengthField: 140 pass 141 142 # invalid lenght in LLDPDUEndOfLLDPDU 143 try: 144 frm = Ether()/LLDPDUChassisID(id='slartibart')/LLDPDUPortID(id='42')/LLDPDUTimeToLive()/LLDPDUEndOfLLDPDU(_length=8) 145 Ether(frm.build()) 146 assert False 147 except LLDPInvalidLengthField: 148 pass 149 150 # invalid management address 151 try: 152 frm = Ether() / LLDPDUChassisID(id='slartibart') / LLDPDUPortID(id='42') / LLDPDUTimeToLive() / LLDPDUManagementAddress() / LLDPDUEndOfLLDPDU() 153 Ether(frm.build()) 154 assert False 155 except LLDPInvalidLengthField: 156 pass 157 158 conf.contribs['LLDP'].strict_mode_disable() 159 160 frm = Ether() / LLDPDUChassisID(id='slartibart') / LLDPDUPortID(id='42') / LLDPDUTimeToLive() / LLDPDUEndOfLLDPDU() 161 frm = Ether(frm.build()) 162 163 frm = Ether() / LLDPDUChassisID() / LLDPDUPortID() / LLDPDUTimeToLive() / LLDPDUEndOfLLDPDU(_length=8) 164 frm = Ether(frm.build()) 165 166 = test attribute values 167 168 conf.contribs['LLDP'].strict_mode_enable() 169 170 frm = 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 189 frm = Ether(frm.build()) 190 191 assert str2mac(frm[LLDPDUChassisID].id) == '06:05:04:03:02:01' 192 assert str2mac(frm[LLDPDUPortID].id) == '01:02:03:04:05:06' 193 sys_capabilities = frm[LLDPDUSystemCapabilities] 194 assert sys_capabilities.reserved_5_available == 0 195 assert sys_capabilities.reserved_4_available == 0 196 assert sys_capabilities.reserved_3_available == 0 197 assert sys_capabilities.reserved_2_available == 0 198 assert sys_capabilities.reserved_1_available == 0 199 assert sys_capabilities.two_port_mac_relay_available == 0 200 assert sys_capabilities.s_vlan_component_available == 0 201 assert sys_capabilities.c_vlan_component_available == 0 202 assert sys_capabilities.station_only_available == 0 203 assert sys_capabilities.docsis_cable_device_available == 0 204 assert sys_capabilities.telephone_available == 1 205 assert sys_capabilities.router_available == 1 206 assert sys_capabilities.wlan_access_point_available == 0 207 assert sys_capabilities.mac_bridge_available == 0 208 assert sys_capabilities.repeater_available == 0 209 assert sys_capabilities.other_available == 0 210 assert sys_capabilities.reserved_5_enabled == 0 211 assert sys_capabilities.reserved_4_enabled == 0 212 assert sys_capabilities.reserved_3_enabled == 0 213 assert sys_capabilities.reserved_2_enabled == 0 214 assert sys_capabilities.reserved_1_enabled == 0 215 assert sys_capabilities.two_port_mac_relay_enabled == 0 216 assert sys_capabilities.s_vlan_component_enabled == 0 217 assert sys_capabilities.c_vlan_component_enabled == 0 218 assert sys_capabilities.station_only_enabled == 0 219 assert sys_capabilities.docsis_cable_device_enabled == 0 220 assert sys_capabilities.telephone_enabled == 1 221 assert sys_capabilities.router_enabled == 1 222 assert sys_capabilities.wlan_access_point_enabled == 0 223 assert sys_capabilities.mac_bridge_enabled == 0 224 assert sys_capabilities.repeater_enabled == 0 225 assert sys_capabilities.other_enabled == 0 226 assert frm[LLDPDUManagementAddress].management_address == b'1.2.3.4' 227 assert frm[LLDPDUSystemName].system_name == b'things will' 228 assert frm[LLDPDUManagementAddress].object_id == b'burn' 229 assert frm[LLDPDUSystemDescription].description == b'without tests.' 230 assert frm[LLDPDUPortDescription].description == b'always!' 231