a
    kÄ#dXT  ã                   @   s   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#d$„ e&d%d&ƒD ƒ¡ e$ %d'd$„ e&d(d)ƒD ƒ¡ dd*d+d,d-œdd.d/d0d1d2d3d4d5d6œ	d7d8d9d:d;d<d=d>d?d@œ	ddAdBdCdDdEdFdœdd dGœdHdIidJœZ'd diZ(e( %dKd$„ e&ddHƒD ƒ¡ dLdMdNdOdPdQdRœZ)e) %dSd$„ e&d	d&ƒD ƒ¡ dTdUdVdWdXdYdZdœZ*d[d\dGœZ+e+ %d]d$„ e&d^dHƒD ƒ¡ G d_d`„ d`eƒZ,G dadb„ dbeƒZ-G dcdd„ ddeƒZ.G dedf„ dfeƒZ/G dgdh„ dheƒZ0G didj„ djeƒZ1G dkdl„ dleƒZ2G dmdn„ dneƒZ3G dodp„ dpeƒZ4G dqdr„ dreƒZ5G dsdt„ dteƒZ6G dudv„ dveƒZ7G dwdx„ dxeƒZ8G dydz„ dzeƒZ9G d{d|„ d|eƒZ:d}d~„ Z;G d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 specificZGetÚSetZIdentifyZ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    ZIPzDevice propertiesZDHCPÚReservedÚControlzDevice InitiativezAll Selector)r   r   r    r   r   r   r!   éÿ   c                 C   s   i | ]
}|d “qS ©r   © ©Ú.0Úir'   r'   úM/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/pnio_dcp.pyÚ
<dictcomp>R   ó    r,   é   é   c                 C   s   i | ]
}|d “qS )r   r'   r(   r'   r'   r+   r,   S   r-   é€   éþ   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!   r.   é   ú	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 TransactionZSignalÚResponsezReset Factory SettingszReset to Factory©r   r   r%   zALL Selector©r   r    r   r   r!   r%   c                 C   s   i | ]
}|d “qS r&   r'   r(   r'   r'   r+   r,   Œ   r-   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    r0   é�   é‚   c                 C   s   i | ]
}|d “qS r&   r'   r(   r'   r'   r+   r,   —   r-   Z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                 C   s   i | ]
}|d “qS r&   r'   r(   r'   r'   r+   r,   §   r-   r    c                	   @   s`   e Zd ZdZeddeƒeddeddd„ d	�ed
ddd�e	dde
ƒedddd„ d�gZdd„ ZdS )ÚDCPBaseBlockz+
        base class for all DCP Blocks
    Úoptionr   Ú
sub_optionr    ÚBc                 C   s   | j S ©N©rK   ©Úpr'   r'   r+   Ú<lambda>¹   r-   zDCPBaseBlock.<lambda>©ÚfmtZ
depends_onÚdcp_block_lengthNÚdata©Ú	length_ofÚ
block_infor   Ú c                 C   s   | j S rN   ©rU   ©Úxr'   r'   r+   rR   ¼   r-   ©Zlength_fromc                 C   s   d|fS ©NrZ   r'   ©ÚselfÚsr'   r'   r+   Úextract_padding¿   s    zDCPBaseBlock.extract_padding)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚDCP_OPTIONSr   ÚDCP_SUBOPTIONSr   r   ÚBLOCK_INFOSr   Úfields_descrc   r'   r'   r'   r+   rJ   ²   s   

ÿ
ú	rJ   c                   @   sz   e Zd Zeddeƒeddedd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�ddd�gZdd„ Zd
S )Ú
DCPIPBlockrK   r   rL   r    rM   c                 C   s   | j S rN   rO   rP   r'   r'   r+   rR   É   r-   zDCPIPBlock.<lambda>rS   rU   NrY   Úipú192.168.0.2Únetmaskú255.255.255.0Úgatewayú192.168.0.1Úpaddingó    c                 C   s
   | j d S ©Nr    r[   rP   r'   r'   r+   rR   Ð   r-   r^   ©Zpadwithc                 C   s   d|fS r_   r'   r`   r'   r'   r+   rc   Ô   s    zDCPIPBlock.extract_padding)rd   re   rf   r   rh   r   ri   r   r   ÚIP_BLOCK_INFOSr
   r   r   rk   rc   r'   r'   r'   r+   rl   Å   s"   

ÿ
ÿþ÷rl   c                   @   s’   e Zd Zeddeƒeddedd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d„ d�eedddd„ d�ddd�g	Zdd„ Zd
S )ÚDCPFullIPBlockrK   r   rL   r   rM   c                 C   s   | j S rN   rO   rP   r'   r'   r+   rR   Ü   r-   zDCPFullIPBlock.<lambda>rS   rU   NrY   rm   rn   ro   rp   rq   rr   ÚdnsaddrrZ   ú0.0.0.0c                 C   s   dS ©Nr   r'   r\   r'   r'   r+   rR   ã   r-   ©Z
count_fromrs   rt   c                 C   s
   | j d S ru   r[   rP   r'   r'   r+   rR   å   r-   r^   rv   c                 C   s   d|fS r_   r'   r`   r'   r'   r+   rc   é   s    zDCPFullIPBlock.extract_padding)rd   re   rf   r   rh   r   ri   r   r   rw   r
   r	   r   r   rk   rc   r'   r'   r'   r+   rx   Ø   s(   

ÿ
ÿÿþõrx   c                   @   sj   e Zd Zeddeƒeddeddd„ d�edd	ƒed
de	ƒe
ddƒeedddd„ d�ddd�gZdd„ Zd	S )ÚDCPMACBlockrK   r   rL   rM   c                 C   s   | j S rN   rO   rP   r'   r'   r+   rR   ñ   r-   zDCPMACBlock.<lambda>rS   rU   NrY   r   Úmacú00:00:00:00:00:00rs   rt   c                 C   s
   | j d S ru   r[   rP   r'   r'   r+   rR   ö   r-   r^   rv   c                 C   s   d|fS r_   r'   r`   r'   r'   r+   rc   ú   s    zDCPMACBlock.extract_padding)rd   re   rf   r   rh   r   ri   r   r   rj   r   r   r   rk   rc   r'   r'   r'   r+   r}   í   s   

ÿ
ÿþùr}   c                   @   sr   e Zd Zeddeƒeddeddd„ d�ed	d
ƒedde	ƒe
dddd„ d�ee
dddd„ d�ddd�gZdd„ Zd
S )ÚDCPManufacturerSpecificBlockrK   r    rL   r   rM   c                 C   s   | j S rN   rO   rP   r'   r'   r+   rR     r-   z%DCPManufacturerSpecificBlock.<lambda>rS   rU   NrY   r   Zdevice_vendor_valueÚet200spc                 C   s
   | j d S ru   r[   r\   r'   r'   r+   rR     r-   r^   rs   rt   c                 C   s
   | j d S ru   r[   rP   r'   r'   r+   rR   
  r-   rv   c                 C   s   d|fS r_   r'   r`   r'   r'   r+   rc     s    z,DCPManufacturerSpecificBlock.extract_padding©rd   re   rf   r   rh   r   ri   r   r   rj   r   r   rk   rc   r'   r'   r'   r+   r€      s"   

ÿ
ÿÿþør€   c                   @   s|   e Zd Zeddeƒeddeddd„ d�edd	d
dd„ d�edde	ƒe
d
ddd„ d�ee
dddd„ d�ddd�gZdd„ Zd	S )ÚDCPNameOfStationBlockrK   r    rL   rM   c                 C   s   | j S rN   rO   rP   r'   r'   r+   rR     r-   zDCPNameOfStationBlock.<lambda>rS   rU   NÚname_of_stationc                 C   s   |d S ru   r'   ©rQ   r]   r'   r'   r+   rR     r-   ©rX   ÚadjustrY   r   r�   c                 C   s
   | j d S ru   r[   r\   r'   r'   r+   rR     r-   r^   rs   rt   c                 C   s
   | j d S ru   r[   rP   r'   r'   r+   rR     r-   r   rv   c                 C   s   d|fS r_   r'   r`   r'   r'   r+   rc   "  s    z%DCPNameOfStationBlock.extract_paddingr‚   r'   r'   r'   r+   rƒ     s&   

ÿÿ
ÿÿþörƒ   c                   @   sr   e Zd Zeddeƒeddeddd„ d�ed	d
ƒedde	ƒe
ddƒe
ddƒeedddd„ d�ddd�gZdd„ Zd
S )ÚDCPDeviceIDBlockrK   r    rL   r   rM   c                 C   s   | j S rN   rO   rP   r'   r'   r+   rR   *  r-   zDCPDeviceIDBlock.<lambda>rS   rU   NrY   r   Ú	vendor_idé*   Ú	device_idé  rs   rt   c                 C   s
   | j d S ru   r[   rP   r'   r'   r+   rR   0  r-   r^   r   rv   c                 C   s   d|fS r_   r'   r`   r'   r'   r+   rc   4  s    z DCPDeviceIDBlock.extract_padding©rd   re   rf   r   rh   r   ri   r   r   rj   r   r   r   rk   rc   r'   r'   r'   r+   rˆ   &  s    

ÿ
ÿþørˆ   c                   @   st   e Zd Zeddeƒeddeddd„ d�ed	dƒed
de	ƒedde
ƒeddƒeedddd„ d�ddd�gZdd„ ZdS )ÚDCPDeviceRoleBlockrK   r    rL   r   rM   c                 C   s   | j S rN   rO   rP   r'   r'   r+   rR   <  r-   zDCPDeviceRoleBlock.<lambda>rS   rU   rY   r   Zdevice_role_detailsr   r   rs   rt   c                 C   s
   | j d S ru   r[   rP   r'   r'   r+   rR   B  r-   r^   rv   c                 C   s   d|fS r_   r'   r`   r'   r'   r+   rc   F  s    z"DCPDeviceRoleBlock.extract_paddingN)rd   re   rf   r   rh   r   ri   r   r   rj   ÚDCP_DEVICE_ROLESr   r   r   rk   rc   r'   r'   r'   r+   rŽ   8  s    

ÿ

ÿþørŽ   c                   @   s6   e Zd Zeddeƒeddeddd„ d�gZd	d
„ ZdS )ÚDeviceOptionrK   r    rL   r   rM   c                 C   s   | j S rN   rO   rP   r'   r'   r+   rR   O  r-   zDeviceOption.<lambda>rS   c                 C   s   d|fS r_   r'   r`   r'   r'   r+   rc   R  s    zDeviceOption.extract_paddingN)	rd   re   rf   r   rh   r   ri   rk   rc   r'   r'   r'   r+   r�   K  s   

ÿþr�   c                   @   st   e Zd Zeddeƒeddeddd„ d�ed	d
ƒedde	ƒe
dg edd„ d�eedddd„ d�ddd�gZdd„ Zd
S )ÚDCPDeviceOptionsBlockrK   r    rL   r   rM   c                 C   s   | j S rN   rO   rP   r'   r'   r+   rR   Z  r-   zDCPDeviceOptionsBlock.<lambda>rS   rU   NrY   r   Zdevice_optionsc                 C   s
   | j d S ru   r[   rP   r'   r'   r+   rR   _  r-   r^   rs   rt   c                 C   s
   | j d S ru   r[   rP   r'   r'   r+   rR   b  r-   r   rv   c                 C   s   d|fS r_   r'   r`   r'   r'   r+   rc   f  s    z%DCPDeviceOptionsBlock.extract_padding)rd   re   rf   r   rh   r   ri   r   r   rj   r   r�   r   r   rk   rc   r'   r'   r'   r+   r‘   V  s"   

ÿ
ÿÿþör‘   c                   @   s|   e Zd Zeddeƒeddeddd„ d�ed	d
ddd„ d�edde	ƒe
dddd„ d�ee
dddd„ d�ddd�gZdd„ Zd
S )ÚDCPAliasNameBlockrK   r    rL   r!   rM   c                 C   s   | j S rN   rO   rP   r'   r'   r+   rR   n  r-   zDCPAliasNameBlock.<lambda>rS   rU   NÚ
alias_namec                 C   s   |d S ru   r'   r…   r'   r'   r+   rR   p  r-   r†   rY   r   r�   c                 C   s
   | j d S ru   r[   r\   r'   r'   r+   rR   s  r-   r^   rs   rt   c                 C   s
   | j d S ru   r[   rP   r'   r'   r+   rR   u  r-   r   rv   c                 C   s   d|fS r_   r'   r`   r'   r'   r+   rc   y  s    z!DCPAliasNameBlock.extract_paddingr‚   r'   r'   r'   r+   r’   j  s&   

ÿÿ
ÿÿþ÷r’   c                   @   sr   e Zd Zeddeƒeddeddd„ d�ed	d
ƒedde	ƒe
ddƒe
ddƒeedddd„ d�ddd�gZdd„ ZdS )ÚDCPDeviceInstanceBlockrK   r    rL   r.   rM   c                 C   s   | j S rN   rO   rP   r'   r'   r+   rR   �  r-   zDCPDeviceInstanceBlock.<lambda>rS   rU   r   rY   r   Zdevice_instance_highZdevice_instance_lowr   rs   rt   c                 C   s
   | j d S ru   r[   rP   r'   r'   r+   rR   ‡  r-   r^   rv   c                 C   s   d|fS r_   r'   r`   r'   r'   r+   rc   ‹  s    z&DCPDeviceInstanceBlock.extract_paddingN)rd   re   rf   r   rh   r   ri   r   r   rj   r   r   r   rk   rc   r'   r'   r'   r+   r”   }  s    

ÿ
ÿþør”   c                   @   sr   e Zd Zeddeƒeddeddd„ d�ed	d
ƒedde	ƒe
ddƒe
ddƒeedddd„ d�ddd�gZdd„ Zd
S )ÚDCPOEMIDBlockrK   r    rL   r2   rM   c                 C   s   | j S rN   rO   rP   r'   r'   r+   rR   “  r-   zDCPOEMIDBlock.<lambda>rS   rU   NrY   r   r‰   rŠ   r‹   rŒ   rs   rt   c                 C   s
   | j d S ru   r[   rP   r'   r'   r+   rR   ™  r-   r^   r   rv   c                 C   s   d|fS r_   r'   r`   r'   r'   r+   rc   �  s    zDCPOEMIDBlock.extract_paddingr�   r'   r'   r'   r+   r•   �  s    

ÿ
ÿþør•   c                   @   s€   e Zd Zeddeƒeddeddd„ d�ed	d
ƒeddeƒeddeddd„ d�eddeƒe	e
dddd„ d�ddd�gZdd„ ZdS )ÚDCPControlBlockrK   r   rL   r   rM   c                 C   s   | j S rN   rO   rP   r'   r'   r+   rR   ¥  r-   zDCPControlBlock.<lambda>rS   rU   r   Úresponser    Zresponse_sub_optionc                 C   s   | j S rN   rO   rP   r'   r'   r+   rR   ©  r-   Zblock_errorr   rs   rt   c                 C   s
   | j d S ru   r[   rP   r'   r'   r+   rR   ¬  r-   r^   r   rv   c                 C   s   d|fS r_   r'   r`   r'   r'   r+   rc   °  s    zDCPControlBlock.extract_paddingN)rd   re   rf   r   rh   r   ri   r   ÚBLOCK_ERRORSr   r   rk   rc   r'   r'   r'   r+   r–   ¡  s$   

ÿ

ÿ
ÿþ÷r–   c                   @   sX   e Zd ZdZeddeƒeddeddd„ d	�ed
ddd�e	dde
ƒeddƒgZdd„ ZdS )ÚDCPDeviceInitiativeBlockz)
        device initiative DCP block
    rK   r!   rL   r   rM   c                 C   s   | j S rN   rO   rP   r'   r'   r+   rR   »  r-   z!DCPDeviceInitiativeBlock.<lambda>rS   rU   NZdevice_initiativerW   rY   r   c                 C   s   d|fS r_   r'   r`   r'   r'   r+   rc   Á  s    z(DCPDeviceInitiativeBlock.extract_padding)rd   re   rf   rg   r   rh   r   ri   r   r   rj   r   rk   rc   r'   r'   r'   r+   r™   ´  s   

ÿ
ú	r™   c                 K   s²   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%œ}z|| | }W n ty–   d&}Y n0 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}   rl   )r   r    r€   rƒ   rˆ   rŽ   r‘   r’   r”   r•   )r   r    r   r   r   r!   r.   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   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™   rF   r%   zALL Selector (0xff)rG   rJ   )r   ÚKeyErrorÚglobals)ÚpacketZkargsrK   Z	suboptionZclass_switch_caseÚcÚclsr'   r'   r+   Úguess_dcp_block_classÅ  sX    	þø÷ùþÿÍ8

rŸ   c                   @   s|  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d„ ƒeeddeddd„ d�dd„ ƒee
ddƒdd„ ƒeeddeƒdd„ ƒeeedddd„ d�dd„ fgeddd d„ d�ƒd!d„ ƒeed"d#ƒd$d„ ƒeed%d&ƒd'd„ ƒeed(d)ƒd*d„ ƒeed+d,ƒd-d„ ƒeed.g ed/d0ƒd1d„ d2�d3d„ ƒeed4dd5d„ d�d6d„ ƒeed7g ed8d„ d�d9d„ ƒgZd:d;„ 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_lengthNrK   r    c                 C   s
   | j dkS ©Nr   ©r¢   ©Úpktr'   r'   r+   rR   J  r-   zProfinetDCP.<lambda>rL   r   rM   c                 C   s   | j S rN   rO   rP   r'   r'   r+   rR   M  r-   rS   c                 C   s
   | j dkS r¥   r¦   r§   r'   r'   r+   rR   N  r-   rU   c                 C   s
   | j dkS r¥   r¦   r§   r'   r'   r+   rR   R  r-   Zblock_qualifierr   c                 C   s   | j dko| jdkS )Nr   r   )r¡   r¢   r§   r'   r'   r+   rR   W  s   
r„   r�   c                 C   s
   | j d S ru   r[   r\   r'   r'   r+   rR   ^  r-   r^   c                 C   s
   | j dkS r{   )r¡   r§   r'   r'   r+   rR   _  r-   c                 C   s   | j S rN   r[   r\   r'   r'   r+   rR   b  r-   c                 C   s   | j dko| jdko| jdkS )Nr   r    )r¢   rK   rL   r§   r'   r'   r+   rR   d  s   r~   r   c                 C   s(   | j dko&| jdko&| jdko&| jdkS )Nr   r   r   ©r¡   r¢   rK   rL   r§   r'   r'   r+   rR   j  s
   
ÿÿrm   rn   c                 C   s(   | j dko&| jdko&| jdko&| jdv S ©Nr   r   r   )r    r   r©   r§   r'   r'   r+   rR   o  s
   
ÿÿro   rp   c                 C   s(   | j dko&| jdko&| jdko&| jdv S rª   r©   r§   r'   r'   r+   rR   s  s
   
ÿÿrq   rr   c                 C   s(   | j dko&| jdko&| jdko&| jdv S rª   r©   r§   r'   r'   r+   rR   w  s
   
ÿÿry   rZ   rz   c                 C   s   dS r{   r'   r\   r'   r'   r+   rR   }  r-   r|   c                 C   s(   | j dko&| jdko&| jdko&| jdkS )Nr   r   r   r   r©   r§   r'   r'   r+   rR   ~  s
   
ÿÿr“   c                 C   s   | j S rN   r[   r\   r'   r'   r+   rR   ‡  r-   c                 C   s(   | j dko&| jdko&| jdko&| jdkS )Nr   r   r    r!   r©   r§   r'   r'   r+   rR   ˆ  s
   
ÿÿZ
dcp_blocksc                 C   s   | j S rN   )r¤   rP   r'   r'   r+   rR   ‘  r-   c                 C   s
   | j dkS )Nr   r¦   r§   r'   r'   r+   rR   ’  r-   c                 C   s*   t t|| ƒ }|d| 7 }t | ||¡S )Nrt   )ÚMIN_PACKET_LENGTHÚlenr   Ú
post_build)ra   r¨   Zpayrs   r'   r'   r+   r­   •  s    zProfinetDCP.post_build)rd   re   rf   rg   Únamer   ÚDCP_SERVICE_IDÚDCP_SERVICE_TYPEr   r   r   r   rh   r   ri   r   ÚBLOCK_QUALIFIERSr   r   r   r
   r	   r   rŸ   rk   r­   r'   r'   r'   r+   r      sˆ   &

ÿ
ÿý
ÿÿþÿþÿÿú	ö
ÿ
ÿ
ÿ
ÿÿþ
ÿþ	ÿý°Vr    N)=Zscapy.compatr   Z	scapy.allr   r   r   Zscapy.fieldsr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r«   ZDCP_GET_SET_FRAME_IDZDCP_IDENTIFY_REQUEST_FRAME_IDZDCP_IDENTIFY_RESPONSE_FRAME_IDZDCP_REQUESTZDCP_RESPONSEZDCP_SERVICE_ID_GETZDCP_SERVICE_ID_SETZDCP_SERVICE_ID_IDENTIFYr¯   r°   r�   rh   ÚupdateÚrangeri   rj   rw   r˜   r±   rJ   rl   rx   r}   r€   rƒ   rˆ   rŽ   r�   r‘   r’   r”   r•   r–   r™   rŸ   r    r'   r'   r'   r+   Ú<module>	   sî   Lùýýø
ü÷÷ùþÿÑ5ÿúùþQ 	