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