scapy.contrib.pnio_dcp

class scapy.contrib.pnio_dcp.DCPAliasNameBlock(_pkt, /, *, option=2, sub_option=6, dcp_block_length=None, block_info=0, alias_name=b'et200sp', padding=b'\x00')[source]

Bases: Packet

aliastypes = [<class 'scapy.contrib.pnio_dcp.DCPAliasNameBlock'>, <class 'scapy.packet.Packet'>]
extract_padding(s)[source]
fields_desc: List[Field[Any, Any] | _FieldContainer] = [<ByteEnumField (DCPAliasNameBlock).option>, <MultiEnumField (DCPAliasNameBlock).sub_option>, <FieldLenField (DCPAliasNameBlock).dcp_block_length>, <ShortEnumField (DCPAliasNameBlock).block_info>, <StrLenField (DCPAliasNameBlock).alias_name>, <scapy.fields.PadField object>]
class scapy.contrib.pnio_dcp.DCPBaseBlock(_pkt, /, *, option=1, sub_option=2, dcp_block_length=None, block_info=0, data=b'')[source]

Bases: Packet

base class for all DCP Blocks

aliastypes = [<class 'scapy.contrib.pnio_dcp.DCPBaseBlock'>, <class 'scapy.packet.Packet'>]
extract_padding(s)[source]
fields_desc: List[Field[Any, Any] | _FieldContainer] = [<ByteEnumField (DCPBaseBlock).option>, <MultiEnumField (DCPBaseBlock).sub_option>, <FieldLenField (DCPBaseBlock).dcp_block_length>, <ShortEnumField (DCPBaseBlock).block_info>, <StrLenField (DCPBaseBlock).data>]
class scapy.contrib.pnio_dcp.DCPControlBlock(_pkt, /, *, option=5, sub_option=4, dcp_block_length=3, response=2, response_sub_option=2, block_error=0, padding=b'\x00')[source]

Bases: Packet

aliastypes = [<class 'scapy.contrib.pnio_dcp.DCPControlBlock'>, <class 'scapy.packet.Packet'>]
extract_padding(s)[source]
fields_desc: List[Field[Any, Any] | _FieldContainer] = [<ByteEnumField (DCPControlBlock).option>, <MultiEnumField (DCPControlBlock).sub_option>, <LenField (DCPControlBlock).dcp_block_length>, <ByteEnumField (DCPControlBlock).response>, <MultiEnumField (DCPControlBlock).response_sub_option>, <ByteEnumField (DCPControlBlock).block_error>, <scapy.fields.PadField object>]
class scapy.contrib.pnio_dcp.DCPDeviceIDBlock(_pkt, /, *, option=2, sub_option=3, dcp_block_length=None, block_info=0, vendor_id=42, device_id=787, padding=b'\x00')[source]

Bases: Packet

aliastypes = [<class 'scapy.contrib.pnio_dcp.DCPDeviceIDBlock'>, <class 'scapy.packet.Packet'>]
extract_padding(s)[source]
fields_desc: List[Field[Any, Any] | _FieldContainer] = [<ByteEnumField (DCPDeviceIDBlock).option>, <MultiEnumField (DCPDeviceIDBlock).sub_option>, <LenField (DCPDeviceIDBlock).dcp_block_length>, <ShortEnumField (DCPDeviceIDBlock).block_info>, <XShortField (DCPDeviceIDBlock).vendor_id>, <XShortField (DCPDeviceIDBlock).device_id>, <scapy.fields.PadField object>]
class scapy.contrib.pnio_dcp.DCPDeviceInitiativeBlock(_pkt, /, *, option=6, sub_option=1, dcp_block_length=None, block_info=0, device_initiative=1)[source]

Bases: Packet

device initiative DCP block

aliastypes = [<class 'scapy.contrib.pnio_dcp.DCPDeviceInitiativeBlock'>, <class 'scapy.packet.Packet'>]
extract_padding(s)[source]
fields_desc: List[Field[Any, Any] | _FieldContainer] = [<ByteEnumField (DCPDeviceInitiativeBlock).option>, <MultiEnumField (DCPDeviceInitiativeBlock).sub_option>, <FieldLenField (DCPDeviceInitiativeBlock).dcp_block_length>, <ShortEnumField (DCPDeviceInitiativeBlock).block_info>, <ShortField (DCPDeviceInitiativeBlock).device_initiative>]
class scapy.contrib.pnio_dcp.DCPDeviceInstanceBlock(_pkt, /, *, option=2, sub_option=7, dcp_block_length=4, block_info=0, device_instance_high=0, device_instance_low=1, padding=b'\x00')[source]

Bases: Packet

aliastypes = [<class 'scapy.contrib.pnio_dcp.DCPDeviceInstanceBlock'>, <class 'scapy.packet.Packet'>]
extract_padding(s)[source]
fields_desc: List[Field[Any, Any] | _FieldContainer] = [<ByteEnumField (DCPDeviceInstanceBlock).option>, <MultiEnumField (DCPDeviceInstanceBlock).sub_option>, <LenField (DCPDeviceInstanceBlock).dcp_block_length>, <ShortEnumField (DCPDeviceInstanceBlock).block_info>, <XByteField (DCPDeviceInstanceBlock).device_instance_high>, <XByteField (DCPDeviceInstanceBlock).device_instance_low>, <scapy.fields.PadField object>]
class scapy.contrib.pnio_dcp.DCPDeviceOptionsBlock(_pkt, /, *, option=2, sub_option=5, dcp_block_length=None, block_info=0, device_options=[], padding=b'\x00')[source]

Bases: Packet

aliastypes = [<class 'scapy.contrib.pnio_dcp.DCPDeviceOptionsBlock'>, <class 'scapy.packet.Packet'>]
extract_padding(s)[source]
fields_desc: List[Field[Any, Any] | _FieldContainer] = [<ByteEnumField (DCPDeviceOptionsBlock).option>, <MultiEnumField (DCPDeviceOptionsBlock).sub_option>, <LenField (DCPDeviceOptionsBlock).dcp_block_length>, <ShortEnumField (DCPDeviceOptionsBlock).block_info>, <PacketListField (DCPDeviceOptionsBlock).device_options>, <scapy.fields.PadField object>]
class scapy.contrib.pnio_dcp.DCPDeviceRoleBlock(_pkt, /, *, option=2, sub_option=4, dcp_block_length=4, block_info=0, device_role_details=1, reserved=0, padding=b'\x00')[source]

Bases: Packet

aliastypes = [<class 'scapy.contrib.pnio_dcp.DCPDeviceRoleBlock'>, <class 'scapy.packet.Packet'>]
extract_padding(s)[source]
fields_desc: List[Field[Any, Any] | _FieldContainer] = [<ByteEnumField (DCPDeviceRoleBlock).option>, <MultiEnumField (DCPDeviceRoleBlock).sub_option>, <LenField (DCPDeviceRoleBlock).dcp_block_length>, <ShortEnumField (DCPDeviceRoleBlock).block_info>, <ByteEnumField (DCPDeviceRoleBlock).device_role_details>, <XByteField (DCPDeviceRoleBlock).reserved>, <scapy.fields.PadField object>]
class scapy.contrib.pnio_dcp.DCPFullIPBlock(_pkt, /, *, option=1, sub_option=3, dcp_block_length=None, block_info=1, ip='192.168.0.2', netmask='255.255.255.0', gateway='192.168.0.1', dnsaddr=[], padding=b'\x00')[source]

Bases: Packet

aliastypes = [<class 'scapy.contrib.pnio_dcp.DCPFullIPBlock'>, <class 'scapy.packet.Packet'>]
extract_padding(s)[source]
fields_desc: List[Field[Any, Any] | _FieldContainer] = [<ByteEnumField (DCPFullIPBlock).option>, <MultiEnumField (DCPFullIPBlock).sub_option>, <LenField (DCPFullIPBlock).dcp_block_length>, <ShortEnumField (DCPFullIPBlock).block_info>, <IPField (DCPFullIPBlock).ip>, <IPField (DCPFullIPBlock).netmask>, <IPField (DCPFullIPBlock).gateway>, <FieldListField (DCPFullIPBlock).dnsaddr>, <scapy.fields.PadField object>]
class scapy.contrib.pnio_dcp.DCPIPBlock(_pkt, /, *, option=1, sub_option=2, dcp_block_length=None, block_info=1, ip='192.168.0.2', netmask='255.255.255.0', gateway='192.168.0.1', padding=b'\x00')[source]

Bases: Packet

aliastypes = [<class 'scapy.contrib.pnio_dcp.DCPIPBlock'>, <class 'scapy.packet.Packet'>]
extract_padding(s)[source]
fields_desc: List[Field[Any, Any] | _FieldContainer] = [<ByteEnumField (DCPIPBlock).option>, <MultiEnumField (DCPIPBlock).sub_option>, <LenField (DCPIPBlock).dcp_block_length>, <ShortEnumField (DCPIPBlock).block_info>, <IPField (DCPIPBlock).ip>, <IPField (DCPIPBlock).netmask>, <IPField (DCPIPBlock).gateway>, <scapy.fields.PadField object>]
class scapy.contrib.pnio_dcp.DCPMACBlock(_pkt, /, *, option=1, sub_option=1, dcp_block_length=None, block_info=0, mac='00:00:00:00:00:00', padding=b'\x00')[source]

Bases: Packet

aliastypes = [<class 'scapy.contrib.pnio_dcp.DCPMACBlock'>, <class 'scapy.packet.Packet'>]
extract_padding(s)[source]
fields_desc: List[Field[Any, Any] | _FieldContainer] = [<ByteEnumField (DCPMACBlock).option>, <MultiEnumField (DCPMACBlock).sub_option>, <FieldLenField (DCPMACBlock).dcp_block_length>, <ShortEnumField (DCPMACBlock).block_info>, <MACField (DCPMACBlock).mac>, <scapy.fields.PadField object>]
class scapy.contrib.pnio_dcp.DCPManufacturerSpecificBlock(_pkt, /, *, option=2, sub_option=1, dcp_block_length=None, block_info=0, device_vendor_value=b'et200sp', padding=b'\x00')[source]

Bases: Packet

aliastypes = [<class 'scapy.contrib.pnio_dcp.DCPManufacturerSpecificBlock'>, <class 'scapy.packet.Packet'>]
extract_padding(s)[source]
fields_desc: List[Field[Any, Any] | _FieldContainer] = [<ByteEnumField (DCPManufacturerSpecificBlock).option>, <MultiEnumField (DCPManufacturerSpecificBlock).sub_option>, <FieldLenField (DCPManufacturerSpecificBlock).dcp_block_length>, <ShortEnumField (DCPManufacturerSpecificBlock).block_info>, <StrLenField (DCPManufacturerSpecificBlock).device_vendor_value>, <scapy.fields.PadField object>]
class scapy.contrib.pnio_dcp.DCPNameOfStationBlock(_pkt, /, *, option=2, sub_option=2, dcp_block_length=None, block_info=0, name_of_station=b'et200sp', padding=b'\x00')[source]

Bases: Packet

aliastypes = [<class 'scapy.contrib.pnio_dcp.DCPNameOfStationBlock'>, <class 'scapy.packet.Packet'>]
extract_padding(s)[source]
fields_desc: List[Field[Any, Any] | _FieldContainer] = [<ByteEnumField (DCPNameOfStationBlock).option>, <MultiEnumField (DCPNameOfStationBlock).sub_option>, <FieldLenField (DCPNameOfStationBlock).dcp_block_length>, <ShortEnumField (DCPNameOfStationBlock).block_info>, <StrLenField (DCPNameOfStationBlock).name_of_station>, <scapy.fields.PadField object>]
class scapy.contrib.pnio_dcp.DCPOEMIDBlock(_pkt, /, *, option=2, sub_option=8, dcp_block_length=None, block_info=0, vendor_id=42, device_id=787, padding=b'\x00')[source]

Bases: Packet

aliastypes = [<class 'scapy.contrib.pnio_dcp.DCPOEMIDBlock'>, <class 'scapy.packet.Packet'>]
extract_padding(s)[source]
fields_desc: List[Field[Any, Any] | _FieldContainer] = [<ByteEnumField (DCPOEMIDBlock).option>, <MultiEnumField (DCPOEMIDBlock).sub_option>, <LenField (DCPOEMIDBlock).dcp_block_length>, <ShortEnumField (DCPOEMIDBlock).block_info>, <XShortField (DCPOEMIDBlock).vendor_id>, <XShortField (DCPOEMIDBlock).device_id>, <scapy.fields.PadField object>]
class scapy.contrib.pnio_dcp.DeviceOption(_pkt, /, *, option=2, sub_option=5)[source]

Bases: Packet

aliastypes = [<class 'scapy.contrib.pnio_dcp.DeviceOption'>, <class 'scapy.packet.Packet'>]
extract_padding(s)[source]
fields_desc: List[Field[Any, Any] | _FieldContainer] = [<ByteEnumField (DeviceOption).option>, <MultiEnumField (DeviceOption).sub_option>]
class scapy.contrib.pnio_dcp.ProfinetDCP(_pkt, /, *, service_id=5, service_type=0, xid=16777217, reserved=0, dcp_data_length=None, option=2, sub_option=3, dcp_block_length=0, block_qualifier=1, name_of_station=None, mac='00:00:00:00:00:00', ip='192.168.0.2', netmask='255.255.255.0', gateway='192.168.0.1', dnsaddr=[], alias_name=b'et200sp', dcp_blocks=[])[source]

Bases: Packet

Profinet DCP Packet

Requests are handled via ConditionalField because here only 1 Block is used every time.

Response can contain 1..n Blocks, for that you have to use one ProfinetDCP Layer with one or multiple DCP*Block Layers:

ProfinetDCP / DCPNameOfStationBlock / DCPDeviceIDBlock ...

Example for a DCP Identify All Request:

Ether(dst="01:0e:cf:00:00:00") /
ProfinetIO(frameID=DCP_IDENTIFY_REQUEST_FRAME_ID) /
ProfinetDCP(service_id=DCP_SERVICE_ID_IDENTIFY,
    service_type=DCP_REQUEST, option=255, sub_option=255,
    dcp_data_length=4)

Example for a DCP Identify Response:

Ether(dst=dst_mac) /
ProfinetIO(frameID=DCP_IDENTIFY_RESPONSE_FRAME_ID) /
ProfinetDCP(
    service_id=DCP_SERVICE_ID_IDENTIFY,
    service_type=DCP_RESPONSE) /
DCPNameOfStationBlock(name_of_station="device1")

Example for a DCP Set Request:

Ether(dst=mac) /
ProfinetIO(frameID=DCP_GET_SET_FRAME_ID) /
ProfinetDCP(service_id=DCP_SERVICE_ID_SET, service_type=DCP_REQUEST,
    option=2, sub_option=2, dcp_data_length=14, dcp_block_length=10,
    name_of_station=name, reserved=0)
aliastypes = [<class 'scapy.contrib.pnio_dcp.ProfinetDCP'>, <class 'scapy.packet.Packet'>]
fields_desc: List[Field[Any, Any] | _FieldContainer] = [<ByteEnumField (ProfinetDCP).service_id>, <ByteEnumField (ProfinetDCP).service_type>, <XIntField (ProfinetDCP).xid>, <ShortField (ProfinetDCP).reserved>, <LenField (ProfinetDCP).dcp_data_length>, <scapy.fields.ConditionalField object>, <scapy.fields.ConditionalField object>, <scapy.fields.ConditionalField object>, <scapy.fields.ConditionalField object>, <scapy.fields.ConditionalField object>, <scapy.fields.ConditionalField object>, <scapy.fields.ConditionalField object>, <scapy.fields.ConditionalField object>, <scapy.fields.ConditionalField object>, <scapy.fields.ConditionalField object>, <scapy.fields.ConditionalField object>, <scapy.fields.ConditionalField object>]
payload_guess: List[Tuple[Dict[str, Any], Type[Packet]]] = [({}, <class 'scapy.packet.Padding'>)]
post_build(pkt, pay)[source]
scapy.contrib.pnio_dcp.guess_dcp_block_class(packet, **kargs)[source]

returns the correct dcp block class needed to dissect the current tag if nothing can be found -> dcp base block will be used

Parameters:

packet – the current packet

Returns:

dcp block class