scapy.contrib.pnio_dcp

class scapy.contrib.pnio_dcp.DCPAliasNameBlock(*args, **kargs)[source]

Bases: scapy.packet.Packet

aliastypes
extract_padding(s)[source]
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     OPTION    |   SUB OPTION  |        DCP BLOCK LENGTH       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           BLOCK INFO          |           ALIAS NAME          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|            PADDING            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                      Fig. DCPAliasNameBlock                      
DCPAliasNameBlock fields

option

ByteEnumField

2

sub_option

MultiEnumField (Depends on 2)

6

dcp_block_length

FieldLenField

None

block_info

ShortEnumField

0

alias_name

StrLenField

b'et200sp'

padding

PadField

b'\x00'

class scapy.contrib.pnio_dcp.DCPBaseBlock(*args, **kargs)[source]

Bases: scapy.packet.Packet

base class for all DCP Blocks

aliastypes
extract_padding(s)[source]
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     OPTION    |   SUB OPTION  |        DCP BLOCK LENGTH       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           BLOCK INFO          |              DATA             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                        Fig. DCPBaseBlock                         
DCPBaseBlock fields

option

ByteEnumField

1

sub_option

MultiEnumField (Depends on 1)

2

dcp_block_length

FieldLenField

None

block_info

ShortEnumField

0

data

StrLenField

b''

class scapy.contrib.pnio_dcp.DCPControlBlock(*args, **kargs)[source]

Bases: scapy.packet.Packet

aliastypes
extract_padding(s)[source]
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     OPTION    |   SUB OPTION  |        DCP BLOCK LENGTH       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|    RESPONSE   |RESPONSE SUB OP|  BLOCK ERROR  |    PADDING    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|               |
+-+-+-+-+-+-+-+-+

                       Fig. DCPControlBlock                       
DCPControlBlock fields

option

ByteEnumField

5

sub_option

MultiEnumField (Depends on 5)

4

dcp_block_length

LenField

3

response

ByteEnumField

2

response_sub_option

MultiEnumField (Depends on 5)

2

block_error

ByteEnumField

0

padding

PadField

b'\x00'

class scapy.contrib.pnio_dcp.DCPDeviceIDBlock(*args, **kargs)[source]

Bases: scapy.packet.Packet

aliastypes
extract_padding(s)[source]
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     OPTION    |   SUB OPTION  |        DCP BLOCK LENGTH       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           BLOCK INFO          |           VENDOR ID           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           DEVICE ID           |            PADDING            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                      Fig. DCPDeviceIDBlock                       
DCPDeviceIDBlock fields

option

ByteEnumField

2

sub_option

MultiEnumField (Depends on 2)

3

dcp_block_length

LenField

None

block_info

ShortEnumField

0

vendor_id

XShortField

42

device_id

XShortField

787

padding

PadField

b'\x00'

class scapy.contrib.pnio_dcp.DCPDeviceInstanceBlock(*args, **kargs)[source]

Bases: scapy.packet.Packet

aliastypes
extract_padding(s)[source]
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     OPTION    |   SUB OPTION  |        DCP BLOCK LENGTH       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           BLOCK INFO          |DEVICE INSTANCE|DEVICE INSTANCE|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|            PADDING            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                   Fig. DCPDeviceInstanceBlock                    
DCPDeviceInstanceBlock fields

option

ByteEnumField

2

sub_option

MultiEnumField (Depends on 2)

7

dcp_block_length

LenField

4

block_info

ShortEnumField

0

device_instance_high

XByteField

0

device_instance_low

XByteField

1

padding

PadField

b'\x00'

class scapy.contrib.pnio_dcp.DCPDeviceOptionsBlock(*args, **kargs)[source]

Bases: scapy.packet.Packet

aliastypes
extract_padding(s)[source]
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     OPTION    |   SUB OPTION  |        DCP BLOCK LENGTH       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           BLOCK INFO          |         DEVICE OPTIONS        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|            PADDING            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                    Fig. DCPDeviceOptionsBlock                    
DCPDeviceOptionsBlock fields

option

ByteEnumField

2

sub_option

MultiEnumField (Depends on 2)

5

dcp_block_length

LenField

None

block_info

ShortEnumField

0

device_options

PacketListField

[]

padding

PadField

b'\x00'

class scapy.contrib.pnio_dcp.DCPDeviceRoleBlock(*args, **kargs)[source]

Bases: scapy.packet.Packet

aliastypes
extract_padding(s)[source]
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     OPTION    |   SUB OPTION  |        DCP BLOCK LENGTH       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           BLOCK INFO          |DEVICE ROLE DET|    RESERVED   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|            PADDING            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                     Fig. DCPDeviceRoleBlock                      
DCPDeviceRoleBlock fields

option

ByteEnumField

2

sub_option

MultiEnumField (Depends on 2)

4

dcp_block_length

LenField

4

block_info

ShortEnumField

0

device_role_details

ByteEnumField

1

reserved

XByteField

0

padding

PadField

b'\x00'

class scapy.contrib.pnio_dcp.DCPIPBlock(*args, **kargs)[source]

Bases: scapy.packet.Packet

aliastypes
extract_padding(s)[source]
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     OPTION    |   SUB OPTION  |        DCP BLOCK LENGTH       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           BLOCK INFO          |               IP              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                               |            NETMASK            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                               |            GATEWAY            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                               |            PADDING            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                         Fig. DCPIPBlock                          
DCPIPBlock fields

option

ByteEnumField

1

sub_option

MultiEnumField (Depends on 1)

2

dcp_block_length

LenField

None

block_info

ShortEnumField

1

ip

IPField

'192.168.0.2'

netmask

IPField

'255.255.255.0'

gateway

IPField

'192.168.0.1'

padding

PadField

b'\x00'

class scapy.contrib.pnio_dcp.DCPMACBlock(*args, **kargs)[source]

Bases: scapy.packet.Packet

aliastypes
extract_padding(s)[source]
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     OPTION    |   SUB OPTION  |        DCP BLOCK LENGTH       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           BLOCK INFO          |              MAC              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|            PADDING            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                         Fig. DCPMACBlock                         
DCPMACBlock fields

option

ByteEnumField

1

sub_option

MultiEnumField (Depends on 1)

1

dcp_block_length

FieldLenField

None

block_info

ShortEnumField

0

mac

MACField

'00:00:00:00:00:00'

padding

PadField

b'\x00'

class scapy.contrib.pnio_dcp.DCPManufacturerSpecificBlock(*args, **kargs)[source]

Bases: scapy.packet.Packet

aliastypes
extract_padding(s)[source]
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     OPTION    |   SUB OPTION  |        DCP BLOCK LENGTH       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           BLOCK INFO          |      DEVICE VENDOR VALUE      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|            PADDING            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                Fig. DCPManufacturerSpecificBlock                 
DCPManufacturerSpecificBlock fields

option

ByteEnumField

2

sub_option

MultiEnumField (Depends on 2)

1

dcp_block_length

FieldLenField

None

block_info

ShortEnumField

0

device_vendor_value

StrLenField

b'et200sp'

padding

PadField

b'\x00'

class scapy.contrib.pnio_dcp.DCPNameOfStationBlock(*args, **kargs)[source]

Bases: scapy.packet.Packet

aliastypes
extract_padding(s)[source]
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     OPTION    |   SUB OPTION  |        DCP BLOCK LENGTH       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           BLOCK INFO          |        NAME OF STATION        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|            PADDING            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                    Fig. DCPNameOfStationBlock                    
DCPNameOfStationBlock fields

option

ByteEnumField

2

sub_option

MultiEnumField (Depends on 2)

2

dcp_block_length

FieldLenField

None

block_info

ShortEnumField

0

name_of_station

StrLenField

b'et200sp'

padding

PadField

b'\x00'

class scapy.contrib.pnio_dcp.DeviceOption(*args, **kargs)[source]

Bases: scapy.packet.Packet

aliastypes
extract_padding(s)[source]
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     OPTION    |   SUB OPTION  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                        Fig. DeviceOption                         
DeviceOption fields

option

ByteEnumField

2

sub_option

MultiEnumField (Depends on 2)

5

class scapy.contrib.pnio_dcp.ProfinetDCP(*args, **kargs)[source]

Bases: scapy.packet.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
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   SERVICE ID  |  SERVICE TYPE |              XID              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                               |            RESERVED           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|        DCP DATA LENGTH        |     OPTION    |   SUB OPTION  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|        DCP BLOCK LENGTH       |        BLOCK QUALIFIER        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|        NAME OF STATION        |              MAC              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                               IP                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            NETMASK                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            GATEWAY                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|        NAME OF STATION        |           ALIAS NAME          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           DCP BLOCKS          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                         Fig. ProfinetDCP                         
ProfinetDCP fields

service_id

ByteEnumField

5

service_type

ByteEnumField

0

xid

XIntField

16777217

reserved

ShortField

0

dcp_data_length

LenField

None

option

ByteEnumField (Cond)

2

sub_option

MultiEnumField (Cond, Depends on 2)

3

dcp_block_length

LenField (Cond)

0

block_qualifier

ShortEnumField (Cond)

1

name_of_station

StrLenField (Cond)

b'et200sp'

mac

MACField (Cond)

'00:00:00:00:00:00'

ip

IPField (Cond)

'192.168.0.2'

netmask

IPField (Cond)

'255.255.255.0'

gateway

IPField (Cond)

'192.168.0.1'

name_of_station

StrLenField (Cond)

b'et200sp'

alias_name

StrLenField (Cond)

b'et200sp'

dcp_blocks

PacketListField (Cond)

[]

payload_guess

Possible sublayers: 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