
    hXT                        d dl mZ d dlmZmZmZ d dlmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZ dZdZdZdZd ZdZd	Zd
ZdZ ddddddddZ!ddddZ"ddddZ#ddddddd d!d"Z$e$%                    d#  e&d$d%          D                        e$%                    d&  e&d'd(          D                        dd)d*d+d,dd-d.d/d0d1d2d3d4d5	d6d7d8d9d:d;d<d=d>d?	dd@dAdBdCdDdEddd dFdGdHidIZ'd diZ(e(%                    dJ  e&ddG          D                        dKdLdMdNdOdPdQZ)e)%                    dR  e&d	d%          D                        dSdTdUdVdWdXdYdZ*dZd[dFZ+e+%                    d\  e&d]dG          D                         G d^ d_e          Z, G d` dae          Z- G db dce          Z. G dd dee          Z/ G df dge          Z0 G dh die          Z1 G dj dke          Z2 G dl dme          Z3 G dn doe          Z4 G dp dqe          Z5 G dr dse          Z6 G dt due          Z7 G dv dwe          Z8 G dx dye          Z9 G dz d{e          Z:d| Z; G d} d~e          Z< ee<e           dS )    )orb)Packetbind_layersPadding)ByteEnumFieldConditionalFieldFieldLenFieldFieldListFieldIPFieldLenFieldMACFieldMultiEnumFieldMultipleTypeFieldPacketListFieldPadFieldShortEnumField
ShortFieldStrLenField
XByteField	XIntFieldXShortField,   i  i  i              reservedManufacturer specificGetSetIdentifyHellor   r      r   r   r      RequestzResponse Successz Response - Request not supported)r   r   r   zIO Supervisorz	IO DevicezIO Controller)r   r   r$   IPzDevice propertiesDHCPReservedControlzDevice InitiativezAll Selector)r   r   r$   r   r   r   r%      c                     i | ]}|d S r    .0is     Z/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/contrib/pnio_dcp.py
<dictcomp>r3   R       ===aAz===          c                     i | ]}|d S )r   r.   r/   s     r2   r3   r3   S   s    JJJ1A.JJJr5         zMAC AddresszIP ParameterzFull IP Suite)r   r   r$   r   z'Manufacturer specific (Type of Station)zName of Stationz	Device IDzDevice RolezDevice Optionsz
Alias NamezDevice InstancezOEM Device ID)	r   r   r$   r   r   r   r%   r6      	Host nameVendor specificServer identifierParameter request listClass identifierDHCP client identifier!FQDN, Fully Qualified Domain NameUUID/GUID-based Client#Control DHCP for address resolution	   +   6   7   <   =   Q   a   r+   zStart TransactionzEnd TransactionSignalResponsezReset Factory SettingszReset to Factoryr   r   r+   zALL Selectorr   r$   r   r   r%   r+   c                     i | ]}|d S r-   r.   r/   s     r2   r3   r3      r4   r5   z
IP not setzIP setzIP set by DHCPz&IP not set (address conflict detected)z"IP set (address conflict detected)z*IP set by DHCP (address conflict detected))r   r   r$   r9         c                     i | ]}|d S r-   r.   r/   s     r2   r3   r3      s    DDDq*DDDr5   OkzOption unsupp.z&Suboption unsupp. or no DataSet avail.zSuboption not setzResource Errorz!SET not possible by local reasonszIn operation, SET not possiblezUse the value temporaryzSave the value permanentc                     i | ]}|d S r-   r.   r/   s     r2   r3   r3      s    FFF1JFFFr5   r$   c            	           e Zd ZdZ edde           eddedd            ed	d
d           e	dde
           eddd           gZd Zd
S )DCPBaseBlockz+
        base class for all DCP Blocks
    optionr   
sub_optionr$   Bc                     | j         S NrZ   ps    r2   <lambda>zDCPBaseBlock.<lambda>       AH r5   fmt
depends_ondcp_block_lengthNdata	length_of
block_infor    c                     | j         S r^   rg   xs    r2   rb   zDCPBaseBlock.<lambda>   s	    a6H r5   length_fromc                 
    d|fS Nrl   r.   selfss     r2   extract_paddingzDCPBaseBlock.extract_padding       1ur5   )__name__
__module____qualname____doc__r   DCP_OPTIONSr   DCP_SUBOPTIONSr	   r   BLOCK_INFOSr   fields_descrx   r.   r5   r2   rY   rY      s          	h;//|QC"4"4	6 	6 	6($&AAA|Q44FB,H,HIIIK    r5   rY   c                       e Zd Z edde           eddedd            edd	           ed
de	           e
dd           e
dd           e
dd           e eddd           dd          gZd Zd	S )
DCPIPBlockrZ   r   r[   r$   r\   c                     | j         S r^   r_   r`   s    r2   rb   zDCPIPBlock.<lambda>   rc   r5   rd   rg   Nrk   ip192.168.0.2netmask255.255.255.0gateway192.168.0.1padding    c                     | j         dz  S Nr$   rn   r`   s    r2   rb   zDCPIPBlock.<lambda>       13E3I r5   rq   padwithc                 
    d|fS rt   r.   ru   s     r2   rx   zDCPIPBlock.extract_padding   ry   r5   )rz   r{   r|   r   r~   r   r   r   r   IP_BLOCK_INFOSr   r   r   r   rx   r.   r5   r2   r   r      s        h;//|QC"4"4	6 	6 	6#T**|Q77m$$	?++	=))Y)I)IK K KLM 	" 	" 	"K    r5   r   c                   &   e Zd Z edde           eddedd            edd	           ed
de	           e
dd           e
dd           e
dd           edg  e
dd          d            e eddd           dd          g	Zd Zd	S )DCPFullIPBlockrZ   r   r[   r   r\   c                     | j         S r^   r_   r`   s    r2   rb   zDCPFullIPBlock.<lambda>   rc   r5   rd   rg   Nrk   r   r   r   r   r   r   dnsaddrrl   0.0.0.0c                     dS Nr   r.   ro   s    r2   rb   zDCPFullIPBlock.<lambda>   s    A r5   
count_fromr   r   c                     | j         dz  S r   rn   r`   s    r2   rb   zDCPFullIPBlock.<lambda>   r   r5   rq   r   c                 
    d|fS rt   r.   ru   s     r2   rx   zDCPFullIPBlock.extract_padding   ry   r5   )rz   r{   r|   r   r~   r   r   r   r   r   r   r
   r   r   r   rx   r.   r5   r2   r   r      s       h;//|QC"4"4	6 	6 	6#T**|Q77m$$	?++	=))y"ggb)&<&<"-+	/ 	/ 	/Y)I)IK K KLM 	" 	" 	"K     r5   r   c                       e Zd Z edde           eddedd            edd           ed	d
e	           e
dd           e eddd           dd          gZd ZdS )DCPMACBlockrZ   r   r[   r\   c                     | j         S r^   r_   r`   s    r2   rb   zDCPMACBlock.<lambda>   rc   r5   rd   rg   Nrk   r   mac00:00:00:00:00:00r   r   c                     | j         dz  S r   rn   r`   s    r2   rb   zDCPMACBlock.<lambda>   r   r5   rq   r   c                 
    d|fS rt   r.   ru   s     r2   rx   zDCPMACBlock.extract_padding   ry   r5   )rz   r{   r|   r   r~   r   r   r	   r   r   r   r   r   r   rx   r.   r5   r2   r   r      s        h;//|QC"4"4	6 	6 	6($//|Q44+,,Y)I)IK K KLM 	" 	" 	"
K    r5   r   c                       e Zd Z edde           eddedd            edd	           ed
de	           e
ddd            e e
ddd           dd          gZd Zd	S )DCPManufacturerSpecificBlockrZ   r$   r[   r   r\   c                     | j         S r^   r_   r`   s    r2   rb   z%DCPManufacturerSpecificBlock.<lambda>  rc   r5   rd   rg   Nrk   r   device_vendor_valueet200spc                     | j         dz
  S r   rn   ro   s    r2   rb   z%DCPManufacturerSpecificBlock.<lambda>      !*<q*@ r5   rq   r   r   c                     | j         dz  S r   rn   r`   s    r2   rb   z%DCPManufacturerSpecificBlock.<lambda>
  r   r5   r   c                 
    d|fS rt   r.   ru   s     r2   rx   z,DCPManufacturerSpecificBlock.extract_padding  ry   r5   rz   r{   r|   r   r~   r   r   r	   r   r   r   r   r   rx   r.   r5   r2   r   r      s        h;//|QC"4"4	6 	6 	6($//|Q44)9 @ @	B 	B 	BY)I)IK K KLM 	" 	" 	"K    r5   r   c                       e Zd Z edde           eddedd            eddd	d
            edde	           e
d	dd            e e
ddd           dd          gZd ZdS )DCPNameOfStationBlockrZ   r$   r[   r\   c                     | j         S r^   r_   r`   s    r2   rb   zDCPNameOfStationBlock.<lambda>  rc   r5   rd   rg   Nname_of_stationc                     |dz   S r   r.   ra   rp   s     r2   rb   zDCPNameOfStationBlock.<lambda>  
    !a% r5   rj   adjustrk   r   r   c                     | j         dz
  S r   rn   ro   s    r2   rb   zDCPNameOfStationBlock.<lambda>  r   r5   rq   r   r   c                     | j         dz  S r   rn   r`   s    r2   rb   zDCPNameOfStationBlock.<lambda>  r   r5   r   r   c                 
    d|fS rt   r.   ru   s     r2   rx   z%DCPNameOfStationBlock.extract_padding"  ry   r5   r   r.   r5   r2   r   r     s        h;//|QC"4"4	6 	6 	6($:K//	1 	1 	1 	|Q44%y @ @	B 	B 	BY)I)IK K KLM 	" 	" 	"K    r5   r   c                       e Zd Z edde           eddedd            edd	           ed
de	           e
dd           e
dd           e eddd           dd          gZd Zd	S )DCPDeviceIDBlockrZ   r$   r[   r   r\   c                     | j         S r^   r_   r`   s    r2   rb   zDCPDeviceIDBlock.<lambda>*  rc   r5   rd   rg   Nrk   r   	vendor_id*   	device_id  r   r   c                     | j         dz  S r   rn   r`   s    r2   rb   zDCPDeviceIDBlock.<lambda>0  r   r5   rq   r   r   c                 
    d|fS rt   r.   ru   s     r2   rx   z DCPDeviceIDBlock.extract_padding4  ry   r5   rz   r{   r|   r   r~   r   r   r   r   r   r   r   r   r   rx   r.   r5   r2   r   r   &          h;//|QC"4"4	6 	6 	6#T**|Q44K((K((Y)I)IK K KLM 	" 	" 	"K    r5   r   c                       e Zd Z edde           eddedd            edd           ed	d
e	           edde
           edd
           e eddd           dd          gZd ZdS )DCPDeviceRoleBlockrZ   r$   r[   r   r\   c                     | j         S r^   r_   r`   s    r2   rb   zDCPDeviceRoleBlock.<lambda><  rc   r5   rd   rg   rk   r   device_role_detailsr   r   r   r   c                     | j         dz  S r   rn   r`   s    r2   rb   zDCPDeviceRoleBlock.<lambda>B  r   r5   rq   r   c                 
    d|fS rt   r.   ru   s     r2   rx   z"DCPDeviceRoleBlock.extract_paddingF  ry   r5   N)rz   r{   r|   r   r~   r   r   r   r   r   DCP_DEVICE_ROLESr   r   r   r   rx   r.   r5   r2   r   r   8  s        h;//|QC"4"4	6 	6 	6#Q''|Q44+Q0@AA
:t$$Y)I)IK K KLM 	" 	" 	"K    r5   r   c                   P    e Zd Z edde           eddedd           gZd Zd	S )
DeviceOptionrZ   r$   r[   r   r\   c                     | j         S r^   r_   r`   s    r2   rb   zDeviceOption.<lambda>O  rc   r5   rd   c                 
    d|fS rt   r.   ru   s     r2   rx   zDeviceOption.extract_paddingR  ry   r5   N)	rz   r{   r|   r   r~   r   r   r   rx   r.   r5   r2   r   r   K  s]        h;//|QC"4"4	6 	6 	6K    r5   r   c                       e Zd Z edde           eddedd            edd	           ed
de	           e
dg ed            e eddd           dd          gZd Zd	S )DCPDeviceOptionsBlockrZ   r$   r[   r   r\   c                     | j         S r^   r_   r`   s    r2   rb   zDCPDeviceOptionsBlock.<lambda>Z  rc   r5   rd   rg   Nrk   r   device_optionsc                     | j         dz
  S r   rn   r`   s    r2   rb   zDCPDeviceOptionsBlock.<lambda>_  s    a.@1.D r5   rq   r   r   c                     | j         dz  S r   rn   r`   s    r2   rb   zDCPDeviceOptionsBlock.<lambda>b  r   r5   r   r   c                 
    d|fS rt   r.   ru   s     r2   rx   z%DCPDeviceOptionsBlock.extract_paddingf  ry   r5   )rz   r{   r|   r   r~   r   r   r   r   r   r   r   r   r   r   rx   r.   r5   r2   r   r   V  s        h;//|QC"4"4	6 	6 	6#T**|Q44("l$D$D	F 	F 	F 	Y)I)IK K KLM 	" 	" 	"K    r5   r   c                       e Zd Z edde           eddedd            edd	d
d            edde	           e
d
dd            e e
ddd           dd          gZd Zd	S )DCPAliasNameBlockrZ   r$   r[   r%   r\   c                     | j         S r^   r_   r`   s    r2   rb   zDCPAliasNameBlock.<lambda>n  rc   r5   rd   rg   N
alias_namec                     |dz   S r   r.   r   s     r2   rb   zDCPAliasNameBlock.<lambda>p  r   r5   r   rk   r   r   c                     | j         dz
  S r   rn   ro   s    r2   rb   zDCPAliasNameBlock.<lambda>s  r   r5   rq   r   r   c                     | j         dz  S r   rn   r`   s    r2   rb   zDCPAliasNameBlock.<lambda>u  r   r5   r   r   c                 
    d|fS rt   r.   ru   s     r2   rx   z!DCPAliasNameBlock.extract_paddingy  ry   r5   r   r.   r5   r2   r   r   j  s        h;//|QC"4"4	6 	6 	6($,//	1 	1 	1|Q44L) @ @	B 	B 	BY)I)IK K KLM 	" 	" 	"K    r5   r   c                       e Zd Z edde           eddedd            edd	           ed
de	           e
dd           e
dd           e eddd           dd          gZd ZdS )DCPDeviceInstanceBlockrZ   r$   r[   r6   r\   c                     | j         S r^   r_   r`   s    r2   rb   zDCPDeviceInstanceBlock.<lambda>  rc   r5   rd   rg   r   rk   r   device_instance_highdevice_instance_lowr   r   r   c                     | j         dz  S r   rn   r`   s    r2   rb   zDCPDeviceInstanceBlock.<lambda>  r   r5   rq   r   c                 
    d|fS rt   r.   ru   s     r2   rx   z&DCPDeviceInstanceBlock.extract_padding  ry   r5   N)rz   r{   r|   r   r~   r   r   r   r   r   r   r   r   r   rx   r.   r5   r2   r   r   }  s        h;//|QC"4"4	6 	6 	6#Q''|Q44
)400
($//Y)I)IK K KLM 	" 	" 	"K    r5   r   c                       e Zd Z edde           eddedd            edd	           ed
de	           e
dd           e
dd           e eddd           dd          gZd Zd	S )DCPOEMIDBlockrZ   r$   r[   r;   r\   c                     | j         S r^   r_   r`   s    r2   rb   zDCPOEMIDBlock.<lambda>  rc   r5   rd   rg   Nrk   r   r   r   r   r   r   r   c                     | j         dz  S r   rn   r`   s    r2   rb   zDCPOEMIDBlock.<lambda>  r   r5   rq   r   r   c                 
    d|fS rt   r.   ru   s     r2   rx   zDCPOEMIDBlock.extract_padding  ry   r5   r   r.   r5   r2   r   r     r   r5   r   c                       e Zd Z edde           eddedd            edd	           ed
de           eddedd            edde           e	 e
ddd           dd          gZd ZdS )DCPControlBlockrZ   r   r[   r   r\   c                     | j         S r^   r_   r`   s    r2   rb   zDCPControlBlock.<lambda>  rc   r5   rd   rg   r   responser$   response_sub_optionc                     | j         S r^   r_   r`   s    r2   rb   zDCPControlBlock.<lambda>  rc   r5   block_errorr   r   r   c                     | j         dz  S r   rn   r`   s    r2   rb   zDCPControlBlock.<lambda>  r   r5   rq   r   r   c                 
    d|fS rt   r.   ru   s     r2   rx   zDCPControlBlock.extract_padding  ry   r5   N)rz   r{   r|   r   r~   r   r   r   BLOCK_ERRORSr   r   r   rx   r.   r5   r2   r   r     s        h;//|QC"4"4	6 	6 	6#Q''j![11,aS"4"4	6 	6 	6mQ55Y)I)IK K KLM 	" 	" 	"K    r5   r   c                       e Zd ZdZ edde           eddedd            ed	d
d           e	dde
           edd          gZd Zd
S )DCPDeviceInitiativeBlockz)
        device initiative DCP block
    rZ   r%   r[   r   r\   c                     | j         S r^   r_   r`   s    r2   rb   z!DCPDeviceInitiativeBlock.<lambda>  rc   r5   rd   rg   Ndevice_initiativeri   rk   r   c                 
    d|fS rt   r.   ru   s     r2   rx   z(DCPDeviceInitiativeBlock.extract_padding  ry   r5   )rz   r{   r|   r}   r   r~   r   r   r	   r   r   r   r   rx   r.   r5   r2   r   r     s          	h;//|QC"4"4	6 	6 	6($:MNNN|Q44
&**K    r5   r   c                 ,   t          | d                   }t          | d                   }ddddddd	d
dddddddddddddd	dddddddd dd!d"d#d$id%}	 ||         |         }n# t          $ r d&}Y nw xY wt                      |         } || fi |S )'z
    returns the correct dcp block class needed to dissect the current tag
    if nothing can be found -> dcp base block will be used

    :param packet: the current packet
    :return: dcp block class
    r   r   r   r   )r   r$   r   r   r   r   r   r   r   r   )r   r$   r   r   r   r%   r6   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   zReserved (0x00)zStart Transaction (0x01)zEnd Transaction (0x02)zSignal (0x03)r   zReset Factory Settings (0x05)zReset to Factory (0x06)r#   r   rP   r+   zALL Selector (0xff)rQ   rY   )r   KeyErrorglobals)packetkargsrZ   	suboptionclass_switch_casecclss          r2   guess_dcp_block_classr    s/    ^^FF1II $"  5-(*-).%	 	 "').(.9.;
 
 (0.%'5/  (0  +g6 6pf%i0    ))A,C3vs   A' 'A65A6c                      e Zd ZdZdZ edde           edde           edd           e	d	d           e
d
d           e edde          d            e eddedd           d            e e
dd          d            e edde          d            e e eddd           d fg eddd                     d             e ed!d"          d#            e ed$d%          d&            e ed'd(          d)            e ed*d+          d,            e ed-g  ed.d/          d0 1          d2            e ed3dd4           d5            e ed6g ed7           d8           gZd9 ZdS ):ProfinetDCPa  
    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)

    zProfinet DCP
service_idr   service_typer   xidi  r   dcp_data_lengthNrZ   r$   c                     | j         dk    S Nr   r	  pkts    r2   rb   zProfinetDCP.<lambda>J      S%5%: r5   r[   r   r\   c                     | j         S r^   r_   r`   s    r2   rb   zProfinetDCP.<lambda>M  s     r5   rd   c                     | j         dk    S r  r  r  s    r2   rb   zProfinetDCP.<lambda>N      (A- r5   rg   c                     | j         dk    S r  r  r  s    r2   rb   zProfinetDCP.<lambda>R  r  r5   block_qualifierr   c                 .    | j         dk    o
| j        dk    S )Nr   r   )r  r	  r  s    r2   rb   zProfinetDCP.<lambda>W  s     S^q%8 &/)Q. r5   r   r   c                     | j         dz
  S r   rn   ro   s    r2   rb   zProfinetDCP.<lambda>^  s    q7IA7M r5   rq   c                     | j         dk    S r   )r  r  s    r2   rb   zProfinetDCP.<lambda>_  s    1!4 r5   c                     | j         S r^   rn   ro   s    r2   rb   zProfinetDCP.<lambda>b  s	    !2D r5   c                 D    | j         dk    o| j        dk    o
| j        dk    S )Nr   r$   )r	  rZ   r[   r  s    r2   rb   zProfinetDCP.<lambda>d  s-    (A-  #*/  Na r5   r   r   c                 Z    | j         dk    o | j        dk    o| j        dk    o
| j        dk    S )Nr   r   r   r  r	  rZ   r[   r  s    r2   rb   zProfinetDCP.<lambda>j  =    S^q%8 &-)Q.&-36:?&-1, r5   r   r   c                 V    | j         dk    o| j        dk    o| j        dk    o| j        dv S Nr   r   r   )r$   r   r  r  s    r2   rb   zProfinetDCP.<lambda>o  =    S^q%8 &2)Q.&236:?&261 r5   r   r   c                 V    | j         dk    o| j        dk    o| j        dk    o| j        dv S r   r  r  s    r2   rb   zProfinetDCP.<lambda>s  r!  r5   r   r   c                 V    | j         dk    o| j        dk    o| j        dk    o| j        dv S r   r  r  s    r2   rb   zProfinetDCP.<lambda>w  r!  r5   r   rl   r   c                     dS r   r.   ro   s    r2   rb   zProfinetDCP.<lambda>}  s    Q r5   r   c                 Z    | j         dk    o | j        dk    o| j        dk    o
| j        dk    S )Nr   r   r   r   r  r  s    r2   rb   zProfinetDCP.<lambda>~  r  r5   r   c                     | j         S r^   rn   ro   s    r2   rb   zProfinetDCP.<lambda>  s	    1;M r5   c                 Z    | j         dk    o | j        dk    o| j        dk    o
| j        dk    S )Nr   r   r$   r%   r  r  s    r2   rb   zProfinetDCP.<lambda>  r  r5   
dcp_blocksc                     | j         S r^   )r  r`   s    r2   rb   zProfinetDCP.<lambda>  s	    !2C r5   c                     | j         dk    S )Nr   r  r  s    r2   rb   zProfinetDCP.<lambda>  r  r5   c                 r    t           t          ||z             z
  }|d|z  z  }t          j        | ||          S )Nr   )MIN_PACKET_LENGTHlenr   
post_build)rv   r  payr   s       r2   r.  zProfinetDCP.post_build  s;     $s39~~6uw sC000r5   )rz   r{   r|   r}   namer   DCP_SERVICE_IDDCP_SERVICE_TYPEr   r   r   r   r~   r   r   r   BLOCK_QUALIFIERSr   r   r   r   r
   r   r  r   r.  r.   r5   r2   r  r    s9       $ $L D 	lA~66na)9::	%$$ 	
:q!!"D)) 	xK@@::	< 	<N<N&8&8: : :--	/ 	/ 	"4a88::	< 	< 	(91(8: :/ /	0 	0
 	 [!2I-M-MO O O446
 -y(D(DF F F    	
 	
 	%)<==- -	. 	.
 	}552 2	3 	3 	O<<2 2	3 	3 	M::2 2	3 	3 		2wwr97M7M3>;@ @ @- -	. 	. 	\91M1MO O O- -	. 	. 	OL".C(C(CE E E--	/ 	/aTKl1 1 1 1 1r5   r  N)=scapy.compatr   	scapy.allr   r   r   scapy.fieldsr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r,  DCP_GET_SET_FRAME_IDDCP_IDENTIFY_REQUEST_FRAME_IDDCP_IDENTIFY_RESPONSE_FRAME_IDDCP_REQUESTDCP_RESPONSEDCP_SERVICE_ID_GETDCP_SERVICE_ID_SETDCP_SERVICE_ID_IDENTIFYr1  r2  r   r~   updateranger   r   r   r   r3  rY   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r.   r5   r2   <module>rA     s         2 2 2 2 2 2 2 2 2 2                                     *     & !'     
!
!



  

,   

   






	 	   ==55t+<+<=== > > >   JJdD8I8IJJJ K K K
 	  7
 
 !& &1&3
 
 !&   ! 
 	n_2 2j 	*   ==55t+<+<=== > > > 408    DDeeFF.C.CDDD E E E 

2


-
*  &&     FFff0E0EFFF G G G    6   &       &    V   *    &   &    6   $    F   (    v   $       &    6       F   (       &    V   $    F   $    f   &    v   "L  L  L bE1 E1 E1 E1 E1& E1 E1 E1P K ! ! ! ! !r5   