scapy.contrib.lldp¶
LLDP - Link Layer Discovery Protocol¶
- author
Thomas Tannhaeuser, hecke@naberius.de
- license
GPLv2
This module is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This module is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
- description
This module provides Scapy layers for the LLDP protocol.
- normative references:
IEEE 802.1AB 2016 - LLDP protocol, topology and MIB description
- TODO
- organization specific TLV e.g. ProfiNet(see LLDPDUGenericOrganisationSpecific for a starting point)
Ignore everything after EndofLLDPDUTLV
- NOTES
you can find the layer configuration options at the end of this file
default configuration enforces standard conform:
- frame structure(ChassisIDTLV/PortIDTLV/TimeToLiveTLV/…)
multiplicity of TLVs (if given by the standard)
min sizes of strings used by the TLVs
conf.contribs[‘LLDP’].strict_mode_disable() -> disable strict mode
-
class
scapy.contrib.lldp.LLDPConfiguration¶ Bases:
objectbasic configuration for LLDP layer
-
strict_mode()¶ get current strict mode state
-
strict_mode_disable()¶ disable strict mode and dissector debugging
-
strict_mode_enable()¶ enable strict mode and dissector debugging
-
-
class
scapy.contrib.lldp.LLDPDU(*args, **kargs)¶ Bases:
scapy.packet.Packetbase class for all LLDP data units
-
DOT1Q_HEADER_LEN= 4¶
-
ETHER_FRAME_MIN_LEN= 64¶
-
ETHER_FSC_LEN= 4¶
-
ETHER_HEADER_LEN= 14¶
-
LAYER_MULTIPLICITIES= {}¶
-
LAYER_STACK= []¶
-
TYPES= {0: 'end of LLDPDU', 1: 'chassis id', 2: 'port id', 3: 'time to live', 4: 'port description', 5: 'system name', 6: 'system description', 7: 'system capabilities', 8: 'management address', range(9, 126): 'reserved - future standardization', 127: 'organisation specific TLV'}¶
-
aliastypes¶
-
dissection_done(pkt)¶
-
do_build()¶
-
guess_payload_class(payload)¶
-
post_build(pkt, pay)¶
-
post_dissect(s)¶
-
pre_dissect(s)¶
-
-
class
scapy.contrib.lldp.LLDPDUChassisID(*args, **kargs)¶ Bases:
scapy.contrib.lldp.LLDPDUieee 802.1ab-2016 - sec. 8.5.2 / p. 26
-
LLDP_CHASSIS_ID_TLV_SUBTYPES= {0: 'reserved', 1: 'chassis component', 2: 'interface alias', 3: 'port component', 4: 'MAC address', 5: 'network address', 6: 'interface name', 7: 'locally assigned', range(8, 255): 'reserved'}¶
-
SUBTYPE_CHASSIS_COMPONENT= 1¶
-
SUBTYPE_INTERFACE_ALIAS= 2¶
-
SUBTYPE_INTERFACE_NAME= 6¶
-
SUBTYPE_LOCALLY_ASSIGNED= 7¶
-
SUBTYPE_MAC_ADDRESS= 4¶
-
SUBTYPE_NETWORK_ADDRESS= 5¶
-
SUBTYPE_PORT_COMPONENT= 3¶
-
SUBTYPE_RESERVED= 0¶
-
aliastypes¶
-
fields_desc¶ Display RFC-like schema
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | TYPE | LENGTH | SUBTYPE | FAMILY | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ID | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Fig. LLDPDUChassisIDLLDPDUChassisID fields¶ _type
BitEnumField(7 bits)1_length
BitFieldLenField(9 bits)Nonesubtype
0family
ByteField(Cond)0id
b''
-
-
class
scapy.contrib.lldp.LLDPDUEndOfLLDPDU(*args, **kargs)¶ Bases:
scapy.contrib.lldp.LLDPDUieee 802.1ab-2016 - sec. 8.5.1 / p. 26
-
aliastypes¶
-
extract_padding(s)¶
-
fields_desc¶ Display RFC-like schema
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | TYPE | LENGTH | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Fig. LLDPDUEndOfLLDPDULLDPDUEndOfLLDPDU fields¶ _type
BitEnumField(7 bits)0_length
BitField(9 bits)0
-
-
class
scapy.contrib.lldp.LLDPDUGenericOrganisationSpecific(*args, **kargs)¶ Bases:
scapy.contrib.lldp.LLDPDU-
ORG_UNIQUE_CODES= {3791: 'PROFIBUS International (PNO)', 4623: 'IEEE 802.3', 4795: 'TIA TR-41 Committee . Media Endpoint Discovery', 32962: 'IEEE 802.1', 3191318: 'Hytec Geraetebau GmbH'}¶
-
ORG_UNIQUE_CODE_HYTEC= 3191318¶
-
ORG_UNIQUE_CODE_IEEE_802_1= 32962¶
-
ORG_UNIQUE_CODE_IEEE_802_3= 4623¶
-
ORG_UNIQUE_CODE_PNO= 3791¶
-
ORG_UNIQUE_CODE_TIA_TR_41_MED= 4795¶
-
aliastypes¶
-
fields_desc¶ Display RFC-like schema
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | TYPE | LENGTH | ORG CODE | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | SUBTYPE | DATA | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | +-+-+-+-+-+-+-+-+ Fig. LLDPDUGenericOrganisationSpecificLLDPDUGenericOrganisationSpecific fields¶ _type
BitEnumField(7 bits)127_length
BitFieldLenField(9 bits)Noneorg_code
0subtype
0data
b''
-
-
class
scapy.contrib.lldp.LLDPDUManagementAddress(*args, **kargs)¶ Bases:
scapy.contrib.lldp.LLDPDUieee 802.1ab-2016 - sec. 8.5.9 / p. 32
currently only 0x00..0x1e are used by standards, no way to use anything > 0xff as management address subtype is only one octet wide
see https://www.iana.org/assignments/address-family-numbers/address-family-numbers.xhtml # noqa: E501
-
IANA_ADDRESS_FAMILY_NUMBERS= {0: 'other', 1: 'IPv4', 2: 'IPv6', 3: 'NSAP', 4: 'HDLC', 5: 'BBN', 6: '802', 7: 'E.163', 8: 'E.164', 9: 'F.69', 10: 'X.121', 11: 'IPX', 12: 'Appletalk', 13: 'Decnet IV', 14: 'Banyan Vines', 15: 'E.164 with NSAP', 16: 'DNS', 17: 'Distinguished Name', 18: 'AS Number', 19: 'XTP over IPv4', 20: 'XTP over IPv6', 21: 'XTP native mode XTP', 22: 'Fiber Channel World-Wide Port Name', 23: 'Fiber Channel World-Wide Node Name', 24: 'GWID', 25: 'AFI for L2VPN', 26: 'MPLS-TP Section Endpoint ID', 27: 'MPLS-TP LSP Endpoint ID', 28: 'MPLS-TP Pseudowire Endpoint ID', 29: 'MT IP Multi-Topology IPv4', 30: 'MT IP Multi-Topology IPv6'}¶
-
INTERFACE_NUMBERING_SUBTYPES= {1: 'unknown', 2: 'ifIndex', 3: 'system port number'}¶
-
SUBTYPE_INTERFACE_NUMBER_IF_INDEX= 2¶
-
SUBTYPE_INTERFACE_NUMBER_SYSTEM_PORT_NUMBER= 3¶ Note - calculation of _length field:
_length = 1@_management_address_string_length + 1@management_address_subtype + management_address.len + 1@interface_numbering_subtype + 4@interface_number + 1@_oid_string_length + object_id.len
-
SUBTYPE_INTERFACE_NUMBER_UNKNOWN= 1¶
-
SUBTYPE_MANAGEMENT_ADDRESS_802= 6¶
-
SUBTYPE_MANAGEMENT_ADDRESS_AFI_FOR_L2VPN= 25¶
-
SUBTYPE_MANAGEMENT_ADDRESS_APPLETALK= 12¶
-
SUBTYPE_MANAGEMENT_ADDRESS_AS_NUMBER= 18¶
-
SUBTYPE_MANAGEMENT_ADDRESS_BANYAN_VINES= 14¶
-
SUBTYPE_MANAGEMENT_ADDRESS_BBN= 5¶
-
SUBTYPE_MANAGEMENT_ADDRESS_DECNET_IV= 13¶
-
SUBTYPE_MANAGEMENT_ADDRESS_DISTINGUISHED_NAME= 17¶
-
SUBTYPE_MANAGEMENT_ADDRESS_DNS= 16¶
-
SUBTYPE_MANAGEMENT_ADDRESS_E_163= 7¶
-
SUBTYPE_MANAGEMENT_ADDRESS_E_164= 8¶
-
SUBTYPE_MANAGEMENT_ADDRESS_E_164_WITH_NSAP= 15¶
-
SUBTYPE_MANAGEMENT_ADDRESS_FIBER_CHANNEL_WORLD_WIDE_NODE_NAME= 23¶
-
SUBTYPE_MANAGEMENT_ADDRESS_FIBER_CHANNEL_WORLD_WIDE_PORT_NAME= 22¶
-
SUBTYPE_MANAGEMENT_ADDRESS_F_69= 9¶
-
SUBTYPE_MANAGEMENT_ADDRESS_GWID= 24¶
-
SUBTYPE_MANAGEMENT_ADDRESS_HDLC= 4¶
-
SUBTYPE_MANAGEMENT_ADDRESS_IPV4= 1¶
-
SUBTYPE_MANAGEMENT_ADDRESS_IPV6= 2¶
-
SUBTYPE_MANAGEMENT_ADDRESS_IPX= 11¶
-
SUBTYPE_MANAGEMENT_ADDRESS_MPLS_TP_LSP_ENDPOINT_ID= 27¶
-
SUBTYPE_MANAGEMENT_ADDRESS_MPLS_TP_PSEUDOWIRE_ENDPOINT_ID= 28¶
-
SUBTYPE_MANAGEMENT_ADDRESS_MPLS_TP_SECTION_ENDPOINT_ID= 26¶
-
SUBTYPE_MANAGEMENT_ADDRESS_MT_IP_MULTI_TOPOLOGY_IPV4= 29¶
-
SUBTYPE_MANAGEMENT_ADDRESS_MT_IP_MULTI_TOPOLOGY_IPV6= 30¶
-
SUBTYPE_MANAGEMENT_ADDRESS_NSAP= 3¶
-
SUBTYPE_MANAGEMENT_ADDRESS_OTHER= 0¶
-
SUBTYPE_MANAGEMENT_ADDRESS_XTP_NATIVE_MODE_XTP= 21¶
-
SUBTYPE_MANAGEMENT_ADDRESS_XTP_OVER_IPV4= 19¶
-
SUBTYPE_MANAGEMENT_ADDRESS_XTP_OVER_IPV6= 20¶
-
SUBTYPE_MANAGEMENT_ADDRESS_X_121= 10¶
-
aliastypes¶
-
fields_desc¶ Display RFC-like schema
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | TYPE | LENGTH | MANAGEMENT ADD|MANAGEMENT ADDR| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | MANAGEMENT ADDRESS |INTERFACE NUMBE|INTERFACE NUMBE| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ | | OID STRING LEN| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | OBJECT ID | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Fig. LLDPDUManagementAddressLLDPDUManagementAddress fields¶ _type
BitEnumField(7 bits)8_length
BitFieldLenField(9 bits)None_management_address_string_length
BitFieldLenField(8 bits)Nonemanagement_address_subtype
0management_address
b''interface_numbering_subtype
1interface_number
BitField(32 bits)0_oid_string_length
BitFieldLenField(8 bits)Noneobject_id
b''
-
-
class
scapy.contrib.lldp.LLDPDUPortDescription(*args, **kargs)¶ Bases:
scapy.contrib.lldp.LLDPDUieee 802.1ab-2016 - sec. 8.5.5 / p. 29
-
aliastypes¶
-
fields_desc¶ Display RFC-like schema
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | TYPE | LENGTH | DESCRIPTION | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Fig. LLDPDUPortDescriptionLLDPDUPortDescription fields¶ _type
BitEnumField(7 bits)4_length
BitFieldLenField(9 bits)Nonedescription
b''
-
-
class
scapy.contrib.lldp.LLDPDUPortID(*args, **kargs)¶ Bases:
scapy.contrib.lldp.LLDPDUieee 802.1ab-2016 - sec. 8.5.3 / p. 26
-
LLDP_PORT_ID_TLV_SUBTYPES= {0: 'reserved', 1: 'interface alias', 2: 'port component', 3: 'MAC address', 4: 'network address', 5: 'interface name', 6: 'agent circuit ID', 7: 'locally assigned', range(8, 255): 'reserved'}¶
-
SUBTYPE_AGENT_CIRCUIT_ID= 6¶
-
SUBTYPE_INTERFACE_ALIAS= 1¶
-
SUBTYPE_INTERFACE_NAME= 5¶
-
SUBTYPE_LOCALLY_ASSIGNED= 7¶
-
SUBTYPE_MAC_ADDRESS= 3¶
-
SUBTYPE_NETWORK_ADDRESS= 4¶
-
SUBTYPE_PORT_COMPONENT= 2¶
-
SUBTYPE_RESERVED= 0¶
-
aliastypes¶
-
fields_desc¶ Display RFC-like schema
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | TYPE | LENGTH | SUBTYPE | FAMILY | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ID | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Fig. LLDPDUPortIDLLDPDUPortID fields¶ _type
BitEnumField(7 bits)2_length
BitFieldLenField(9 bits)Nonesubtype
0family
ByteField(Cond)0id
b''
-
-
class
scapy.contrib.lldp.LLDPDUSystemCapabilities(*args, **kargs)¶ Bases:
scapy.contrib.lldp.LLDPDUieee 802.1ab-2016 - sec. 8.5.8 / p. 31
-
aliastypes¶
-
fields_desc¶ Display RFC-like schema
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | TYPE | LENGTH |R|R|R|R|R|T|S|C|S|D|T|R|W|M|R|O| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |R|R|R|R|R|T|S|C|S|D|T|R|W|M|R|O| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Fig. LLDPDUSystemCapabilitiesLLDPDUSystemCapabilities fields¶ _type
BitEnumField(7 bits)7_length
BitFieldLenField(9 bits)4reserved_5_available
BitField(1 bit)0reserved_4_available
BitField(1 bit)0reserved_3_available
BitField(1 bit)0reserved_2_available
BitField(1 bit)0reserved_1_available
BitField(1 bit)0two_port_mac_relay_available
BitField(1 bit)0s_vlan_component_available
BitField(1 bit)0c_vlan_component_available
BitField(1 bit)0station_only_available
BitField(1 bit)0docsis_cable_device_available
BitField(1 bit)0telephone_available
BitField(1 bit)0router_available
BitField(1 bit)0wlan_access_point_available
BitField(1 bit)0mac_bridge_available
BitField(1 bit)0repeater_available
BitField(1 bit)0other_available
BitField(1 bit)0reserved_5_enabled
BitField(1 bit)0reserved_4_enabled
BitField(1 bit)0reserved_3_enabled
BitField(1 bit)0reserved_2_enabled
BitField(1 bit)0reserved_1_enabled
BitField(1 bit)0two_port_mac_relay_enabled
BitField(1 bit)0s_vlan_component_enabled
BitField(1 bit)0c_vlan_component_enabled
BitField(1 bit)0station_only_enabled
BitField(1 bit)0docsis_cable_device_enabled
BitField(1 bit)0telephone_enabled
BitField(1 bit)0router_enabled
BitField(1 bit)0wlan_access_point_enabled
BitField(1 bit)0mac_bridge_enabled
BitField(1 bit)0repeater_enabled
BitField(1 bit)0other_enabled
BitField(1 bit)0
-
-
class
scapy.contrib.lldp.LLDPDUSystemDescription(*args, **kargs)¶ Bases:
scapy.contrib.lldp.LLDPDUieee 802.1ab-2016 - sec. 8.5.7 / p. 31
-
aliastypes¶
-
fields_desc¶ Display RFC-like schema
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | TYPE | LENGTH | DESCRIPTION | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Fig. LLDPDUSystemDescriptionLLDPDUSystemDescription fields¶ _type
BitEnumField(7 bits)6_length
BitFieldLenField(9 bits)Nonedescription
b''
-
-
class
scapy.contrib.lldp.LLDPDUSystemName(*args, **kargs)¶ Bases:
scapy.contrib.lldp.LLDPDUieee 802.1ab-2016 - sec. 8.5.6 / p. 30
-
aliastypes¶
-
fields_desc¶ Display RFC-like schema
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | TYPE | LENGTH | SYSTEM NAME | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Fig. LLDPDUSystemNameLLDPDUSystemName fields¶ _type
BitEnumField(7 bits)5_length
BitFieldLenField(9 bits)Nonesystem_name
b''
-
-
class
scapy.contrib.lldp.LLDPDUTimeToLive(*args, **kargs)¶ Bases:
scapy.contrib.lldp.LLDPDUieee 802.1ab-2016 - sec. 8.5.4 / p. 29
-
aliastypes¶
-
fields_desc¶ Display RFC-like schema
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | TYPE | LENGTH | TTL | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Fig. LLDPDUTimeToLiveLLDPDUTimeToLive fields¶ _type
BitEnumField(7 bits)3_length
BitField(9 bits)2ttl
20
-
-
exception
scapy.contrib.lldp.LLDPInvalidFrameStructure¶ Bases:
scapy.error.Scapy_Exceptionbasic frame structure not standard conform (missing TLV, invalid order or multiplicity)
-
exception
scapy.contrib.lldp.LLDPInvalidLengthField¶ Bases:
scapy.error.Scapy_Exceptioninvalid value of length field
-
exception
scapy.contrib.lldp.LLDPInvalidTLVCount¶ Bases:
scapy.error.Scapy_Exceptioninvalid number of entries for a specific TLV type
-
exception
scapy.contrib.lldp.LLDPMissingLowerLayer¶ Bases:
scapy.error.Scapy_Exceptionfirst layer below first LLDPDU must be Ethernet or Dot1q
-
class
scapy.contrib.lldp.ThreeBytesEnumField(name, default, enum)¶